Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

Raspberry Pi : un serveur FTP

<term VSFTPD>Very Secure FTP Daemon</term>

8.25. Références

8.26. Mise en place ultra-rapide, peu sécurisée

8.26.1. Mise en place

Sur le terminal, tapez la commande suivante:

  • sudo apt-get install vsftpd

Une fois les paquets de VSFTPD téléchargés et installés, ouvrez avec les droits d'administration le fichier /etc/vsftpd.conf pour le modifier comme ceci :

Le fichier /etc/vsftpd.conf est le fichier de configuration de VSFTPD.Il permet de nombreux réglages.

Pour commencer, modifier les lignes suivantes, soit en les dé-commentant, soit en indiquant YES ou NO :

Anonymous_enable=NO
Write_enable=YES
Local_enable=YES
Ascii_upload_enable=YES
Ascii_download_enable=YES

L'explication complète se trouve dans les commentaires du fichier.

Redémarrez le RPI pour activer tout ce que vous avez fait jusqu'ici. Pour ce faire, tapez dans le terminal :

  • sudo reboot

8.26.2. Accès sur le réseau local

Voici comment accéder à un disque dur externe connecté à l'un des ports USB de l'RPi, via un client FTP.

Branchez un disque dur externe USB à votre PC et formatez-le en NTFS par exemple sous le nom de volume FTP. Quand c'est terminé, branchez-le au RPI.

Via VNC, le lecteur s'affiche dans le gestionnaire de fichiers.

Notez l'adresse du disque dur (par exemple /media/FTP puisqu'il a un label “FTP”). Pour tester l'accès FTP, installer un client FTP tel que FileZilla et entrez les informations de connexion :

hôte
192.168.0.X/media/FTP
Identifiant
pi (par défaut) ; à remplacer éventuellement par le nom d'utilisateur défini dans VSFTPD
Mot de passe
raspberry (par défaut) ; à remplacer éventuellement par le mot de passe de l'utilisateur défini dans VSFTPD

Avec de la chance, vous devriez maintenant avoir accès au disque dur USB externe, via FTP, par le réseau local.

8.26.3. Accès externe

Il reste à autoriser l'accès au FTP externe pour le RPI.

Sur le routeur, faire une redirection NAT du port 21 vers le port 21 de l'adresse IP interne du Rpi.

8.27. Introduction : configuration de VSFTPD en mode utilisateur virtuel

Pour accéder aux fichiers sur le serveur, nous installons VSFTPD1), serveur FTP très sécurisé.

Pour disposer de plusieurs comptes FTP par domaine et que les comptes FTP pointent sur des sous domaines, nous utiliserons le paramétrage par utilisateur virtuel.

Pour cela, nous utiliserons une base de données de type Berkeley, de type non-sql. C'est une table de hachage. Chaque enregistrement n'eest constitué que d'un login et d'un mot de passe.Pour l'identification de type PAM, l'utilisation de ce type de base de données est obligatoire.

8.27.1. Principe

  • un utilisateur UNIX sert à la connexion : ftpsecure
  • un utilisateur UNIX définit la base du serveur FTP qui est son home : ftp
  • Quand on se connecte avec un utilisateur, le programme vérifie dans la base de données si celui-ci existe et si le mot de passe correspond.
  • il cherche les paramètres concernés (chroot, droits spécifiques) et renvoie le répertoire concerné.

Le home de ftp doit se trouver sur une partition de type ext (pas ntfs). On peut cependant monter dessus une partition ntfs par un mount/bind. C'est ce que nous ferons ici.

Le chroot, assure la sécurité : le répertoire étant considéré comme la racine, il est impossible de remonter la hiérarchie.

Pour créer un nouvel utilisateur, il suffit de lui créer :

  • une entrée dans la base Berkeley
  • et un fichier de configuration personnel.

8.28. Installation

Lancer la commande suivante dans un terminal :

  • sudo apt-get install -y vsftpd db5.3-util

8.29. Mise en place des utilisateurs UNIX

8.29.1. ftpsecure

L'utilisateur ftpsecure sert à la connexion.

Créer l'utilisateur ftpsecure qui servira aux connexions :

  • sudo useradd -r -s /bin/false ftpsecure
-r
crée un compte système sans répertoire personnel.
-s /bin/false
shell : aucune action possible.

8.29.2. ftp

Créer l'utilisateur ftp dont le home sera la racine du serveur ftp :

  • sudo useradd -m -d /srv/ftp ftp
-m
crée le répertoire personnel de l'utilisateur s'il n'existe pas.
-d /srv/ftp
répertoire personnel de l'utilisateur (/srv/ftp). Ce répertoire doit obligatoirement se trouver sur une partition de type ext

Si la racine du serveur ftp doit se trouver sur une partition ntfs (par exemple en /media/R-Pi-Donnees/ftp/), la lier par un mount/bind comme ceci :

  1. Créer le répertoire de montage :
    sudo mkdir /srv/ftp

  2. puis monter par :

    sudo mount --bind /disk/DISQUE/ftp/ /srv/ftp

Pour rendre cela permanent, on peut écrire une ligne dans le fichier /etc/fstab :

/etc/fstab
/srv/ftp    /disk/DISQUE/ftp/    none    bind    0    0

8.30. Base de données des utilisateurs virtuels

Cette base de données est construite à partir d'un fichier texte qui contient les informations.

Créer avec les droits d'administration le fichier /etc/vsftpd/login.txt et y écrire ceci :

/etc/vsftpd/login.txt
adminftp
pass1
userftp
pass2

Les lignes vont par deux : un utilisateur / son mot de passe.

Convertir ce fichier en base de données et protéger les fichiers avec les commandes :

  • sudo db5.3_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
    sudo chmod 600 /etc/vsftpd/login.*

Pour que le module PAM utilise la base de données, Créer avec les droits d'administration le fichier /etc/vsftpd/vsftpd.pam pour y écrire ceci :

/etc/vsftpd/vsftpd.pam
auth required /lib/arm-linux-gnueabihf/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/arm-linux-gnueabihf/security/pam_userdb.so db=/etc/vsftpd/login

/lib/arm-linux-gnueabihf/security/pam_userdb.so est le chemin sur un RPi. Sur une autre machine, adapter.

Le copier à son emplacement :

  • sudo cp /etc/vsftpd/vsftpd.pam /etc/pam.d/vsftpd

Si le système nous informe que le fichier existe déjà, on l'écrase.

8.31. Préparation

Sauvegarder la configuration d'origine de VSFTPD et créer le répertoire qui contiendra les fichiers de configuration et celui qui contiendra les configurations personnalisées des utilisateurs :

  • sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original
    sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.original
    sudo mkdir -p /etc/vsftpd/vsftpd_user_conf/

8.32. Création des utilisateurs

8.32.1. Mettre en place l'emplacement des fichiers pour les utilisateurs virtuels

Nous utilisons l'utilisateur ftp, déjà existant, et dont le home est /srv/ftp

Si ce n'est pas le cas, on peut le créer par :

  • sudo useradd -d /srv/ftp ftp

ou le modifier par :

  • sudo usermod -d /srv/ftp ftp

Ce répertoire /srv/ftp sera la racine de notre serveur ftp.

8.33. Fichier vsftpd.conf

Un exemple :

/etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=ftp
listen=YES
listen_port=10021
pasv_min_port=30000
pasv_max_port=30999

Passons en revue ligne par ligne :

anonymous_enable=NO
local_enable=YES
par sécurité, désactive le FTP anonyme et permet le FTP non anonyme (c'est le cas des utilisateurs virtuels)
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
pour des raisons de sécurité, aucune des commandes d'écriture n'est autorisée
chroot_local_user=YES
l'utilisateur virtuel est limité à la zone /srv/ftp définie ci-dessus
guest_enable=YES
guest_username=ftp
très important : active les utilisateurs virtuels ! guest_username dit que tous les utilisateurs virtuels sont mappés à l'utilisateur réel ftp mis en place plus haut. Cela détermine l'emplacement des fichiers du serveur : le répertoire personnel de l'utilisateur ftp, /srv/ftp
listen=YES
listen_port=10021
vsftpd en mode autonome. Cela signifie qu'il suffit de lancer l'exécutable vsftpd pour qu'il démarre. Les demandes FTP sont écoutées sur le port non standard 10021 (pour FTP, le port est généralement 21)
pasv_min_port=30000
pasv_max_port=30999
plage de ports pou les demandes entrantes FTP passives - très utile si vous configurez un pare-feu

Démarrer vsftpd :

  • sudo service vsftpd restart

Test

Lancer :

  • ftp localhost 10021
Connected to localhost (127.0.0.1).
220 ready, dude (vsFTPd 1.1.0: beat me, break me)
Name (localhost:chris): tom
331 Please specify the password.
Password:
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (127,0,0,1,117,135)
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp> size hosts
213 147
ftp>

Comments:

Le mot de passe fourni était “foo”.

Do not be alarmed by the “failed to open directory”. That is because the directory /home/ftpsite is not world readable (we could change this behaviour if we wanted using anon_world_readable_only=NO but maybe we want it this way for security.

We can see that we have access to the “hosts” file we copied into the virtual FTP area, via the size command.

8.34. Modification de vsftpd.conf

Ouvrir avec les droits d'administration le fichier /etc/vsftpd.conf pour le modifier comme ceci :

/etc/vsftpd.conf
# vsftpd en mode "standalone"
listen=YES

# Connexions anonymes désactivées
# et connexions non-anonymes activées (c'est le cas des utilisateurs virtuels) :
anonymous_enable=NO
local_enable=YES

# Toute action d'écriture est interdite
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 'guest_enable' active les utilisateurs virtuels
# 'guest_username' fait correspondre tous les utilisateurs virtuels
#   à l'utilisateur 'virtual' défini plus haut,
#   et au home correspondant : '~virtual/'.
guest_enable=YES
guest_username=www-data

# Droits par défaut des fichiers uploadés
anon_umask=022

# Les utilisateurs virtuels restent chez eux : '~virtual/'
chroot_local_user=YES

# nombre maximum de sessions : 200
#   (les nouveaux clients recevront un message du genre: "erreur : serveur occupé").
# nombre maximum de sessions par IP : 4
max_clients=200
max_per_ip=4

####################################
# Debian customization             #
# (ou adoptons la Debian attitude) #
####################################
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem

# Emplacement des configurations individuelles pour chaque utilisateur
user_config_dir=/etc/vsftpd/vsftpd_user_conf

8.35. Paramétrer les utilisateurs

Pour chrooter les utilisateurs dans leur répertoire respectif, on crée un fichier pour chaque utilisateur de la base de données.

Par exemple, pour l'utilisateur user1, Ouvrir avec les droits d'administration le fichier /etc/vsftpd/vsftpd_user_conf/user1 pour y écrire :

/etc/vsftpd/vsftpd_user_conf/user1
anon_world_readable_only=NO
local_root=/home/user1
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

Adapter selon les réglages voulus.

8.36. Redémarrage et test

Redémarrer le serveur FTP :

  • sudo /etc/init.d/vsftpd restart

Il ne reste plus qu'à se connecter à un compte ftp en utilisant par exepmle :

  • IP : ip du serveur ou nom de domaine
  • login : user1
  • password : password1

Si on ne peut pas uploader de fichiers, c'est que les droits ne sont pas bons. Vérifier que le répertoire /home/user1 a pour propriétaire et groupe www-data:www-data (attention, récursif, donc valable pour tous les fichiers et répertoires contenus dans /home/user1)

8.37. Utilisateurs virtuels seulement

Cette configuration n'autorise que des utilisateurs virtuels et pas les utilisateurs locaux.

L'étape suivante consiste à créer un fichier pam_userdb pour authentifier les utilisateurs virtuels.

Il suffit de créer un fichier texte nommé /etc/vsftpd/login.txt avec deux paires de lignes (ID et mot de passe) :

/etc/vsftpd/login.txt
harry
mot_de_passe_de_harry
potter
mot_de_passe_de_potter

Maintenant, créer le fichier /etc/vsftpd/login.db avec la commande suivante :

  • sudo db5.1_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

Maintenant, créer un fichier PAM /etc/pam.d/vsftpd qui utilise la DB des utilisateurs virtuels :

/etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/login
account required pam_userdb.so db=/etc/vsftpd/login

Créer un fichier de configuration vsftpd nommé /etc/vsftpd.conf comme ceci :

/etc/vsftpd.conf
# désactive le FTP anonyme
anonymous_enable=NO

# autorise le FTP non anonyme
local_enable=YES

# active les utilisateurs virtuels
guest_enable=YES

# les utilisateurs virtuels utilisent des privs locales, pas des privs anon
virtual_use_local_privs=YES

# autorise les uploads et la création de nouveaux répertoires
write_enable=YES

# le fichier PAM utilisé pour l'authentification d'utilisateurs virtuels
pam_service_name=vsftpd

# en association avec 'local_root',
# spécifie un répertoire home pour chaque utilisateur virtuel
user_sub_token=$USER
local_root=/srv/www/virtual/$USER

# l'utilisateur virtuel est limité à sa zone FTP virtuelle
chroot_local_user=YES

# cache les ID utilisateur du serveur FTP et n'afficher que "ftp" dans les listes de répertoires
hide_ids=YES

# vsftpd fonctionne en mode autonome
listen=YES

# écoute sur ce port pour les connexions FTP entrantes
listen_port=60021

# port minimum à allouer à des connexions de données de style PASV
pasv_min_port=62222

# port maximum à allouer à des connexions de données de style PASV
pasv_max_port=63333

# contrôle si les connexions de données style PORT utilisent le port 20 (ftp-data)
connect_from_port_20=YES

# le umask de création du fichier
local_umask=022

Créer un répertoire pour les utilisateurs virtuels dans /var/www/virtual et changer leur propriétaire en ftp :

  • sudo mkdir /var/www/virtual/mary
    sudo chown ftp:ftp /var/www/virtual/mary

La dernière étape consiste à redémarrer vsftpd avec la nouvelle configuration et de vérifier si ça marche :

  • sudo service vsftpd restart
    lftp -u mary -p 60021 192.168.1.101
    ncftp -u mary -P 60021 192.168.1.101

8.37.1. Créer l'arborescence

Créer les dossiers suivants pour y placer les fichiers de configuration :

  • sudo mkdir -p /etc/vsftpd/vsftpd_user_conf

<note tip>le paramètre -p crée les répertoires parents si besoin</note>

Sauvegarder les fichiers originaux :

  • sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original
    sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.original

8.37.2. Créer la base de données des utilisateurs virtuels

8.37.2.1. Fichier /etc/pam.d/vsftpd

Effacer le contenu du fichier /etc/pam.d/vsftpd et le remplacer par :

/etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login

8.37.2.2. Fichier login.txt

Créer un fichier /etc/vsftpd/login.txt, avec les utilisateurs et leurs mots de passe alternativement :

/etc/vsftpd/login.txt
util1
mdp1
util2
mdp2

Ici, les 2 utilisateurs sont : util1 (mot de passe = mdp1) et util2 (mot de passe = mdp2).

Attention : le fichier login.txt doit impérativement se terminer par un saut de ligne pour que db5.1_load le lise et l’interprète correctement.

8.37.2.3. Création de la base de données

Il faut convertir le fichier login.txt au format db et sécuriser les fichiers :

  • sudo db5.1_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
    sudo chmod 600 /etc/vsftpd/login.*

8.37.3. Configuration du fichier /etc/vsftpd.conf

/etc/vsftpd.conf
# Ceci configure vsFTPd en mode "standalone"
listen=YES

# On désactive les connexions anonymes
# et on active les non-anonymes(c'est le cas des utilisateurs virtuels):
anonymous_enable=NO
local_enable=YES

# Pour des raisons de sécurité on interdit toute action d'écriture:
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 'guest_enable' est très important: cela active les utilisateurs virtuels!
# 'guest_username' fait correspondre tous les utilisateurs virtuels à
# l'utilisateur 'ftp' que nous avons défini plus haut, et au home
# correspondant: '/home/ftp/'.
guest_enable=YES
guest_username=ftp

# On veut que les utilisateurs virtuels restent chez eux: '/home/ftp/'
chroot_local_user=YES

# On défini le nombre maximum de sessions à 200(les nouveaux clients recevront
# un message du genre: "erreur: serveur occupé").
# On défini le nombre maximum de sessions par IP à 4
max_clients=200
max_per_ip=4

####################################
# Debian customization             #
####################################
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem


## Activer la configuration per-user
user_config_dir=/etc/vsftpd/vsftpd_user_conf

Relancer le serveur par :

  • sudo service vsftpd restart

8.38. Gérer les droits des utilisateurs virtuels

Par défaut les utilisateurs virtuels n'ont aucun droit, il faut donc les définir pour chacun d'entre eux :

Pour cela, créer un fichier de configuration pour chaque utilisateur dans le dossier /etc/vsftpd/vsftpd_user_conf/.

Par exemple, pour util1, configurer le fichier /etc/vsftpd/vsftpd_user_conf/util1

Exemple de fichier
## l'utilisateur est enfermé dans un dossier déterminé
local_root=/chemin_du_dossier/

## on ne souhaite pas de lecture seule (Lecture seulement)
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

8.39. Commandes

  • pour démarrer :
    sudo service vsftpd start

  • pour arrêter :

    sudo service vsftpd stop

  • pour redémarrer :

    sudo service vsftpd restart

Normalement, le système a déjà un utilisateur ftp de home /srv/ftpet un groupe ftp. Si ce n'est pas le cas, les créer avec :

  • sudo groupadd ftp
    sudo useradd -d /media/R-Pi-Donnees/ftp ftp

Si l'utilisateur ftp existe, lui donner comme home le répertoire de base du serveur ftp :

  • sudo usermod -d /media/R-Pi-Donnees/ftp ftp

8.40. Configuration

Le fichier de configuration de vsftpd /etc/vsftpd.conf. Commencer par sauvegarder l'original :

  • sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original

Pour partir d'une configuration vide, le recréer par un touch et créer un dossier qui contiendra les configurations spécifiques à chaque utilisateur :

  • sudo mkdir /etc/vsftpd/vsftpd_user_conf

Ouvrir avec les droits d'administration le fichier /etc/vsftpd.conf (vide) pour y écrire ceci :

changeren
# Interdire les connexions anonymes au serveur
anonymous_enable=YESanonymous_enable=NO
#anon_upload_enable=YESanon_upload_enable=NO
#anon_mkdir_write_enable=YESanon_mkdir_write_enable=NO
anon_other_write_enable=NO
# Autoriser les utilisateurs locaux (obligatoire même si on ne veut que des utilisateurs virtuels)
#local_enable=YESlocal_enable=YES
# Autoriser les utilisateurs virtuels
guest_enable=YES
guest_username=ftp
# Activer les droits spécifiques par utilisateur
user_config_dir=/etc/vsftpd/vsftpd_user_conf
# activation de logs
xferlog_enable=YESxferlog_enable=YES
#xferlog_file=/var/log/vsftpd.logxferlog_file=/var/log/vsftpd.xfer.log
#xferlog_std_format=YESxferlog_std_format=YES
log_ftp_protocol=YES
vsftpd_log_file=/var/log/vsftpd.log
# Configuration du serveur en standalone
listen=YESlisten=YES
tcp_wrappers=YES
connect_from_port_20=YESconnect_from_port_20=YES
#ftpd_banner=Welcome to blah FTP service.ftpd_banner= Bienvenue sur le serveur FTP
# Configuration de l’authentification
pam_service_name=vsftpdpam_service_name=vsftpd
userlist_enable=YES
/etc/vsftpd.conf
# http://vsftpd.beasts.org/vsftpd_conf.html ou "man vsftpd.conf"

# Port d’écoute
listen_port=21

# Bannière de bienvenue
ftpd_banner=Bienvenue sur mon ftp perso

# Fichier de config PAM
pam_service_name=vsftpd

# Mode "standalone"
listen=YES

# Pas de connexion anonyme
anonymous_enable=NO

# connexions des utilisateurs locaux = autorisées.
# Indispensable pour que les utilisateurs virtuels (mappés sur un utilisateur local)
# puissent se connecter
# Les "vrais" utilisateurs locaux sont ensuite désactivés avec le fichier user_list
local_enable=YES

# Fichier de users
userlist_file=/etc/vsftpd/user_list
# Chargement de la liste userlist_file
userlist_enable=YES
# On refuse les utilisateurs de la liste
userlist_deny=YES

# trop restrictif, un utilisateur virtuel pourra ainsi télécharger un fichier même s'il n'est pas world readable
anon_world_readable_only=NO

# Refus des commandes influant sur le système de fichier (STOR, DELE, RNFR, RNTO, MKD, RMD, APPE and SITE)
write_enable=NO

# Pas de droits d’écriture pour les anonymes (et donc utilisateurs virtuels) par défaut
# les autorisations seront données au cas par cas :
# pas d'upload
anon_upload_enable=NO
# pas de création de répertoire
anon_mkdir_write_enable=NO
# pas de création, suppression, renommage de répertoire ...
anon_other_write_enable=NO

# On fait en sorte que les utilisateurs "guest" (non-anonymes) soient mappés sur le compte local "ftp"
guest_enable=YES
guest_username=ftp

# chroot des utilisateurs
chroot_local_user=YES

# Nombre maximum de connexions simultanées
max_clients=50

# Nombre maximum de connexions venant de la même IP
max_per_ip=4

# Dossier de configuration spécifique des utilisateurs
user_config_dir=/etc/vsftpd/vsftpd_user_conf

# log activé
xferlog_enable=YES

<note>Il existe beaucoup de possibilités de configuration. Lire la page de manuel de vsftpd pour une configuration sûre.</note>

Petit résumé :

  • écoute sur le port 21
  • en standalone
  • refus des utilisateurs anonymes
  • utilisateurs système et utilisateurs virtuels acceptés
  • utilisateurs virtuels mappés sur l'utilisateur système ftp
  • par défaut, aucun droit d'écriture pour les utilisateurs
  • utilisateurs chrootés dans /var/ftp
  • dossier des configurations d'utilisateurs virtuels = /etc/vsftpd/vsftpd_user_conf/
  • liste des utilisateurs refusés (pour lesquels on ne demandera même pas le mot de passe) = /etc/vsftpd/user_list
? Mapping utilisateur

:: Par définition, les utilisateurs virtuels ne sont pas des utilisateurs système mais disposent tout de même de droits (sur les fichiers, dossiers, en écriture, lecture…). :: Pour pouvoir gérer ces droits, on mappe 2) ces utilisateurs à un utilisateur système unique (ici ftp). :: Les droits des utilisateurs virtuels seront donc ceux de l'utilisateur système ftp. :: Ces droits prévalent sur la configuration (si l'utilisateur “ftp” n'a pas les droits d'écriture dans un dossier, l'utilisateur virtuel ne pourra pas y écrire, même s'il a les droits d'écriture). !!

? Standalone :: En mode standalone, le serveur est autonome et le service tourne en permanence. !!

<note important>Penser à ouvrir les ports 20 et 21 du pare-feu et à faire une redirection de port si on est derrière un routeur. Si les valeurs de ces ports sont changées dans le fichier de configuration, modifier pare-feu et routage en conséquence.</note>

Pour plus de sécurité, réduire les droits sur le fichier de configuration :

  • sudo chmod 600 /etc/vsftpd.conf

8.41. Utilisateurs virtuels (format berkeley)

Nous allons créer la base (au format berkeley) contenant les utilisateurs virtuels.

Pour cela, on part d'un fichier texte simple, contenant les logins et mots de passe et on utiliserons une commande pour créer un fichier au format db à partir de ce fichier texte.

Le format du fichier texte est simple : dans l'ordre, sur chaque ligne, le login, le pass, le login, le pass, etc.

Créons une base contenant deux utilisateurs

  • titi (mot de passe est passtiti)
  • toto (mot de passe est passtoto)

Créer avec les droits d'administration le fichier /etc/vsftpd/login.txt pour y inscrire ceci :

/etc/vsftpd/login.txt
titi
passtiti
toto
passtoto

<note important>Attention ! Ce fichier doit se terminer par un retour à la ligne.</note>

Pour créer le fichier .db à partir de celui-ci, on utilise la commande db_load, fournie par le paquet db5-utils 3).

  • sudo db5.1_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

Cette commande peut être intégrée à un script pour régénérer plus facilement la base.

Pour plus de sécurité, réduire les droits sur les fichiers utilisateurs :

  • sudo chmod 600 /etc/vsftpd/login.*

8.42. Se simplifier la vie : un script

La commande qui génère le fichier db à partir du txt est lourde à retenir ; de plus il est intéressant de pouvoir générer un fichier de configuration spécifique vide pour chaque utilisateur pour ne pas avoir d'erreur.

Le script suivant, nommé txt2db.sh, régénère le fichier .db et crée un fichier de config vide s'il n'existe pas 4) :

~/bin/txt2db.sh
#!/bin/sh
if [ $# = "2" ]; then
    rm -f $2
    db5.1_load -T -t hash -f $1 $2
    chmod 600 /etc/vsftpd/login.*
    echo "Base créée"
    lignes=$(cat $1)
    nb=1
    for ligne in $lignes
    do
        if [ $(($nb%2)) -ne 0  ];
        then
            if [ ! -e vsftpd_user_conf/$ligne ];
            then
                touch /etc/vsftpd/vsftpd_user_conf/$ligne
                echo "fichier $ligne créé"
            fi
        fi
        nb=$(($nb+1))
    done
else
    echo "Il faut donner le fichier d’entrée et le fichier de sortie"
fi

Le rendre exécutable (à ne faire que la première fois) :

sudo chmod +x ~/bin/txt2db.sh

Utilisation 5) :

cd ~/bin
sudo ./txt2db.sh /etc/vsftpd/login.txt /etc/vsftpd/login.db

Ce script lit les lignes du login.txt ; pour chaque login, il vérifie si un fichier de configuration existe. Si ce n'est pas le cas il en crée un vide. Auparavant il génère le fichier db.

Voici un script appelé cleanconf.sh qui supprime tous les fichiers qui n'ont pas de login associé (utilisateurs supprimés) :

~/bin/cleanconf.sh
fichiers=$(ls /etc/vsftpd/vsftpd_user_conf)
users=""
lignes=$(cat /etc/vsftpd/login.txt)
nb=1
for ligne in $lignes
do
    if [ $(($nb%2)) -ne 0  ];
    then
         users="$users $ligne"
    fi
    nb=$(($nb+1))
done
for conf in $fichiers
do
    found=0
    for user in $users
    do
        if [ $conf = $user ];
        then
            found="1"
        fi
    done
    if [ $found != "1" ];
    then
        rm -f /etc/vsftpd/vsftpd_user_conf/$conf
        echo "Fichier $conf supprimé"
    fi
done

Le rendre exécutable (à ne faire que la première fois) :

sudo chmod +x ~/bin/txt2db.sh

Utilisation 6) :

cd ~/bin
sudo ./cleanconf.sh

8.43. PAM

PAM 7) est un système d'authentification modulaire gérant l'authentification des utilisateurs.

La base d'utilisateurs est créée. Configurons PAM pour qu'il l'utilise.

PAM utilise pour sa configuration un dossier, /etc/pam.d/, contenant les fichiers de configuration des services qui l'utilisent.

Un fichier /etc/pam.d/vsftpd existe déjà, mais nous allons remplacer son contenu par le suivant :

#%PAM-1.0
auth sufficient pam_unix.so
account sufficient pam_unix.so
auth       required     /lib/security/pam_userdb.so db=/etc/vsftpd/login
account    required     /lib/security/pam_userdb.so db=/etc/vsftpd/login

Les lignes 2 et 3 permettent la connexion des utilisateurs système ; les lignes 4 et 5, la connexion des utilisateurs virtuels placés dans la base.

<note important>Pour une architecture 64 bits, les deux dernières lignes sont à remplacer par celles-ci :

auth       required     /lib64/security/pam_userdb.so db=/etc/vsftpd/login
account    required     /lib64/security/pam_userdb.so db=/etc/vsftpd/login

</note>

Relancer le serveur :

sudo service vsftpd restart

8.44. Attribution/Personnalisation des droits

Testons notre serveur :

ftp localhost
  • utilisateur : titi
  • mot de passe : passtiti

La connexion doit s' établir.

Placer un fichier dans /var/ftp/ (lisible par l'utilisateur ftp) et se reconnecter. Une fois connecté, taper la commande ls. On voit le fichier.

Si nous avons créé des utilisateurs virtuels, c'est pour que chacun d'eux puisse avoir des droits différents, et même leur espace propre. Vous avez vu que dans la configuration, nous utilisons la directive “user_config_dir=/etc/vsftpd/vsftpd_user_conf”. Ce dossier nous permet de stocker dans des fichiers séparés des configurations spécifiques à chaque utilisateur. Dans ces fichiers, on entre des paramètres, les mêmes que ceux du fichier de configuration, qui seront prioritaires par rapport à ce dernier. Généralement, on y modifie le “local_root” et les droits d'écriture. On y met un fichier par utilisateur, et le fichier porte le même nom que le login de l'utilisateur auquel il fait référence.

Créons un dossier titi dans /var/ftp, changeons son propriétaire puis modifions le “local_root” et les droits d'écriture pour cet utilisateur :

sudo mkdir /var/ftp/titi
sudo chown ftp:ftp /var/ftp/titi
sudo echo "local_root=titi" > /etc/vsftpd/vsftpd_user_conf/titi
sudo echo "write_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
sudo echo "anon_upload_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
sudo echo "anon_mkdir_write_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
sudo echo "anon_other_write_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi

Notez que l'on aurait pu mettre un répertoire absolu pour le “local_root”, par exemple /var/www/html/le_site_de_titi, mais en s'assurant que l'utilisateur ftp ait les droits adéquats sur ce dossier. Reconnectez-vous avec l'utilisateur titi, il vous est maintenant possible de déposer des fichiers. Reportez-vous à la page de man pour les détails sur les paramètres de configuration.

8.45. Configurer les utilisateurs virtuels

pam_userdb est utilisé pour authentifier les utilisateurs virtuels.

Nous aurons besoin d’un fichier de base de données contenant les couples identifiant/mot de passe.

Ouvrir ou créer avec les droits d'administration le fichier /etc/vsftpd/virtual-users.txt pour y écrire les noms d’utilisateur et mots de passe sur les lignes en alternance (en terminant par un retour à la ligne) :

/etc/vsftpd/virtual-users.txt
user1
password1
user2
password2

Créer la base de données en exécutant la ligne suivante :

sudo db5.1_load -T -t hash -f /etc/vsftpd/virtual-users.txt /etc/vsftpd/virtual-users.db

Restreindre les droits sur ce fichier pour éviter que la base ne soit récupérée et exploitée.

sudo chmod 600 /etc/vsftpd/virtual-users.db

<note tip>Pour ajouter, modifier ou supprimer un utilisateur il faut éditer le fichier virtual-users.txt puis relancer la création de la base avec la commande ci-dessus. </note>

La base des utilisateurs est créée, encore faut-il dire à vsftpd de l‘utiliser. Ouvrir avec les droits d'administration le fichier /etc /pam.d/vsftpd pour remplacer son contenu par ses lignes :

/etc /pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/virtual-users
account required /lib/security/pam_userdb.so db=/etc/vsftpd/virtual-users

Maintenant il faut configurer le serveur lui-même. Le fichier de config à éditer est Ouvrir avec les droits d'administration le fichier /etc/vsftpd.conf pour changer au moins les paramètres suivants :

/etc/vsftpd.conf
# pas d’utilisateur anonyme
anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
# par défaut, pas de droit d’écriture, on spécifiera les droits par utilisateur plus tard
write_enable=NO
# on n’autorise pas les utilisateurs à se faire passer pour d’autres
chown_uploads=NO
chown_username=nobody
# on restreint les utilisateurs à leur home
chroot_local_user=YES
# on autorise les utilisateurs locaux
local_enable=YES
# Ajout de quelques paramètres manquants :
# active les utilisateurs virtuels et spécifie le chemin des configs
guest_enable=YES
guest_username=www-data
user_config_dir=/etc/vsftpd/user_conf
# Quelques restrictions sur le serveur
max_clients=20
max_per_ip=5

Pour chaque utilisateur, créer un répertoire contenant un fichier de configuration quiprécise ses droits et le dossier de partage.

Créer un répertoire :

sudo mkdir /etc/vsftpd/user1_conf

Ouvrir avec les droits d'administration le fichier /etc/vsftpd/user1_conf/user1 pour définir les paramètres suivants pour l’utilisateur :

/etc/vsftpd/user1_conf/user1
# droits de lecture de l’utilisateur 
download_enable=YES 
anon_world_readable_only=NO 
# droits d'écriture de l’utilisateur 
write_enable=YES 
anon_upload_enable=YES 
anon_mkdir_write_enable=YES 
# droit de renommer et de supprimer 
anon_other_write_enable=YES 
# droit de faire des chmod 
chmod_enable=YES 
virtual_use_local_privs=YES 
#affiche les fichiers cachés (important pour l’utilisation des fichiers htaccess) 
force_dot_files=YES 
# Définit le dossier du FTP 
local_root=/home/user1/public_html 
# Définit a qui appartiendront les fichiers à uploader 
guest_username=pi

Redémarrer le serveur pour les modifications :

sudo /etc/init.d/vsftpd restart

Créer l’utilisateur ftp avec comme répertoire home /media/R-Pi-Donnees/ftp :

sudo useradd -d /media/R-Pi-Donnees/ftp -s /usr/sbin/nologin ftp

8.46. Création de l'utilisateur dédié

8.47. Utilisateurs virtuels

Créer les répertoires :

sudo mkdir -p /etc/vsftpd/vsftpd_user_conf

Sauvegarder les fichiers de configuration :

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original
sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.original

Ouvrir avec les droits d'administration le fichier /etc/pam.d/vsftpd pour remplacer son contenu par :

/etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login

Créer le fichier /etc/vsftpd/login.txt :

sudo touch /etc/vsftpd/login.txt

Ouvrir avec les droits d'administration le fichier /etc/vsftpd/login.txt pour le modifier comme ceci :

util1
mdp1
util2
mdp2

Les utilisateurs sont ici :

  • util1, mot de passe mdp1
  • util2, mot de passe mdp2

<note important>le fichier login.txt doit impérativement se terminer par un saut de ligne pour que db5.1_load le lise et l'interprête correctement. </note>

Convertir le fichier /etc/vsftpd/login.txt au format “db” :

sudo db5.1_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

Sécuriser les fichiers :

sudo chmod 600 /etc/vsftpd/login.*

8.48. Configuration du fichier /etc/vsftpd.conf

/etc/vsftpd.conf
# Ceci configure vsFTPd en mode "standalone"
listen=YES

# On désactive les connexions anonymes
# et on active les non-anonymes(c'est le cas des utilisateurs virtuels):
anonymous_enable=NO
local_enable=YES

# Pour des raisons de sécurité on interdit toute action d'écriture:
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 'guest_enable' est très important: cela active les utilisateurs virtuels!
# 'guest_username' fait correspondre tous les utilisateurs virtuels à
# l'utilisateur 'ftp' que nous avons défini plus haut, et au home
# correspondant: '/home/ftp/'.
guest_enable=YES
guest_username=ftp

# On veut que les utilisateurs virtuels restent chez eux: '/home/ftp/'
chroot_local_user=YES

# On défini le nombre maximum de sessions à 200(les nouveaux clients recevront
# un message du genre: "erreur: serveur occupé").
# On défini le nombre maximum de sessions par IP à 4
max_clients=200
max_per_ip=4

####################################
# Debian customization             #
####################################
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem


## Activer la configuration per-user
user_config_dir=/etc/vsftpd/vsftpd_user_conf

Relancer le serveur :

sudo /etc/init.d/vsftpd reload

8.49. Gérer les droits des utilisateurs virtuels

Par défaut les utilisateurs virtuels n'ont aucun droit, il faut donc les définir pour chacun d'entre eux :

Pour cela, créer un fichier de configuration pour chaque utilisateur dans le dossier /etc/vsftpd/vsftpd_user_conf/

Par exemple, pour util1, configurer le fichier /etc/vsftpd/vsftpd_user_conf/util1

/etc/vsftpd/vsftpd_user_conf/util1
## l'utilisateur est enfermé dans un dossier déterminé
local_root=/chemin_du_dossier/

## on ne souhaite pas de lecture seule (Lecture seulement)
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

8.50. Configuration de vsftpd

Ouvrir avec les droits d'administration le fichier /etc/vsftpd.conf pour le modifier comme ceci :

  • remplacer anonymous_enable=YES par anonymous_enable=NO
  • Dé-commenter local_enable=YES et write_enable=YES
  • Ajouter à la fin du fichier force_dot_files=YES

Sauvegarder et quitter le fichier. Redémarrer vsftpd :

sudo service vsftpd restart

Désormais, framboise est accessible par ftp depuis un PC (par exemple avec FileZilla) avec :

  • identifiant : pi
  • mot de passe de pi

8.51. Références

1)
Very Secure File Transfert Protocol Daemon
2)
relie
3)
à installer si ce n'est pas fait
4) , 5) , 6)
le script est supposer résider en ~/bin/
7)
Pluggable Authentication Modules

Navigation