Actualizado y probado en Debian 11
Este post muestra una configuración típica del ProFTPD en Debian para usar usuarios virtuales que estén en una base de datos MySQL.
Esta solución está orientada a servidores Web principalmente, donde cada usuario es un sitio Web.
Objetivo:
- Tener el listado de usuarios en una base datos MySQL
- Enjaular a los usuarios en un directorio
- Activar el soporte TLS/SSL
Instalación
Proftpd está partido en módulos por lo que es necesario instalar varios paquetes:
apt install proftpd proftpd-mod-mysql proftpd-mod-crypto
El módulo tls
no se carga por defecto hay que activarlo en
/etc/proftpd/modules.conf
:
LoadModule mod_tls.c
Configuración de la base de datos
Suponiendo que tenemos una base de datos MySQL ya creada esta tabla contendría los usuarios
CREATE TABLE IF NOT EXISTS `mod_proftpd_users` (
`username` varchar(30) NOT NULL DEFAULT '',
`passwd` varchar(80) NOT NULL DEFAULT '',
`uid` int(11) NOT NULL DEFAULT '33',
`gid` int(11) NOT NULL DEFAULT '33',
`homedir` varchar(255) DEFAULT NULL,
UNIQUE KEY `userid` (`username`)
);
El UID/GID de las líneas resaltadas corresponde al usuario www-data grupo www-data de mi sistema.
Aunque esa es la configuración predeterminada, para mejor seguridad de los sitios Web suelo usar en los usuarios FTP virtuales el usuario ftp gupo www-data. Con esto los PHP descontrolados (como son los WordPress) tienen difícil autodestruirse si los permisos están adecuadamente establecidos.
Configuración de ProFTPD
Hay que asegurarse tener instalado el paquete proftpd-mod-mysql y tras se puede crear un nuevo fichero de configuración, por ejemplo /etc/proftpd/conf.d/mypanel.conf. Este fichero es incluido automáticamente, el contenido sería el siguiente:
# Desactivando PAM y activando MySQL
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
AuthPAM off
DefaultRoot ~
RequireValidShell off
# Configuracion MySQL
SQLBackend mysql
SQLAuthTypes Crypt
SQLAuthenticate users
SQLConnectInfo $USER@localhost $DATABASE $PASSWORD
SQLUserInfo mod_proftpd_users username passwd uid gid homedir '/bin/false'
SQLMinID 10
# Si algo va mal activo este log para depurar
#SQLLogFile /var/log/proftpd/proftpd-mysql.log
En la línea resaltada se debe indicar correctamente los datos de conexión a la base de datos.
Activando y forzando TLS
Ahora toca evitar el robo de contraseñas forzando a los usuarios a utilizar TLS. Cuidado con esta configuración, TLS no funciona bien cuando los clientes están tras un cortafuegos. Considera que desde operadores móviles TLS no suele funcionar ya que se comparte IP entre varios dispositivos móviles.
Aunque hay un fichero de configuración de ejemplo que basta con ioncluirlo desde proftpd.conf, prefiero añadir la configuración manualmente en el mismo fichero anterior /etc/proftpd/conf.d/mypanel.conf.
### Configuracion TLS
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSRSACertificateFile /etc/proftpd/cert.crt
TLSRSACertificateKeyFile /etc/proftpd/key.pem
#TLSCACertificateFile /etc/proftpd/ca.pem
TLSOptions AllowClientRenegotiations
TLSVerifyClient off
TLSRequired on
TLSRenegotiate required off
# Problemas TLS con muchos clientes
TLSOptions NoSessionReuseRequired
</IfModule>
Si no quieres forzar a los usuarios a usar TLS cambia la directiva resaltada