Installer le serveur FTP vsFTPd sur Debian
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
- Merci à Falko Timme pour son article Virtual Hosting With vsftpd And MySQL On Debian Etch.
- Merci aux développeurs de vsFTPd.
- Merci à prince_jammys sur irc.freenode.net#bash pour m'avoir indiqué l'article How can I handle command-line arguments to my script easily? sur le site Greg's Wiki.
connection protocol ?
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
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
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
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
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
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
failregex = \[.+\] FAIL LOGIN: Client "<HOST>"\s*$
very secure?
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
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
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
Le plus simple donc serait de faire un controleur de domaine avec openldap sur ma debian si je comprend bien.
Merci.
GnuTLS error -8
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
Ftp sur root
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
Limitation des commandes...
Je sais que Proftpd sait le faire avec la balise <Limits> mais je n'arrive pas à trouver l'info pour vsftpd.
Merci !
cmds_allowed
Hope this help.
Read the VSFTPD manpage for more details : http://vsftpd.beasts.org/vsftpd_conf.html
Bonne continuation
Strange Connection Error
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!