wiki/HowtoProFTPD.md

654 lines
20 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/>
[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 (FTP over SSH).
2016-12-29 11:25:39 +01:00
## Installation
~~~{bash}
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
~~~
2016-12-29 11:25:39 +01:00
## Configuration
2022-01-26 11:50:45 +01:00
### Configuration simple
Le fichier de configuration principal est `/etc/proftpd/proftpd.conf`.
Vous pouvez aussi ajouter des fichiers `.conf` pour customiser la configuration dans `/etc/proftpd/conf.d`, qui sont inclus à la fin de `/etc/proftpd/proftpd.conf` et permettent d'écraser les directives générales.
Voici les directives que nous conseillons de changer :
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 $ftp_user
AllowGroup $ftp_group
DenyAll
2016-12-29 11:25:39 +01:00
</Limit>
~~~
Dans cette configuration, un utilisateur doit être dans le groupe `$ftp_group` (à créer) pour utiliser le FTP.
2017-04-21 16:03:52 +02:00
Si l'IPv6 n'est pas fonctionnel sur votre serveur :
~~~
UseIPv6 off
~~~
2016-12-29 11:25:39 +01:00
**Configuration des firewalls**
Sur le firewall côté serveur, il faut ouvrir les ports 20 et 21, et les ports passifs :
2022-06-24 11:28:06 +02:00
~~~
iptables -A INPUT -p tcp --dport 60000:61000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
~~~
S'il y a également des restrictions côté client (dans le cas d'un serveur voulant accéder en FTP à un autre), il faut autoriser les paquets entrants :
~~~
iptables -A INPUT -p tcp --sport 20 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 21 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --sport 60000:61000 --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
~~~
2017-11-10 14:39:05 +01:00
### Configuration dans différents VirtualHost
2017-11-10 14:39:05 +01:00
D'une manière similaire à [Apache](HowtoApache), on peut isoler des configurations FTP dans différents VirtualHost.
2017-11-10 14:39:05 +01:00
2022-01-26 11:50:45 +01:00
Cela permet notamment de faire écouter ProFTPD sur 2 ports différents en même temps. Par exemple, pour mettre en place à la fois un FTP classique et un SFTP.
2017-11-10 14:39:05 +01:00
2022-01-26 11:50:45 +01:00
Note : A Evolix, nous ne proposons pour l'instant pas, sauf exception, les protocoles SFTP et FTPS.
2017-11-10 14:39:05 +01:00
2022-01-26 11:50:45 +01:00
Autre exemple : on laisse la configuration par défaut écouter sur le port 21, et on fait écouter un VirtualHost sur le port 8887.
2017-11-10 14:39:05 +01:00
2022-01-26 11:50:45 +01:00
La balise `VirtualHost` accepte les adresses IP et les noms de domaine.
Voici un exemple de configuration classique qui écoute sur un port différent dans un VirtualHost :
2017-11-10 14:39:05 +01:00
~~~
# vim /etc/proftpd/conf.d/my_vhost.conf
2017-11-10 14:39:05 +01:00
<VirtualHost 192.168.1.8>
2017-11-10 14:39:05 +01:00
ServerName "FTP Server"
ServerIdent on "FTP Server Ready"
AccessGrantMsg "Hey, bienvenue %u sur le serveur FTP !"
2017-11-10 14:39:05 +01:00
SFTPEngine on
Port 8887
DefaultRoot ~
PassivePorts 60000 61000
UseReverseDNS off
IdentLookups off
TimesGMT off
2017-11-10 14:39:05 +01:00
# Local permissions
DefaultRoot ~
Umask 137 027
RequireValidShell off
UseFtpUsers off
2016-12-29 11:25:39 +01:00
# Allow RESUME (REST command)
AllowStoreRestart on
</VirtualHost>
~~~
2022-01-26 11:50:45 +01:00
Si l'on veut faire écouter deux VirtualHost sur deux IPs différentes (publique ou LAN) mais sur le même port, il faut utiliser ces options avant la directive `<VirtualHost>` :
~~~
Port 0
SocketBindTight on
~~~
Cela va forcer à utiliser l'IP configurée dans la directive `<VirtualHost>` avec le port indiqué 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>
~~~
Les VirtualHosts ont de nombreuses autres fonctionnalités, comme les Alias par exemple.
Voir la documentation : <http://www.proftpd.org/docs/howto/Vhost.html>.
## Gestion des utilisateurs
ProFTPD permet l'authentification via les comptes Unix, un fichier de configuration simple, PAM, une base de données SQL, LDAP.
Les comptes ont les mêmes attributs qu'un compte Unix : username, password, uid, gid, gecos, homedir, shell.
2017-04-21 16:03:52 +02:00
Lorsqu'un compte FTP utilise un UID et un GID non définis dans `/etc/passwd`, il est dit "virtuel".
2017-04-21 16:03:52 +02:00
On détaille ici l'utilisation de comptes définis dans un fichier `/etc/proftpd/vpasswd`.
2017-04-21 16:03:52 +02:00
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
~~~
**Attention:** Le fichier `/etc/proftpd/vpasswd` doit avoir les droits en 600, sinon ProFTPD refuse de se lancer.
La gestion des comptes se fait ensuite via le script Perl `ftpasswd` inclu avec ProFTPD.
Documentation :
* <http://www.proftpd.org/docs/howto/Authentication.html>
* <http://www.proftpd.org/docs/howto/VirtualUsers.html>
### Ajouter un compte
2021-10-20 16:29:08 +02:00
#### Dans un répertoire existant, appartenant déjà à un utilisateur Unix
2016-12-29 11:25:39 +01:00
Dans ce cas, les `$ftp_uid` et `$ftp_gid` doivent être ceux du compte Unix propriétaire du répertoire :
~~~{bash}
2021-10-20 16:29:08 +02:00
# ftp_home=... # répertoire racine du compte FTP
# ftp_uid=$(stat -c '%u' "${ftp_home}") # UID du compte FTP
# ftp_gid=$(stat -c '%g' "${ftp_home}") # GID du compte FTP
2021-10-20 16:29:08 +02:00
# ftp_user=... # nom du futur utilisateur FTP
# apg -n 1 -m 14 # génération du mot de passe
# ftpasswd --file=/etc/proftpd/vpasswd --name="${ftp_user}" --home="${ftp_home}" --shell=/bin/false --uid="${ftp_uid}" --gid="${ftp_gid}" --passwd
2016-12-29 11:25:39 +01:00
~~~
2021-10-20 16:29:08 +02:00
#### Avec un nouveau répertoire racine, dédié à l'utilisateur FTP
Dans ce cas, on choisit des `$ftp_uid` et `$ftp_gid` qui ne sont pas utilisés dans `/etc/passwd`.
2021-10-20 16:29:08 +02:00
Pour lister les UID et GID déjà utilisés : `cut -d: -f1,3,4 /etc/passwd`
Puis, on crée le répertoire racine, possédé par les numéros `$ftp_uid` et `$ftp_gid` de l'utilisateur FTP.
Attention : **ne pas utiliser le nom du compte FTP dans `chown`** (Unix ne le reconnaît pas car le compte FTP n'est pas dans `/etc/passwd`).
~~~{bash}
2021-10-20 16:29:08 +02:00
# ftp_home=... # répertoire racine du compte FTP
# ftp_uid=... # UID du compte FTP
# ftp_gid=... # GID du compte FTP
# mkdir "${ftp_home}"
# chown "${ftp_uid}:${ftp_gid}" -R "${ftp_home}"
2021-10-20 16:29:08 +02:00
# ftp_user=... # nom du futur utilisateur FTP
# apg -n 1 -m 12 # génération du mot de passe
# ftpasswd --passwd --file=/etc/proftpd/vpasswd --name="${ftp_user}" --home="${ftp_home}" --shell=/bin/false --uid="${ftp_uid}" --gid="${ftp_gid}"
2016-12-29 11:25:39 +01:00
~~~
### Changer le mot de passe
Pour changer le mot de passe d'un compte :
2016-12-29 11:25:39 +01:00
~~~{bash}
2021-10-20 16:29:08 +02:00
# ftp_user=... # nom du compte FTP
# apg -n 1 -m 12 # génération du mot de passe
# ftpasswd --passwd --file /etc/proftpd/vpasswd --name="${ftp_user}" --change-password
2016-12-29 11:25:39 +01:00
~~~
### Supprimer un compte
2021-10-20 16:29:08 +02:00
Pour supprimer un compte :
~~~{bash}
2021-10-20 16:29:08 +02:00
# ftp_user=... # nom du compte FTP à supprimer
# ftpasswd --passwd --file=/etc/proftpd/vpasswd --name="${ftp_user}" --delete-user
2016-12-29 11:25:39 +01:00
~~~
2022-01-26 11:50:45 +01:00
## Restriction des commandes et accès avec la directive Limit
2018-11-06 02:25:32 +01:00
2022-01-26 11:50:45 +01:00
Documentation :
* <http://www.proftpd.org/docs/howto/Limit.html>
* <http://www.proftpd.org/docs/howto/ConnectionACLs.html>
2018-11-06 02:25:32 +01:00
2022-01-26 11:50:45 +01:00
La directive `Limit` permet d'autoriser ou empêcher l'exécution de commandes FTP bas niveau.
**Attention :** 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).
2018-11-06 02:25:32 +01:00
2022-01-26 11:50:45 +01:00
Si on a plusieurs vhost qui doivent avoir les mêmes limites, on créé un fichier `/etc/proftpd/access_control.conf` dans lequel on définit la gestion commune des droits. Puis, on l'inclus dans les différents vhost avec la directive `Include /etc/proftpd/access_control.conf`.
### Empêcher toutes les opérations sauf dans un répertoire
2018-11-06 02:25:32 +01:00
~~~
<Directory *>
<Limit ALL>
DenyAll
</Limit>
2018-11-06 02:25:32 +01:00
</Directory>
<Directory $path>
<Limit ALL>
AllowAll
</Limit>
2018-11-06 02:25:32 +01:00
</Directory>
~~~
2022-01-26 11:50:45 +01:00
### Autoriser uniquement le dépôt de fichiers dans un répertoire
2018-11-06 02:25:32 +01:00
~~~
<Directory $path>
<Limit ALL>
DenyAll
</Limit>
<Limit CDUP CWD XCWD XCUP PWD STOR STOU>
AllowAll
</Limit>
2018-11-06 02:25:32 +01:00
</Directory>
~~~
2022-01-26 11:50:45 +01:00
### Avoir un utilisateur en lecture seule, confiné dans son `$ftp_home`
2019-01-28 10:00:25 +01:00
~~~
<Directory ~$ftp_user>
2019-01-28 10:00:25 +01:00
<Limit CWD PWD DIRS READ>
AllowUser $ftp_user
2019-01-28 10:00:25 +01:00
</Limit>
<Limit ALL>
DenyUser $ftp_user
2019-01-28 10:00:25 +01:00
</Limit>
</Directory>
~~~
2022-01-26 11:50:45 +01:00
### Blacklister les connexions depuis une IP ou un hôte, en autorisant seulement certains comptes
~~~
<Limit LOGIN>
Deny from $IP
AllowUser $ftp_user1
AllowUser $ftp_user2
</Limit>
~~~
2022-01-26 11:50:45 +01:00
Cette configuration refuse toutes les connexions au serveur depuis `$IP`, mais accepte les connexions aux utilisateurs `$ftp_user1` et `$ftp_user2`, à l'exception de tous les autres utilisateurs.
**Attention :** Dans ce dernier cas, s'il y a plusieurs blocs / directives LOGIN dans la configuration ou le VirtualHost, il faut autoriser les utilisateurs dans toutes ces directives, sinon l'accès sera refusé tout le temps.
2017-04-21 16:03:52 +02:00
2022-01-26 11:50:45 +01:00
### Filtrer l'accès à un compte par IP (whitelist)
~~~
<Limit LOGIN>
AllowUser $ftp_user1
AllowUser $ftp_user2
AllowUser $ftp_user3
DenyAll
</Limit>
<IfUser $ftp_user3>
<Limit LOGIN>
Allow from $IP1 $IP2/24
Allow from $IP3
# Et autres ACLs
DenyAll
</Limit>
</IfUser>
~~~
**Attention** : Bien respecter l'ordre des directives et des blocs, sinon l'effet sera différents de celui attendu.
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
~~~
Forcer les droits 640 en fichier et 750 en répertoire avec l'umask:
2016-12-29 11:25:39 +01:00
~~~
<Directory $ftp_home>
Umask 0137 0027
2021-01-20 16:59:31 +01:00
<Limit SITE_CHMOD>
2021-01-20 16:59:31 +01:00
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 :
~~~{bash}
2016-12-29 11:25:39 +01:00
# 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
2016-12-29 11:25:39 +01:00
</IfModule>
~~~
On peut ensuite positionner des quotas, par exemple pour limiter les données uploadées à 200 Go :
~~~{bash}
2016-12-29 11:25:39 +01:00
# 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 :
~~~{bash}
2016-12-29 11:25:39 +01:00
# 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
~~~{bash}
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
2016-12-29 11:25:39 +01:00
-------------------------------------------
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 :
~~~{bash}
2016-12-29 11:25:39 +01:00
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
~~~{bash}
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 :
~~~{bash}
2016-12-29 11:25:39 +01:00
# 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 (FTP over SSL/TLS)
2017-04-21 16:03:52 +02:00
2022-01-26 11:50:45 +01:00
Note : A Evolix, nous ne proposons pour l'instant pas, sauf exception, les protocoles SFTP et FTPS.
On peut activer SSL/TLS en créant un fichier `/etc/proftpd/tls.conf` contenant les directives suivantes :
2017-04-21 16:03:52 +02:00
~~~{bash}
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
2020-05-15 12:09:08 +02:00
~~~
2017-04-21 16:03:52 +02:00
Vérifiez que les certificats et la clé privé existent bien.
2017-04-21 16:03:52 +02:00
Il faut vérifier que le fichier est bien chargé par la configuration principale `/etc/proftpd/proftpd.conf` :
~~~{bash}
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
Testez la configuration et rechargez la configuration :
2018-07-04 17:26:18 +02:00
~~~{bash}
# proftpd -t && systemctl reload proftpd.service
2020-05-15 12:09:08 +02:00
~~~
Testez la connexion :
~~~{bash}
# host=... # IP ou domaine
# lftp $host
lftp host:~> set ftp:ssl-force true
lftp host:~> login $ftp_user
2020-05-15 12:09:08 +02:00
Mot de passe :
lftp $ftp_user@host:~> ls
2017-04-21 16:03:52 +02:00
~~~
Si l'on peut lire le contenu du répertoire, alors la connexion est fonctionnelle.
2017-04-21 16:03:52 +02:00
## SFTP (FTP over SSH)
2023-01-25 15:44:37 +01:00
A Evolix, sauf exception, nous préférons utiliser OpenSSH, [qui propose lui aussi le protocole SFTP](HowtoOpenSSH#sftp).
2022-02-11 17:19:54 +01:00
Généralement, on souhaite conserver un service FTP "classique" en parallèle de SFTP.
On met donc sa configuration dans un VirtualHost, pour pouvoir écouter sur un deuxième port :
2017-11-09 16:31:18 +01:00
~~~
$ vim /etc/proftpd/conf.d/sftp.conf
LoadModule mod_sftp.c
2017-11-09 16:31:18 +01:00
<VirtualHost 0.0.0.0>
<IfModule mod_sftp.c>
2017-11-09 16:31:18 +01:00
SFTPEngine on
Port 2222
DefaultRoot ~
2017-11-09 16:31:18 +01:00
SFTPLog /var/log/proftpd/sftp.log
2017-11-09 16:31:18 +01:00
SFTPAuthMethods password publickey
# ProFTPD doesn't support ed25519 yet
#SFTPHostKey /etc/ssh/ssh_host_ed25519_key
SFTPHostKey /etc/ssh/ssh_host_ecdsa_key
SFTPHostKey /etc/ssh/ssh_host_rsa_key
2017-11-09 16:31:18 +01:00
SFTPAuthorizedUserKeys file:/etc/proftpd/sftp.passwd.keys/%u
AuthOrder mod_auth_file.c
AuthUserFile /etc/proftpd/vpasswd
2017-11-09 16:31:18 +01:00
RequireValidShell off
2018-01-24 11:24:38 +01:00
</IfModule>
</VirtualHost>
2017-11-09 16:31:18 +01:00
~~~
2023-01-25 15:44:37 +01:00
Note : Les clés publiques SSH des comptes SFTP dans le répertoire indiqué dans la directive [`SFTPAuthorizedUserKeys`](http://www.proftpd.org/docs/contrib/mod_sftp.html#SFTPAuthorizedUserKeys) doivent être au format de la RFC 4716, qui n'est pas le format par défaut de SSH.
**Si votre version de ProFTPd est antérieur à la 1.3.7 :**
Les clés SSH indiquées dans ler directives `SFTPHostKey` doivent être au format de la RFC 4716, qui n'est pas le format par défaut de SSH.
Pour créer les clés privées compatibles côté serveur :
~~~{bash}
# ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N '' -m PEM
# ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -t ecdsa -N '' -m PEM
~~~
2018-03-14 11:58:54 +01:00
Si les firgerprints des clés sont stockées dans un système d'information, pensez à le mettre à jour (`ssh-keyscan localhost` est votre ami).
2023-01-25 15:44:37 +01:00
### Ajouter un compte SFTP avec clé SSH
Suivre d'abord la section [Ajouter un compte](#ajouter-un-compte).
Puis, convertir la clé publique au format de la RFC 4716 et ajuster les droits :
~~~{bash}
$ ssh-keygen -e -f <PUBLIC_KEY> > /etc/proftpd/sftp.authorized_keys/<FTP_USER>
$ chmod 600 /etc/proftpd/sftp.authorized_keys/<FTP_USER>
~~~
Dans la configuration SFTP (`/etc/proftpd/conf.d/sftp.conf`), ajouter le nouvel utilisateur à la directive `AllowUser` .
Tester la configuration et la recharger :
2017-11-09 16:31:18 +01:00
~~~{bash}
# proftpd -t && systemctl reload proftpd.service
2019-02-12 18:09:25 +01:00
~~~
2023-01-25 15:44:37 +01:00
Tester la connexion via un mot de passe :
2018-01-24 11:24:38 +01:00
~~~{bash}
# lftp sftp://<USER>@<HOST>:<PORT>
Mot de passe :
lftp <USER>@<HOST>:~> ls
~~~
ou bien :
~~~
$ sftp -P <PORT> <USER>@<HOST>
<USER>@<HOST>'s password:
Connected to <HOST>
sftp> ls
2018-01-24 11:24:38 +01:00
~~~
Si l'on peut lire le contenu du répertoire, alors la connexion est fonctionnelle.
2023-01-25 15:44:37 +01:00
### Troobleshooting clés SSH
2021-10-21 11:54:19 +02:00
2023-01-25 15:44:37 +01:00
* Dans la configuration SFTP (`/etc/proftpd/conf.d/sftp.conf`), vérifier que la directive `SFTPAuthMethods` inclue `publickey` et que l'utilisateur est dans la liste des `AllowUser`.
2021-10-21 11:54:19 +02:00
2023-01-25 15:44:37 +01:00
* Vérifier les permission du répertoire des clés publique SSH :
2021-10-21 11:54:19 +02:00
2023-01-25 15:44:37 +01:00
~~~
chmod 700 /etc/proftpd/sftp.authorized_keys/
2018-01-24 11:24:38 +01:00
~~~
2023-01-25 15:44:37 +01:00
* Les fichiers de clés doivent être accessibles par l'utilisateur sous lequel ProFTPd tourne. Si les directives `User` et/ou `Group` sont utilisées, il faut ajuster les droits. Par exemple, avec `User=proftpd` et `Group=proftpd`, il faut (au minimum) que le dossier soit en `root:proftpd 0750` et les fichiers soient en `root:proftpd 0640`.
2021-10-21 11:54:19 +02:00
2023-01-25 15:44:37 +01:00
* Les clés publiques SSH des comptes SFTP dans le répertoire indiqué dans la directive [`SFTPAuthorizedUserKeys`](http://www.proftpd.org/docs/contrib/mod_sftp.html#SFTPAuthorizedUserKeys) doivent être au format de la RFC 4716, qui n'est pas le format par défaut de SSH.
2023-01-25 15:44:37 +01:00
* Si votre version de ProFTPd est antérieur à la 1.3.7, les clés SSH indiquées dans ler directives `SFTPHostKey` doivent être au format de la RFC 4716, qui n'est pas le format par défaut de SSH.
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
### Problème d'envoi de fichier avec erreur `open for write: permission denied`
L'erreur est provoquée lorsque l'on veut écraser un fichier existant, il faut rajouter la directive `AllowOverwrite on` dans le la configuration de ProFTPD ou du VirtualHost concerné.
On la positionne dans une balise `<Directory>` comme ceci :
~~~
<Directory /home/*>
AllowOverwrite on
</Directory>
2021-10-21 11:54:19 +02:00
~~~
2022-06-24 11:28:06 +02:00
2022-06-24 11:28:35 +02:00
### Problèmes d'accès
2022-06-24 11:28:06 +02:00
En cas d'erreurs d'accès, bien vérifier que les ports 20 et 21 sont ouverts, ainsi que les ports passifs :
~~~
iptables -A INPUT -p tcp --dport 60000:61000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
~~~
En cas d'erreurs de permission, il vérifier que lUID et le GID sont bien mis explicitement (en chiffres) comme propriétaires des répertoires et fichiers auxquels l'utilisateur FTP est censée avoir accès. En effet, ProFTPd nest pas capable de lire les noms des utilisateurs Unix dans `/etc/passwd`.