Serveur FTP VSFTPD avec TLS

But de l’installation

Le transfert de fichiers est un service réseau très courant. Le célèbre FTP comprend quand même un gros problème de sécurité car les logins et mot de passe sont diffusés en clair sur le réseau.

Un écoute avec ethereal par exemple peut vous donner pas mal d’informations comme le montre l’image suivante.
Capture Ethereal FTP

Pour contourner ce problème il faut crypter la connexion comme le fait http avec https, c’est à dire en ajoutant une couche SSL à la connexion. Cette implémentation de SSL se nomme TLS et est disponible pour FTP mais aussi pour POSTFIX, le serveur de mail.

Cet article va donc détailler la mise en place de TLS sur FTP pour créer un service FTPS.

Installation de VSFTPD ( VERY SECURE FTP DAEMON )

Si vous avez choisi lors de l’installation Serveur FTP, vous n’avez rien à faire, sinon, utilisez la commande yum pour installer le service.

yum -y install vsftpd

On l’active lors du démarrage du serveur :
chkconfig vsftpd on

On le démarre avec la commande service vsftpd start.

Configuration de base de vsftpd

On va déjà paramétrer vsftpd pour fonctionner comme serveur ftp « classique ».

Mes choix pour ce serveur sont les suivants :
– Pas de ftp anonyme, car ce serveur est d’usage purement privé.
– Je souhaite verrouiller certains comptes dans leur dossier personnel.

Ces choix sont personnels, rien ne vous empèche de créer un ftp public. Dans ce cas, sachez que le dossier public est /var/ftp.

Dans mon cas je dois éditer certaines valeurs que je vais commenter ci-dessous. Ces valeurs se trouvent dans le fichier de configuration de vsftpd, nommé /etc/vsftpd/vsftpd.conf.

Attention, je ne commente ici que les valeurs que je modifié. Les autres valeurs du fichier restent par défaut.


# Je ne veux pas de login anonyme
anonymous_enable=NO

# Je veux que mes utilisateurs locaux puissent se connecter
local_enable=YES

# Ils doivent pouvoir écrire
write_enable=YES

# Je modifie la banniere du service ftp
ftpd_banner=Bienvenue sur mon joli serveur FTP.

# Je veux spécifier une liste d'utilisateurs locaux
# devant être chrootés dans leur dossier personnel.
# Cela veut dire qu'il arrivent dans leur propre dossier
# et qu'ils ne peuvent en sortir.
# Cela s'obtient normalement en créant une liste des users
# chrootés avec les instructions chroot_list_enable=YES
# et chroot_list_file=/etc/vsftpd/chroot_list
#
# Je préfère que tous mes utilisateurs soient chrootés par défaut
# et spécifier explicitement qui ne doit pas l'être.
# Pour cela j'utilise chroot_local_user=YES,
# La liste que je vais créer devient alors la liste de ceux qui
# ne sont pas chrootés.
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

# Masque de création des fichiers par défaut.
# Je serai peut être amené à le modifier, mais pour
# l'instant il reste par défaut.
# Default umask for local users is 077.
# You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

Les 2 fichiers suivants ne sont pas indiqués dans la configuration par défaut mais sont importants car utilisés implicitement.

Ces fichiers sont user_list et ftpusers. Ils sont identiques car ftpusers est le fichier historique des utilisateurs ne pouvant pas se logguer en ftp, comme root par exemple et user_list de vsfpd a le même objectif.

Ils comportent en général les comptes système du serveur.

Le fichier user_list utilisé par vsftpd est intéressant, car comme l’indique son contenu, on peut l’utiliser de manière « inverse » à sa fonction primaire.

C’est à dire que si dans vsftpd.conf on indique userlist_deny=NO au lieu de userlist_deny=YES qui est la valeur implicite par défaut, on peut remplir ce fichier des utilisateurs pouvant se connecter au service ftp. Ce qui exclut par défaut tous les autres comptes d’utilisateurs.

Cela peut être pratique si l’usage du ftp est restreint à des webmasters par exemple.

Fichier /etc/vsftpd/user_list

# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

Fichier /etc/vsftpd/ftpusers

# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

Fichier /etc/vsftpd/chroot_list

L’usage de ce fichier est détaillé dans mon fichier de configuration vsftpd.conf.

# Utilisateurs pouvant se déplacer dans l'arborescence du serveur.
lrayssiguier
webmaster

Une fois les modifications faites, on recharge la configuration du service ftp et on peut tester après avoir créé deux comptes utilisateurs nommés laurent et lrayssiguier.


service vsftpd reload
useradd -s /sbin/nologin -c "Mon Utilisateur" laurent
passwd laurent
useradd -s /sbin/nologin -c "Utilisateur privilégié" lrayssiguier
passwd lrayssiguier

Vous remarquerez le shell défini à /sbin/nologin interdisant à ces utilistaurs de se connecter à la console du serveur ou en ssh.

Une fois les comptes et les mots de passe renseignés on lance nos tests :

Connexion annonyme :

[root@portable ~]# ftp localhost
Connected to localhost.localdomain.
220 Bienvenue sur mon joli serveur FTP.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): ftp
530 This FTP server does not allow anonymous logins.
Login failed.
ftp> quit
221 Goodbye.

La connexion est bien refusée comme souhaité.

Connexion de l’utilisateur laurent :

[root@portable ~]# ftp localhost
Connected to localhost.localdomain.
220 Bienvenue sur mon joli serveur FTP.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): laurent
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> quit
221 Goodbye.

L’utilisateur se connecte correctement et se trouve bloqué dans son dossier personnel.

Ceci est indiqué par le fait que l’utilisateur est à la racine / et ne peut donc pas se déplacer en dehors de son dossier.

Connexion de l’utilisateur lrayssiguier :

[root@portable ~]# ftp localhost
Connected to localhost.localdomain.
220 Bienvenue sur mon joli serveur FTP.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): lrayssiguier
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/lrayssiguier"
ftp> cd /
250 Directory successfully changed.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (127,0,0,1,212,123)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Mar 22 19:41 bin
drwxr-xr-x 4 0 0 1024 Mar 22 18:08 boot
drwxr-xr-x 11 0 0 3740 Mar 25 08:28 dev
drwxr-xr-x 89 0 0 12288 Mar 25 09:57 etc
drwxr-xr-x 4 0 0 4096 Mar 25 09:57 home
drwxr-xr-x 11 0 0 4096 Mar 25 09:36 lib
drwx------ 2 0 0 16384 Mar 22 18:52 lost+found
drwxr-xr-x 3 0 0 4096 Mar 22 18:32 media
drwxr-xr-x 2 0 0 4096 Feb 11 03:06 misc
drwxr-xr-x 2 0 0 4096 Feb 11 17:16 mnt
drwxr-xr-x 2 0 0 0 Mar 25 08:28 net
drwxr-xr-x 2 0 0 4096 Feb 11 17:16 opt
dr-xr-xr-x 114 0 0 0 Mar 25 09:27 proc
drwxr-x--- 16 0 0 4096 Mar 25 09:03 root
drwxr-xr-x 2 0 0 12288 Mar 22 19:42 sbin
drwxr-xr-x 2 0 0 4096 Mar 22 17:53 selinux
drwxr-xr-x 2 0 0 4096 Feb 11 17:16 srv
drwxr-xr-x 11 0 0 0 Mar 25 09:27 sys
drwxrwxrwt 10 0 0 4096 Mar 25 09:58 tmp
drwxr-xr-x 14 0 0 4096 Mar 22 18:02 usr
drwxr-xr-x 22 0 0 4096 Mar 24 19:20 var
226 Directory send OK.
ftp> quit
221 Goodbye.

On voit bien ici que l’utilisateur peut se déplacer sur le serveur comme il le ferait à la console de la machine. Les droits sur le système sont bien entendu liés aux droits du compte utilisateur unix.

Sécurisation SSL du serveur FTP

Création du certificat

Le cryptage SSL se base sur ce qu’on appelle un certificat.

Ce certificat peut être signé par une autorité reconnue comme VERISIGN, mais dans mon cas, je vais me créer un certificat auto-signé.

Cela va provoquer une alerte de sécurité lors de la connexion, mais ne gache en rien la sécurité apportée au transfert ftp.

Pour ce faire, je crée mon certificat comme suit :

cd /etc/vsftpd/
mkdir cert
cd cert/
openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.crt -out vsftpd.crt

Openssl va vous poser des questions servant à renseigner le certificat comme indiqué ci-dessous.


[root@portable cert]# openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.crt -out vsftpd.crt
Generating a 1024 bit RSA private key
............................................++++++
....................++++++
writing new private key to 'vsftpd.crt'


You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.


Country Name (2 letter code) [GB]:FR
State or Province Name (full name) [Berkshire]:MidiPyrénées
Locality Name (eg, city) [Newbury]:CASTRES
Organization Name (eg, company) [My Company Ltd]:Linuxtips
Organizational Unit Name (eg, section) []:Castres-Wireless
Common Name (eg, your name or your server's hostname) []:old.citoyendunet.org
Email Address []:l.rayssiguier@free.fr
[root@portable cert]#

Nous voila avec un beau certificat valable 730 jours.

Utilisation du certificat


chown root: /etc/vsftpd/cert/vsftpd.crt
chmod 600 /etc/vsftpd/cert/vsftpd.crt

On vérifie les droits donnés au certificat :

[root@portable cert]# ll
total 4
-rw------- 1 root root 2367 mar 25 11:16 vsftpd.crt

On force l’apartenance du certificat à root malgrès le fait que vsftpd utilise un compte nommé vsftpd durant son fonctionnement normal.

Cela est dû au fait qu’il démarre en tant que root, il lit le certificat et change ensuite l’utilisateur du processus.

Configuration de vsftpd

On ajoute à la fin du fichier /etc/vsftpd/vsftpd.conf le bloc suivant :

# On active SSL
ssl_enable=YES
# On refuse l'accès anonyme en ssl aussi
allow_anon_ssl=NO
# Les données peuvent passer non cryptées
force_local_data_ssl=NO
# Le login est par contre forcément en ssl
force_local_logins_ssl=YES
# On définit quelles versions de ssl/tls utiliser
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# On indique où se trouve le certificat
rsa_cert_file=/etc/vsftpd/cert/vsftpd.crt

On active les changements avec la commande service vsftpd reload.

Faisons un test en ligne de commande :

[root@portable cert]# ftp localhost
Connected to localhost.localdomain.
220 Bienvenue sur mon joli serveur FTP.
504 Unknown AUTH type.
504 Unknown AUTH type.
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): laurent
530 Non-anonymous sessions must use encryption.
Login failed.
ftp> quit
221 Goodbye.

La commande ftp à la console ne sait pas faire de ftps et le serveur nous refuse l'accès avant de taper le mot de passe.

Faisons un test avec GFTP :

Configuration GTFP

Attention ! Etant donné que nous avons un certificat auto-signé, pensez à décocher "Verify SSL Peer" dans le menu FTP, Options, Moteur SSL.

Connexion FTPS

Voila qui est bien, on est connecté en ftps...

Les clients qui supportent ssl

Sous Windows
- FileZilla
- SmartFtP option : "FTP over SSL Explicit”
- EngInSite DataFreeway : client ssh, ftp, dav, ftps

Sous Linux
- ftp-ssl - The FTP client with SSL or TLS encryption support
- gftp

Cette liste n'est pas exhaustive bien entendu.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.