HSC
Cabinet de consultants en sécurité informatique depuis 1989 - Spécialisé sur Unix, Windows, TCP/IP et Internet
Mode texte : accès au contenu de la page
Hervé Schauer Consultants
Vous êtes ici : Accueil > Ressources > Brèves > vsftpd
Accéder au : Site HSC des formations
Télécharger le catalogue des formations
Recherche :  
English version
   Services   
o Domaines de compétences
o Conseil & Expertise
o Prestations ISO 27001
o Audit & Évaluation
o Tests d'intrusion
o Tests de vulnérabilités (TSAR)
o Analyse Forensique
o Certification ARJEL
o Formations
o E-learning
   Conférences   
o Agenda
o Interventions passées
o Tutoriels
   Ressources   
o Index thématique
o Brèves
o Présentations
o Cours
o Articles
o Outils (téléchargement)
o Veille en vulnérabilité
   Société   
o Hervé Schauer
o Equipe
o Offres d'emploi
o Références
o Historique
o Partenariats
o Associations
   Presse et
 communication
 
 
o Newsletter HSC
o Bulletin juridique HSC
o Revue de presse
o Communiqués de presse
o Publications
   Contacts   
o Coordonnées
o Requêtes particulières
o Accès à nos locaux
o Hôtels proches de nos locaux
|>|vsftpd  

par Thomas Seyrat (10/06/2002)





--------------------------------[ vsftpd ]-------------------------------------


Cette brève présente un logiciel serveur FTP pour plate-forme Unix de plus,
léger, rapide, conçu élégamment avec une volonté d'en faire un logiciel
"sécurisé", en le conservant aussi simple que possible, et en séparant les
privilèges de fonctionnement de chacun des mécanismes du logiciel.

La tendance de développement des logiciels serveurs FTP à l'heure actuelle
(ProFTPd, PureFTPd, WU-FTPD, etc.) est plutôt à l'enrichissement incontrôlable
en fonctionnalités à l'utilité douteuse, avec les effets de bord qu'on connaît
(les trous de sécurité critiques dans WU, la consommation mémoire de ProFTPd,
la configuration inhumaine de glFtpD, etc.).

Dans ce document, nous allons simplement décrire l'installation de vsftpd et
sa mise en place progressive dans différentes configurations courantes.




--[ Installation ]-------------------------------------------------------------

Téléchargez tout d'abord la dernière version du logiciel depuis le site FTP
ftp://vsftpd.beasts.org/users/cevans/ . Une page web, où vous trouverez
de la promotion et des références pour vsftpd, ainsi que les documents écrits
par son auteur détaillant sa conception et son architecture est également
disponible sur http://vsftpd.beasts.org/ (ou http://www.vsftpd.org/ ).

L'installation, décrite dans le fichier INSTALL de la distribution source, est
simplissime : "make" à la racine du répertoire, et le fichier binaire "vsftpd"
est généré. La commande "make install" (en tant que root) installe ensuite
éventuellement l'exécutable dans /usr/local/sbin/, et les pages de manuel de
vsftpd(8) et vsftpd.conf(5) dans /usr/local/man/. Recopiez ensuite le fichier
de configuration fourni, vsftpd.conf, dans /etc.

vsftpd doit être lancé par un métadémon comme inetd ou xinetd. C'est un choix
délibéré de l'auteur de vsftpd de ne pas intégrer la gestion d'un mode
autonome, comme le permet ProFTPd, par exemple. Ça n'est pas particulièrement
gênant, un logiciel comme xinetd intègre toutes les fonctionnalités de contrôle
des connexions et des accès nécessaires, et un noyau moderne permet de mettre
facilement en oeuvre de la limitation de bande passante.

Dans le cas d'inetd, par exemple, une ligne comme celle-ci, ajoutée à
/etc/inetd.conf, et dans le cas où votre système fournit TCP-Wrappers, suffit :

ftp    stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/local/sbin/vsftpd

L'équivalent dans xinetd.conf serait :

service ftp
{
	socket_type     = stream
	protocol        = tcp
	wait            = no
	user            = root
	server          = /usr/local/sbin/vsftpd
}


Ensuite, veillez à ce que les utilisateurs "ftp" et "nobody" existent, avec un
répertoire pour l'utilisateur ftp, ainsi qu'un répertoire /usr/share/empty,
vide. Ces valeurs, dont nous allons constater l'utilité, pourront être
modifiées en les affinant si nécessaire dans la configuration.



--[ Configuration ]------------------------------------------------------------

Une fois le fichier de configuration vsftpd.conf placé dans /etc, les lignes
adéquates ajoutées dans la configuration du métadémon, et ce dernier rechargé,
vérifions les derniers points et connectons nous au serveur. Quelques détails
peuvent varier selon votre installation ou votre système.


$ id nobody
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

$ id ftp
uid=103(ftp) gid=103(ftp) groups=103(ftp)

$ ls -a /usr/share/empty/
./  ../

$ grep ^ftp /etc/inetd.conf 
ftp      stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/local/sbin/vsftpd

$ sudo kill -1 `cat /var/run/inetd.pid`



Il devrait déjà être possible de se connecter :

$ ftp localhost
Connected to localhost.
220 ready, dude (vsFTPd 1.0.0: beat me, break me)
Name (localhost:seyrat): ftp
331 Please specify the password.
Password:
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 


Nous sommes ici connectés en utilisateur anonyme, emprisonnés dans le
répertoire de celui-ci (~ftp dans ce cas). Il est impossible de se connecter à
ce stade en tant qu'utilisateur habituel de la machine, avec un login et un mot
de passe :

$ ftp localhost
Connected to localhost.
220 ready, dude (vsFTPd 1.0.0: beat me, break me)
Name (localhost:seyrat): seyrat
530 This FTP server is anonymous only.
Login failed.
ftp>

De même, la fonction d'upload n'est pas encore disponible :

$ ftp localhost
Connected to localhost.
220 ready, dude (vsFTPd 1.0.0: beat me, break me)
Name (localhost:seyrat): ftp
331 Please specify the password.
Password:
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put test
local: test remote: test
200 PORT command successful. Consider using PASV.
500 Unknown command.
ftp>


Vous le constatez, la configuration par défaut de vsftpd est particulièrement
restrictive :-)

Étudions-la de plus près. Le fichier de configuration fourni dans la
distribution source de vsftpd, vsftpd.conf, que vous devez avoir placé dans
/etc, est très court une fois toutes les lignes commentées et les explications
dissimulées :

[~/vsftpd-1.0.1]$ egrep -v '^(#|$)' vsftpd.conf
anonymous_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES


- anonymous_enable autorise l'accès anonyme au serveur (comportement par
	défaut).
- dirmessage_enable active l'affichage des fichiers .message à l'entrée dans
	les répertoires.
- xferlog_enable active un journal des téléchargements.
- connect_from_port_20 active (bien que ça ne soit pas le comportement par
	défaut du serveur) l'utilisation du port source 20 pour les PORT.


Les trois dernières directives ne sont là que pour outrepasser le comportement
par défaut du serveur, et le rendre un petit peu plus traditionnel, mais il est
amusant de remarquer que vsftpd est parfaitement capable de fonctionner en tant
que serveur FTP à accès anonyme en lecture uniquement, avec un fichier de
configuration entièrement vide.

Observons d'ailleurs le comportement des processus impliqués lors de
l'établissement de cette session :

En attente de mot de passe :

root      7111  0.1  0.3  2356  840 ?        S    18:17   0:00  \_ vsftpd
nobody    7112  0.0  0.3  2368  848 ?        S    18:17   0:00      \_ vsftpd


# ls -l /proc/7111/root
lrwxrwxrwx    1 root     root            0 Jun 10 18:17 /proc/7111/root -> //

# ls -l /proc/7112/root
lrwxrwxrwx    1 root     root            0 Jun 10 18:17 /proc/7112/root -> /usr/share/empty/



Le processus lancé initialement par inetd, avec les "pleins pouvoirs"
(fonctionnement root non mis en cage) sert de maître pour contrôler les
invocations des différents processus vsftpd qui couvrent le déroulement d'une
session donnée (authentification/transferts/fermeture). Ainsi il n'est pas
celui en attente de l'authentification, mais laisse agir son fils qui, lui, a
été lancé de manière restreinte dans le répertoire vide /usr/share/empty/ en
tant qu'utilisateur non privilégié.

Une fois l'authentification passée, le processus principal lance le processus
chargé du contrôle de la session de l'utilisateur authentifié, en le
restreignant à son identité (ici ftp) et à son répertoire personnel (soit
/home/ftp). Ensuite, le processus "maître" (ici 7111), qui n'a plus de raison
de conserver son privilège root et sa racine commune à celle du système
restreint sa racine et cède son identité pour une non privilégiée (on dit
parfois qu'il "s'automutile") :

nobody    7111  0.0  0.3  2368  864 ?        S    18:17   0:00  \_ vsftpd
ftp       7119  0.0  0.3  2392  896 ?        S    18:18   0:00      \_ vsftpd


# ls -l /proc/7111/root
lrwxrwxrwx    1 root     root            0 Jun 10 18:18 /proc/7111/root -> /usr/share/empty/

# ls -l /proc/7119/root
lrwxrwxrwx    1 root     root            0 Jun 10 18:18 /proc/7119/root -> /home/ftp/




À ce stade, nous n'avons qu'un serveur FTP anonyme sans possibilité d'upload.
En ajustant la configuration, rendons ce serveur disponible pour les
utilisateurs locaux de la machine, sans accès anonyme cette fois : on modifie
une ligne de configuration, à la place de :

anonymous_enable=YES

on place :

local_enable=YES

Et on désactive l'accès anonyme en spécifiant explicitement :
anonymous_enable=NO

Cette fois-ci, une connexion non-anonyme fonctionne :

$ ftp localhost
Connected to localhost.
220 ready, dude (vsFTPd 1.0.0: beat me, break me)
Name (localhost:seyrat): 
331 Please specify the password.
Password:
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

Toutefois ...

ftp> put engel.png
local: engel.png remote: engel.png
200 PORT command successful. Consider using PASV.
500 Unknown command.

Impossible d'uploader ... Il suffit de décommenter la ligne

#write_enable=YES

de la configuration. Et l'upload est maintenant possible :

ftp> put test
local: test remote: test
200 PORT command successful. Consider using PASV.
150 Go ahead make my day^W^W^Wsend me the data.
226 File receive OK.


Par défaut les utilisateurs (même non-anonymes) sont placés en cage dans leur
répertoire personnel par la directive implicite chroot_local_user=YES. En
spécifiant ensuite :

chroot_list_enable=YES

et

chroot_list_file=/etc/vsftpd.chroot_list

les utilisateurs dont les logins seront contenus dans /etc/vsftpd.chroot_list
ne seront -pas- mis en cage. Si chroot_local_user est à NO, la liste contient
les utilisateurs qui doivent l'être, au contraire.

Il existe de la même manière une directive userlist_enable (associée à
userlist_deny et userlist_file) pour autoriser ou interdire explicitement
les connexions de certains utilisateurs locaux.



La configuration d'une zone d'upload pour un utilisateur anonyme est également
simple. Par défaut, l'utilisateur anonyme ne peut pas écrire de fichiers sur
le serveur : il est nécessaire dans un premier temps d'activer la directive de
configuration :

anon_upload_enable=YES

Voire, pour lui permettre également de créer des répertoires :

anon_mkdir_write_enable=YES


Il est de plus nécessaire de procurer des permissions correctes au répertoire
utilisé pour les uploads. Il est nécessaire que celui-ci soit en effet
disponible en écriture pour l'utilisateur gérant la session anonyme
(ftp dans nos exemples), sans pour autant faire en sorte que l'utilisateur ftp
possède le répertoire. Ainsi, on positionne les droits d'écriture pour la
catégorie "autres", ou, mieux, pour un groupe dédié auquel seul appartient
l'utilisateur "ftp". Ainsi :

$ ls -ld ~ftp/upload
drwxrwxr-x    2 root     ftp          4096 Jun 18 15:12 /ftp/upload/

Et, en cas d'upload de fichier :

ftp> pwd
257 "/upload"
ftp> put todo
local: todo remote: todo
200 PORT command successful. Consider using PASV.
150 Go ahead make my day^W^W^Wsend me the data.
226 File receive OK.
40 bytes sent in 0.00 secs (558.0 kB/s)
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-------    1 103      101            40 Jun 18 13:27 todo
226 Directory send OK.
ftp> delete todo
500 Unknown command.


Il ne sera pas possible d'écrire par dessus ce fichier. Plus intéressant, il
n'est pas non plus possible par défaut de le télécharger depuis cet emplacement.
Pour se faire, il faut changer le umask de l'utilisateur anonyme à l'aide de
anon_umask, avant de réaliser les uploads.


Il est également possible de restreindre plus encore les privilèges d'exécution
du processus vsftpd non privilégié (lancé au moment de l'attente
d'authentification puis lors de l'automutilation) en lui dédiant un utilisateur
(par défaut nobody). Il suffit de créer cet utilisateur non-privilégié (par
exemple vsftpd) et de le spécifier par la directive nopriv_user=vsftpd. De
même, la racine vide dans cette situation (par défaut /usr/share/empty) peut
être spécifiée par secure_chroot_dir.



	Thomas Seyrat <Thomas.Seyrat@hsc.fr>



-------------------------------------------------------------------------------
$Id: vsftpd.tip,v 1.6 2002/10/11 13:44:33 seyrat Exp $



Dernière modification le 12 novembre 2003 à 13:55:01 CET - webmaster@hsc.fr
Mentions légales - Informations sur ce serveur - © 1989-2013 Hervé Schauer Consultants