BOITE À OUTILS : VSFTPD (serveur ftp)
Publié par The Troll le 21 04 2015

Ce soir dans la série je gère mon site sans panel, un truc pas si compliqué et pas forcément nécessaire : la création de compte ftp pour permettre à des utilisateurs d'accéder aux dossiers.

Présupposés :
  • je n'utilise pas d'utilisateurs ayant un compte sur la machine (donc que des utilisateurs virtuels).
  • je veux un petit serveur ftp et pas une usine à gaz, même si cela me restreint dans la gestion du bousin (mais avec mes petits besoins, je n'ai pas eu ce soucis).
  • je veux pouvoir librement choisir le répertoire de chacun d'eux.
  • je veux que les fichiers sur le serveur appartiennent au même utilisateur système,
  • je veux pouvoir gérer les identifiant et pass avec un fichier texte.

vsftpd me permettait tout cela, je l'ai donc naturellement choisi. Bonus : il est pensé sécurité avant tout et performance. Et il est tout petit (Installed-Size: 464) et semble avoir une toute petite empreinte mémoire.

Une fois installé, quelques modifs dans le fichier : /etc/vsftpd.conf


listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=user
user_config_dir=/etc/vsftpd-virtual-user/
virtual_use_local_privs=YES
pam_service_name=vsftpd

Il y a d'autres options, mais celles-ci permettent au bousin de tomber en marche. Comme on peut le voir nous avons besoin d'un répertoire pour y mettre les fichiers de configuration des utilisateurs (car vous pouvez avoir des configurations différentes pour chaque utilisateur.) ici, c'est /etc/vsftpd-virtual-user/ (vous devez le créer). Les fichiers qui arriveront sur le serveur appartiendront à l'utilisateur user (un "vrai" utilisateur système). On peut voir également que pam se charge de l'authentification,

donc modification du fichier /etc/pam.d/vsftpd


auth    required        pam_userdb.so db=/etc/virtual_users
account required        pam_userdb.so db=/etc/virtual_users

Il n'y a rien d'autre dans le fichier en question.Comme vous pouvez le voir, il s'attend à trouver une base de donnée : /etc/virtual_users, nous y viendrons plus tard. C'est un nom que j'ai choisi, vous pouvez en choisir un autre sans aucun soucis.

ATTENTION, il n'y a pas de .db à la fin, c'est normal.

Notre fichier modèle utilisateur /root/ftp_user_model


local_root=DIRECTORY
cmds_allowed=USER,PASS,SYST,FEAT,OPTS,PWD,TYPE,PASV,LIST,STOR,DELE,CWD,MKD,SIZE,MDTM,CDUP,RETR,RNFR,RNTO
local_umask=022
write_enable=YES

La liste des commandes utilisées semble classique, vous pouvez la personnaliser. Liste des commandes FTP sur wikipedia

c'est maintenant que ça va shazammer : le script de la mort qui tue (bon, pas tellement en fait) do_ftp


#!/bin/sh
USER_CONF_DIR=/etc/vsftpd-virtual-user/
USER_CONF_MODEl=/root/ftp_user_model
USERS_FILE=/etc/users_ftp
USERS_DB=/etc/virtual_users.db
did=" effectué"
action=$1
user=$2
pass=$3
the_directory=$4
 usage(){
    echo "Usage :$0 ACTION var(s)"
    echo "Action : add_user nom_user password /directory"
    echo "    del_user nom_user"
    echo "    list_user"
    echo "    list_pass"
    exit
}
 [ "$1" = "" ] && usage;
 add_user(){
    echo "création utilisateur $user avec le pass $pass pour le répertoire $the_directory"
    sed -e 's,DIRECTORY,'$the_directory',g' $USER_CONF_MODEl > user_$user
    more user_$user
    read -p "Config ok [o/n] ?" reponse

    if [ $reponse = "o" ]; then
        mv user_$user $USER_CONF_DIR/$user && echo "mise en place du fichier utilisateur$did"
        sed -i '1i'$user'\n'$pass'' $USERS_FILE && echo "inscription dans la base des mots de passe$did"
        /usr/bin/db_load -T -thash -f $USERS_FILE $USERS_DB && echo "re-hash de la base$did"
    fi
exit
}

del_users(){
    read -p "Voulez vous vraiment effacer l'utilisateur $user [o/n] ?" reponse
       
    if [ $reponse = "o" ]; then
        sed -i '/'$user'/{N;d}' $USERS_FILE
        echo "Utiliateur $user effacé"
        rm $USER_CONF_DIR/$user
        /usr/bin/db_load -T -thash -f $USERS_FILE $USERS_DB && echo "re-hash de la base$did"
     fi
}


list_userss(){
    find $USER_CONF_DIR -type f -printf "%f\n" | sort
}

list_passs(){
    echo "Liste des mots de passe ===="
    < users sed "N;s/\n/ -> /"
}


case $action in
        add_user)
              [ "$the_directory" = "" ] && usage;

              if ( [ -f "$USER_CONF_DIR/$user" ] );then
                    echo "l'utilisateur $user existe déja"
                    exit
              fi

              if !( [ -d "$the_directory" ] );then
                    echo "$the_directory doit être un répertoire existant";exit
              fi

              add_user;;

    list_users)
        list_userss;;

    list_pass)
        list_passs;;

    del_user)
        del_users;;

esac

Comme on peut le voir dans le code, il permet d'ajouter, supprimer, lister utilisateurs et mots de passe

Usage :./do_ftp ACTION var(s)
Action :
  • add_user nom_user password /directory
  • del_user nom_user
  • list_user
  • list_pass

C'est presque fini : il vous faut configurer le script :

USER_CONF_DIR=/etc/vsftpd-virtual-user/ (répertoire créé pour /etc/vsftpd.conf)
USER_CONF_MODEl=/root/ftp_user_model (le modèle de fichier utilisateur)
USERS_FILE=/etc/users_ftp (le fichier texte des utilisateurs)
USERS_DB=/etc/virtual_users.db (la base de donnée, même chose que dans le fichier /etc/pam.d/vsftpd - avec le .db en plus, c'est normal)

enfin il faut créer le fichier /etc/users_ftp avec une ligne vide, par exemple


touch /etc/users_ftp && echo "" > /etc/users_ftp && chmod 600  /etc/users_ftp 

et voila.

le fichier /etc/users_ftp est un fichier texte en clair sous la forme :
ident1
pass_ident1
ident2
pass_ident2
ident3
pass_ident3

Ce qui peut en rebuter plus d'un. J'ai choisi de le laisser sur mon système en le rendant en lecture uniquement par root (si un personne devient root sur la machine, ce sera le moindre de vos soucis).

  • Vous pouvez le déplacer dans un autre endroit de la machine (en changeant son nom) et le remettre lorsque vous en avez besoin,
  • vous pouvez le garder en local sur votre machine et le ssh-er lorsque vous en avez besoin. Ce sont des contournements à cette problématique.

Comme d'hab, le script(doit être exécutable) et le fichier de conf dans le bon répertoire et pour créer votre premier utilisateur :


./do_ftp nom_user pass_user /rept/de/utilisateur

on vous demande si la configuration est bonne. Avant de continuer, vous pouvez à ce moment là, depuis un autre terminal (shell) modifier les commandes pour par exemple supprimer l'upload de fichier et la personne ne pourra que télécharger, ou pas de droit de créer des répertoires...

Note : Le répertoire utilisateur doit exister AVANT de créer l'utilisateur, il doit appartenir à l'utilisateur user (défini dans /etc/vsftpd.conf)

Note 2:La version que j'utilise ne permet à l'utilisateur d'écrire dans son répertoire de premier niveau, j'ai ajusté ma structure de répertoires pour pallier cet inconvénient

Et voila... suite au prochain épisode.

Serveurs - Commentez