Vous êtes sur la page 1sur 9

Humeurs : J'aime Linux, identi.ca, zabbix, ...

--|-- Mon stage dans une Socit de


Services en Logiciels Libres

Installation et paramtrage de vsftpd


Cet article a t publi par Benjamin le 02-04-09 13:24 dans la catgorie Serveur
Tags : - Libre - Serveur - Ubuntu
Bonjour tous, comme vous le savez maintenant, j'ai dcid de bientt passer
l'auto-hbergement. Cependant, avant de me lancer comme a dans cette grande
aventure, je fais tous les tests possibles et imaginables sur une machine locale qui
fait donc office de serveur temporaire.
J'ai

donc

tout

d'abord

mis

en

place

vsftpd

Contexte
Dans cet article, je vais vous prsenter la mise en place d'un serveur vsftpd. Je
tiens tre clair ds le dbut, je ne vais vous prsenter que ce que j'ai mis en place,
je ne dtaillerais pas toutes les possibilits de ce serveur FTP.
Pour rsumer voici ce dont j'avais besoin :

Un compte FTP par compte UNIX sur ma machine (pas de comptes


"virtuels"), pour avoir un compte FTP, un client doit avoir un compte UNIX sur
mon serveur

Le client sera chroot dans son /home. C'est dire qu'un client qui se
connectera sera "bloqu" dans son rpertoire personnel et ne pourra pas
remonter l'arborescence du serveur (pour des raisons videntes de scurit).

Les connexions anonymes seront interdites, mme en lecture

La connexion se fera via SSL pour ne pas faire transiter les mots de passe en
clair sur le rseau

Voila pour le "cahier des charges", maintenant place la prsentation.


I. Prsentation

VsFTPd (pour Very secure FTPd) est un serveur FTP conu avec la problmatique
d'une scurit maximale. Contrairement aux autres serveurs FTP (ProFTPd,
PureFTPd, etc.), aucune faille de scurit n'a jamais t dcele dans VsFTPd.
Ce serveur est notamment utilis grande chelle par des entreprises telles que Red
Hat. (source)
Je suis un parano de la scurit (oui je vais quand mme autoriser des centaines de
connexions quotidiennes chez moi), il me semblait donc trs important d'utiliser un
serveur FTP "scuris". J'ajoute "scuris" car le protocole FTP, par dfinition, n'est
pas scuris. Nanmoins, cela me rassure un peu plus d'utiliser vsftpd :)
II. Installation
Comme toujours, l'installation est trs simple puisque vsftpd est inclus dans les
dpts officiels des principales distributions. Pour les distributions Ubuntu ou Debian,
il vous suffit de taper cette commande :
apt-get install vsftpd

Voila, votre serveur FTP est dj install.


III. Configuration
Pour la configuration de vsftpd, j'ai dcid de vous fournir tout mon fichier de
configuration, avec en gras, les modifications que j'ai apportes et les commentaires
correspondants. Ce qui n'est pas en gras est donc thoriquement votre fichier de
configuration actuel. Je dis thoriquement car mon serveur de test est sous Debian
Lenny et non pas sous Ubuntu.
Vous pouvez videmment remplacer votre fichier de configuration par dfaut par le
mien (en prenant soin de sauvegarder l'original auparavant ( sudo cp
/etc/vsftpd.conf /etc/vsftpd.old)), vous n'aurez qu'a modifier les dernires lignes
(pasv_**) que je dtaille plus bas.
#
Example
config
file
/etc/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
#
Please
see
vsftpd.conf.5
for
all
compiled
in
defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
#
capabilities.

#
#
# Run standalone? vsftpd can run either from an inetd or as a standalone
#
daemon
started
from
an
initscript.
listen=YES
#
#
Run
standalone
with
IPv6?
# Like the listen parameter, except vsftpd will listen on an IPv6 socket
# instead of an IPv4 one. This parameter and the listen parameter are mutually
#
exclusive.
#listen_ipv6=YES
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
#
#
Uncomment
this
to
allow
local
users
to
log
in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
#
Fichier
des
users
userlist_file=/etc/vsftpd/user_list
# Si vous n'avez pas encore cr ce fichier, excutez ces commandes : mkdir
/etc/vsftpd
puis
# J'ajoute tous les utilisateurs du systme dans ce fichier (grce cette
commande
:
# less /etc/vcat /etc/passwd |cut -d: -f1 > /etc/vsftpd/user_list) et je commente
les
users
AUTORISES
#
Chargement
de
la
liste
userlist_file
userlist_enable=YES
# On refuse tous les utilisateur de la liste (vous devez donc commenter
explicitement
les
utilisateurs
autoriss

se
connecter)
userlist_deny=YES
#
Nombre
maximum
de
connexion
simultanes
max_clients=30
# Nombre maximum de connexion venant de la mme adresse IP
max_per_ip=4
# 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
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=NO
#
# Uncomment this if you want the anonymous FTP user to be able to create
#
new
directories.
anon_mkdir_write_enable=NO
#
# Activate directory messages - messages given to remote users when they
#
go
into
a
certain
directory.
dirmessage_enable=YES
#
#
Activate
logging
of
uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
#
recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
#
below.
#xferlog_file=/var/log/vsftpd.log
#
# If you want, you can have your log file in standard ftpd xferlog format
#xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the

# ftp server can use as a totally isolated and unprivileged user.


#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
#
however,
may
confuse
older
FTP
clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
#
mangling
on
files
when
in
ASCII
mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
#
raw
file.
#
ASCII
mangling
is
a
horrible
feature
of
the
protocol.
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
#
You
may
fully
customise
the
login
banner
string:
ftpd_banner=Welcome
to
Benj's
FTP
service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
#
useful
for
combatting
certain
DoS
attacks.
#deny_email_enable=YES
#
(default
follows)
#banned_email_file=/etc/vsftpd.banned_emails
#
# You may restrict local users to their home directories. See the FAQ for
#
the
possible
risks
in
this
before
using
chroot_local_user
or
#
chroot_list_enable
below.
chroot_local_user=YES
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
#
users
to
NOT
chroot().
#chroot_list_enable=YES
#
(default
follows)
#chroot_list_file=/etc/vsftpd.chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by

# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
#
#
#
Debian
customization
#
# Some of vsftpd's settings don't fit the Debian filesystem layout by
#
default.
These
settings
are
more
Debian-friendly.
#
# This option should be the name of a directory which is empty. Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
#
access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
#
encrypted
connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
pasv_enable=YES
pasv_promiscuous=NO
pasv_min_port=40000
pasv_max_port=40100
pasv_address=mon_futur_site.com
pasv_addr_resolve=YES
port_promiscuous=NO
Je vais m'attarder sur ces derniers paramtres que j'ai ajout : les pasv_******. Ayant
moi mme eu un peu de mal tout cerner, j'ai dcid de tout reprendre dans cet
article. Je prcise que ces lignes sont ncessaires si vous souhaitez rendre
disponible votre serveur FTP l'exterieur.
Avant tout, si vous ne connaissez pas la diffrence entre le FTP actif et le FTP passif,
allez lire cet article de NicoLargo qui explique trs bien cette diffrence, ensuite vous
pouvez revenir ;)

Je vous ajoute le deuxime schma de NIcolargo ii pour plus de facilit pour la suite
de la lecture
Bien, dsormais je vais reprendre mes lignes pasv_ et vous les expliquer.

pasv_enable=YES : On active le mode passif (pour autoriser les connexions


extrieures), voir schma ci-dessus.

pasv_promiscuous=NO : Par scurit, vrifie que la machine qui a demand


la connexion au serveur (flche rouge) est bien la mme que celle qui
demande recevoir les donnes (flche verte).

pasv_min_port=40000, pasv_max_port=40100 : Les plages de ports


utilisables par le client ( remplacer sur le schma TCP/1024-65534 (en bleu)
par TCP/40000-401000 pour correspondre avec mon exemple). Vous pouvez
modifier ces valeurs.

pasv_address=X.X.X.X : L vous avez deux solutions, soit vous renseignez


votre adresse IP (adresse IP publique), soit vous mettez le nom de domaine
par lequel ce serveur FTP sera accessible.

pasv_addr_resolve=YES : Cette ligne est utile uniquement si vous avez mis


un nom de domain ci-dessus

port_promiscuous=NO : Assure que les donnes sortantes du serveur ne


peuvent se connecter qu'au client qui en a fait la demande (et pas sur un autre
port)

Bien sr, si vous tes derrire un routeur ou une *box, il vous faudra dbloquer les
ports 21 (pour la flche rouge) et les ports 40000 40100 (pour la flche verte).
Dsormais, votre serveur FTP sera accessible depuis l'extrieur.
IV. Scurisation

Comme je vous l'ai dit prcdemment, le protocole FTP n'est pas scuris (car c'est
un protocole ancien). Par dfaut, les mots de passe circulent en clair sur le rseau.
Pour vous le prouver, voici une analyse de trame pendant une connexion FTP :

Nous voyons clairement que l'utilisateur benj se connecte avec le mot de passe
"topsecret123". Ces donnes sont accessible par n'importe qui... Voici donc une belle
preuve de la faiblesse de ce protocole.
Pour palier ce soucis, nous allons devoir encapsuler FTP dans du SSL afin de
crypter la connexion (on appelle cela FTPS). Pour cela, il y a deux tapes, une
premire consiste crer un certificat SSL et une deuxime consiste paramtrer
vsftpd pour qu'il n'autorise que les connexions en SSL (source).

Cration du certificat

Dans un terminal, tapez cette commande (il est possible que vous deviez installer
openssl auparavant: apt-get install openssl) :
openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.pem -out
vsftpd.pem

Vous devez ensuite renseigner quelques champs, ils ne sont pas particulirement
importants excpts celui-ci :
Common Name (eg, YOUR name) []:
L, vous devez taper l'adresse IP publique de votre serveur FTP (ou le nom de
domaine).
Maintenant il ne vous reste plus qu'a copier le fichier gnr dans le rpertoire
/etc/ssl/certs/. Pour cela, utilisez cette commande :
cp vsftpd.pem /etc/ssl/certs/

Scurisons dsormais ce certificat :


sudo chown root:root /etc/ssl/certs/vsftpd.pem
sudo chmod 600 /etc/ssl/certs/vsftpd.pem

Modification des paramtres de vsftpd

Il vous suffit d'ajouter ces lignes dans votre fichier de configuration :


ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
Redmarrez votre serveur via cette commande :
sudo /etc/init.d/vsftpd restart

Vous pouvez dsormais vous connecter avec un client compatible SSL (par
exemple ftp-ssl). Les donnes sont maintenant cryptes :

P.S : Si vous obtenez une erreur 500 Illegal PORT command, c'est parce que vous
n'avez pas dit votre client qu'il faut utiliser le mode passif. Pour cela, ajoutez le
paramtre -P pour la commande ftp-ssl.
Voila, j'en ai fini avec cet article, si vous pensez que je n'ai pas parl de certaines
choses qui vous semblent intressantes, merci de ma le signaler :) Je reste
galement disposition pour d'ventuelles questions.
bientt !