wiki/HowtoProFTPD.md

472 lines
13 KiB
Markdown
Raw Normal View History

2017-04-21 16:03:52 +02:00
---
categories: web
title: Howto ProFTPD
...
2016-12-29 11:25:39 +01:00
2017-04-21 16:03:52 +02:00
* Documentation : <http://www.proftpd.org/docs/>
2017-05-02 22:04:56 +02:00
[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).
2016-12-29 11:25:39 +01:00
## Installation
~~~
2017-04-21 16:03:52 +02:00
# apt install proftpd
2018-11-06 02:10:55 +01:00
# proftpd -v
ProFTPD Version 1.3.5b
# systemctl status proftpd
● proftpd.service - LSB: Starts ProFTPD daemon
Loaded: loaded (/etc/init.d/proftpd; generated; vendor preset: enabled)
Docs: man:systemd-sysv-generator(8)
Process: 28249 ExecStop=/etc/init.d/proftpd stop (code=exited, status=0/SUCCESS)
Process: 22916 ExecReload=/etc/init.d/proftpd reload (code=exited, status=0/SUCCESS)
Process: 28259 ExecStart=/etc/init.d/proftpd start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/proftpd.service
└─28267 proftpd: (accepting connections)
2016-12-29 11:25:39 +01:00
~~~
## Configuration
2017-04-21 16:03:52 +02:00
Le fichier de configuration principal est `/etc/proftpd/proftpd.conf`, voici les directives que nous conseillons de changer en général :
2016-12-29 11:25:39 +01:00
~~~
2017-04-21 16:03:52 +02:00
ServerName "Foo FTP Server"
PassivePorts 60000 61000
MaxInstances 50
MaxClients 40
MaxClientsPerHost 20
Umask 137 027
2016-12-29 11:25:39 +01:00
UseReverseDNS off
2017-04-21 16:03:52 +02:00
IdentLookups off
2017-08-17 14:50:22 +02:00
TimesGMT off
2017-04-21 16:03:52 +02:00
DefaultRoot ~
RequireValidShell off
UseFtpUsers off
ServerIdent on "FTP Server Ready"
AccessGrantMsg "Hey, bienvenue %u sur le serveur FTP example.com !"
2016-12-29 11:25:39 +01:00
# Allow RESUME (REST command)
AllowStoreRestart on
<Limit LOGIN>
AllowUser foo
AllowGroup ftpusers
DenyAll
</Limit>
~~~
2017-04-21 16:03:52 +02:00
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
~~~
2016-12-29 11:25:39 +01:00
2017-11-10 14:39:05 +01:00
### Configuration par VirtualHost
2018-11-06 02:10:55 +01:00
Dans un fichier de configuration de ProFTPD, on peut isoler certaine configuration par VirtualHost, la balise `<VirtualHost>` s'utilise de la même façon qu'avec [Apache](HowtoApache). Voici un exemple d'une configuration classique, mais avec un port d'écoute différent :
2017-11-10 14:39:05 +01:00
~~~
<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>
~~~
2018-11-06 02:10:55 +01:00
Dans la balise VirtualHost on peut mettre soit une adresse IP, soit un nom de domaine.
2017-11-10 14:39:05 +01:00
2018-11-06 02:10:55 +01:00
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.
2017-11-10 14:39:05 +01:00
2018-11-06 02:10:55 +01:00
On peut aussi utiliser les VirtualHost pour faire du SFTP et du FTP classique, sur deux ports différents.
2017-11-10 14:39:05 +01:00
2018-11-06 02:10:55 +01:00
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)
2016-12-29 11:25:39 +01:00
Si l'on veux faire écouter deux VirtualHost sur deux IPs différentes (publique ou LAN) mais sur le même port, il faut utilisé ces options avant la directive `<VirtualHost>` :
~~~
Port 0
SocketBindTight on
~~~
Cela va forcer à utiliser l'ip configuré dans la directive `<VirtualHost>` avec le port indiquer dans celui-ci, exemple avec une configuration SFTP :
~~~
Port 0
SocketBindTight on
<VirtualHost 192.168.199.27>
<IfModule mod_sftp.c>
SFTPEngine on
Port 22
DefaultRoot ~
RequireValidShell off
AuthUserFile /etc/proftpd/vpasswd
</IfModule>
</VirtualHost>
~~~
2017-04-21 16:03:52 +02:00
## 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_ :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2017-04-21 16:03:52 +02:00
AuthOrder mod_auth_file.c
AuthUserFile /etc/proftpd/vpasswd
2016-12-29 11:25:39 +01:00
~~~
2017-04-21 16:03:52 +02:00
On peut alors ajouter un compte FTP avec la commande suivante :
2016-12-29 11:25:39 +01:00
~~~
2017-04-21 16:03:52 +02:00
# ftpasswd --file=/etc/proftpd/vpasswd --name=foo --home=/home/example/foo --shell=/bin/false --uid=1664 --gid=1664 --passwd
2016-12-29 11:25:39 +01:00
~~~
2017-04-21 16:03:52 +02:00
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éé.
2016-12-29 11:25:39 +01:00
### Modifier mot de passe
2016-12-29 11:25:39 +01:00
Pour modifier le mot de passe d'un compte existant :
~~~
# ftpasswd --file /etc/proftpd/vpasswd --name=FTP_user --change-password --passwd
~~~
2018-11-06 02:25:32 +01:00
### Directive Limit
Voir <http://www.proftpd.org/docs/howto/Limit.html>
La directive `Limit` permet d'autoriser ou empêcher l'exécution de commande FTP bas niveau.
C'est puissant et dangereux, car on pourrait croire que l'on empêche la lecture d'un fichier, mais il faut avoir en tête qu'il existe plusieurs commandes FTP pour faire cela. Il existe des groupes de commandes : LOGIN, DIRS, READ, WRITE et enfin ALL (tout sauf LOGIN).
Voici un exemple d'utilisation pour empêcher toutes opérations sauf dans un répertoire :
~~~
<Directory *>
<Limit ALL>
DenyAll
</Limit>
</Directory>
<Directory foo>
<Limit ALL>
AllowAll
</Limit>
</Directory>
~~~
ou encore autoriser **uniquement** le dépôt de fichiers dans un répertoire :
~~~
<Directory foo>
<Limit ALL>
DenyAll
</Limit>
<Limit CDUP CWD XCWD XCUP PWD STOR STOU>
AllowAll
</Limit>
</Directory>
~~~
2019-01-28 10:00:25 +01:00
Pour avoir un utilisateur Read-Only chrooter dans un répertoire :
~~~
<Directory ~user>
<Limit CWD PWD DIRS READ>
AllowUser user
</Limit>
<Limit ALL>
DenyUser user
</Limit>
</Directory>
~~~
Blacklisté les connexions depuis une ip ou hôte, mais en autorisant seulement certains comptes :
~~~
<Limit LOGIN>
Deny from 1.2.3.4
AllowUser foo
AllowUser bar
</Limit>
~~~
Cette configuration refuse toutes les connexions au serveur depuis l'ip 1.2.3.4, mais accepte les connexions aux utilisateur foo et bar, mais refuse pour tous les autres utilisateurs.
Attention, si il y a plusieurs blocs / directives LOGIN dans la configuration / virtualhost, il faut autorisé les utilisateurs dans toutes ces directives, sinon l'accès sera refusée tout le temps.
2017-04-21 16:03:52 +02:00
## Divers
2016-12-29 11:25:39 +01:00
Pour limiter les uploads de fichiers de taille supérieure à 50 Mo :
~~~
MaxStoreFileSize 50 Mb
~~~
2021-01-20 16:59:31 +01:00
Forcer les droits 640 en fichier et 750 en dossier avec l'umask:
2016-12-29 11:25:39 +01:00
~~~
2021-01-20 16:59:31 +01:00
<Directory /home/utilisateur/dossier>
Umask 0137 0027
<Limit SITE_CHMOD>
DenyAll
</Limit>
</Directory>
2016-12-29 11:25:39 +01:00
~~~
2017-04-21 16:03:52 +02:00
2016-12-29 11:25:39 +01:00
## 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
~~~
2017-04-21 16:03:52 +02:00
On peut lister les données de quota sur le serveur ainsi :
2016-12-29 11:25:39 +01:00
~~~
# 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
~~~
2017-04-21 16:03:52 +02:00
Enfin, on peut réinitialiser un compteur (tous les jours par exemple) :
2016-12-29 11:25:39 +01:00
~~~
# 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
~~~
2017-04-21 16:03:52 +02:00
## FTPS
2020-05-15 12:09:08 +02:00
On peut activer SSL/TLS en editant le fichier suivant pour y activer ces directives :
2017-04-21 16:03:52 +02:00
~~~
2020-05-15 12:09:08 +02:00
# vim /etc/proftpd/tls.conf
~~~
~~~
2017-04-21 16:03:52 +02:00
TLSEngine on
2020-05-15 12:09:08 +02:00
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSRSACertificateFile /etc/proftpd/ssl/proftpd.crt
TLSCACertificateFile /etc/proftpd/ssl/proftpd.ca.crt
TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key
~~~
2017-04-21 16:03:52 +02:00
2020-05-15 12:09:08 +02:00
Il y aura besoin de renseigner les bon certificats et clé privé et il faudra vérifier que le fichier est bien chargé par la configuration principale. Sinon ajouter cette directive :
2017-04-21 16:03:52 +02:00
2020-05-15 12:09:08 +02:00
~~~
# vim /etc/proftpd/proftpd.conf
~~~
~~~
Include /etc/proftpd/tls.conf
~~~
2018-07-04 17:26:18 +02:00
2020-05-15 12:09:08 +02:00
Recharger le service et vérifiez que ça fonctionne bien :
2018-07-04 17:26:18 +02:00
2020-05-15 12:09:08 +02:00
~~~
# systemctl restart proftpd.service
~~~
~~~
$ lftp domaine.com
lftp domaine.com:~> set ftp:ssl-force true
lftp domaine.com:~> login utilisateur
Mot de passe :
lftp utilisateur@domaine.com:~> ls
2017-04-21 16:03:52 +02:00
~~~
2020-05-15 12:09:08 +02:00
Si l'on peut lire le contenu du dossier, alors c'est fonctionnel.
2017-04-21 16:03:52 +02:00
2017-04-21 16:04:16 +02:00
## SFTP
2017-04-21 16:03:52 +02:00
On peut configurer FTP over SSH ainsi :
~~~
LoadModule mod_tls.c
<IfModule mod_sftp.c>
SFTPEngine on
2018-01-24 11:24:38 +01:00
Port 2222
2017-04-21 16:03:52 +02:00
DefaultRoot ~
2019-08-09 09:56:59 +02:00
2017-04-21 16:03:52 +02:00
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
2019-08-09 09:56:59 +02:00
2017-04-21 16:03:52 +02:00
</IfModule>
~~~
2017-11-09 16:31:18 +01:00
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
2019-01-14 21:40:47 +01:00
# ProFTPD doesn't support ed25519 yet
#SFTPHostKey /etc/ssh/ssh_host_ed25519_key
2017-11-09 16:31:18 +01:00
SFTPHostKey /etc/ssh/ssh_host_ecdsa_key
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPAuthorizedUserKeys file:/etc/proftpd/sftp.passwd.keys/%u
2019-08-09 09:56:59 +02:00
AuthOrder mod_auth_file.c
2017-11-09 16:31:18 +01:00
AuthUserFile /etc/proftpd/vpasswd
2018-01-24 11:24:38 +01:00
RequireValidShell off
2017-11-09 16:31:18 +01:00
</IfModule>
~~~
2018-03-14 11:58:54 +01:00
Note: Il faudra sans doute mettre en place un VirtualHost car proftpd écoute sur un port en plus.
2019-02-12 18:09:25 +01:00
On peut soit se connecter avec le mot de passe du compte virtuel, soit ajouter une clé ssh au format de la RFC 4716 dans /etc/proftpd/sftp.passwd.keys/ en faisant ainsi :
2017-11-09 16:31:18 +01:00
2019-02-12 18:09:25 +01:00
~~~
# ssh-keygen -e -f ~/.ssh/id_rsa.pub
~~~
Ou créé le compte sftp avec la commande classique :
2018-01-24 11:24:38 +01:00
~~~
# ftpasswd --file=/etc/proftpd/vpasswd --name=foo --home=/home/example/foo --shell=/bin/false --uid=1664 --gid=1664 --passwd
~~~
Le fichier /etc/proftpd/vpasswd doit avoir les droits en 600, sinon Proftpd refuse de se lancer.
2018-02-22 15:56:37 +01:00
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.
2017-11-09 16:31:18 +01:00
2017-05-15 16:09:16 +02:00
## Logs
[fichier xferlog](http://www.castaglia.org/proftpd/doc/xferlog.html)
## Troubleshooting
2019-09-23 10:03:23 +02:00
### Problème d'envoi de fichier, avec erreur "open for write: permission denied"
2019-09-23 10:03:23 +02:00
L'erreur est provoqué lorsque l'on veux écraser un fichier existant, il faut rajouter la directive `AllowOverwrite on` dans le VirtualHost de la configuration, par exemple en sftp.
On la positionne dans une balise `<Directory>` comme ceci :
~~~
<Directory /home/*>
AllowOverwrite on
</Directory>
~~~