Vamos a llevar a cabo una instalación de un servidor ftp, en este caso PureFTPd, y vamos a almacenar los usuarios en una tabla de una base de datos, en este caso MySQL. Este tipo de instalación es muy útil, ya que podremos agregar, modificar o eliminar usuarios modificando la tabla de MySQL, esto es muy cómodo cuando necesitamos modificar usuarios desde una aplicación como podría ser una aplicación web, o incluso desde una app móvil como (android o IOS). También podrán ser modificados desde PHPMyAdmin.
En caso de no disponer de MySQL en nuestro equipo, lo instalamos
sudo apt-get install mysql-server mysql-client
Nos preguntará por la contraseña que queremos usar, y nos pedirá repetirla.
Una vez listo MySQL, abrimos una terminal o consola y nos autenticamos en MySQL con nuestro usuario de MySQL con el comando:
mysql -u username -p
Creamos la base de datos para PureFTPd con el comando:
CREATE DATABASE pureftpd;
Creamos el usuario de MySQL pureftpd y le damos permisos de selección, inserción, actualización, borrado y creación en la base de datos que creamos en el paso anterior con el comando (sustituyendo ContraseñaDeEsteUsuario por la contraseña que deseemos):
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO ‘pureftpd’@’localhost’ IDENTIFIED BY ‘ContraseñaDeEsteUsuario’;
Creamos la tabla en la base de datos:
CREATE TABLE pureftpd.ftpd (
User varchar(30) NOT NULL default ”,
status enum(‘0′,’1’) NOT NULL default ‘0’,
Password varchar(64) NOT NULL default ”,
Uid varchar(11) NOT NULL default ‘1060’,
Gid varchar(11) NOT NULL default ‘1009’,
Dir varchar(128) NOT NULL default ”,
ULBandwidth smallint(5) NOT NULL default ‘0’,
DLBandwidth smallint(5) NOT NULL default ‘0’,
comment varchar(255) NOT NULL default ”,
ipaccess varchar(15) NOT NULL default ‘*’,
QuotaSize smallint(5) NOT NULL default ‘0’,
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
);
Con esto ya tenemos la base de datos preparada. Salimos de MySQL
exit
Continuamos instalando PureFTPd
sudo apt-get install pure-ftpd-mysql
Hacemos una copia de la configuración por defecto de PureFTPd
sudo cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig
Vaciamos el archivo de configuración
sudo sh -c “cat /dev/null > /etc/pure-ftpd/db/mysql.conf”
NOTA: A alguien le puede parecer extraño este comando y estará pensando porque no se hace con sudo cat /dev/null > /etc/pure-ftpd/db/mysql.conf, el motivo es que se hacerlo de esa forma, la primera parte, el cat /dev/null se realizaría con permisos de superusuario, pero la redirección al archivo de configuración se realizaría con el usuario del shell, y por tanto si no es root, no lo realizaría. De esta forma ejecutamos como superusuario el comando sh, y a este le pasamos con la opción -c el código que queremos ejecutar.
Ahora editamos el archivo de configuración
sudo nano /etc/pure-ftpd/db/mysql.conf
y añadimos lo siguiente:
MySQLSocket /var/run/mysqld/mysqld.sock
#MYSQLServer localhost
#MYSQLPort 3306
MySQLTransactions On
MYSQLUser pureftpd
MYSQLPassword ContraseñaDeEsteUsuario
MYSQLDatabase pureftpd
MYSQLCrypt cleartext
MYSQLGetPW SELECT Password FROM ftpd WHERE User=”\L” AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MYSQLGetUID SELECT Uid FROM ftpd WHERE User=”\L” AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MYSQLGetGID SELECT Gid FROM ftpd WHERE User=”\L”AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MYSQLGetDir SELECT Dir FROM ftpd WHERE User=”\L”AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User=”\L” AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User=”\L” AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User=”\L” AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User=”\L” AND status=”1″ AND (ipaccess = “*” OR ipaccess LIKE “\R”)
Guardamos pulsando control + o y luego intro
Y salimos con control + x
Continuamos con algunas configuraciones para nuestro demonio:
sudo sh -c ‘echo “yes” > /etc/pure-ftpd/conf/ChrootEveryone’ Crea un entorno chroot para los usuarios
sudo sh -c ‘echo “yes” > /etc/pure-ftpd/conf/CreateHomeDir’ Crea el directorio del usuario cuando este se loguea y no existe dicho directorio
sudo sh -c ‘echo “yes” > /etc/pure-ftpd/conf/NoAnonymous’ Impide el acceso anónimo
sudo sh -c ‘echo “yes” > /etc/pure-ftpd/conf/AllowDotFiles’ Permite archivos que empiezan con un punto como .htaccess
sudo sh -c ‘echo “no” > /etc/pure-ftpd/conf/ProhibitDotFilesWrite’ No prohíbe la escritura de los archivos de la linea anterior
sudo sh -c ‘echo “yes” > /etc/pure-ftpd/conf/DisplayDotFiles’ Muestra los archivos que empiezan por un punto (archivos ocultos en linux)
sudo sh -c ‘echo “no” > /etc/pure-ftpd/conf/ProhibitDotFilesRead’ No impide leer los archivos que comienzan por un punto
Modificamos el siguiente archivo para que PureFTPd se ejecute en modo “standalone”, es decir, de forma automática, sin la intervención del usuario
sudo nano /etc/default/pure-ftpd-common
con esta línea
STANDALONE_OR_INETD=standalone
Reiniciamos el servicio para aplicar los cambios
sudo service pure-ftpd-mysql restart
o si nuestra distribución de línux no posee el comando service
sudo /etc/init.d/pure-ftpd-mysql restart
Esta sería la vista de un usuario creado desde phpMyAdmin
Como vemos, tendremos varios campos, que explicamos a continuación:
La columna User será el nombre de usuario.
La columna status indica con un 1 si la cuenta ftp está activada, o con un 0 si está desactivada.
La columna Password, será al contraseña de nuestro usuario ftp.
La columna Uid, es el identificador de Usuario del sistema con la que se crearán los archivos y directorios que se suban al ftp.
La columna Gid, es el identificador de Grupo del sistema con la que se crearán los archivos y directorios que se suban al ftp
La columna Dir, es el Directorio raíz a donde apunte la cuenta de FTP.
La columna ipaccess, por defecto al dejarla en blanco coge un “*” y se podrá acceder a la cuenta desde cualquier IP, si se especifica una IP solo se podrá acceder a esa cuenta de ftp desde esa IP.
La columna ULBandwidth especifica el ancho de banda de subida del que dispondrá ese usuario en KB/sec. Si no se desea poner una limitación, se dejará a 0.
La columna DLBandwidth especifica el ancho de banda de bajada del que dispondrá ese usuario en KB/sec. Si no se desea poner una limitación, se dejará a 0.
La columna QuotaSize especifica especifica la cuota de disco de la que dispondrá el usuario en MB. Si no se desea poner una limitación, se dejará a 0.
La columna QuotaFiles especifica la cuota de máxima de cada archivo en MB. Si no se desea poner una limitación, se dejará a 0.
Y con esto ya tendremos nuestro servidor ftp funcionando y podremos añadir, borrar y modificar usuarios desde mysql, phpMyAdmin, o incluso desde una aplicación web o móvil que nosotros mismos podremos programar.