ProFTPd sous Debian 10.x

Écrit par Alexandre Dos Reis
Créé le 10/12/2020, modifié le 5/5/2021.
v1 - Licence open source - v1.3.6 - Documentation

I. Présentation

File Transfer Protocol (protocole de transfert de fichier), ou FTP, est un protocole de communication destiné au partage de fichiers sur un réseau TCP/IP. Il permet, depuis un ordinateur, de copier des fichiers vers un autre ordinateur du réseau, ou encore de supprimer ou de modifier des fichiers sur cet ordinateur. Ce mécanisme de copie est souvent utilisé pour alimenter un site web hébergé chez un tiers.

La variante de FTP protégée par les protocoles SSL ou TLS (SSL étant le prédécesseur de TLS) s'appelle FTPS.

FTP obéit à un modèle client-serveur, c'est-à-dire qu'une des deux parties, le client, envoie des requêtes auxquelles réagit l'autre, appelé serveur. En pratique, le serveur est un ordinateur sur lequel fonctionne un logiciel lui-même appelé serveur FTP, qui rend publique une arborescence de fichiers similaire à un système de fichiers UNIX. Pour accéder à un serveur FTP, on utilise un logiciel client FTP (possédant une interface graphique ou en ligne de commande).

FTP, qui appartient à la couche application du modèle OSI et du modèle ARPA, utilise une connexion TCP.

Par convention, deux ports sont attribués (well known ports) pour les connexions FTP : le port 21 pour les commandes et le port 20 pour les données. Pour le FTPS dit implicite, le port conventionnel est le 990.

Ce protocole peut fonctionner avec IPv4 et IPv6.

Il existe deux modes permettant d'établir une connexion au serveur FTP. Le mode passif et le mode actif :

En mode actif, c'est le client FTP qui détermine le port de connexion à utiliser pour permettre le transfert des données. Ainsi, pour que l'échange des données puisse se faire, le serveur FTP initialisera la connexion de son port de données (port 20) vers le port spécifié par le client. Le client devra alors configurer son pare-feu pour autoriser les nouvelles connexions entrantes afin que l'échange des données se fasse. De plus, il peut s'avérer problématique pour les utilisateurs essayant d'accéder à des serveurs FTP lorsque ces utilisateurs sont derrière une passerelle NAT. Étant donnée la façon dont fonctionne le NAT, le serveur FTP lance la connexion de données en se connectant à l'adresse externe de la passerelle NAT sur le port choisi. Certaines passerelles NAT n'ayant pas de correspondance pour le paquet reçu dans la table d'état, le paquet sera ignoré et ne sera pas délivré au client.

En mode passif, le serveur FTP détermine lui-même le port de connexion à utiliser pour permettre le transfert des données (data connexion) et le communique au client. En cas de présence d'un pare-feu devant le serveur, celui-ci devra être configuré pour autoriser la connexion de données. L'avantage de ce mode est que le serveur FTP n'initialise aucune connexion. Ce mode fonctionne sans problème avec des clients derrière une passerelle NAT. Dans les nouvelles implémentations, le client initialise et communique directement par le port 21 du serveur ; cela permet de simplifier les configurations des pare-feu serveur.

Source : Wikipédia

Dans cet exemple, on utilisera ProFTPd qui est le serveur FTP libre, puissant et parfaitement sécurisé, comme l'annonce leur site web.

Lien utile

Topologie :

MachineOSDistributionVersionRôleNom d'hôteIP
Machine Virtuelle Virtual BoxGNU / LinuxDebian10.5Serveur FTPftp01172.16.200.20
Dell Latitude 3500Windows10 Entreprise1903Client FTPL019-163172.16.1.16

II. Installation de ProFTPd

$
apt update
$
apt install proftpd-basic

Pour vérifier que le service a bien démarré :

$
systemctl status proftpd

Pour le lancer à chaque démarrage du système :

$
systemctl enable proftpd

Pour vérifier sur quel port écoute ProFTPd :

$
lsof -i -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME  
proftpd 1173 proftpd 0u IPv6 17361 0t0 TCP *:21 (LISTEN)

Le fichier de log se trouve là : /var/log/proftpd/proftpd.log

III. Accès avec un utilisateur système

a. Connexion simple

Pour l'instant, l'accès au serveur se fait avec un utilisateur présent dans le système. On effectue le test avec WinSCP avec notre client FTP. Par contre, l'accès avec root est refusé.

test client alextest client alex

On est connecté dans le home d'Alex /home/alex, on peut donc créer et déposer des fichiers librement. Les droits sont repris des droits définis dans la debian. Si on essai de créer un fichier dans le dossier /home, on ne pourra pas contrairement à ce que nous affiche WinSCP car alex n'en est pas le propriétaire.

test client alex

lrwxrwxrwx 1 root root 7 août 27 08:55 bin -> usr/bin  
drwxr-xr-x 3 root root 4096 août 27 08:59 boot  
drwxr-xr-x 17 root root 3200 oct. 10 17:42 dev  
drwxr-xr-x 75 root root 4096 oct. 10 17:48 etc  
*drwxr-xr-x 5 root root 4096 sept. 17 10:40 home*  
lrwxrwxrwx 1 root root 31 août 27 08:56 initrd.img -> boot/initrd.img-4.19.0-10-amd64  
lrwxrwxrwx 1 root root 31 août 27 08:56 initrd.img.old -> boot/initrd.img-4.19.0-10-amd64  
lrwxrwxrwx 1 root root 7 août 27 08:55 lib -> usr/lib  
lrwxrwxrwx 1 root root 9 août 27 08:55 lib32 -> usr/lib32  
lrwxrwxrwx 1 root root 9 août 27 08:55 lib64 -> usr/lib64  
lrwxrwxrwx 1 root root 10 août 27 08:55 libx32 -> usr/libx32  
(...)

root est bien propriétaire du dossier /home.

b. Enfermer l'utilisateur dans son home

Evidemment on ne veut pas que les utilisateurs puissent remonter à la racine du système, pour cela on va activer l'option pour enfermer les utilisateurs dans leur home respectif. Il va falloir modifier le fichier de configuration de ProFTPd :

$
nano /etc/proftpd/proftpd.conf

Et décommenter la ligne suivante :

# Use this to jail all users in their homes  
DefaultRoot ~

Le charactère tilde ~ dans le système Linux signifie le home de l'utilisateur courant.

$
systemctl restart proftpd

L'accès est maintenant limité au dossier home de chaque utilisateur.

c. Empêcher l'utilisateur de se connecter en ssh

En créant un utilisateur système sur la machine directement pour qu'il puisse accéder à son FTP, on rend possible pour ce même utilisateur la connexion en SSH, ce que l'on souhaite éviter. Pour remédier à cela, on va créer un utilisateur mais en lui associant un shell qui n'existe pas. Pour le créer on va se rendre dans /etc/shells et ajouter un faux shell en ajoutant cette ligne : /bin/false.

# /etc/shells: valid login shells
/bin/sh  
/bin/bash  
/usr/bin/bash  
/bin/rbash  
/usr/bin/rbash  
/bin/dash  
/usr/bin/dash  
/bin/false

Lors de la création de l'utilisateur, on va spécifier ce faux shell :

$
adduser --shell /bin/false test

On déclare notre utilisateur normalement, mais lorsque l'on tente une connexion ssh :

$
ssh test@172.16.200.20
test@172.16.200.20's password:  
Linux ftp01 4.19.0-10-amd64 #1 SMP Debian 4.19.132-1 (2020-07-24) x86_64  

The programs included with the Debian GNU/Linux system are free software;  
the exact distribution terms for each program are described in thev individual files in /usr/share/doc/*/copyright.  

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent  
permitted by applicable law.  
Connection to 172.16.200.20 closed.

La connexion se ferme même si on a rentré le mot de passe.

IV. Accès avec un utilisateur virtuel

Si on ne souhaite pas créer des utilisateurs système pour ne pas poluer le fichier /etc/passwd, on peut créer des utilisateurs virtuels qui seront liés à ProFTPd. On va devoir ajouter ces lignes dans le fichier de configuration :

AuthUserFile /etc/proftpd/ftpd.passwd  
AuthGroupFile /etc/proftpd/ftpd.group  
AuthOrder mod_auth_file.c
$
systemctl reload proftpd

On se rend dans le dossier /etc/proftpd pour créer les dossiers ftpd.passwd et ftpd.group.

$
touch ftpd.passwd && touch ftpd.group

On crée l'utilisateur virtuel avec la commande ftpasswd.

$
ftpasswd --passwd --name=asterix --uid=1100 --gid=1100 --file=/etc/proftpd/ftpd.passwd --home=/home/virtualUsers/asterix --shell=/bin/false

Création du groupe lié à cet utilisateur :

$
ftpasswd --group --name=asterix --gid=1100 file=/etc/proftpd/ftpd.group --member=asterix

Il faut attribuer à l'utilisateur asterix les droits sur le dossier /home/virtual.users/asterix avec cette commande :

$
chown 1100:1100 /home/virtual.users/asterix

On se connecte en FTP au serveur avec l'utilisateur Astérix et on crée un fichier nommé helloworld puis on vérifie le fichier créé :

$
ls -l /home/virtual.users/asterix/
-rw-r--r-- 1 1100 1100 10 oct. 12 11:04 helloworld

Les droits du fichier sont corrects.

V. Accès en anonyme

On peut permettre à des clients n'ayant pas d'utilisateur créé sur le système du serveur ftp de se connecter en mode anonyme. Ce mode n'est pas enclenché par défaut, il faut décommenter ces lignes dans le fichier de configuration :

<Anonymous ~ftp>  
User ftp  
Group nogroup  
# We want clients to be able to login with "anonymous" as well as "ftp"  
UserAlias anonymous ftp  
# Cosmetic changes, all files belongs to ftp user  
DirFakeUser on ftp  
DirFakeGroup on ftp  

RequireValidShell off  

# Limit the maximum number of anonymous logins  
MaxClients 10  

# We want 'welcome.msg' displayed at login, and '.message' displayed  
# in each newly chdired directory.  
DisplayLogin welcome.msg  
DisplayChdir .message  

# Limit WRITE everywhere in the anonymous chroot  
<Directory *>  
<Limit WRITE>  
DenyAll  
</Limit>  
</Directory>  
# Uncomment this if you're brave.  
# <Directory incoming>  
# # Umask 022 is a good standard umask to prevent new files and dirs  
# # (second parm) from being group and world writable.  
# Umask 022 022  
# <Limit READ WRITE>  
# DenyAll  
# </Limit>  
# <Limit STOR>  
# AllowAll  
# </Limit>  
# </Directory>  
</Anonymous>

Puis redémarrer prodftp :

$
systemctl restart proftpd

On peut maintenant se connecter au serveur en mode anonyme en cochant l'option anonyme. A noter que les champs Nom d'utilisateur et Mot de passe sont remplis par WinSCP au moment ou la case Connexion anonyme est cochée.

test client alex

Le connexion anonyme est utile pour permettre au client de récupérer des fichiers sur le serveur sans avoir à créer d'utilisateur.

test client alex

Nous arrivons dans un répertoire où est situé un fichier nommé welcome.msg. Ce fichier est situé ici : /usr/share/proftpd/templates/welcome.msg

Il est inclus dans la partie à cette ligne dans le fichier de configuration :

DisplayLogin welcome.msg

VI. Sécuriser les dépôts avec l'antivirus ClamAV

a. Installation et utilisation basique

Documentation de ClamAV

On va sécuriser notre serveur ftp avec l'ajout de l'antivirus ClamAV. Pour ce faire, on installe les paquets suivants :

$
apt install clamav clamav-freshclam

On arrête le service pour pouvoir mettre à jour l'antivirus :

$
systemctl stop clamav-freshclam
$
freshclam
Mon Oct 12 14:03:14 2020 -> ClamAV update process started at Mon Oct 12 14:03:14 2020  
Mon Oct 12 14:03:15 2020 -> daily.cvd database is up to date (version: 25954, sigs: 4330152, f-level: 63, builder: raynman)  
Mon Oct 12 14:03:15 2020 -> main.cvd database is up to date (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr)  
Mon Oct 12 14:03:15 2020 -> bytecode.cvd database is up to date (version: 331, sigs: 94, f-level: 63, builder: anvilleg)
$
systemctl start clamav-freshclam

Pour scanner le home d'un utilisateur et supprimer un éventuel virus :

$
clamscan -r --remove /home/alex
/home/alex/.bash_history: OK  
/home/alex/.bashrc: OK  
/home/alex/.bash_logout: OK  
/home/alex/.profile: OK  

----------- SCAN SUMMARY -----------  
Known viruses: 8922999  
Engine version: 0.102.4  
Scanned directories: 4  
Scanned files: 4  
Infected files: 0  
Data scanned: 0.00 MB  
Data read: 0.00 MB (ratio 0.00:1)  
Time: 81.609 sec (1 m 21 s)

On peut modifier la périodicité des mises à jour de la base antivirale avec dans le fichier de configuration : /etc/clamav/freshclam.conf

# Check for new database 24 times a day
Checks 24  
DatabaseMirror db.local.clamav.net  
DatabaseMirror database.clamav.net

On peut mettre en place un scan automatique avec Crontab qui est le planificateur de tâches par défaut dans le système. On accède au fichier de configuration avec cette commande qui nous demande de choisir un éditeur :

$
crontab -e

Voici comment doit se constituer le fichier pour planifier les tâches :

# Exemple d'une planification :
.---------------- minute (0 - 59)
| .------------- heure (0 - 23)
| | .---------- jour (1 - 31)
| | | .------- mois (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- jour de la semaine (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * [Commande à utiliser]

Pour un scan tous les jours à 3h du matin du dossier des utilisateurs virtuels, faire :

0 3 * * * clamscan -r --remove /home/virtual.users

On peut aussi déclencher cette commande au démarrage du système avec :

@reboot clamscan -r --remove /home/virtual.users

b. Scan automatique de l'antivirus à chaque dépôt dans le FTP

A finir :Voir ce lien...