VSFTPd : un serveur FTP sécurisé avec des utilisateurs virtuels

Principes appliqués :

Ici, le serveur est supposé se trouver sur l'emplacement $DISQUE=/srv/www

Le protocole ftp n'est pas sûr ! L'échange du nom d'utilisateur et du mot de passe transite en clair sur le réseau.

Ne pas utiliser via ftp un compte qui a les droits sudo !

Introduction

Pré-requis

Installation

  1. Installer vsftpd,db-util,ftp

    ~$ sudo apt install {vsftpd,db-util,ftp}

    Le service ftp démarre automatiquement après l'installation.

  2. Vérification avec le programme ftp :
    • Accepter le nom d'utilisateur proposé et donner son mot de passe (nicolas / *).
    • Pour sortir du ftp : bye

      ~$ ftp chateau.parc
      Connected to chateau.parc.
      220 (vsFTPd 3.0.5)
      Name (chateau.parc:nicolas): 331 Please specify the password. Password:
      230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.
      ftp> bye
      221 Goodbye.

      Avec la configuration d'origine,

      • le serveur fonctionne avec un utilisateur (nicolas) disposant réellement d’un compte sur la machine serveur mais pas en anonyme (impossible de se connecter avec l'utilisateur anonymous)
      • un ls confirme que le dossier racine est le home (/home/nicolas) de cet utilisateur

Configuration

Configuration de base

  1. Création du répertoire /etc/vsftpd/user_conf/ et du fichier /etc/vsftpd/user_list:

    ~$ sudo mkdir -p /etc/vsftpd/user_conf
    ~$ sudo touch /etc/vsftpd/user_list

  2. Sauvegarde des fichiers de configuration originaux :

    ~$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.dist
    ~$ sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.dist

    Pour revenir au départ en cas de problème, il suffira de faire l'inverse :

    ~$ sudo cp /etc/vsftpd.conf.dist /etc/vsftpd.conf
    ~$ sudo cp /etc/pam.d/vsftpd.dist /etc/pam.d/vsftpd
  3. création de l'emplacement pour la racine du serveur :
    1. Créer le répertoire <DISQUE>/srv/www :

      ~$ sudo mkdir -p <DISQUE>/srv/www
      ~$ sudo mkdir /var/www

    2. Éditer avec les droits d'administration le fichier /etc/fstab pour ajouter la ligne :
      /etc/fstab
      <DISQUE>/srv	/srv	none	bind	0	0
    3. Monter /srv et /var/www :

      ~$ sudo mount /srv
      ~$ sudo mount /var/www

  4. Création de la clé privée de 2048 bits et du certificat autosigné valable 10 ans (la clé privée et le certificat sont enregistrés dans un même fichier) :

    ~$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
    (...)
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []:nicolas@nfrappe.fr

  5. Éditer avec les droits d'administration le fichier /etc/vsftpd.conf pour ajouter à la fin les commandes suivantes :
    /etc/vsftpd.conf
    (...)
    
    ############################
    # Paramètres personnalisés #
    ############################
    
    ########## Paramètres généraux ##########
    ftpd_banner=Bienvenue sur le serveur FTP de chateau.parc
    
    # Nombre maximum de connexions simultanées
    #   Au-delà, les nouveaux clients recevront un message du genre :
    #   "erreur: serveur occupé"
    max_clients=200
    # Nombre maximum de connexions venant de la même IP
    max_per_ip=4
    
    ########## Utilisateurs virtuels ##########
    # Activation des utilisateurs virtuels
    guest_enable=YES
    
    # nom de l'utilisateur (www-data) sous lequel ils vont fonctionner
    #   tous les utilisateurs virtuels -> utilisateur ftp avec son home /srv/ftp
    ftp_username=www-data
    guest_username=www-data
    nopriv_user=www-data
    
    # Fichier de config PAM
    pam_service_name=vsftpd
    
    ########## Connexion et contrôle d'accès ##########
    # Pas d'accès anonyme, que des utilisateurs locaux
    # (dont les utilisateurs virtuels, mappés sur un utilisateur local)
    # les vrais utilisateurs locaux sont désactivés avec le fichier user_list
    #anonymous_enable=NO
    #local_enable=YES
    
    # On refuse les utilisateurs du fichier /etc/vsftpd.user_list
    # un utilisateur par ligne
    #userlist_enable=YES
    #userlist_deny=NO
    #userlist_file=/etc/vsftpd/user_list
    
    # Les utilisateurs locaux restent chez eux
    chroot_local_user=YES
    allow_writeable_chroot=YES
    
    ########## Permissions ##########
    # Interdiction de toute action d'écriture :
    # On spécifiera les droits utilisateur par utilisateur.
    write_enable=NO
    anon_mkdir_write_enable=NO
    anon_other_write_enable=NO
    anon_upload_enable=NO
    anon_world_readable_only=NO
    
    # droits par défaut des fichiers uploadés
    anon_umask=002
    
    # Autoriser les utilisateurs locaux à changer les permissions des fichiers
    chmod_enable=YES
    virtual_use_local_privs=YES
    
    # On n’autorise pas les utilisateurs à se faire passer pour d’autres
    chown_uploads=NO
    chown_username=nobody
    
    # Cacher les informations sur le propriétaire des fichiers (utilisateur et groupe)
    hide_ids=YES
    
    # Activation de la configuration utilisateur par utilisateur
    user_config_dir=/etc/vsftpd/user_conf
    
    ########## Sécurisation des transmissions avec SSL/TLS ##########
    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    rsa_private_key_file=/etc/ssl/private/vsftpd.pem
    ssl_enable=YES

Utilisateurs virtuels

Nous allons créer trois utilisateurs virtuels :

  1. admin, qui aura accès à tout /srv sous l'utilisateur ftp
  2. user, qui ne pourra que télécharger sous l'utilisateur ftp
  3. admiweb, qui aura accès à tout le site web (/serv/www/html) sous l'utilisateur www-data

  1. Éditer avec les droits d'administration le fichier /etc/vsftpd/login.txt pour y écrire les noms et mots de passe des utilisateurs virtuels (2 lignes pour chaque utilisateur) :

    ~$ sudo touch /etc/vsftpd/login.txt

    /etc/vsftpd/login.txt
    admin
    Epp48Arf
    user
    Epp48Arf
    admiweb
    Epp48Arf
    

    Il faut une ligne vide à la fin

  2. Créer la base de données :

    ~$ sudo db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

  3. Protéger ces fichiers contre une intrusion :

    ~$ sudo chmod 600 /etc/vsftpd/login.*

    Pour ajouter, modifier ou supprimer un utilisateur il faut éditer le fichier login.txt puis relancer la création de la base avec la commande du paragraphe 2.

  4. Éditer avec les droits d'administration le fichier /etc/pam.d/vsftpd et remplacer son contenu par :
    /etc/pam.d/vsftpd
    auth required pam_userdb.so db=/etc/vsftpd/login
    account required pam_userdb.so db=/etc/vsftpd/login
  5. Redémarrer le serveur :

    ~$ sudo systemctl restart vsftpd.service

  6. Vérification :
    • nicolas ne peut plus se connecter :

      ~$ ftp chateau.parc 
      Connected to chateau.parc.
      220 Bienvenue sur le serveur FTP de chateau.parc
      Name (chateau.parc:nicolas): 
      331 Please specify the password.
      Password:
      530 Login incorrect. ftp: Login failed
      ftp> bye
      221 Goodbye.

    • mais admiweb le peut :

      ~$ ftp chateau.parc 
      Connected to chateau.parc.
      220 Bienvenue sur le serveur FTP de chateau.parc
      Name (chateau.parc:nicolas): admiweb
      331 Please specify the password.
      Password:
      230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.
      ftp> bye
      221 Goodbye.

Personnalisation pour chaque utilisateur

Par défaut les utilisateurs virtuels n'ont aucun droit.

Il faut donc les définir pour chacun d'entre eux en créant dans le dossier /etc/vsftpd/user_conf un fichier de configuration pour chaque utilisateur (du même nom que le login de l'utilisateur auquel il fait référence).

Chaque fichier contient des paramètres (les mêmes que ceux de vsftpd.conf) qui remplaceront ceux de vsftpd.conf.

Généralement, on y modifie le “local_root” et les droits d'écriture.

Attention : pas de blanc en fin de ligne (sinon erreur de syntaxe)

  1. utilisateur admin (admin a presque tous les droits et accède au répertoire /srv et à tous ses sous-répertoires) :

    ~$ sudo touch /etc/vsftpd/user_conf/admin

    /etc/vsftpd/user_conf/admin
    # Racine
    local_root=/srv
    
    # Lecture autorisée
    download_enable=YES
    anon_world_readable_only=NO
    
    # Écriture autorisée 
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    
    # Renommage et suppression autorisés 
    anon_other_write_enable=YES
    
    # changement des droits autorisé 
    chmod_enable=YES
    virtual_use_local_privs=YES
    
    # Définit à qui appartiendront les fichiers téléversés
    guest_username=nicolas
    
    # Affichage des fichiers cachés
    #   (important pour les fichiers htaccess) 
    force_dot_files=YES
    
    # masque local (002 -> droits 775)
    local_umask=002
    anon_umask=002
  2. utilisateur admiweb (admiweb a presque tous les droits et accède au répertoire /srv/www/html et à tous ses sous-répertoires sous le nom www-data) :

    ~$ sudo touch /etc/vsftpd/user_conf/admiweb

    /etc/vsftpd/user_conf/admiweb
    # Racine
    local_root=/var/www/html
    
    # Lecture autorisée
    download_enable=YES
    anon_world_readable_only=NO
    
    # Écriture (upload) autorisée 
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    
    # Renommage et suppression autorisés 
    anon_other_write_enable=YES
    
    # changement des droits autorisé 
    chmod_enable=YES
    virtual_use_local_privs=YES
    
    # Définit à qui appartiendront les fichiers téléversés
    guest_username=www-data
    chown_uploads=YES
    chown_username=www-data
    
    # Affichage des fichiers cachés
    #   (important pour les fichiers htaccess) 
    force_dot_files=YES
    
    # masque local (002 -> droits 775)
    file_open_mode=0777
    local_umask=002
    anon_umask=002
  3. utilisateur user (user ne peut que télécharger et est enfermé dans le répertoire /srv/ftp/user - qui doit exister) :
    • Créer le répertoire <DISQUE>/srv/ftp/user :

      ~$ sudo mkdir -p <DISQUE>/srv/ftp/user

    • puis le fichier

      ~$ sudo touch /etc/vsftpd/user_conf/user

      /etc/vsftpd/user_conf/user
      local_root=/srv/ftp/user
  4. utilisateur adminftp (adminftp a accès au répertoire ~ftp et à ses sous-répertoires avec tous les droits ; il ne peut pas remonter au-dessus de ~ftp qui apparaîtra comme la racine ”/”) :

    ~$ sudo touch /etc/vsftpd/user_conf/adminftp

    /etc/vsftpd/vsftpd_user_conf/adminftp
    ## l'utilisateur est enfermé dans un dossier déterminé
    # en commentant cette ligne, on autorise tout le site
    #local_root=adminftp 
    
    ## droit de lecture(download)
    anon_world_readable_only=NO
    
    ## droit d'écriture(upload)
    write_enable=YES
    anon_upload_enable=YES
    
    ## créer des dossiers
    anon_mkdir_write_enable=YES
    
    ## droit de renommer, supprimer...
    anon_other_write_enable=YES
    
    ## pour gérer le chmod de l'utilisateur
    ## activer l'option
    #virtual_use_local_privs=YES
    ## définir l'option local_umask
    #local_umask=022
    #anon_umask=022
    write_enable=YES
    anon_upload_enable=YES
  5. Redémarrer le serveur pour valider les modifications :

    ~$ sudo systemctl restart vsftpd.service

Utilisation

Désinstallation

Voir aussi


Basé sur « https://doc.ubuntu-fr.org/vsftpd » par Doc ubuntu.