Ceci est une ancienne révision du document !
Table des matières
Pro-ftpd : un serveur FTP open source pour Linux
Introduction
ProFTPD est un serveur FTP/SFTP/FTPS open source, modulaire et puissant.
- Il gère les répertoires cachés, les hôtes virtuels et les fichiers .ftpaccess par répertoire.
- La structure interne des répertoires anonymes FTP est quelconque (pas besoin de bin, lib ni de fichiers spéciaux).
- Il gère les fonctionnalités avancées (plusieurs fichiers de mots de passe, ratios téléchargement/envoi, etc.).
Pré-requis
Installation
Pour utiliser une authentification sur une base de données, installez les paquets proftpd-mod suggérés correspondants.
- Installez les paquets proftpd,ftp ou
...@...:~$ sudo apt install proftpd ftp
Pour un Raspberry Pi :
pi@framboise:~ $ sudo apt install proftpd ftp
- ftp pour les tests
- Vous pouvez installer aussi les paquets proftpd-mod-ldap,proftpd-mod-mysql,proftpd-mod-odbc,proftpd-mod-pgsql,proftpd-mod-sqlite,proftpd-mod-geoip ou
pi@framboise:~ $ sudo apt install proftpd-mod-ldap proftpd-mod-mysql proftpd-mod-odbc proftpd-mod-pgsql proftpd-mod-sqlite proftpd-mod-geoip
- L'installation crée les utilisateurs système suivants :
- proftpd (UID 127), groupe nogroup ; pas de création de répertoire personnel /run/proftpd.
- ftp (UID 128), groupe nogroup ; création du répertoire personnel /srv/ftp »…
Vérifiez que ftp fonctionne sous l'utilisateur en cours :...@...:~$ ftp localhost ...
Name (localhost:xxxxxxx): 331 Mot de passe requis pour xxxxxxx Password: 230 Utilisateur xxxxxxx authentifié Remote system type is UNIX. Using binary mode to transfer files.ftp> ls ... drwxrwxr-x 4 xxxxxxx xxxxxxx 4096 Sep 5 05:39 Bureau ... 226 Téléchargement terminé ftp> bye 221 Au revoir....@...:~$Pour un Raspberry Pi, vérifiez que ftp fonctionne sous l'utilisateur pi :
pi@framboise:~ $ ftp localhost Connected to localhost. 220 ProFTPD Server (Debian) [::1]
Name (localhost:pi): 331 Mot de passe requis pour pi Password: 230 Utilisateur pi authentifié Remote system type is UNIX. Using binary mode to transfer files.ftp> ls ... drwxr-xr-x 2 pi pi 4096 Aug 18 16:15 Desktop ... drwxr-xr-x 5 pi pi 4096 Aug 6 2017 Documents drwxr-xr-x 2 pi pi 4096 Oct 29 2019 Downloads ... ftp> bye 221 Au revoir.pi@framboise:~ $Si vous essayez avec un client comme Filezilla, vous constaterez que l'utilisateur n'est pas bloqué dans son home.Configuration
- L'installation a créé l’arborescence :
pi@framboise:~ $ tree -d /etc/proftpd/ /etc/proftpd/ └── conf.d
- Pour le listing des fichiers de la distribution, voir fichiers_dist
Nous ne toucherons pas au fichier de configuration /etc/proftpd/proftpd.conf de syntaxe similaire à celle d'Apache.
- Liste des directives : http://www.proftpd.org/docs/directives/linked/by-name.html
A la fin de ce fichier, une directive include appelle les directives des fichiers du répertoire /etc/proftpd/conf.d/, pour l'instant vide.
Nous y mettrons des fichiers contenant les directives de configuration voulues.
Ces fichiers ne seront pas affectés par les mises à jour.
Pour le listing des fichiers de la distribution, voir fichiers_dist
Utilisateurs virtuels
Chaque utilisateur a accès à son propre répertoire personnel (par exemple /home/xxxxxxx).
- Unix ne connaît que les UID : il n'utilise pas les noms d'utilisateurs.
- proftpd ne fait donc pas de différence entre un utilisateur système et un utilisateur virtuel : ils sont définis par leur UID.
- Un utilisateur virtuel est un utilisateur qui n'est pas défini dans le système.
Création d'un webmestre pour un site monsite.tld
Nous allons créer un utilisateur virtuel admiweb pour accéder par ftp au site monsite.tld, hébergé à l'emplacement /var/www/html/monsite.tld
- Vérifiez l'existence de l'utilisateur www-data et de son groupe :
...@...:~$ id www-data uid=33(www-data) gid=33(www-data) groupes=33(www-data)
→ L’identifiant du groupe www-data est 33.
Si le groupe www-data n'existe pas, créez-le ainsi que l'utilisateur www-data par :...@...:~$ sudo groupadd www-data ...@...:~$ sudo useradd -g www-data -d /var/www -s /bin/false www-data
- Créez un nouvel utilisateur virtuel ayant accès à /var/www/html (le webmestre admiweb, de home /var/www/html, avec les uid et gid de www-data) :
...@...:~$ cd /etc/proftpd/ ...@...:/etc/proftpd$ sudo ftpasswd --passwd --name admiweb --gid 33 --uid 33 --home /var/www/html --shell /bin/false ftpasswd: creating passwd entry for user admiweb ... Password: Re-type password: ... ftpasswd: entry created
Création d'un utilisateur virtuel (cas général)
On peut créer de la même façon des utilisateurs virtuels ayant des identifiants quelconques (sauf UID 0 (zéro) et GID 0 (zéro) qui sont utilisés pour l'utilisateur root et le groupe root).
Utilisez pour les utilisateurs virtuels des identifiants qui ne sont pas déjà utilisés dans /etc/passwd pour séparer les privilèges de vos utilisateurs système de ceux de vos utilisateurs virtuels.
Les privilèges sont déterminés par les identifiants.
Les utilisateurs virtuels peuvent tous avoir les mêmes identifiants → ils auront tous exactement les mêmes privilèges.
La directive DefaultRoot ~ dans /etc/proftpd/conf.d/global.conf confine vos utilisateurs virtuels dans des répertoires personnels distincts.
Ainsi, ces utilisateurs virtuels, bien qu'ayant tous les mêmes privilèges, seront tous séparés dans des répertoires différents.
L'outil ftpasswd est un script Perl.
Fichier de configuration
- Créez ou éditez avec les droits d'administration le fichier /etc/proftpd/conf.d/global.conf pour ajouter à la fin votre configuration :
- /etc/proftpd/conf.d/global.conf
# Tous les utilsateurs seront emprisonnés dans leur home, sauf l'utilisateur système xxxxxxx DefaultRoot ~ !xxxxxxx # Pas de shell valide exigé (ex : bin/sh ou /bin/bash). RequireValidShell off # Fichier des mots de passe AuthUserFile /etc/proftpd/ftpd.passwd # Fichier des groupes AuthGroupFile /etc/proftpd/ftpd.group AuthOrder mod_auth_file.c mod_auth_unix.c AuthPAM off
- Créez les fichiers /etc/proftpd/ftp.passwd et /etc/proftpd/ftpd.group :
...@...:~$ sudo touch /etc/proftpd/ftp.passwd ...@...:~$ sudo touch /etc/proftpd/ftpd.group
Rechargement et test
- Relancez proftpd et vérifiez que l'utilisateur admiweb peut se connecter :
...@...:~$ sudo systemctl restart proftpd ...@...:~$ ftp localhost ...
Name (localhost:xxxxxxx): admiweb 331 Mot de passe requis pour admiweb Password: 230 Utilisateur admiweb authentifié Remote system type is UNIX. Using binary mode to transfer files.ftp> ls ... -rwxrws--- 1 admiweb www-data 612 Apr 25 2018 index.nginx-debian.html ... ftp> bye 221 Au revoir....@...:~$ - L'utilisateur système xxxxxxx, lui, peut se connecter et n'est pas emprisonné :
...@...:~$ ftp localhost ...
Name (localhost:xxxxxxx): 331 Mot de passe requis pour xxxxxxx Password: 230 Utilisateur xxxxxxx authentifié Remote system type is UNIX. Using binary mode to transfer files.ftp> ls ... drwxrwxr-x 4 xxxxxxx xxxxxxx 4096 Sep 5 05:39 Bureau ... 226 Téléchargement terminé ftp> cd .. ... ftp> ls ... drwxrwxr-x 269 xxxxxxx xxxxxxx 20480 Sep 10 11:51 xxxxxxx ... ftp> bye 221 Au revoir....@...:~$
Hôtes virtuels
Créez avec les droits d'administration le fichier /etc/proftpd/conf.d/global.conf pour y ajouter les directives :
- /etc/proftpd/conf.d/global.conf
DefaultRoot ~ AuthUserFile /etc/proftpd/ftpd.passwd AuthGroupFile /etc/proftpd/ftpd.group
Vérifiez l'existence de l'utilisateur www-data et de son groupe :
$ getent group www-data www-data:x:33: $ getent passwd www-data www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
On constate que l’identifiant du groupe www-data est 33.
Créez l'utilisateur virtuel admiweb, de home /var/www/html, avec les uid et gid de www-data en lançant les commandes (le mot de passe du compte vous sera demandé) :
$ cd /etc/proftpd $ sudo ftpasswd --passwd --name=admiweb --uid=33 --gid=33 --home=/var/www/html --shell=/bin/false ftpasswd: creating passwd entry for user admiweb ... Password: Re-type password: ... ftpasswd: entry created
Vérifiez que l'utilisateur courant peut se connecter :
$ ftp localhost Connected to localhost.localdomain. 220 ProFTPD 1.3.4c Server (ProFTPD) [::ffff:127.0.0.1] Name (localhost:xxxxxxx): 331 Password required for xxxxxxx Password: 230 User xxxxxxx logged in Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful 150 Opening ASCII mode data connection for file list -rw-r--r-- 1 root root 3607 Feb 27 2017 applications.html -rw-r--r-- 1 root root 177 Feb 27 2017 bitnami.css drwxr-xr-x 21 root root 4096 Apr 4 11:48 dashboard -rw-r--r-- 1 root root 30894 May 11 2007 favicon.ico drwxr-xr-x 2 root root 4096 Apr 4 11:48 img -rw-r--r-- 1 root root 260 Jul 9 2015 index.php drwxr-xr-x 2 daemon daemon 4096 Apr 4 11:48 webalizer 226 Transfer complete ftp> bye 221 Goodbye.
De même pour admiweb :
$ ftp localhost Connected to localhost.localdomain. 220 ProFTPD 1.3.4c Server (ProFTPD) [::ffff:127.0.0.1] Name (localhost:xxxxxxx): admiweb 331 Password required for admiweb Password: 230 User admiweb logged in Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful 150 Opening ASCII mode data connection for file list -rw-r--r-- 1 root root 3607 Feb 27 2017 applications.html -rw-r--r-- 1 root root 177 Feb 27 2017 bitnami.css drwxr-xr-x 21 root root 4096 Apr 4 11:48 dashboard -rw-r--r-- 1 root root 30894 May 11 2007 favicon.ico drwxr-xr-x 2 root root 4096 Apr 4 11:48 img -rw-r--r-- 1 root root 260 Jul 9 2015 index.php drwxr-xr-x 2 daemon daemon 4096 Apr 4 11:48 webalizer 226 Transfer complete ftp> bye 221 Goodbye.
Vous pouvez maintenant créer tous les utilisateurs nécessaires en répétant cette commande.
Fichier proftpd.conf et dérivés
Il inclut :
- /etc/proftpd/modules.conf
- Répertoire des modules DSO : /usr/lib/proftpd
- Seul l'utilisateur root peut charger et décharger des modules, mais tout le monde peut voir quels modules ont été chargés.
- Charge les modules mod_ctrls_admin.c, mod_tls.c, mod_radius.c, mod_quotatab.c, mod_quotatab_file.c, mod_quotatab_radius.c, mod_wrap.c, mod_rewrite.c, mod_load.c, mod_ban.c, mod_wrap2.c, mod_wrap2_file.c, mod_dynmasq.c, mod_exec.c, mod_shaper.c, mod_ratio.c, mod_site_misc.c, mod_sftp.c, mod_sftp_pam.c, mod_facl.c, mod_unique_id.c, mod_copy.c, mod_deflate.c, mod_ifversion.c, mod_tls_memcache.c, mod_ifsession.c
/etc/proftpd/conf.d/(désactivés) :- #/etc/proftpd/ldap.conf (entièrement désactivé par des #)
- #/etc/proftpd/sql.conf (entièrement désactivé par des #)
- #/etc/proftpd/tls.conf (entièrement désactivé par des #)
- #/etc/proftpd/virtuals.conf (entièrement désactivé par des #)
Après chaque changement de configuration, pensez à relancer proftpd :
$ sudo systemctl restart proftpd
Premiers réglages
Créez ou éditez avec les droits d'administration le fichier /etc/proftpd/conf.d/config.conf pour le modifier comme ceci :
- Dé-commentez la ligne DefaultRoot → Les utilisateurs seront chrootés dans leur propre home.
- Vous pouvez aussi personnaliser au besoin :
- ServerName,
- DisplayLogin
- et UseIPv6
Sécurisation TLS
Le serveur est maintenant en place, cependant, tout ce qui transite entre votre serveur et votre Client FTP transite en clair sur le Net.
Nous allons chiffrer le tout avec une sécurisation TLS (SSLv3 étant deprecated).
Commençons par créer un certificat SSL auto-signé :
$ sudo openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/proftpd.cert -keyout /etc/ssl/private/proftpd.key Generating a 2048 bit RSA private key ..........................................................+++ ..................................................................................+++ writing new private key to '/etc/ssl/private/proftpd.key' ----- 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) []:sd-xxxxx.dedibox.fr Email Address []:me@mymail.tld
Renseignez les champs demandés avec les bonnes informations. (sd-xxxxx.dedibox.fr : votre nom de domaine si vous en avez un).
Protégez la clé :
$ sudo chmod 440 /etc/ssl/private/proftpd.key
Nous allons maintenant forcer notre serveur FTP à utiliser cette clé pour générer une connexion chiffrée.
Avec les droits d'administration, éditez le fichier /etc/proftpd/conf.d/tls.conf pour le modifier comme ceci :
- /etc/proftpd/conf.d/tls.conf
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log # TLSv1 Uniquement TLSProtocol TLSv1 # N'autorise que les connexions sécurisées TLSRequired on # Renseigne l'emplacement des certificats TLSRSACertificateFile /etc/ssl/certs/proftpd.cert TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key TLSVerifyClient off TLSRenegotiate none TLSOptions NoSessionReuseRequired </IfModule>
Redémarrez le serveur FTP :
$ sudo systemctl restart proftpd
Vous pouvez maintenant vous connecter à votre serveur FTP de manière sécurisée !
Quelques exemples de fichiers de configuration
- Basic :
- Anonymous
- Simple MySQL Authentication
- Virtual hosts
- Complex Virtual
Fichier /etc/proftpd/proftpd.conf
Utilisation
Sur un PC du réseau, ouvrez Filezilla et lancez une connexion :
- Hôte : l'adresse IP du serveur
- Identifiant : admiweb
- Mot de passe : son mot de passe
Interface graphique : Gadmin-ProFTPd : une interface graphique pour le serveur FTP ProFTPd
Désinstallation
Voir aussi