proftpd + sql + sftp

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