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.
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 tutorial está basado en Ubuntu 8.04 LTS. Ya debería haber configurado un sistema de servidor Ubuntu 8.04 básico, como se describe en los primeros ocho capítulos de este tutorial:https://www.howtoforge.com/perfect-server-ubuntu8.04-lts
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:
ln -sf /bin/bash /bin/sh
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
2 Instalar MySQL y phpMyAdmin
Todo esto se puede instalar con un solo comando:
apt-get install mysql-server mysql-client libmysqlclient15-dev 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 (como fue el caso con versiones anteriores de Ubuntu):
Nueva contraseña para el usuario "root" de MySQL:<-- yourrootsqlpassword
Además de esto, verá la siguiente pregunta:
Servidor web para reconfigurar automáticamente:<-- apache2
3 Instalar Proftpd con compatibilidad con MySQL
Para Ubuntu hay disponible un paquete proftpd-mysql preconfigurado. Instálelo como un demonio independiente como este:
apt-get install proftpd-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 nombre de grupo (nombre de grupo)
) TYPE=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 int(10) sin firmar NOT NULL predeterminado '0',
bytes_out_avail int(10) no firmado NOT NULL predeterminado '0',
bytes_xfer_avail int(10) no firmado NOT NULL predeterminado '0',
files_in_avail int(10) sin firmar NOT NULL predeterminado '0',
files_out_avail int(10) sin firmar NOT NULL predeterminado '0',
files_xfer_avail int(10) sin firmar NOT NULL predeterminado '0'
) TYPE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL predeterminado '',
quota_type enum('usuario','grupo','clase','todos') NOT NULL predeterminado 'usuario',
bytes_in_used int(10) sin firmar NOT NULL predeterminado '0',
bytes_out_used int(10) sin firmar NOT NULL predeterminado '0',
bytes_xfer_used int(10) 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'
) TYPE=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)
) TIPO =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/proftpd.conf y deshabilite IPv6 desactivando UseIPv6:
vi /etc/proftpd/proftpd.conf
[...]UsarIPv6 desactivado[...] |
[...]DefaultRoot ~SQLBackend mysql# Las contraseñas en MySQL se cifran mediante CRYPTSQLAuthTypes Plaintext CryptSQLAuthenticate users groups# utilizados para conectarse a la base de datos# [ email protected] database_user user_passwordSQLConnectInfo [email protected] proftpd password# Aquí le decimos a ProFTPd los nombres de las columnas de la base de datos en la "tabla de usuario"# con las que queremos que interactúe. Haga coincidir los nombres con los de dbSQLUserInfo ftpuser userid passwd uid gid homedir shell# Aquí le decimos a ProFTPd los nombres de las columnas de la base de datos en la "tabla de grupo"# con las que queremos que interactúe. Nuevamente, los nombres coinciden con los de dbSQLGroupInfo ftpgroup groupname gid miembros # establecer min UID y GID; de lo contrario, estos son 999 eachSQLMinID 500 # crear un directorio de inicio del usuario a pedido si no existe CreateHome on # Actualizar recuento cada vez que el usuario inicia sesión SQLLog PASS updatecountSQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser# Actualización modificada cada vez que el usuario carga o elimina un archivoSQLLog STOR,DELE modificadoSQLNamedQuery modificado UPDATE "modified=now() WHERE userid=' %u'" ftpuser# Cuotas de usuario# ===========QuotaEngine onQuotaDirectoryTally onQuotaDisplayUnits MbQuotaShowQuotas onSQLNamedQuery get-quota-limit SELECT "name, tipo_cuota, por_sesión, tipo_límite, bytes_en_disponibilidad, bytes_fuera_disponible, bytes_xfer_disponibilidad, archivos_en_disponibilidad, archivos_fuera_disponible, files_xfer_avail FROM ftpquotalimits WHERE nombre ='%{0}' AND tipo_cuota ='%{1}'"SQLNamedQuery get-quota-tally SELECT "name, tipo_cuota, bytes_en_usados, bytes_fuera_usados, bytes_xfer_usados, archivos_en_ used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE nombre ='%{0}' Y tipo_de_cuota ='%{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 nombre ='%{6}' AND tipo_cuota =' %{7}'" ftpquotatalliesSQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, % {7}" ftpquotatalliesQuotaLimitTable sql:/get-quota-limitQuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tallyRootLogin offRequireValidShell off[...] |
[...] |