--- categories: web title: Howto ProFTPD ... * Documentation : [ProFTPD](http://www.proftpd.org/) est un serveur [FTP](https://fr.wikipedia.org/wiki/File_Transfer_Protocol) 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 AllowUser foo AllowGroup ftpusers DenyAll ~~~ 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 : ~~~ 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 ~~~ 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](http://www.proftpd.org/docs/howto/Vhost.html) ## 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) : ~~~ Umask 022 ~~~ ## 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 : ~~~ QuotaEngine on QuotaLimitTable file:/etc/proftpd/ftpquota.limittab QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab ~~~ 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 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 TLSVerifyClient on TLSRequired off TLSRenegotiate required off TLSOptions NoSessionReuseRequired ~~~ ## SFTP On peut configurer FTP over SSH ainsi : ~~~ LoadModule mod_tls.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/sftp/authorized_keys/%u SFTPCompression delayed ~~~ 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 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 RequireValidShell off ~~~ Note: Il faudra sans doute mettre en place un VirtualHost car proftpd écoute sur un port en plus. On peut soit se connecter avec le mot de passe du compte virtuel, soit ajouté une clé ssh dans /etc/proftpd/sftp.passwd.keys/ Il faut créé le compte sftp avec la commande classique : ~~~ # ftpasswd --file=/etc/proftpd/vpasswd --name=foo --home=/home/example/foo --shell=/bin/false --uid=1664 --gid=1664 --passwd ~~~ Il faut vérifier que le dossier racine possède les bons droits (775), sinon il y a une erreur d'authentification dans les logs proftpd. ## Logs [fichier xferlog](http://www.castaglia.org/proftpd/doc/xferlog.html)