Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / Autres / Installer le serveur FTP vsFTPd sur Debian

Installer le serveur FTP vsFTPd sur Debian

Par Pierre-Yves Landuré Dernière modification 30/04/2015 11:49

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:

    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

    Erdal Gunyar a écrit :
    05/07/2013 20:44
    Il manque un réglage sur les droits à la fin. Sinon, depuis les dernières version de vsFTPd, il refuse la demande avec un "500 OOPS: vsftpd: refusing to run with writable root inside chroot ()".
    Deux fixes possibles : http://www.benscobie.com/[…]/
    Pierre-Yves Landuré a écrit :
    06/07/2013 09:52
    Merci pour l'information. J'étais au courant du problème, mais je n'ai pas eu le temps de m'y pencher en détails.
    Pierre-Yves Landuré a écrit :
    14/07/2013 12:31
    Les outils de création des comptes sont maintenant corrigés pour que le problème ne se présente pas.
    Ajouter un commentaire

    Vous pouvez ajouter un commentaire en complétant le formulaire ci-dessous. Le format doit être plain text. Les url et les courriels sont transformés en liens cliquables. Les commentaires sont modérés.

    Mots-clés associés : , , ,