Usuarios virtuales con ProFTP y MySQL


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

#Proftp