Je souhaitais installer, configurer et sécuriser un serveur FTP : voilà donc un nouveau mémo détaillant cette manipulation avec proftpd. Notre serveur FTP devra autoriser la connexion d’utilisateurs virtuels enfermés (chroot) dans un dossier. Le serveur FTP devra aussi leur permettre d’accéder à des ressources présentes sur d’autres disques.
Configurer et sécuriser un serveur FTP : installation de proftpd
Commençons donc par installer le logiciel proftpd
sudo apt-get install proftpd-basic
Lors du processus d’installation, vous allez devoir choisir entre un serveur inetd ou standalone. Si vous choisissez inetd, le serveur ne se lancera que si une connexion FTP est initiée, si vous choisissez standalone le daemon tournera en permanence. Vu la puissance actuelle des machines, on peut tranquillement choisir le mode standalone
Configurer et sécuriser un serveur FTP : Ajout d’un utilisateur virtuel
Pas question d’ajouter un utilisateur système pour chaque personne ayant besoin d’accèder à ce serveur FTP, il faut donc créer des utilisateurs virtuels. Accessoirement nous souhaitons que ces utilisateurs n’aient accès à aucun shell. Nous allons créer configurer un « faux shell » nommé /bin/false
Commençons par lister les shells disponibles sur notre serveur via la commande suivante
cat /etc/shell
Dans mon cas voici le résultat
root@noobunbox:~$ cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash
Le shell /bin/false n’étant pas disponible, nous allons l’ajouter, il suffit d’editer le fichier /etc/shells
sudo nano /etc/shells
pour y ajouter l’entrée suivante
/bin/false
Cette étape terminée nous allons pouvoir configurer notre utilisateur virtuel via la commande ftpasswd. Quelques explications sur les options que nous allons utilisés
- sha512 : nous permet d’utiliser l’algorithme sha512 à la place de md5
- uid & gid : il faut spécifier un user identifier et groupe identifier pour chaque utilisateur virtuel
- file : le fichier contenant les données utilisateurs
- home : le répertoire dans lequel notre utilisateur virtuel se connectera
- shell: le shell que notre utilisateur peut utiliser
ftpasswd --passwd --name=mon-utilisateur --sha512 --uid=800 --gid=800 --file=/etc/proftpd/ftpd.passwd --home=/srv/ftp/ --shell=/bin/false
Configurer et sécuriser un serveur FTP : Génération d’un certificat SSL
Créons le dossier qui contiendra notre certificat ainsi que la clé privée
sudo mkdir /etc/proftpd/ssl sudo chmod 600 /etc/proftpd/ssl/ && cd /etc/proftpd/ssl
Générons une clé privée un CSR et signons notre certificat
sudo openssl ecparam -genkey -name secp384r1 > ftp-key-p384.pem sudo openssl req -new -key ftp-key-p384.pem -out csr.pem sudo openssl req -x509 -days 3650 -key ftp-key-p384.pem -in csr.pem -out certificate.pem
Maintenant protégeons ces fichiers
sudo chmod 400 ftp-key-p384.pem csr.pem sudo chmod 600 certificate.pem
Configurer et sécuriser un serveur FTP : configuration générale de protftpd
Nous pouvons maintenant modifier la configuration générale de proftpd,
sudo nano /etc/proftpd/proftpd.conf
De nombreuses options y sont définies. Voici celle que vous devez modifier / configurer :
- ServerIdent off – pas la peine que des petits malins puissent identifier la version de proftpd que vous utilisez
- Servername « Votre Serveur » – donnez un nom à votre serveur
- AuthUserFile /etc/proftpd/ftpd.passwd – Indispensable pour que votre serveur puisse accepter les connexions de vos utilisateurs virtuels
- DefaultRoot ~ – Indispensable pour que les utilisateurs ne puissent pas se balader partout sur votre serveur
- Port 21 – Je vous conseille de modifier le port d’écoute par défaut
- PassivePorts 1234 1234 – Indiquer un range de ports (ex 30100 30200) utilisé pour le mode PASV. Pour plus d’infos sur le mode passif, cliquez ici
- Include /etc/proftpd/tls.conf – indispensable puisque nous allons configurer et sécuriser le protocole FTPS
Assurez vous donc que les entrées suivantes soient présentes dans votre fichier de configuration, tout en les modifiant à votre convenance :
ServerIdent off ServerName "noobunbox.net" AuthUserFile /etc/proftpd/ftpd.passwd DefaultRoot ~ Port 34555 PassivePorts 30100 30200 Include /etc/proftpd/tls.conf
Configurer et sécuriser un serveur FTP : configuration SSL
Nous n’allons pas seulement configurer proftpd pour qu’il utilise le certificat que nous avons généré précédemment, nous allons aussi configurer correctement le protocole FTPS c’est à dire :
- N’autoriser que les connexions sécurisées
- N’autoriser que les connexions via le protocole TLS 1.2
- Utiliser des ciphers sécurisés
- Utiliser le chiffrement implicite
Petite parenthèse avant de continuer : vous avez surement remarquer que lorsque vous configuriez une connexion FTPS dans votre client préféré vous aviez le choix entre le chiffrement explicite et implicite. Le chiffrement implicite permet de n’autoriser que les connexions chiffrées dès l’établissement de la connexion.
Modifions le fichier contenant la configuration du protocole FTPS
sudo nano /etc/proftpd/tls.conf
Que nous configurons de la manière suivante
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol TLSv1.2 TLSCipherSuite EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES; TLSOptions UseImplicitSSL TLSRSACertificateFile /etc/proftpd/ssl/certificate.pem TLSRSACertificateKeyFile /etc/proftpd/ssl/ftp-key-p384.pem TLSVerifyClient off TLSRequired on </IfModule>
Vous pouvez maintenant redémarrer le service proftpd et vous connectez avec votre utilisateur.
Voici comment il faudrait configurer la connexion avec le client FileZilla
Configurer et sécuriser un serveur FTP : partage de dossiers
Lorsque j’ai voulu partager des dossiers avec mes utilisateurs virtuels je dois dire que j’ai eu un peu de mal. Je souhaitais que ces utilisateurs aient assez à des ressources stockées sur plusieurs disques et partages réseaux.
Par exemple vous souhaiteriez partager :
- vos images stockées dans /home/utilisateur/images
- des vidéos stockées sur un disque /media/disk01/videos
- des fichiers stockés sur un nas monté dans /media/synology/docs
Si vous créez des liens symboliques dans le home de vos utilisateurs (ici /srv/ftp) cela ne fonctionnera pas. Les liens symbolique seront visibles, mais lorsque vos utilisateurs tenteront de naviguer dans des sous dossiers ou télécharger des fichiers l’erreur 550 s’affichera.
Il faudra donc monter ces dossiers dans /srv/ftp via la commande
mount --bind
Dans notre exemple voici ce que cela donnerait :
Commençons par créer les dossiers dans lesquels nous monterons nos dossiers partagés
cd /srv/ftp sudo mkdir docs images videos
Montons maintenant nos dossiers
mount --bind /home/utilisateur/images images mount --bind /media/disk01/videos videos mount --bind /media/synology/docs
Pour que ces partages soient permanents il vous faudra ajouter les entrées suivantes au fichier /etc/fstab
A noter qu’il faudra ajouter l’option _netdev pour chaque mount bind d’une ressource réseau.
## Partage FTP /home/utilisateur/images images none bind 0 0 /media/disk01/videos videos none bind 0 0 /media/synology/docs docs none _netdev,bind 0 0
Salute,
Pourquoi tu as choisi proftpd ? Je pense notamment à vsftpd qui est reconnu très sécurisé.
Merci, Tcho !
Salut Cascador
En fait j’avais besoin de mettre en place rapidement un FTP, et je me suis tourné vers proftpd que j’avais déjà utilisé auparavant 🙂
Je regarderais vsftpd et je mettrais surement à jour le billet 🙂
Hello,
Je suis du même avis que Cascador, j’utilisais ProFTPD avec Suse Linux il y a plus de 15 ans maintenant je crois et j’utilise désormais (en environnement de production notamment) vsftpd qui est plutôt léger/sécurisé et permet l’utilisation d’utilisateur virtuel assez facilement.
En passant, attention à la faille CPTO : https://hehackedmy.wordpress.com/2016/04/21/proftpd-attention-a-la-faille-cpto/
Salut Tetsumaki 🙂
Tu peux être sur que j’ajouterai une partie concernant vsftpd,
Par contre concernant la faille CPTO, sa détection se fait par telnet, or je crois qu’on ne peut pas se connecter via telnet a un serveur FTPS.
Sans shell impossible pour un utilisateur d’utiliser des commandes 🙂 enfin normalement