Configurer et sécuriser un serveur FTP

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

 

 

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

 

 

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