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

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 ProFTPd : Fichiers de la distribution
  • 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 :
  2. 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.
    ...@...:~$

    Pour un Raspberry Pi :

    pi@framboise:~ $ sudo systemctl restart proftpd
    pi@framboise:~ $ ftp localhost
    Connected to localhost.
    220 ProFTPD Server (Debian) [::1]
    Name (localhost:pi): 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 ... drwxrws--- 22 admiweb www-data 4096 Jul 28 13:23 html ... ftp> bye 221 Au revoir.
    pi@framboise:~ $

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

    Pour un Raspberry Pi :

    pi@framboise:~ $ ftp localhost
    ...
    Name (localhost:pi): 
    331 Mot de passe requis pour pi
    Password:
    230 Utilisateur pi authentifié
    ...
    ftp> ls ... drwxr-xr-x 2 pi pi 4096 Sep 9 16:15 Desktop ... ftp> cd .. ... ftp> ls ... drwxr-xr-x 33 pi pi 4096 Sep 9 17:53 pi ... ftp> bye 221 Au revoir.
    pi@framboise:~ $

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

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 (ici, un Raspberry)
  • Identifiant : admiweb
  • Mot de passe : son mot de passe

Interface graphique : Gadmin-ProFTPd : une interface graphique pour le serveur FTP ProFTPd FIXME

Désinstallation

Voir aussi