Proftpd
ProFTPd est un logiciel permettant de monter un serveur de fichiers basé sur les protocoles FTP ; FTPS et SFTP. Il a la particularité d'utiliser des fichiers de configuration proches de ceux d'Apache2.
Installation
Référence dans son domaine, il est probablement disponible dans les dépôts de la distribution Linux que vous utilisez. Pour Debian 12, la commande suivante permet d'installer le paquet
apt install --no-install-recommends proftpd proftpd-mod-crypto
ProFTPd supporte un grand nombre de modules. Le paquet proftpd-mod-crypto
permet d'utiliser FTP sur TLS, aussi appelé FTPS ainsi que SFTP, le protocole de transfert de fichiers sur SSH.
SFTP
De nos jours, l'utilisation des protocoles FTP et sont pendant chiffré, FTPS, est dépréciée. Les raisons principales de cette tendance, malgré les qualités indéniables de ces derniers est principalement dû à l'explosion des NAT/PAT sur les réseaux WAN ainsi que la systématisation des règles de pare-feux. FTP est en effet un vieux protocole imaginé à une époque où il était normal (allez savoir pourquoi) d'utiliser une multitude de ports pour réaliser une action simple. Aussi, le port 20/TCP était utilisé pour les données alors que le 21/TCP servait pour transmettre les commandes. La version chiffrée quant à elle utilisait carrément des plages de ports au dessus de 1024 en plus de ceux mentionnés, rendant toute tentative de filtrage fin veine et occasionnait des problèmes de fiabilité avec certaines passerelles NAT (que je n'ai pour ma part jamais rencontré).
Cependant, la vacance occasionnée par la dépréciation de ces protocoles n'a jamais été réellement comblée. WebDAV n'est pas très fiable dans ces implémentations (surtout sous Windows) et est plus que casse pied à configurer côté serveur (y'a toujours un truc qui va pas) ; HTTP seul ne permet pas le transfert de répertoires, Samba et NFS ne sont pas fait pour du WAN en plus de proposer une sécurité (surtout pour ce dernier) très discutable, ISCSI ne fonctionne qu'en mode bloc ; SFTP embarqué dans un serveur SSH utilise traditionnellement des utilisateurs POSIX, ce qui oblige à porter une attention toute particulière au durcissement de la configuration en plus de permettre des répercutions catastrophiques en cas de faille (un utilisateur destiné au transfert de fichiers peut, en fin de compte, se connecter au serveur...) ; etc... Aucun remplaçant potentiel n'a donc su prendre la relève avec la légèreté et les fonctionnalités du protocole de transfert de fichiers (File Transfer Protocol) traditionnel :
- installation et utilisation simple
- utilisateurs virtuels avec base de données de multiple types allant du fichier plain à la base SQL en passant par l'annuaire LDAP
- emprisonnement des comptes utilisateurs dans un répertoire (chroot)
- pas de shell
- gestion des droits
- reprise de téléchargements partiels
- performances maximales
- support très large
L'implémentation de SFTP proposée par ProFTPd s'avère alors particulièrement intéressante car elle est décorrélée de tout serveur SSH et permet l'utilisation de comptes virtuels emprisonnés sans utilisation de shell, réduisant ainsi drastiquement la surface d'attaque. De plus, ce logiciel est reconnu comme apportant un soin prononcé à la sécurité et est éprouvé depuis plusieurs décennies. Il permettra donc de proposer un service quasiment similaire tout en apportant la confidentialité exigée par l'époque...
Configuration du service
En mode SFTP uniquement
mv /etc/proftpd/proftpd.conf /etc/proftpdproftpd.conf.ori
cat << '_EOF_' > /etc/proftpd/proftpd.conf
# Chargement du module SFTP
LoadModule mod_sftp.c
# Désactiver le service FTPS
<IfModule mod_tls.c>
TLSEngine off
</IfModule>
# Activer SFTP
<IfModule mod_sftp.c>
SFTPEngine on
Port 2222
# Pièger l'utilisateur (chroot) dans son répertoire personnel
DefaultRoot ~
# Journalisation
SFTPLog /var/log/proftpd/sftp.log
SyslogLevel info
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log
# UseLastlog on
SFTPHostKey /etc/proftpd/ssh_host_ed25519_key
# Méthode d'authentification
SFTPAuthMethods publickey
SFTPAuthorizedUserKeys file:/etc/proftpd/authorized_keys/%u
RequireValidShell off
</IfModule>
# Utiliser les utilisateurs virtuels
<IfModule mod_auth.c>
AuthOrder mod_auth_file.c
</IfModule>
# Base des utilisateurs virtuels
<IfModule mod_auth_file.c>
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
</IfModule>
# Limiter l'accès aux utilisateurs virtuels
<Limit LOGIN>
AllowUser toto
DenyAll
</Limit>
_EOF_
ASTUCE
La configuration proposée impose l'usage de clés SSH pour la connexion des clients. Pour permettre l'utilisation des mots de passes en cas d'absence de clé, le motpassword
peut être ajouté à la suite après un espace dans le paramètre correspondant de la façon suivante : SFTPAuthMethods publickey password
.L'outil exige que le nom d'hôte redirige obligatoirement sur son adresse IP (il doit probablement utiliser cette information pour la création du socket TCP). Définissez cette donnée en l'adaptant à votre configuration :
echo -e "10.0.0.100\t${HOSTNAME}" >> /etc/hosts
Éléments secrets
Génération d'une clé SSH serveur
ssh-keygen -t ed25519 -f /etc/proftpd/ssh_host_ed25519_key -N "" chmod 600 /etc/proftpd/ssh_host_ed25519_key
Utilisation des clés SSH pour les clients
mkdir /etc/proftpd/authorized_keys
Proftpd utilise volontairement un format de clé SSH différent d'OpenSSH pour éviter les conflits avec ce dernier. Il a ainsi choisit la forme décrite dans la RFC 4716. Il est possible de convertir une clé existante sans altération de l'originale (par retour sur stdout) via la commande suivante sur le client
ssh-keygen -e -f ~/.ssh/id_ed25519.pub
Le résultat est à mettre dans le fichier de clés portant le nom de votre utilisateur (directive SFTPAuthorizedUserKeys file:/etc/proftpd/authorized_keys/%u
).
Exemple avec l'utilisateur toto
cat << '_EOF_' >> /etc/proftpd/authorized_keys/toto
---- BEGIN SSH2 PUBLIC KEY ----
VOTRE
CLÉ PUBLIQUE
AU FORMAT
RFC 4716
---- END SSH2 PUBLIC KEY ----
_EOF_
Il est bien entendu possible de chaîner plusieurs clés dans ce même fichier. Il y aura donc autant de sections BEGIN/END que de clés.
chmod 600 /etc/proftpd/authorized_keys/toto
Utilisateurs virtuels
Création du répertoire personnel de l'utilisateur virtuel
mkdir -p /var/lib/proftpd/toto chown 2000:2000 /var/lib/proftpd/toto
Création dudit utilisateur
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --uid=2000 --gid 2000 --home=/var/lib/proftpd/toto --shell=/bin/false --sha256 --name=toto ftpasswd --group --file=/etc/proftpd/ftpd.group --gid=2000 --member=toto --name=Moi
ASTUCE
Il est possible de remplacer le mot de passe haché par un!
ou tout autre caractère ne correspondant pas à un mot de passe haché dans le fichier passwd
afin de désactiver le mot de passe. L'option -l
ou --lock
peut également être passée à la commande de création de l'utilisateur (concatène ce caractère au mot haché). Seule les connexions par clé SSH seront alors autorisées.Test et application
Il est possible de tester la configuration avec la commande suivante
proftpd -t -d 10
Le paramètre -d
permet d'augmenter le niveau de verbosité du journal sur la sortie standard (de 0 à 10). Il est également possible d'augmenter le niveau de journalisation en conduite en passant la valeur debug
à la directive SyslogLevel
.
Redémarrer le service pour prendre en compte les modifications (inutile pour la création ou le changement de mot de passe d'un utilisateur)
systemctl restart proftpd.service
Vous pouvez désormais utiliser un client SFTP pour vérifier le bon fonctionnement.
Exemple avec celui d'OpenSSH :
sftp -oPort=2222 toto@10.0.0.100
ou
sftp -P 2222 toto@10.0.0.100