Servidor Virtual de FTP Seguro con MySQL

Hoy vamos a instalar un servidor Ubuntu para un FTP virtual (VSFTP).
Los usuarios van a estar almacenados en una base de datos MySQL (cualquier otra sirve, como por ejemplo, PostgreSQL) por lo cual nuestro nuevo servidor debe tener instaladas todas las aplicaciones necesarias:

  • vsftpd: Servidor FTP
  • pam: Modulos de autenticación
  • MySQL: Base de datos

Despues de tener instalado el servidor Ubuntu le indicamos el siguiente comando:

$sudo apt-get install libpam-mysql vsftpd mysql-server

Lo cual instalará todo lo necesario siguiendo sus dependencias. Así que lo siguiente será configurar todo esto para que trabajen juntos.

Configuración MySQL
Nos vamos a centrar en la configuración que nos interesa en este momentos, por lo tanto, esto no es lo único que se debe hacer despues de instalar MySQL.
1. Nos conectamos a MySQL
$mysql -u root -p

2. Creamos la base de datos para los usuarios del vsftpd
mysql>CREATE DATABASE vsftpd;
mysql>USE vsftpd

3. Creamos la tabla
mysql>CREATE TABLE accounts (
id int AUTO_INCREMENT NOT NULL,
username varchar(30) binary NOT NULL,
pass varchar(50) binary NOT NULL,
primary key(id)
);

4. Si lo deseamos, podemos crear una tabla donde se almacene un registro
mysql> CREATE TABLE logs (msg varchar(255),
user varchar(20),
pid int,
host char(32),
rhost char(32),
logtime timestamp
);

5. Finalmente, creamos un usuario específico para el vsftpd (no queremos usar 'root')
GRANT SELECT, INSERT, UPDATE ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'contraseña_segura');
mysql>FLUSH PRIVELEGES;

Si deseamos algo más de seguridad:
mysql> GRANT SELECT ON vsftpd.accounts TO 'vsftpd'@'localhost' IDENTIFIED BY 'contraseña_segura');
mysql> GRANT INSERT ON vsftpd.logs TO 'vsftpd'@'localhost' IDENTIFIED BY 'contraseña_segura');
mysql> FLUSH PRIVELEGES;

Esto no nos permitira realizar ningún cambio en los usuarios a menos que seamos 'root' de MySQL.

Configuración Ubuntu
1. Crear el usuario 'vsftpd'
$sudo adduser --ingroup nogroup -d /home/vsftpd -s /bin/false vsftpd
$sudo chown vsftpd.nogroup /home/vsftpd

2.Modificar el fichero de configuración de PAM para el vsftpd
$sudo vi /etc/pam.d/vsftpd

Añadimos lo siguiente:
auth required pam_mysql.so config_file=/etc/security/pam_mysql try_first_pass=false
account required pam_mysql.so config_file=/etc/security/pam_mysql try_first_pass=false

Lo siguiente es crear ese fichero pam_mysql.conf
$sudo vi /etc/security/pam_mysql
users.host=localhost
users.database=vsftpd
users.db_user=vsftpd
users.db_passwd=contraseña
users.table=accounts
users.user_column=username
users.password_column=pass
users.password_crypt=2
verbose=1
log.enabled=1
log.table=logs
log.message_column=msg
log.pid_column=pid
log.user_column=user
log.host_column=host
log.rhost_column=rhost
log.time_column=logtime

3. Y finalmente ha llegado la hora de configurar vsftpd
$sudo vi /etc/vsftpd.conf
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
nopriv_user=vsftpd
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf

Ya podemos iniciar el servidor:
$sudo /etc/init.d/vsftpd start

Nota: El vsftpd puede ser utilizado dentro de inetd o xinetd.

Creación de usuarios.
Dependiendo de los privilegios que le hayamos otorgado al usuario vsftpd en MySQL podremos utilizarlo para administrar sus usuarios. Si hemos sido paranoicos, habrá que ser 'root' o algún usuario con permisos de modificación en la tabla accounts.
$mysql -u vsftpd -p
mysql>USE vsftpd;
mysql>INSERT INTO accounts (username, pass) VALUES ('nombre', PASSWORD('contraseña'));
mysql>quit;

Creamos la carpeta del usuario
$sudo mkdir /home/vsftpd/nombre
$sudo chmod vsftpd.ngroup /home/vsftpd/nombre

Y ya está. Para comprobarlo nos conectamos utilizado cualquier cliente FTP.
Mas información en
man vsftpd.conf
man pam

6 comentarios:

  1. Excellent tutorial --- however:

    Last command:

    $sudo chmod vsftpd.ngroup /home/vsftpd/nombre

    must be

    $sudo chown vsftpd.nogroup /home/vsftpd/nombre

    anyway... :( i can't connect with my FTP Client. The message is "Login incorrect". I think is a password problem , but i followed the tutorial step by step.

    Any suggestion would be eternally appreciated!

    Thanks in advance

    ResponderEliminar
  2. Creo que donde pone:
    account required pam_mysql.so config_file=/etc/security/pam_mysql try_first_pass=false
    falta que el fichero se llame pam_mysql.conf

    ResponderEliminar
  3. You needed to look at /var/log/auth.log to see the error messages from libpam-mysql.

    As described in the pam_mysql documentation (http://pam-mysql.sourceforge.net/), the config_file parameter is only available since 0.7 version.

    Then in the /etc/pam.d/vsftpd call-configuration file you need to specify all the parameters on each call to pam_mysql.so

    I've found those different-named parameters at http://pam-mysql.sourceforge.net/Documentation/package-readme.php

    ResponderEliminar
  4. @anonimo:
    You're right, it's "chown". Maybe the problem is on the GRANT commands. Try following the tutorial without this commands. What version of MySQL are you using. If you want I can assist you by connecting to FreeNode on #Linux.

    @Narcis:
    El nombre del fichero da igual, lo puedes llamar como quieras. Recuerda que los sistemas *nix no utilizan extensiones de archivos, solo como referencia.

    ResponderEliminar
  5. Lo he repasado todo una y otra vez, hasta conseguir el propósito del artículo. Entonces he creado otra guía, en la que se tiene en cuenta la desactivación de la autenticación PAM-Unix (la del sistema), y la diferente configuración de la versión 0.6.2 de PAM-MySQL (la última estable y en repositorios)

    En catalán

    ResponderEliminar
  6. Y ahora disponible también en castellano:

    http://www.actiu.net/infordoc/servidors/

    ResponderEliminar