L’idée de l’article est d’utiliser proftpd avec un backend sql pour l’authentification des utilisateurs et de sécuriser le tout via sftp.
On commence par la base : on installe proftpd + le module mysql (on considère qu’un serveur sql est déjà configuré)
apt -y install proftpd-mod-mysql
sql
On va créer une base spécifique + un utilisateur sql dédié (adaptez sqlBase, sqlUser et sqlPassword suivant votre besoin)
CREATE DATABASE IF NOT EXISTS sqlBase CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL ON sqlBase.* to 'sqlUser'@'localhost' IDENTIFIED BY 'sqlPassword';
On va créer une table pour les utilisateurs :
CREATE TABLE `users` (
`userID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userLogin` tinytext NOT NULL,
`userPassword` tinytext NOT NULL,
`userUID` int(11) unsigned NOT NULL,
`userGID` int(11) unsigned NOT NULL,
`userHome` tinytext NOT NULL,
`userShell` tinytext NOT NULL,
PRIMARY KEY (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
proftpd
On va modifier le fichier /etc/proftpd/proftpd.conf à 3 endroits :
[...] # Use this to jail all users in their homes DefaultRoot ~ [...]
[...]
# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
RequireValidShell off
[...]
et :
[...]
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
Include /etc/proftpd/sql.conf
[...]
On modifie le fichier /etc/proftpd/modules.conf
[...]
# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c
[...]
# Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c
[...]
On va ensuite modifier le fichier /etc/proftpd/sql.conf (le SqlLogFile est optionnel, mais peut être très efficace) :
<IfModule mod_sql.c>
SQLBackend mysql
SQLEngine on
SQLAuthenticate users
SQLAuthTypes OpenSSL
SQLConnectInfo sqlUser@localhost sqlBase sqlPassword
SQLUserInfo users userLogin userPassword userUID userGID userHome userShell
SqlLogFile /var/log/proftpd/sql.log
</IfModule>
Arrivé à ce point, on peut faire un systemctl restart proftpd.service
On va maintenant rajouter un utilisateur. Il faut générer son mot de passe (changez password par le mot de passe souhaité)
/bin/echo "{md5}"`/bin/echo -n "password" | openssl dgst -binary -md5 | openssl enc -base64`
Ou en PHP :
$password = "{md5}".base64_encode(pack("H*", md5("password")));
On rajoute un utilisateur via SQL à notre serveur FTP. Il nous faut un nom d’utilisateur, un mot de passe, un UID unique sur le système, un GID unique ou (partagé avec d’autres utilisateurs), le répertoire home d’arrivée et obligatoirement le ‘/sbin/nolgin‘ :
INSERT INTO users (`userLogin`, `userPassword`, `userUID`, `userGID`, `userHome`, `userShell`) VALUES ('testLogin', '{md5}testPassword', 1234, 4321, '/path/to/home/to/testLogin/', '/sbin/nologin');
Pour que l’utilisateur puisse créer des dossiers / fichiers dans le répertoire, il faut lui donner les droits dessus.
chown -R 1234:4321 /path/to/home/to/testLogin
Maintenant en prenant son gestionnaire FTP préféré, on devrait pouvoir se logger en FTP déjà pour valider cette partie de configuration.
sftp
Dernière partie : on va configurer la partir SFTP. Rajoutez ces lignes à la fin du fichier /etc/proftpd/proftpd.conf
SFTPEngine on
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_dsa_key
SFTPCompression delayed
SFTPAuthMethods password
Puis un systemctl restart proftpd.service
Attention, vous êtes toujours sur le port 21 pour l’identification SFTP