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… :-)

Ceci est une ancienne révision du document !


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.

  1. Installez les paquets proftpd,ftp ou (cas d'un Raspberry Pi) :

    ...@...:~$ sudo apt install proftpd ftp

    • ftp pour les tests
    • Lors de l’installation, il peut vous être demandé comment ProFTP doit être démarré. Choisissez autonome (standalone) :
    • 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

      ...@...:~$ 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 répertoire personnel /run/proftpd.
      • ftp (UID 128), groupe nogroup ; création du répertoire personnel /srv/ftp »…
  2. Vérifiez que ftp fonctionne sous l'utilisateur en cours (pi pour un Raspberry Pi) :

    ...@...:~$ 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.
    ...@...:~$

  3. 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 :

    ...@...:~$ tree -d /etc/proftpd/
    /etc/proftpd/
    └── conf.d

    ou pour un Raspberry Pi :

    pi@framboise:~ $ tree -d /etc/proftpd/
    /etc/proftpd/
    └── conf.d

  • Pour le listing des fichiers de la distribution, voir fichiers_dist
  • Pour que les réglages persistent après les mises à jour, nous ne toucherons pas au fichier /etc/proftpd/proftpd.conf.
  • Nous placerons dans le répertoire /etc/proftpd/conf.d/ des fichiers contenant nos directives de configuration. Ces fichiers ne seront pas affectés par les mises à jour.

Utilisateurs virtuels

Chaque utilisateur a accès à son propre répertoire personnel /home/xxxxxxx (ou /home/pi pour un Raspberry Pi).

  • 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

  1. 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

  2. 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, fournissez et confirmez le mot de passe du nouveau compte) :

    ...@...:~$ 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

  1. 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

    Cas d'un Raspberry Pi :

    /etc/proftpd/conf.d/global.conf
    # Tous les utilsateurs seront emprisonnés dans leur home, sauf l'utilisateur système pi
    DefaultRoot ~ !pi
    
    # 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
  2. 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

  1. 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.
    ...@...:~$

  2. 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

Sinon, créez-le

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 :

Basic.conf

  • Anonymous

anonymous.conf

  • Simple MySQL Authentication

mysql_simple.conf

  • Virtual hosts

virtual.conf

  • Complex Virtual

virtual_authuserfile.conf

Fichier /etc/proftpd/proftpd.conf

  • Fichier Proftpd.conf exemple

Proftpd.conf

Modèle de fichier proftpd.conf

Autre exemple

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