Installation du serveur FTP
Le serveur FTP qui a retenu mon attention est pure-ftpd. Ce serveur permet de « chrooter » (emprisonner) les utilisateurs dans leurs répertoires respectifs mais, correctement configuré, permet également d’utiliser des liens symboliques. De plus, couplé à une base de données SQL, vous pouvez utiliser des utilisateurs virtuels.
ATTENTION A RESTREINDRE CORRECTEMENT LES DROITS UTILISATEURS AU RISQUE DE VOIR VOS UTILISATEURS PRENDRE LA MAIN SUR LES FICHIER PARTAGES DANS LES FTP
- Création de la base de données et liaison vers le serveur FTP
Ouvrez « phpMyAdmin » et saisissez le script suivant dans une requête SQL (en modifiant « login mysql » et « password mysql » par votre login et mot de passe « phpMyAdmin ») :
CREATE DATABASE pureftpd; USE `pureftpd`; CREATE TABLE `ftpduser` ( `Id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `User` varchar(16) NOT NULL default '', `status` enum('0','1') NOT NULL default '0', `Password` varchar(64) NOT NULL default '', `Uid` varchar(11) NOT NULL default '-1', `Gid` varchar(11) NOT NULL default '-1', `Dir` varchar(128) NOT NULL default '', `ULBandwidth` smallint(5) NOT NULL default '0', `DLBandwidth` smallint(5) NOT NULL default '0', `ipaccess` varchar(15) NOT NULL default '*', `QuotaSize` smallint(5) NOT NULL default '0', `QuotaFiles` int(11) NOT NULL default '0', PRIMARY KEY (`Id`) ) TYPE=MyISAM COMMENT='Utilisateur du Serveur FTP'; GRANT SELECT, INSERT, UPDATE, DELETE ON pureftpd.* TO 'login mysql'@'localhost' IDENTIFIED BY 'password mysql' WITH GRANT OPTION;
Cliquez sur exécuter, votre base de données et la table des utilisateurs sera ainsi créé.
- Configurer Pure-ftpd avec MySQL
Afin d’indiquer à Pure-ftpd quelle table de la base de données et quels sont les valeurs à utiliser, nous allons renseigner le fichier /etc/pure-ftpd/db/mysql.conf
:
nano /etc/pure-ftpd/db/mysql.conf
Ajoutez-y les lignes suivantes en modifiant le login et mot de passe pour se connecter à la base MySQL, pensez également à commenter toutes les lignes préexistantes du fichier de configuration:
MYSQLSocket /var/run/mysqld/mysqld.sock MYSQLUser login mysql MYSQLPassword password mysql MYSQLDatabase pureftpd MYSQLCrypt crypt MYSQLGetPW SELECT Password FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetUID SELECT Uid FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetGID SELECT Gid FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetDir SELECT Dir FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetQTASZ SELECT QuotaSize FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetQTAFS SELECT QuotaFiles FROM ftpduser WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
Relancez le serveur ftp pour qu’il prenne en compte les nouveaux paramètres :
service pure-ftpd-mysql restart
- Configurer les options principales du serveur FTP
Pour obtenir le fonctionnement désiré, certaines options doivent être rêglées avant d’aller plus loin.
Editer le fichier /etc/default/pure-ftpd-common
:
nano /etc/default/pure-ftpd-common
Et modifiez la ligne « VIRTUALCHROOT=false
» par « VIRTUALCHROOT=true
»
Enregistrer le fichier ainsi modifié.
Executez les commandes suivantes :
echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir echo "027 007" > /etc/pure-ftpd/conf/Umask echo "90" > /etc/pure-ftpd/conf/MaxDiskUsage echo "no" > /etc/pure-ftpd/conf/DisplayDotFiles
Une fois ces modifications effectués, vous pouvez redémarrer le serveur FTP pour prendre en charge les modifications :
service pure-ftpd-mysql restart
- Configurer les options secondaires du serveur FTP
Pure-ftpd se configure exclusivement par plusieurs fichiers de paramètres ; chaque fichiers correspond à un paramètres et ne contient qu’une seule ligne ; vous trouverez ci-dessous la liste des paramètres possible :
Create file name | Format | Description |
NoTruncate | Yes/No | Cette option permet de renommer automatiquement un fichier si un autre du même nom existe déjà sur le serveur.Cette option est incompatible avec les « Quotas virtuels » |
LogPID | Yes/No | Log le PID de chaque session dans Syslog |
IPV4Only | Yes/No | Écoute uniquement les connections IP V4 |
IPV6Only | Yes/No | Écoute uniquement les connections IP V6 |
TrustedGID | 1 nombre | Seulement les membres du groupe peuvent se connecter. |
FSCharset | Table de Caractères | |
ClientCharset | Table de Caractères | |
ChrootEveryone | Yes/No | Chroot tous les utilisateurs |
Daemonize | Yes/No | Démarrer le serveur en mode Standalone (en démon) |
MaxClientsNumber | 1 nombre | Autorise au maximum clients à se connecter simultanément au serveur (Défaut = 50) |
MaxClientsPerIP | 1 nombre | Nombre maximum de connexions simultanées par client (adresse IP) |
VerboseLog | Yes/No | Envoie des messages de débogage dans Syslog (A utiliser seulement en cas de problème) Pour avoir également les logs de réponses, il faut doubler ce paramètre. |
DisplayDotFiles | Yes/No | Affiche les fichiers commençant par un point (Paramètre à activer pour les puristes et à désactiver pour les simples utilisateurs) |
AnonymousOnly | Yes/No | Autorise uniquement les utilisateurs anonymes. A utiliser uniquement pour les sites FTP publiques. |
NoAnonymous | Yes/No | Autorise uniquement les utilisateurs authentifiés. Les utilisateurs anonymes sont interdits. |
SysLogFacility | Paramètres (1 mot) | Indique la « facility » à utiliser pour syslog (Défaut = local2). « -f none » permet de désactiver les logs. |
FortunesFile | Chemin vers fichier | Affiche une ligne de texte aléatoire à la connexion en provenance du fichier « fortune file » (ex : Astuce du jour). Pour afficher un texte à la connexion, il faut également utiliser cette option. |
NoRename | Yes/No | Autoriser ou non les utilisateurs à renommer les fichiers |
DontResolve | Yes/No | Par défaut, les noms pleinement qualifiés sont logués en faisant une requête DNS inverse sur l’adresse IP. Cette option permet d’éviter de rechercher le nom pleinement qualifié dans le but d’accélérer le temps de connexion. Cette option est donc conseillée pour les sites publics très chargés. |
AnonymousCantUpload | Yes/No | Interdit l’accès en écriture sur le serveur (upload) pour les utilisateurs anonymes. |
MaxIdleTime | 1 nombre | Change la durée de connexion maximum en minutes (Défaut = 15) |
CreateHomeDir | Yes/No | Créer automatiquement le home de l’utilisateur s’il n’existe pas. |
MaxDiskUsage | 1 nombre | Interdit les chargements sur le serveur (upload) si la partition utilisée est chargée à plus de |
KeepAllFiles | Yes/No | Autorise les utilisateurs à charger des fichiers sur le serveur, mais les interdit de les renommer ou les supprimer. |
LimitRecursion | 2 nombres | Cette option permet d’éviter le nombre de fichiers listes et le nombre de niveau de recherches pour éviter les dénis de services. (Défaut = 2000 fichiers et 5 niveaux de répertoire) |
MaxLoad | 1 nombre | Interdit les téléchargements anonymes si la charge du CPU atteint XX |
AnonymousCanCreateDirs | Yes/No | Autorise les utilisateurs anonymes à créer des répertoires. |
Quota | 2 nombres | Si le serveur supporte les quotas virtuels, cette option permet de les configurer |
NATmode | Yes/No | Mode NAT |
AltLog | Chemin vers fichier log | Enregistre les logs des fichiers transférés dans un fichier spécifique. Plusieurs formats sont supportés : CLF (Apache-like), Stats, W3C and xferlog. (exemple :stats:/var/log/pureftpd.log) |
PassivePortRange | 2 nombres | Permet de modifier les ports sur lesquels le serveur Écoute |
CallUploadScript | Yes/No | Appel ou non le script UploadScript (par exemple pour exécuter un antivirus sur le fichier uploader) |
ForcePassiveIP | Chemin vers fichier | Force l’adresse IP ou le nom de la machine pour le retour |
AnonymousRatio | 2 nombres | Active les ratios pour les utilisateurs anonymes |
UserRatio | 2 nombres | Active les ratios pour tous les utilisateurs |
AutoRename | Yes/No | Ne jamais écraser un fichier existant. Le fichier est automatiquement renommé si c’est nécessaire. |
NoChmod | Yes/No | Interdit aux utilisateurs d’utiliser les commandes CHMOD |
AntiWarez | Yes/No | Interdit aux utilisateurs anonymes de télécharger des fichiers |
UserBandwidth | 1 ou 2 nombres | Active la limitation de la bande passante en kilooctets/seconds. Il est possible d’avoir une bande passante différente avec la syntaxe « -t [] : [] » |
AnonymousBandwidth | 1 ou 2 nombres | Active la limitation de la bande passante en kbps pour les utilisateurs anonymes. Il est possible d’avoir une bande passante différente avec la syntaxe « -t [] : [] » |
MinUID | 1 nombre | Interdit les accès pour les utilisateurs ayant un uid inférieur à celui indiqué. |
Umask | 2 nombres | Change le mask de création des fichiers et dossiers. (Défaut = 133 022) |
TrustedIP | Adresse IP | Autorise les accès non anonymes seulement pour l’adresse IP spécifiée. Les autres adresses IP auront un accès anonyme. |
ProhibitDotFilesWrite | Yes/No | Interdit les utilisateurs anonymes à écrire des fichiers commençant par un point. |
ProhibitDotFilesRead | Yes/No | Interdit les utilisateurs anonymes à lire et écrire des fichiers commençant par un point. |
PerUserLimits | 2 nombres | Permet de limiter le nombre de session simultanées qu’un utilisateur peut ouvrir (Défaut = 0 = illimités) |
TLS | 1 nombre | 0: pas de TLS | 1: TLS + texte clair | 2: appliquer TLS | 3: appliquer canal de données chiffrées |
AllowDotFiles | Yes/No | Autorise les utilisateurs anonymes à lire les fichiers et les dossiers commençant par un point. |
BrokenClientsCompatibility | Yes/No | Peut résoudre des problèmes de connexion lorsque l’on se connecte par un navigateur Web |
CustomerProof | Yes/No | Active certaine protection contre les erreurs des utilisateurs (ex chmod 0 filename) |
AllowAnonymousFXP | Yes/No | Active le protocole FXP (File eXchange Protocol) pour les utilisateurs anonyme |
AllowUserFXP | Yes/No | Active le protocole FXP (File eXchange Protocol) pour les utilisateurs authentifiés |
Bind | Adresse IP, port | Indique à pure-ftpd si il doit écouter sur un autre port |
Pour activer une option :
– Créer un fichier avec le nom de l’option dans /etc/pure-ftpd/conf
– Editer ce fichier avec la valeur correspondante,
– Sauvegarder les modifications
– Redémarrer le serveur FTP :
service pure-ftpd-mysql restart
- Script de gestion des utilisateurs
A ce stade, votre serveur est capable d’accepter les connexions venant d’utilisateur inscrit dans votre base de données qui, pour l’instant, est vide.
Pour remédier à ce problème, je vous propose de découvrir le script que j’ai mis en place pour gérer les utilisateurs de mon serveur.
Pour expliquer son fonctionnement, j’ai considéré les utilisateurs ftp Primaire comme étant les répertoires qui seront partagés aussi bien sur le réseau local qu’avec les autres utilisateurs du serveur.
Supposons que la racine de votre serveur se trouve dans le répertoire « /ftp
« .
Les répertoires Confidentiel et Dossier sont ce que j’appelle des ftp primaires. Si l’on observe bien, on voit que les répertoires des utilisateurs sont situés dans le répertoire « /ftp/User
« .
Les deux utilisateurs déclarés ont tous les deux accès au répertoire « /ftp/Dossier
« , mais seul l’utilisateur « Direction » à accès au répertoire « Confidentiel ».
En jouant correctement sur les droits d’accès au fichier (via les ACL, voir ici) vous pourrez autoriser certains de vos utilisateurs à accéder en lecture/écriture ou seulement en lecture sur vos ftp primaire.
/ftp ├── Confidentiel ├── Dossier └── User ├── Compta -> /ftp/Dossier └── Direction ├── Confidentiel -> /ftp/Confidentiel └── Dossier -> /ftp/Dossier
On peut alors imaginer partager les FTP primaires via SAMBA pour rendre les documents accessible depuis l’extérieur en FTP.
Afin que ce script soit exécutable facilement, nous le créerons dans le « path » pour ne pas indiquer son emplacement sur le disque dur à chaque appel du script.
cd /usr/local/bin
Télécharger le script dans ce répertoire
chmod +x ftpusermanager.sh
Si vous voulez lancez le script, il vous suffit alors de saisir :
/usr/local/bin/ftpusermanager.sh
Une fois saisi le login et mot de passe de l’utilisateur MySQL, vous arriverez sur un menu qui vous proposera les choix suivants :
1 | Création d'un Utilisateur | Permet de créer un utilisateur |
2 | Désactiver un Utilisateur | L’utilisateur ne pourra plus se connecter |
3 | Réactiver un Utilisateur | L’utilisateur pourra se connecter |
4 | Affecter un Quota à un Utilisateur | Limite la bande passante de l’utilisateur |
5 | Supprimer un Utilisateur | Efface l’utilisateur |
6 | Créer un Utilisateur FTP Primaire | Créé un Utilisateur « primaire » |
7 | Affecter un FTP primaire à un utilisateur | Créé les liens symboliques entre l’utilisateur et les ftp primaires |
8 | Quitter | Quitte le script |
Note : Lors de la création d’utilisateur, un test de connexion au serveur ftp sera automatiquement exécuté pour valider le fonctionnement et créer le répertoire local de l’utilisateur.
- Partage de fichier entre Samba, Docker et SELinux – 29/11/2017
- Mise à jour vers Windows 10 : Pas assez de mémoire vive… – 24/08/2015
- Améliorer les performances RAID – 15/05/2015