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 6.0 Squeeze
- Debian 7.0 Wheezy
Pré-requis
Ce guide nécessite:
- un serveur MySQL, comme décrit par Installer et configurer MySQL sur Debian.
- mysql-tools, l'outil d'administration simplifiée de MySQL sur l'hôte local (et l'hôte du serveur MySQL, si différent).
Paramètres
Renseignez le nom de domaine ou sera disponible le serveur FTP :
domain="ftp.domaine-exemple.fr"
Renseignez le nom d'hôte du serveur MySQL:
mysqlHost="localhost"
Si le serveur MySQL n'est pas local, l'outil mysql-tools essaiera de s'y connecter avec le client MySQL, ou, en cas d'échec de connexion, via une connexion SSH.
Renseignez le nom du certificat SSL à utiliser pour chiffrer l'application avec TLS ou IMAPS (créé via la procédure Créer un certificat SSL / TLS sur Debian) (optionnel, recommandé):
SSL_KEY_NAME="${domain}"
Installation
Détectez le proxy de commande (command ou sudo):
cmdProxy='command'
command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'
Renseignez le chemin des données du serveur FTP:
dataPath='/var/lib/ftp'
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) :
ftpUser="www-data" ftpGroup="www-data"
Préparation de l'evnvironnement
Installez les logiciels nécessaires:
${cmdProxy} apt-get install vsftpd fail2ban mysql-client libpam-mysql openssl apg
Activez la protection de vsFTPd par Fail2Ban:
if [ ! -e '/etc/fail2ban/jail.local' ]; then
${cmdProxy} touch '/etc/fail2ban/jail.local'
fi
if [ -z "$(command grep '\[vsftpd\]' '/etc/fail2ban/jail.local')" ]; then
echo '[vsftpd]
enabled = true
' | ${cmdProxy} tee -a '/etc/fail2ban/jail.local'
fi
Redémarrez Fail2Ban pour prendre en compte cette configuration:
/etc/init.d/fail2ban restart
Créez l'utilisateur et le groupe choisis si nécessaire :
if [ -z "$(${cmdProxy} grep "^${ftpGroup}" '/etc/group')" ]; then ${cmdProxy} addgroup --system "${ftpGroup}" fi if [ -z "$(${cmdProxy} grep "^${ftpUser}" '/etc/passwd')" ]; then ${cmdProxy} adduser --system --shell '/bin/sh' --home "${dataPath}" --ingroup "${ftpGroup}" "${ftpUser}" fi
Création de la base de données
Créez la base de données :
mysqlParams="$(${cmdProxy} mysql-tools --server="${mysqlHost}" --with-ssh \
--auto-hosts --db-prefix="vsftpd" --create "${domain}")"
Récupérez les paramètres de la nouvelle base de données :
mysqlDb="$(echo "${mysqlParams}" | command grep -e "^MYSQL_DB" \ | cut --delimiter="=" --fields="2-")" mysqlUser="$(echo "${mysqlParams}" | command grep -e "^MYSQL_USER" \ | cut --delimiter="=" --fields="2-")" mysqlPassword="$(echo "${mysqlParams}" | command grep -e "^MYSQL_PASSWORD" \ | cut --delimiter="=" --fields="2-")" echo "${mysqlParams}"
Initialisez le contenu de la base de données :
${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/various/vsftpd.sql' \ --no-check-certificate --output-document='/tmp/vsftpd.sql' ${cmdProxy} mysql --user="${mysqlUser}" --password="${mysqlPassword}" --host="${mysqlHost}" "${mysqlDb}" \ < '/tmp/vsftpd.sql'
Configuration
Configurez vsFTPd pour prendre en compte la base de données et le certificat SSL:
${cmdProxy} 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${ftpUser}/" \ -e 's/^[#]*\(chroot_local_user=\).*/\1NO/' \ -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=${ftpUser}
chroot_local_user=YES
local_root=${dataPath}/\$USER user_sub_token=\$USER virtual_use_local_privs=YES user_config_dir=/etc/vsftpd.d" \ | ${cmdProxy} tee -a '/etc/vsftpd.conf'
Créez le dossier destiné à contenir les configurations spécifiques des utilisateurs:
${cmdProxy} 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:
${cmdProxy} sed -i -e 's/^\(.*\)$/#\1/' '/etc/pam.d/vsftpd' command echo "# MySQL configuration for vsFTPd. auth required pam_mysql.so user=${mysqlUser} passwd=${mysqlPassword} host=${mysqlHost} db=${mysqlDb} table=accounts usercolumn=username passwdcolumn=pass crypt=2 account required pam_mysql.so user=${mysqlUser} passwd=${mysqlPassword} host=${mysqlHost} db=${mysqlDb} table=accounts usercolumn=username passwdcolumn=pass crypt=2" \ | ${cmdProxy} tee '/etc/pam.d/vsftpd'
Redémarrez vsFTPd pour prendre en compte la configuration:
${cmdProxy} service vsftpd restart
Administration des utilisateurs
Mettez 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:
${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/various/add-ftp-account' \
--no-check-certificate --output-document='/usr/local/bin/add-ftp-account'
${cmdProxy} chmod +x '/usr/local/bin/add-ftp-account'
${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/various/remove-ftp-account' \
--no-check-certificate --output-document='/usr/local/bin/remove-ftp-account'
${cmdProxy} chmod +x '/usr/local/bin/remove-ftp-account'
Ajoutez un nouvel utilisateur avec:
# add-ftp-account 'username'
Supprimez un utilisateur avec:
# remove-ftp-account 'username'
Obtenez de l'aide sur l'utilisation avancée des commandes avec:
# add-ftp-account --help
# remove-ftp-account --help
Remarque: Pour des raisons de sécurité, la racine du répertoire de l'utilisateur n'est pas inscriptible. L'outil add-ftp-account crée un dossier "upload" permettant le dépôts de fichiers sur le serveur.
Chiffrement des transferts de données
Pour maximiser la confidentialité des données, configurez 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.
Déterminez les fichiers du certificat SSL:
keyFile="/etc/ssl/private/${SSL_KEY_NAME}.key"
if [ -e "/etc/ssl/certificates/${SSL_KEY_NAME}.crt+chain+root" ]; then
certFile="/etc/ssl/certificates/${SSL_KEY_NAME}.crt+chain+root"
else
certFile="/etc/ssl/certificates/${SSL_KEY_NAME}.crt"
fi
Configurez le serveur pour utiliser le certificat SSL:
if [ -e "${certFile}" ]; then
${cmdProxy} sed -i -e "s|^[#]*\(rsa_cert_file=\).*|\1${certFile}|" \ '/etc/vsftpd.conf'
fi
Ajoutez les options qui ne sont pas déjà présentes dans le fichier de configuration:
if [ -e "${keyFile}" ]; then
command echo " # SSL configuration ssl_enable=YES rsa_private_key_file=${keyFile} ssl_tlsv1=YES force_local_logins_ssl=YES force_local_data_ssl=YES require_ssl_reuse=NO
ssl_ciphers=HIGH" \ | ${cmdProxy} tee -a '/etc/vsftpd.conf'
fi
Redémarrez vsFTPd pour prendre en compte la configuration:
${cmdProxy} service vsftpd restart
Remarque: Si le chiffrement TLS est utilisé, configurez le client FTP pour se connecter avec une "Connexion FTP explicite sur TLS (FTPES)".
Mode passif derrière un pare-feu (ou routeur NAT)
Si votre serveur FTP se trouve derrière un pare-feu, vous devez spécifier l'intervale de ports à utiliser pour le mode passif.
pasvMinPort=34560 pasvMaxPort=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 :
pasvAddress="$(command wget --quiet http://www.monip.org/ -O- \ | command grep "IP :" \
| command 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=${pasvAddress} pasv_min_port=${pasvMinPort} pasv_max_port=${pasvMaxPort}" \ | ${cmdProxy} tee -a '/etc/vsftpd.conf'
Vous pouvez maintenant redémarrer votre serveur FTP pour prendre en compte la configuration:
${cmdProxy} service vsftpd restart
Attention: N'oubliez surtout pas d'ouvrir les ports suivants sur votre routeur:
echo "Ouvrez les ports: 21, ${pasvMinPort}-${pasvMaxPort}"
Sauvegardes
Sauvegardez l'installation avec Backup Manager (voir Installer et configurer Backup Manager sur Debian):
${cmdProxy} backup-manager-tools add "${dataPath}"
N'oubliez pas de sauvegarder la base de données (voir Installer et configurer MySQL sur Debian).
Remerciements
- Merci à Falko Timme pour son article Virtual Hosting With vsftpd And MySQL On Debian Etch (en).
- Merci aux développeurs de vsFTPd (en).
- 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 ? (en) sur le site Greg's Wiki (en).
- Merci à Erdal Gunyar (Sideriver) et Ben Scobie's (en) pour Fixing 500 OOPS: vsftpd: refusing to run with writable root inside chroot () (en).