Instalar Pure-ftpd con soporte MySQL



1 - Instalar soporte: MySQL, Apache, PhpMyAdmin

# apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin apache2

1.1 - Aunque durante de la instalacion del MySQL me piden un password para el usuario “root”, en caso de haberla obviado y dejado en blanco, puedo darle una usando:

# mysqladmin -u root password <nuevo_password>

1.2 - Chequeo por donde esta escuchando el MySQL:

# netstat -tap | grep mysql

1.3 - Si la salida de este comando es:

tcp 0 0 localhost.localdo:mysql *:* LISTEN 2713/mysqld

Esto significa que esta escuchando solo local, lo cual se me hace seguro con el password asignado en el paso (2), pero si la salida es algo como:

tcp 0 0 *:mysql *:* LISTEN 2713/mysqld

Entonces debo ponerle password a los accesos a mi MySQL desde mi hostname (Usare como ejemplo “server1.example.com”):

# mysqladmin -h server1.example.com -u root password <nuevo_password>

2 - Instalar Pure-FTPd con soporte MSQL

# aptitude install pure-ftpd-mysql

2.1 - Crear un grupo y un usuario (en esta guia “ftpgroup” y “ftpuser”) con los que se van a mapear todos los usuarios virtuales. Asignarles un GID y UID disponible en el sistema (en esta guia uso el 2001):

# groupadd -g 2001 ftpgroup

# useradd -u 2001 -s /bin/false -d /bin/null -c “pureftpd user” -g ftpgroup ftpuser

3 - Crear la base de datos para Pure-FTPd

3.1 - Creo una BBDD (en esta guia la llamare “pureftpd”) y un usuario (“pureftpd” en esta guia, con contrasena “ftpdpass”) con el cual el demonio de Pure-FTPd se conectara a dicha BBDD

# mysql -u root -p

> CREATE DATABASE pureftpd;

> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';

> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';

> FLUSH PRIVILEGES;

3.2 - Creo la tabla de control de usuarios (es la unica tabla con que consta esta BBDD)

> USE pureftpd;

> CREATE TABLE ftpd (
User varchar(16) NOT NULL default ' ',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default ' ',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default ' ',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
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)
) TYPE=MyISAM;

QUIT;

4 - Configurar Pure-FTPd

Editamos el fichero /etc/pure-ftpd/db/mysql.conf no sin antes aplicar la buena practica de duplicar el actual

# cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig

Lo vaciamos

# cat /dev/null > /etc/pure-ftpd/db/mysql.conf

Y lo editamos

# vim /etc/pure-ftpd/db/mysql.conf

Debe quedar asi

——————— Start of /etc/pure-ftpd/db/mysql.conf ———————

MYSQLSocket /var/run/mysqld/mysqld.sock
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLUser pureftpd
MYSQLPassword ftpdpass
MYSQLDatabase pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
MYSQLCrypt md5
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”)

——————— End of /etc/pure-ftpd/db/mysql.conf ———————–

NOTA: Recordar sustituir los valores de prueba utilizados en esta guia por los que utilicemos en la configuracion real

4.1 - Crear el fichero /etc/pure-ftpd/conf/ChrootEveryone y escribirle dentro la cadena “yes”

# echo “yes” > /etc/pure-ftpd/conf/ChrootEveryone

Esto hara que PureFTPd “chrootee” a cada usuario virtual en su home y no le permita navegar mas alla

4.2 - Crear tambien el fichero /etc/pure-ftpd/conf/CreateHomeDir y escribire “yes” adentro tambien

# echo “yes” > /etc/pure-ftpd/conf/CreateHomeDir

Con este mandato, Pure-FTPd se encargara de crear el home de un usuario si al entrar este, aun no existe

4.3 - Configurar el Pure-FTPd como un demonio “standalone” (independiente, pues por defecto viene controlado por inetd) para esto, editar el fichero /etc/default/pure-ftpd-common y cambiar el valor del parametro STANDALONE_OR_INETD a “standalone”

# vim /etc/default/pure-ftpd-common

Debe quedar asi (el resto de los parametros se mantienen intactos)

——————— Start of /etc/default/pure-ftpd-common ——————–

[…]
STANDALONE_OR_INETD=standalone
[…]

——————— End of /etc/default/pure-ftpd-common ———————-

Luego editar /etc/inetd.conf y comentar la linea “ftp”

# vim /etc/inetd.conf

Debe quedar asi

——————— Start of /etc/inetd.conf ———————————-

[…]
#ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/pure-ftpd-wrapper
[…]

——————— End of /etc/inetd.conf ————————————

Despues de esto, reiniciar Inetd y Pure-FTPd

# /etc/init.d/openbsd-inetd restart
# /etc/init.d/pure-ftpd-mysql restart

5 - Poblar la BBDD y probar

Acceder a MySQL y una vez dentro a la BBDD pureftpd

# mysql -u root -p

> USE pureftpd;

Ahora, como ejemplo, crear el usuario “exampleuser” con el valor de su status en “1” (lo cual implica que su cuenta ftp estara activa), su password sera “secret” (se almacenara cifrado utilizando la funcion MD5 de MySQL), el UID y GID seran 2001 (el mismo valor del usuario/password que se creo en el paso 2.1), su home sera “/home/exampleuser”, ancho de banda de subida y descarga fijado a 100Kbps y una cuota de espacio de 50Mb

> INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/exampleuser', '100', '100', ' ', '*', '50', '0');

> QUIT;

La hora de la verdad, probar si se ha hecho todo correctamente, para ello, abrir el cliente ftp preferido e intentar conectarse, para este ejemplo los valores serian: host “server1.example.com” el usuario “exampleuser” y el pasword “secret”. Use los que usted haya definido.

Si logre conectarme, FELICIDADES… Si no, algo hice mal.