En esta guía montaremos un Servidor FTP multiusuario con usuarios virtuales, utilizando VSFTPD + PAM + MySQL. El servicio FTP tradicional consiste en que los usuarios del sistema operativo tienen acceso al sistema de ficheros con sus mismas credenciales y atribuciones, y adicionalmente hay una cuenta de usuario anónimo para que públicamente se puedan descargar determinados contenidos. La característica especial, entonces, de esta instalación es que todos los usuarios FTP se almacena en una base de datos, y pasan a ser “usuarios virtuales” en lugar de “usuarios reales” del sistema operativo. De esta manera se evita la creación de múltiples usuarios reales en el sistema operativo, y todos los usuarios virtuales actúan con una misma cuenta del sistema.
Antes de nada hay que verificar que el Router esté correctamente configurado para no tener problemas de conectividad. Hay que abrir el puerto 20 y configurarlo con la IP local de nuestro servidor.
Al servidor tambien debemos ponerle la IP manual asi tendrá siempre la misma y evitaremos errores al conectarnos remotamente.
1)Instalamos los programas a utilizar, desde el terminal
sudo apt-get install mysql-server
sudo apt-get install libpam-runtime libpam-modules
sudo apt-get install libpam-mysql
sudo apt-get install vsftpd
El MySQL Server al instalarse pedirá que le establezcamos una contraseña para el usuario
administrador (root), que necesitamos cuando queremos hacer determinadas operaciones.
2)Nos conectamos a la consola del servidor MySQL (nos pedirá la contraseña del propio usuario “root” de MySQL) para crear el usuario ‘vsftpd’ que será el usuario principal el cual establecerá la conexión con mysql.
mysql -u root -p
dentro de MySQL tecleamos:
INSERT INTO user (Host, User, Password) VALUES
('localhost','vsftpd',password('ftppass'));
Le damos privilegios al usuario ‘vsftpd’
INSERT INTO db (Host, Db, User, Select_priv) VALUES
('localhost','vsftpd','vsftpd','Y');
Actualizamos los privilegios
FLUSH PRIVILEGES;
3)Creamos la base de datos para ‘vsftpd’
CREATE DATABASE vsftpd;
Seleccionamos la base de datos vsftpd
use vsftpd;
4)Creamos la tabla para los usuarios
CREATE TABLE `usuarios` (
`usuario` varchar(30) NOT NULL default '',
`password` varchar(50) NOT NULL default ''
);
Nos desconectamos
quit
5)Agregamos el usuario “fantasma” ‘vsftpd’
sudo useradd --home /home/vsftpd --gid nogroup
-m --shell /bin/false vsftpd
6)Configuramos el archivo vsftpd.conf
sudo gedit /etc/vsftpd.conf
Cambiamos los siguientes valores:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=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
7)Configuramos libpam
Pluggable Authentication Modules (PAM) es un sistema múltiple para que los programas puedan
autenticar la identidad de usuarios y otros agentes del entorno informático. Lo utilizamos aquí para
que el servidor VSFTPD no tenga que hacer esta tarea, y simplemente consulte a PAM si el
usuario que llama se corresponde con el de la base de datos.
sudo gedit /etc/pam.d/vsftpd
Borramos todo y escribimos estas dos lineas de codigo:
auth required pam_mysql.so user=vsftpd passwd=ftppass
host=localhost db=vsftpd table=usuarios usercolumn=usuario
passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=ftppass
host=localhost db=vsftpd table=usuarios usercolumn=usuario
passwdcolumn=password crypt=2
Una vez tenemos todo configurado podemos crear los usuarios, en la tabla de usuarios.
8)entramos en mysql
mysql -u root -p
y dentro nos vamos a la base de datos vsftpd
use vsftpd
INSERT INTO usuarios (usuario, password) VALUES
('anonimo',password('123456'));
El nombre del usuario lo elegimos nosotros al igual que la contraseña (password). Para el ejemplo utilizamos ‘anonimo’ y ‘123456′
9)Cerramos el Terminal y abrimos otro para crear el directorio para el nuevo usuario que acabamos de crear
cd /home/vsftpd/
sudo mkdir publico
10) Cambiamos de propietario
sudo chown vsftpd:nogroup anonimo
11) Una vez tenemos los propietarios que queremos, creamos su lista de acceso, con los privilegios de cada uno. Creamos una carpeta que contendrá los archivos de cada usuario.
sudo mkdir /etc/vsftpd/user_conf
Dentro de esta carpeta irán los archivos de configuración de cada usuario, por ejemplo creamos el del usuario “publico”
sudo gedit /etc/vsftpd/user_conf/anonimo
y le añadimos:
# permiso de escritura
write_enable=NO
# puede listar directorios
dirlist_enable=YES
# puede descargar
download_enable=YES
# velocidad límite de descarga
local_max_rate=0
# máscara de creación de archivos
local_umask=022
# directorio al que accederá
local_root=/home/ftp/anonimo
Esto lo haremos para cada usuario que demos de alta
Ya está todo listo ahora solo nos queda reiniciar el servidor ftp:
sudo /etc/init.d/vsftpd restart
Cómo eliminar un usuario FTP
1. Eliminamos el usuario de la base de datos:
mysql -u ftpadmin --password=contraseña2 -e
"DELETE FROM vsftpd.usuarios
WHERE nombre = 'elnombredeusuario';"
2. Eliminamos el perfil FTP de usuario:
sudo rm /etc/vsftpd/elnombredeusuario
3. Si queremos, podemos eliminar su directorio (se perderá todo el contenido ! ):
sudo rm -R /ruta/a/su/directorio