Personal tools
You are here: Home GNU / Linux Debian 4.0 Etch Installer le serveur FTP vsFTPd sur Debian
Document Actions
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Installer le serveur FTP vsFTPd sur Debian

by Pierre-Yves Landuré last modified 2011-02-16 14:59

vsFTPd est un serveur FTP conçu dans l'optique de la sécurité et de la rapidité. Il est très performant, supporte de nombreuses options, et est relativement simple à mettre en place. Ce guide vous explique comment le mettre en place sur Debian.

Ce guide a été testé avec les distributions suivantes :

  • Debian 4.0 Etch
  • Debian 5.0 Lenny
  • Debian 6.0 Squeeze

Pré-requis

Ce guide nécessite un serveur MySQL disposant du script mysql-tools disponible dans le guide Installer et configurer MySQL sur Debian.

Paramètres

Renseignez le nom de domaine ou sera disponible le serveur FTP :

DOMAIN="ftp.domaine-exemple.fr"

Renseignez le nom d'hôte de votre serveur MySQL (si vous ne savez pas de quoi il s'agit, ne modifiez pas cette valeur) :

MYSQL_HOST="localhost"

Si votre serveur MySQL n'est pas local, ce guide effectuera une connexion SSH pour y créer la base de données.

Installation

Installez les logiciels nécessaires:

command apt-get install vsftpd fail2ban mysql-client libpam-mysql openssl apg

Activez la protection de vsFTPd par Fail2Ban:

command sed -i \
    -e '/\[vsftpd\]/, /filter/ {0,/^enabled.*/ s//enabled = true/ }' \
  /etc/fail2ban/jail.conf

Redémarrez Fail2Ban pour prendre en compte cette configuration:

/etc/init.d/fail2ban restart

Choisissez l'utilisateur et le groupe du serveur FTP. Par exemple, utilisez www-data si vous souhaitez que votre serveur FTP puisse modifier les fichiers créés par votre serveur HTTP (et inversement) :

FTP_USER="www-data"
FTP_GROUP="www-data"

Créez l'utilisateur et le groupe choisis si nécessaire :

if [ -z "$(command grep "^${FTP_GROUP}" '/etc/group')" ]; then
  command addgroup --system "${FTP_USER}"
fi
if [ -z "$(command grep "^${FTP_USER}" '/etc/passwd')" ]; then
  command adduser --system --shell /bin/sh --home /var/lib/ftp --ingroup "${FTP_GROUP}" "${FTP_USER}"
fi

Création de la base de données

Créez la base de données :

if [ "${MYSQL_HOST}" = "localhost" ]; then
  MYSQL_PARAMS=$(command mysql-tools create-domain-db "${DOMAIN}")
else
  command echo "Saisissez le mot de passe de l'utilisateur root MySQL :"
  command read PASSWORD
  MYSQL_PARAMS=$(command ssh "root@${MYSQL_HOST}" "command mysql-tools create-domain-db '${DOMAIN}' '$(command cat /etc/mailname)' '${PASSWORD}'")
fi

Récupérez les paramètres de la nouvelle base de données :

MYSQL_DB="$(echo "${MYSQL_PARAMS}" | command grep -e "^MYSQL_DB" \
    | cut --delimiter="=" --fields="2-")"
MYSQL_USER="$(echo "${MYSQL_PARAMS}" | command grep -e "^MYSQL_USER" \
    | cut --delimiter="=" --fields="2-")"
MYSQL_PASSWORD="$(echo "${MYSQL_PARAMS}" | command grep -e "^MYSQL_PASSWORD" \
    | cut --delimiter="=" --fields="2-")"
echo "${MYSQL_PARAMS}"

Initialisez le contenu de la base de données :

command wget 'http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-le-serveur-ftp-vsftpd-sur-debian-4-0-etch/vsftpd.sql' \
    --output-document='/tmp/vsftpd.sql'
command mysql --user="${MYSQL_USER}" --password="${MYSQL_PASSWORD}" --host="${MYSQL_HOST}" "${MYSQL_DB}" \
    < '/tmp/vsftpd.sql'

Configuration de vsFTPd

Configurez vsFTPd pour prendre en compte la base de données et le certificat SSL:

command sed -i -e 's/^[#]*\(anonymous_enable=\).*/\1NO/' \
            -e 's/^[#]*\(local_enable=\).*/\1YES/' \
            -e 's/^[#]*\(write_enable=\).*/\1YES/' \
            -e 's/^[#]*\(local_umask\)=.*/\1=022/' \
            -e 's/^[#]*\(dirmessage_enable=\).*/\1YES/' \
            -e 's/^[#]*\(xferlog_enable=\).*/\1YES/' \
            -e 's/^[#]*\(connect_from_port_20=\).*/\1YES/' \
            -e "s/^[#]*\(nopriv_user=\).*/\1${FTP_USER}/" \
            -e 's/^[#]*\(chroot_local_user=\).*/\1YES/' \
            -e 's/^[#]*\(secure_chroot_dir=\).*/\1\/var\/run\/vsftpd/' \
            -e 's/^[#]*\(pam_service_name=\).*/\1vsftpd/' \
         /etc/vsftpd.conf

Nous ajoutons les options qui ne sont pas déjà présentes dans le fichier de configuration:

command echo "
# Virtual Users configuration
guest_enable=YES
guest_username=${FTP_USER}
local_root=/var/lib/ftp/\$USER
user_sub_token=\$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd.d" \
    >> /etc/vsftpd.conf

Créez le dossier destiné à contenir les configurations spécifiques des utilisateurs:

command mkdir /etc/vsftpd.d

Pour plus d'information, voici un extrait du manuel de vsFTPd:

user_config_dir
This powerful option allows the override of any config option specified in the manual page, on a per-user basis. Usage is simple, and is best illustrated with an example. If you set user_config_dir to be /etc/vsftpd_user_conf and then log on as the user "chris", then vsftpd will apply the settings in the file /etc/vsftpd_user_conf/chris for the duration of the session. The format of this file is as detailed in this manual page! PLEASE NOTE that not all settings are effective on a per-user basis. For example, many settings only prior to the user's session being started. Examples of settings which will not affect any behviour on a per-user basis include listen_address, banner_file, max_per_ip, max_clients, xferlog_file, etc.

    Default: (none)

Configurez la section de PAM pour vsFTPd:

command sed -i -e 's/^\(.*\)$/#\1/' '/etc/pam.d/vsftpd'
command echo "# MySQL configuration for vsFTPd.
auth required pam_mysql.so user=${MYSQL_USER} passwd=${MYSQL_PASSWORD} host=${MYSQL_HOST} db=${MYSQL_DB} table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=${MYSQL_USER} passwd=${MYSQL_PASSWORD} host=${MYSQL_HOST} db=${MYSQL_DB} table=accounts usercolumn=username passwdcolumn=pass crypt=2" \
    >> /etc/pam.d/vsftpd

Redémarrez vsFTPd pour prendre en compte la configuration:

/etc/init.d/vsftpd restart

Chiffrer les transferts de données

Si vous souhaitez maximiser la confidentialité de vos données, vous pouvez configurer le serveur FTP pour chiffrer les données transférées. Cela se fait au détriment de la vitesse de transfert, car les données chiffrées sont beaucoup plus volumineuse que leur équivalent en clair.

Création du certificat SSL

Créez le certificat SSL correspondant au nom de domaine de votre serveur FTP en suivant mon guide:

Créer un certificat SSL multi-domaines

Une fois le certificats créé, renseignez le nom des fichiers :

KEY_FILE="/etc/ssl/private/ftp_key.pem"
CERT_FILE="/etc/ssl/certs/ftp_cert.cert"
Assurez-vous que les permissions de la clef privé sont minimalistes :
command chown root:root "${KEY_FILE}"
command chmod go-rwx "${KEY_FILE}"

Configuration de vsFTPd

Configurez vsFTPd pour prendre en compte la base de données et le certificat SSL:

command sed -i -e "s|^[#]*\(rsa_cert_file=\).*|\1${CERT_FILE}|" \
         '/etc/vsftpd.conf'

Ajoutez les options qui ne sont pas déjà présentes dans le fichier de configuration:

/bin/echo "
# SSL configuration
ssl_enable=YES
rsa_private_key_file=${KEY_FILE}
ssl_tlsv1=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
require_ssl_reuse=NO" \
    >> /etc/vsftpd.conf

Redémarrez vsFTPd pour prendre en compte la configuration:

/etc/init.d/vsftpd restart

Mode passif derrière un routeur NAT

Si votre serveur FTP se trouve derrière un routeur NAT, vous devez spécifier l'intervale de ports à utiliser pour le mode passif.

PASV_MIN_PORT=34560
PASV_MAX_PORT=35324

Vous devez aussi spécifier l'adresse IP de votre routeur sur Internet (l'adresse IP fixe que vous a donné votre fournisseur d'accès). Pour l'obtenir, vous pouvez utiliser la commande suivante :

PASV_ADDRESS=$(command wget --quiet http://www.monip.org/ -O- \
    | command grep "IP :" | /usr/bin/cut --characters=-80 \
    | command sed -e 's/^.* \(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/')

Source : Merci au Labo Linux de Supinfo pour l'article Connaître son IP public derrière un routeur.

Une fois ceci fait, appliquez la configuration:

command echo "# Passive connections through NAT.
pasv_address=${PASV_ADDRESS}
pasv_min_port=${PASV_MIN_PORT}
pasv_max_port=${PASV_MAX_PORT}" \
    >> /etc/vsftpd.conf

Vous pouvez maintenant redémarrer votre serveur FTP pour prendre en compte la configuration:

/etc/init.d/vsftpd restart

Attention: N'oubliez surtout pas d'ouvrir les ports suivants sur votre routeur:

echo "Ouvrez les ports: 21, ${PASV_MIN_PORT}-${PASV_MAX_PORT}"

Sauvegardes

Pour sauvegarder votre installation vsFTPd, je vous propose d'utiliser Backup Manager. Pour l'installer, vous pouvez suivre mon guide:

Installer et configurer Backup Manager sur Debian

Une fois Backup Manager installé, vous pouvez configurer la sauvegarde des fichiers de vsFTPd avec la commande suivante:

command update-bm-folders add /var/lib/ftp

Important: Sauvegarder les fichiers ne suffit pas ! Il faut aussi sauvegarder la base de données. La procédure pour ce faire est disponible dans mon article MySQL sur Debian.

Création facile des utilisateurs

Nous allons mettre en place deux scripts facilitant la création et la suppression des utilisateurs. Ces scripts lisent la configuration de vsFTPd pour récupérer le dossier par défaut des utilisateurs, et la configuration de connexion à MySQL. Vous n'avez donc pas à les modifier, même si vous avez légèrement changé la configuration présentée par cet article. Voici les lignes de commande à utiliser pour obtenir ces scripts:

command wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-le-serveur-ftp-vsftpd-sur-debian-4-0-etch/add-ftp-account \
--output-document=/usr/bin/add-ftp-account
command chmod +x /usr/bin/add-ftp-account
command wget http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-le-serveur-ftp-vsftpd-sur-debian-4-0-etch/remove-ftp-account \
--output-document=/usr/bin/remove-ftp-account
command chmod +x /usr/bin/remove-ftp-account

Vous pouvez maintenant ajouter un nouvel utilisateur avec la commande:

add-ftp-account username

Et le supprimer avec la commande:

remove-ftp-account username

Pour aller plus loin, vous pouvez obtenir de l'aide sur l'utilisation avancée de ces commandes:

add-ftp-account --help
remove-ftp-account --help

Création manuelle des utilisateurs

Cette section est présente à titre de documentation. Utilisez de préférence les scripts fournis par cet article.

Prérequis

Avant de vous lancer dans la création des utilisateurs, vous devez renseigner les paramètres de connexion à la base de données:

MYSQL_HOST=localhost
MYSQL_DB=VSFTPD
MYSQL_USERNAME=vsftpd
MYSQL_USERPWD=vsftpd_password

Création d'un utilisateur

Pour créer un utilisateur, commencez par renseigner son identifiant et son mot de passe:

FTP_USERNAME=my_username
FTP_PASSWORD=my_password

Une fois ceci fait, nous créons le dossier de l'utilisateur virtuel:

/bin/mkdir /home/ftp/$FTP_USERNAME
/bin/chown ftp:nogroup /home/ftp/$FTP_USERNAME

Et nous créons l'utilisateur dans la base de données:

/bin/echo "INSERT INTO accounts (username, pass) VALUES('$FTP_USERNAME', PASSWORD('$FTP_PASSWORD'));" \
    | /usr/bin/mysql --user=$MYSQL_USERNAME --password=$MYSQL_USERPWD --host=$MYSQL_HOST $MYSQL_DB

Remarque: si vous souhaitez utiliser un emplacement différent pour le dossier de l'utilisateur, vous pouvez le faire en utilisant le dossier vsftpd.d. En premier lieu, renseignez le dossier que vous souhaitez utiliser:

FTP_PATH=/some/other/folder

Et au besoin, créez le et assignez lui les permissions adéquates:

/bin/mkdir --parent $FTP_PATH
/bin/chown -R ftp:nogroup $FTP_PATH

Vous pouvez ensuite créer le fichier de configuration spécifique à votre utilisateur:

/bin/echo "# Custom user path.
local_root=$FTP_PATH" | /usr/bin/tee /etc/vsftpd.d/$FTP_USERNAME

Utilisation du client FTP

Dans la configuration que je vous propose, les connexions au serveur FTP sont cryptées. Pour vous y connecter avec FileZilla, ajoutez votre site au gestionnaire de site, et choisissez le type de serveur FTPES.

Remerciements

Attachments

Strange Connection Error

Posted by DanielS at 2008-08-30 01:38
Hello :)
I've been following your guides, and must say that I'm very impressed at how easy you make these for us less knowing. However I've run into a problem, it follows:

Response: 230 Login successful.
Command: PBSZ 0
Response: 200 PBSZ set to 0.
Command: PROT P
Response: 200 PROT now Private.
Status: Connected
Status: Retrieving directory listing...
Command: PWD
Response: 257 "/"
Command: TYPE I
Response: 200 Switching to Binary mode.
Command: PASV
Response: 227 Entering Passive Mode (comma,seperated,numbers)
Command: LIST
Response: 150 Here comes the directory listing.
Status: Server did not properly shut down TLS connection
Error: Transfer connection interrupted: ECONNABORTED - Connection aborted
Response: 226 Directory send OK.
Error: Failed to retrieve directory listing

I've never seeen a Directory send OK, followed by Failed to retrieve directory listing.
Any idea's?

Either way Thanks for these guides! You've helped me SO much, and I'm learning alot as well! Thank you!

connection protocol ?

Posted by lwolf at 2008-08-30 08:04
Hi

i've been successfully using filezilla as client, with FTPES server type.

If it is not a protocol problem, try to set a different local_root value.

This howto is quite recent and still must be translated. If you have been using google translation to follow this howto, it may have induced errors in the command lines.

Good luck

Google Translation

Posted by DanielS at 2008-08-30 09:14
You are very sharp!
Yes indeed I did use google translator to read this page, and I did notice the extra spaces introduced by it, so I did keep two tabs open, one translated and the original to copy the commands from.

To be honest this is the farthest I've come to getting my ftp server working correctly, I just cant seem to get the directory's to list.

I'll try what you've suggested. Thanks again for the quick responce!

Re: Strange Connection Error

Posted by Stephane at 2008-11-26 20:34
If you use vsftpd server with version < 2.0.7, and you use some recent ftp clients softwares (filezilla > V3.0.X) , it is possible you meet
theses kinds of problem.
It sounds like server prior to 2.0.7 have minor bug with SSL/TSL protocoles that can cause recents clients to shutdown ftp connections.
So the better thing is to upgrade to 2.0.7 version.

In my case, i have compiled sources on my debian etch, and it works very well .

fail2ban

Posted by hugues at 2009-03-05 10:48
Le filtre fail2ban ne fonctionne pas avec pam_mysql :

En cas d'echec, dans auth.log on observe avec pam_unix :
vsftpd: (pam_unix) authentication failure; logname= uid=0 euid=0 tty=ftp ruser=hugues rhost=127.0.0.1 user=hugues

et avec pam_mysql :
vsftpd: pam_mysql - SELECT returned no result.

Le problème est qu'il n'y a pas l'adresse de l'hote dans cette ligne donc impossible d'adapter le filtre...

sisi il fonctionne

Posted by lwolf at 2009-03-05 11:18
Le filtre fail2ban de vsftpd se base sur le log de vsftpd. J'ai pu constater de première main son bon fonctionnement. Simplement, le ban se met en place après 6 échec. Cf la ligne :

maxretry = 6

de la configuration [vsftpd] dans /etc/fail2ban/jail.conf

Donc, peut être que le filtre pam de fail2ban ne fonctionne pas, mais le filtre [vsftpd] fonctionne lui.

nonon, pas sur etch

Posted by hugues at 2009-03-09 19:05
Après vérification le filtre se base sur le log de vsftpd à partir de la version 0.8.3 (lenny) mais la version de etch se base sur le log de pam.

Donc pour etch il faut modifier :
dans /etc/fail2ban/jail.conf :
logpath = /var/log/vsftpd.log

et dans /etc/fail2ban/filter.d/vsftpd :
failregex = vsftpd(?:\(pam_unix\))?(?:\[\d+\])?:.* authentication failure; .* rhost=<HOST>(?:\s+user=\S*)?\s*$
\[.+\] FAIL LOGIN: Client "<HOST>"\s*$

correction

Posted by hugues at 2009-03-11 10:12
dans /etc/fail2ban/filter.d/vsftpd :
failregex = \[.+\] FAIL LOGIN: Client "<HOST>"\s*$

very secure?

Posted by oliv at 2010-02-03 20:46
Hello.

Une correction de sécurité :

chmod 640 /etc/pam.d/vsftpd

Sinon, ca sera pas "very secure"...

(on peut d'ailleurs preferer berkeley à mysql pour l'utilisation de pam)

VSFTPD + annuaire LDAP

Posted by Guitou83 at 2010-02-16 07:55
Bonjour,

je voudrais que VSFTPD authentifie mes utilisateurs avec un annuaire LDAP sous 2003 server.

J'ai vu qu'il fallait installer lippam_ldap ? Est-ce correct et es-ce suffisant ?

De plus j'aimerais que mon FTP dise :

Pour tel fichiers --> tel groupe a accés. Bien sûr groupe défini dans mon annuaire existant.

Est-ce possible ?
Un grand Merci d'avance pour vos réponses P.S. : si vous préférez me répondre par e-mail : guil.langlois@aliceadsl.fr

LDAP + FTP

Posted by Lone Wolf at 2010-02-16 09:56
Bonjour,

pour ce qui est de libpam_ldap, c'est normallement le seul paquet nécessaire. Il reste par compte à trouver la configuration adéquate pour vsftpd.

Concernant les groupes liés à l'annuaire ldap, je ne sais pas si c'est possible en utilisant les utilisateurs virtuels dans vsftpd. Je crains que vous ne deviez lié votre système à votre annuaire ldap, et pas seulement le serveur ftp.

Bon courage et bonne continuation.

VSFTPD + annuaire LDAP

Posted by Guitou83 at 2010-02-16 13:03
Merci pour votre réponse très clair.

Le plus simple donc serait de faire un controleur de domaine avec openldap sur ma debian si je comprend bien.

Merci.

GnuTLS error -8

Posted by matthieu at 2010-03-25 09:37
Bonjour lorsque j'essais de me connecter avec filezilla j'obtiens ce message:

Erreur : GnuTLS error -8: A record packet with illegal version was received.
Erreur : Impossible d'établir une connexion au serveur

Avez vous déjà rencontré ce problème?

Modification du owner

Posted by Jérôme at 2010-12-11 15:28
Attention en utilisant ton script add-ftp-account. Il modifie automatiquement, et sans confirmation, le propriétaire du du répertoire cible. J'ai voulu créer un utilisateur avec accès FTP au répertoire / et je regrette. Obligé de réinstaller la machine...

Ftp sur root

Posted by Pierre-Yves Landuré at 2011-01-02 19:48
Bonjour,

Merci pour le signalement de ce problème. J'ai corrigé le script incriminé.
Il est vrai que pour moi, il est tellement peut recommandé de faire ce genre de manipulation (rendre le fichier /etc/shadow accessible par ftp) que je n'ai pas prévu le cas. C'est maintenant chose faite.


Installer le serveur FTP vsFTPd sur Debian

Posted by Seb_12 at 2011-02-14 21:40
Merci, site en marque page pour administration de mon serveur...

Limitation des commandes...

Posted by HM at 2011-03-08 01:26
Est il possible avec vsftpd, de n'autoriser l'utilisateur qui se connecte de n'exécuter que quelques commandes (STOR) par exemple. Ca permettrait de mettre en place un FTP qui ne serait qu'un dépôt. Impossible de supprimer du coup.

Je sais que Proftpd sait le faire avec la balise <Limits> mais je n'arrive pas à trouver l'info pour vsftpd.

Merci !

cmds_allowed

Posted by Lone Wolf at 2011-03-10 11:20
I think the option you are looking for is cmds_allowed .

Hope this help.

Read the VSFTPD manpage for more details : http://vsftpd.beasts.org/vsftpd_conf.html

Bonne continuation

BlogBang
Navigation
 

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards:

Wikio