Login Logout

Howto ProFTPD

ProFTPD est un serveur FTP libre. Il est particulièrement configurable grâce à des modules. Il permet notamment de facilement restreindre un compte dans un répertoire donné (chroot) ou d’utiliser les protocoles FTPS (FTP over SSL/TLS) et SFTP/SCP (issus de SSH).

Installation

# apt install proftpd

Configuration

Le fichier de configuration principal est /etc/proftpd/proftpd.conf, voici les directives que nous conseillons de changer en général :

ServerName    "Foo FTP Server"
PassivePorts  60000 61000
MaxInstances  50
MaxClients    40
MaxClientsPerHost 20
Umask         137  027
UseReverseDNS off
IdentLookups  off
TimesGMT      off
DefaultRoot   ~
RequireValidShell off
UseFtpUsers   off
ServerIdent   on "FTP Server Ready"
AccessGrantMsg    "Hey, bienvenue %u sur le serveur FTP example.com !"
# Allow RESUME (REST command)
AllowStoreRestart on

<Limit LOGIN>
        AllowUser foo
        AllowGroup ftpusers
        DenyAll
</Limit>

Avec cette configuration proposée, un utilisateur doit être dans le groupe ftpusers (à créer) pour pouvoir utiliser le FTP.

Si l’IPv6 n’est pas fonctionnel sur votre serveur :

UseIPv6       off

Configuration par VirtualHost

Dans un fichier de configuration de Proftpd, on peut isoler certaine configuration par virtualhost, la balise s’utilise de la même façon que dans apache, exemple d’une configuration classique, mais avec un port d’écoute différent :

<VirtualHost 192.168.1.8>

ServerName        "FTP Server"
ServerIdent    on "FTP Server Ready"
AccessGrantMsg    "Hey, bienvenue %u sur le serveur FTP !"

SFTPEngine   on
Port         8887
DefaultRoot  ~
PassivePorts  60000 61000
UseReverseDNS off
IdentLookups  off
TimesGMT      off

# Local permissions
DefaultRoot       ~
Umask             137  027
RequireValidShell off
UseFtpUsers       off

# Allow RESUME (REST command)
AllowStoreRestart on

</VirtualHost>

Dans la balise VirtualHost on peut mettre soit une ip, soit un nom de domaine.

Cela permet notamment de faire écouter proftpd sur 2 ports différents en même temps, dans ce cas-là, la configuration par défaut écoute sur le port 21, et la configuration dans le VirtualHost écoute sur le port 8887.

On peut utiliser les VirtualHost pour faire du SFTP et du FTP classique, sur deux ports différents.

Il y a plusieurs types d’autres options dans les virtalhost de proftpd, comme notamment les alias, on peut voir tout ce qu’on peut faire dans la doc Proftpd Virtual Servers

Comptes virtuels

ProFTPD peut utiliser des comptes Unix ou des comptes virtuels définis dans SQL/LDAP ou simplement un fichier.

On détaille ici l’utilisation de comptes avec un simple fichier /etc/proftpd/vpasswd.

Il faut ajouter dans /etc/proftpd/proftpd.conf :

AuthOrder       mod_auth_file.c
AuthUserFile    /etc/proftpd/vpasswd

On peut alors ajouter un compte FTP avec la commande suivante :

# ftpasswd --file=/etc/proftpd/vpasswd --name=foo --home=/home/example/foo --shell=/bin/false --uid=1664 --gid=1664 --passwd

Si l’on veut que le compte FTP soit une sorte de sous-compte d’un compte existant restreint dans un répertoire, il faut préciser les UID et GID du compte UNIX propriétaire du répertoire dans lequel est le $HOME du compte virtuel créé.

Pour modifier le mot de passe d’un compte existant :

# ftpasswd --file /etc/proftpd/vpasswd --name=FTP_user --change-password --passwd

Divers

Pour limiter les uploads de fichiers de taille supérieure à 50 Mo :

MaxStoreFileSize 50 Mb

Pour changer les droits par défaut (umask) :

<Directory /path/to/dir>
   Umask 022
</Directory>

Quota

Pour activer les quotas spécifiquement à ProFTPD avec gestion via fichiers :

# cd /etc/proftpd
# ftpquota --create-table --type=limit
# ftpquota --create-table --type=tally

Puis ajouter dans la configuration :

<IfModule mod_quotatab.c>
QuotaEngine on
QuotaLimitTable file:/etc/proftpd/ftpquota.limittab
QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab
</IfModule>

On peut ensuite positionner des quotas, par exemple pour limiter les données uploadées à 200 Go :

# ftpquota --add-record --type=limit --bytes-upload=200 --units=Gb --name=foo --quota-type=user

Imaginons que vous positionnez le quota alors que l’utilisateur a déjà 170 Go, vous devez mettre à jour son compteur :

# ftpquota --update-record --type=tally --bytes-upload=170 --units=Gb --name=foo --quota-type=user

On peut lister les données de quota sur le serveur ainsi :

# ftpquota --show-records --type=tally
-------------------------------------------
  Name: foo
  Quota Type: User
    Uploaded bytes:     182536110080.00
    Downloaded bytes:   0.00
    Transferred bytes:  0.00
    Uploaded files:     0
    Downloaded files:   0
    Transferred files:  0

#   ftpquota --show-records --type=limit
-------------------------------------------
  Name: foo
  Quota Type: User
  Per Session: False
  Limit Type: Hard
    Uploaded bytes:     214748364800.00
    Downloaded bytes:   unlimited
    Transferred bytes:  unlimited
    Uploaded files:     unlimited
    Downloaded files:   unlimited
    Transferred files:  unlimited

Via FTP, vous pourrez voir les données de quota ainsi :

ftp> quote SITE QUOTA
200-Quota pour la session actuelle [courant / limite]:
200-Nom: foo
200-Type quota: Utilisateur
200-Par session : Faux
200-Type de limite : matérielle
200-  bytes:    182536110080.00/193273528320.00 envoyés
200-  bytes:    unlimited reçus
200-  bytes:    unlimited téléchargés
200-  files:    unlimited envoyés
200-  files:    unlimited reçus
200-  files:    unlimited téléchargés
200 Veuillez contacter ftpmaster@example.com si ces données sont inexactes

Enfin, on peut réinitialiser un compteur (tous les jours par exemple) :

# ftpquota --update-record --type=tally --name=foo --quota-type=user

Ou même effacer toutes les données de quota d’un utilisateur :

# ftpquota --delete-record --type=limit --name=foo --quota-type=user
# ftpquota --delete-record --type=tally --name=foo --quota-type=user

FTPS

On peut configurer FTP over SSL/TLS ainsi :

LoadModule mod_tls.c

<IfModule mod_tls.c>
TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             TLSv1

TLSRSACertificateFile                   /etc/ssl/certs/ftp.example.com.crt
TLSRSACertificateKeyFile                /etc/ssl/private/ftp.example.com.key
TLSCACertificateFile                    /etc/ssl/certs/ftp.example.com_ca.pem

#TLSOptions                             AllowClientRenegotiations

TLSOptions                              AllowPerUser
TLSVerifyClient                         off
<IfUser ecorner>
TLSVerifyClient                         on
</IfUser>

TLSRequired                             off

TLSRenegotiate                          required off
TLSOptions NoSessionReuseRequired
</IfModule>

SFTP

On peut configurer FTP over SSH ainsi :

LoadModule mod_tls.c

<IfModule mod_sftp.c>
SFTPEngine   on
Port         222
DefaultRoot  ~

SFTPLog      /var/log/proftpd/sftp.log

SFTPAuthMethods password publickey
SFTPHostKey /etc/ssh/ssh_host_dsa_key
SFTPHostKey /etc/ssh/ssh_host_ecdsa_key
SFTPHostKey /etc/ssh/ssh_host_rsa_key

SFTPAuthorizedUserKeys  file:/etc/sftp/authorized_keys/%u

SFTPCompression delayed
</IfModule>

Si on veut faire du SFTP over SSH avec les comptes virtuels, on crée une configuration comme celle-ci dans /etc/proftpd/conf.d/sftp.conf :

LoadModule mod_tls.c

<IfModule mod_sftp.c>

SFTPEngine   on
Port         2222
DefaultRoot  ~

SFTPLog      /var/log/proftpd/sftp.log

SFTPAuthMethods password publickey
SFTPHostKey /etc/ssh/ssh_host_dsa_key
SFTPHostKey /etc/ssh/ssh_host_ecdsa_key
SFTPHostKey /etc/ssh/ssh_host_rsa_key

SFTPAuthorizedUserKeys file:/etc/proftpd/sftp.passwd.keys/%u
AuthUserFile /etc/proftpd/vpasswd

</IfModule>

On peut soit se connecter avec le mot de passe du compte virtuel, soit ajouté une clé ssh dans /etc/proftpd/sftp.passwd.keys/

Logs

fichier xferlog