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