Este documento describe cómo instalar un servidor Proftpd que utiliza usuarios virtuales de una base de datos MySQL en lugar de usuarios reales del sistema. Esto es mucho más eficaz y permite tener miles de usuarios de ftp en una sola máquina. Además de eso, mostraré el uso de la cuota con esta configuración. Este tutorial está basado en Ubuntu 14.04LTS.
Para la administración de la base de datos MySQL, puede usar herramientas basadas en web como phpMyAdmin, que también se instalará en este instructivo. phpMyAdmin es una interfaz gráfica cómoda, lo que significa que no tiene que perder el tiempo con la línea de comandos.
Este howto pretende ser una guía práctica; no cubre los antecedentes teóricos. Se tratan en muchos otros documentos en la web.
¡Este documento viene sin garantía de ningún tipo! Quiero decir que esta no es la única forma de establecer un sistema de este tipo. Hay muchas maneras de lograr este objetivo, pero este es el camino que tomo. ¡No emito ninguna garantía de que esto funcione para usted!
1 nota preliminar
En este tutorial utilizo el nombre de host server1.example.com con la dirección IP 192.168.0.100. Estas configuraciones pueden diferir para usted, por lo que debe reemplazarlas cuando corresponda.
Asegúrese de haber iniciado sesión como root:
sudo su
1.1 Cambiar el shell predeterminado
/bin/sh es un enlace simbólico a /bin/dash, sin embargo, necesitamos /bin/bash, no /bin/dash. Por lo tanto hacemos esto:
guión dpkg-reconfigure
¿Instalar guión como /bin/sh? <-- No
1.2 Deshabilitar AppArmor
AppArmor es una extensión de seguridad (similar a SELinux) que debería proporcionar seguridad extendida. En mi opinión, no lo necesitas para configurar un sistema seguro, y suele causar más problemas que ventajas (piensa en ello después de haber realizado una semana de resolución de problemas porque algún servicio no estaba funcionando como se esperaba, y luego descubra que todo estaba bien, solo AppArmor estaba causando el problema). Por lo tanto, lo deshabilito.
Podemos desactivarlo así:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Instalar MySQL y phpMyAdmin
Todo esto se puede instalar con un solo comando:
apt-get install mysql-server mysql-client phpmyadmin apache2
Se le pedirá que proporcione una contraseña para el usuario root de MySQL; esta contraseña es válida para el usuario [email protected] así como para [email protected], por lo que no tenemos que especificar una contraseña de root de MySQL manualmente más adelante:
Nueva contraseña para el usuario "root" de MySQL:<-- yourrootsqlpassword
Repetir la contraseña para el usuario "root" de MySQL:<-- yourrootsqlpassword
Además de esto, verá las siguientes preguntas:
Servidor web para reconfigurar automáticamente:<-- apache2
¿Configurar base de datos para phpmyadmin con dbconfig-common? <-- No
3 Instalar Proftpd con compatibilidad con MySQL
Para Ubuntu hay disponible un paquete proftpd-mod-mysql preconfigurado. Instálelo como un demonio independiente como este:
apt-get install proftpd-mod-mysql
Se le hará la siguiente pregunta:
Ejecute proftpd:<-- independiente
Luego creamos un grupo ftp (ftpgroup) y un usuario (ftpuser) al que se asignarán todos nuestros usuarios virtuales. Reemplace el grupo y el ID de usuario 2001 con un número que esté libre en su sistema:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd usuario" -g ftpgroup ftpuser
4 Crea la base de datos MySQL para Proftpd
Ahora creamos una base de datos llamada ftp y un usuario de MySQL llamado proftpd que el demonio proftpd usará más adelante para conectarse a la base de datos ftp:
mysql -u raíz -p
CREAR BASE DE DATOS ftp;
CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR EN ftp.* A 'proftpd'@'localhost' IDENTIFICADO POR 'contraseña';
CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR EN ftp.* A 'proftpd'@'localhost.localdomain' IDENTIFICADO POR 'contraseña';
VACIAR PRIVILEGIOS;
Reemplace la contraseña de cadena con la contraseña que desee usar para el usuario de MySQL proftpd. Todavía en el shell de MySQL, creamos las tablas de base de datos que necesitamos:
UTILIZAR ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL predeterminado '',
gid smallint(6) NOT NULL predeterminado '5500',
members varchar(16) NOT NULL predeterminado '',
KEY groupname (nombre de grupo)
) ENGINE=MyISAM COMMENT='Tabla de grupo ProFTP';
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) sin firmar NOT NULL predeterminado '0',
bytes_out_avail bigint(20) sin firmar NOT NULL predeterminado '0',
bytes_xfer_avail bigint(20) sin firmar NOT NULL predeterminado '0',
files_in_avail int(10) no firmado NOT NULL predeterminado '0',
files_out_avail int(10) no firmado NOT NULL predeterminado '0',
files_xfer_avail int(10) no firmado NOT NULL predeterminado '0'
) ENGINE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL predeterminado '',
quota_type enum('usuario','grupo','clase','todos') NOT NULL predeterminado 'usuario',
bytes_in_used bigint(20) sin firmar NOT NULL predeterminado '0',
bytes_out_used bigint(20) sin firmar NOT NULL predeterminado '0',
bytes_xfer_used bigint(20) sin firmar NOT NULL predeterminado '0',
files_in_used int(10) sin firmar NOT NULL predeterminado '0',
files_out_used int(10) sin firmar NOT NULL predeterminado '0',
files_xfer_used int(10) sin firmar NOT NULL predeterminado '0'
) MOTOR=MiISAM;
CREATE TABLE ftpuser (
id int(10) sin firmar NOT NULL auto_increment,
userid varchar(32) NOT NULL predeterminado '',
passwd varchar(32) NOT NULL predeterminado '',
uid smallint(6) NOT NULL predeterminado '5500',
gid smallint(6) NOT NULL predeterminado '5500',
homedir varchar(255) NOT NULL predeterminado '',
shell varchar(16) NOT NULL predeterminado '/sbin/nologin',
count int(11) NOT NULL predeterminado '0',
fecha y hora de acceso NOT NULL predeterminado '0000-00-00 00:00:00 ',
fecha y hora modificada NOT NULL predeterminado '0000-00-00 00:00:00',
CLAVE PRIMARIA (id),
CLAVE ÚNICA ID de usuario (ID de usuario)
) MOTOR =MyISAM COMMENT='Tabla de usuarios de ProFTP';
salir;
Como habrás notado, con la renuncia; hemos dejado el shell de MySQL y estamos de vuelta en el shell de Linux.
Por cierto, (supongo que el nombre de host de su sistema de servidor ftp es server1.example.com) puede acceder a phpMyAdmin en http://server1.example.com/phpmyadmin/ (puede usar la dirección IP en lugar de server1. example.com) en un navegador e inicie sesión como proftpd. A continuación, puede echar un vistazo a la base de datos. Más tarde puede usar phpMyAdmin para administrar su servidor Proftpd.
5 Configurar Proftpd
Abra /etc/proftpd/modules.conf...
vi /etc/proftpd/modules.conf
... y habilite los siguientes tres módulos:
[...] # Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other |
[...] #<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> [...] |
[...] # # Alternative authentication frameworks # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # [email protected] database_user user_password SQLConnectInfo [email protected] proftpd password # Here we tell ProFTPd the names of the database columns in the "usertable" # we want it to interact with. Match the names with those in the db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Here we tell ProFTPd the names of the database columns in the "grouptable" # we want it to interact with. Again the names match with those in the db SQLGroupInfo ftpgroup groupname gid members # set min UID and GID - otherwise these are 999 each SQLMinID 500 # create a user's home directory on demand if it doesn't exist CreateHome on # Update count every time user logs in SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Update modified everytime user uploads or deletes a file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # User quotas # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...] |