vsFTPd, un serveur FTP sécurisé et simple (Andesi)

1. Configuration

1.1 Relancer le serveur

  • sudo /etc/init.d/vsftpd stop
    sudo /etc/init.d/vsftpd start

Si la configuration est bonne, la commande ne retourne rien. Sinon les éventuels messages d'erreurs s'affichent.

2. Utilisation

2.1 Test

Nous utilisons la commande ftp (installée par défaut).

Voici un exemple d'une session ftp (mot de passe entré : foo) :

$ ftp localhost 21
Connected to localhost.localdomain.
220 (vsFTPd 2.0.3)
Name (localhost:to_): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp> size hosts
213 147
ftp> quit
221 Goodbye.

La commande ls a échoué (failed to open directory). C'est dû au fait que les utilisateurs virtuels ont en réalité les même permissions que les utilisateurs anonymes.

Or, par défaut, le serveur n'autorise que la lecture des répertoires dont les permissions sont à world_readable (lisible par le reste du monde), ce qui n'est pas le cas de notre répertoire ~www-data/ dont les permissions sont 2750.

Plutôt que de modifier cette politique dans /etc/vsftpd.conf, nous affinerons les permissions pour chacun des utilisateurs virtuels.

2.2 Gérer les permissions de chacun

Supposons que nous voulions définir 2 types d'utilisateurs virtuels :

  • tom qui aurait un accès en lecture seule :
    • il ne pourrait que se balader dans son home (commun à tous les utilisateurs virtuels i.e ~www-data/)
    • et télécharger ce qui s'y trouve
  • fred qui aurait un accès en lecture/écriture :
    • il pourrait en plus uploader un répertoire dédié,
    • mais sans pouvoir supprimer des données:

Pour cela, nous utiliserons la configuration par utilisateur (configuration per-user).

La configuration per-user permet d'appliquer n'importe quelle option de la page de manuel à un utilisateur en particulier.

Elle modifie les réglages du vsftpd.conf qui joue alors le rôle d'une politique par défaut.

Pour l'activer, rajoutez la ligne suivante au fichier /etc/vsftpd.conf :

user_config_dir=/etc/vsftpd/vsftpd_user_conf

et créez le repertoire qui contiendra les fichiers gérant les droits de chacun (un fichier par utilisateur) :

  • sudo mkdir /etc/vsftpd/vsftpd_user_conf/

Les droits du système de fichiers prévalent toujours sur ceux du serveur.

Même si fred est autorisé par vsFTPd à écrire, encore faut-il que l'utilisateur système www-data, qui le représente, ait le droit d'écriture sur le répertoire en question.

Re-démarrez le serveur ftp pour que cette option soit prise en compte :

  • sudo /etc/init.d/vsftpd reload

Donnons à tom le droit de lecture (download)

Créez avec les droits d'administration le fichier /etc/vsftpd/vsftpd_user_conf/tom pour y écrire :

/etc/vsftpd/vsftpd_user_conf/tom
anon_world_readable_only=NO

Vérification : loguez-vous en tom et faites de nouveau un ls:

  • ftp> ls
    200 PORT command successful. Consider using PASV.
    150 Here comes the directory listing.
    -rw-r--r-- 1 0 0 263 Aug 23 23:18 hosts
    226 Directory send OK.

Loguez-vous en fred : ça ne marche toujours pas pour lui.

Donnons à fred son droit de lecture/écriture (download/upload), dans un répertoire dédié

De la même manière, créez avec les droits d'administration le fichier /etc/vsftpd/vsftpd_user_conf/fred pour y écrire :

/etc/vsftpd/vsftpd_user_conf/fred
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES

Cela ne suffit pas : du point de vue du système de fichiers, www-data n'a pas les permissions nécessaires sur ~www-data/ !

Créons donc un répertoire dédié dans lequel le méta-utilisateur virtuel www-data aura la permission d'écrire :

  • sudo mkdir ~virtual/upload/
    sudo chmod 770 ~virtual/upload/

Pour vérifier, loguez-vous en fred et vérifiez que vous pouvez uploader :

  • ftp> cd upload
    250 Directory successfully changed.
    ftp> send /etc/hostname hostname
    local: /etc/hostname remote: hostname
    200 PORT command successful. Consider using PASV.
    150 Ok to send data.
    226 File receive OK.
    16 bytes sent in 0.00 secs (157.8 kB/s)

Loguez-vous en tom et constatez le contraire

De même, vsFTPd vous interdit d'effacer des fichiers avec la commande delete.

Quelques autres droits

Pour accorder le droit de créer un dossier :

anon_mkdir_write_enable=YES

Pour le droit de renommer, supprimer, etc. :

anon_other_write_enable=YES

2.3 File dans ta chambre !

Créons un répertoire pour chaque utilisateur :

  • cd ~www-data/
    sudo mkdir -p {tom/,fred/}/upload
    sudo chmod 2750 {tom/,fred/}
    sudo chmod 770 {tom/,fred/}/upload/

Il suffit ensuite de rajouter, pour chaque utilisateur de notre base de données, l'option

local_root=<USER>

dans le fichier de configuration de USER. Ouvrez avec les droits d'administration le fichier /etc/vsftpd/vsftpd_user_conf/tom pour y ajouter :

/etc/vsftpd/vsftpd_user_conf/tom
...
local_root=tom

Ouvrez avec les droits d'administration le fichier /etc/vsftpd/vsftpd_user_conf/fred pour y ajouter :

...
local_root=fred

Cette tâche peut être automatisée par ce script accountDB.sh :

accountDB.sh
#!/bin/bash
 
USER_CONFIG_DIR=/etc/vsftpd/vsftpd_user_conf/
 
if [ $# -eq 1 ]; then
    if [ -f $1 ]; then
        #pour tous les noms figurant dans la base de données :
        for user in ` db_dump -p $1 | sed -n 's/^ //p' | sed -n '1,${p;n;}' `
          do
          #création des répertoires personnels pour les utilisateurs virtuels :
          if [ ! -d ~virtual/$user ]; then
              echo "$0: ajout du répertoire personnel ~virtual/$user pour l'utilisateur virtuel '$user'"
              mkdir -p ~virtual/$user/upload
              chmod 2750 ~virtual/$user/
              chmod 770 ~virtual/$user/upload/
          else
              echo "$0[warning]: ~virtual/$user: omission, ce répertoire existe déja."
          fi
          #chrootage des utilisateurs virtuels:
          if ! grep -q "^local_root=" $USER_CONFIG_DIR/$user 2>/dev/null; then
              echo "$0: on chroote '$user'"
              echo "local_root=$user" >> $USER_CONFIG_DIR/$user
          else
              echo "$0[warning]: $USER_CONFIG_DIR/$user: '$user' est déjà chrooté."
          fi
        done
    else
        echo "$0[erreur]: $1: base de données introuvable ! "
    fi
else
    echo "$0[erreur]: usage : accountDB.sh base_de_donnees"
fi

Avant de le lancer, rendez ce script exécutable :

  • sudo chmod u+x accountDB.sh

Il doit être exécuté avec les droits du super-utilisateur, par :

  • sudo sh accountDB.sh /etc/vsftpd/login.db

Pour adapter ce script et automatiser entièrement la configuration, modifiez le corps de la boucle for.

3. Désinstallation

3.1 Désinstallation partielle

Pour désinstaller le serveur vsftpd, en gardant les fichiers de configuration :

  • sudo apt-get remove vsftpd

3.2 Désinstallation complète

Pour tout remettre à plat :

Cela supprime définitivement des données de votre disque dur !

Si vous n'êtes pas sûr de vous, la désinstallation partielle est préférable.

  • sudo apt-get remove --purge vsftpd db-util
    sudo rm -rf /etc/vsftpd/
    sudo rm /etc/vsftpd.conf.default.bak /etc/pam.d/vsftpd.default.bak

4. Voir aussi


Contributeurs principaux : jamaique.

Basé sur l'article “vsFTPd, un serveur FTP sécurisé et simple” (liens morts) par l'équipe Andesi.


Navigation

éditer cette page