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 12.10.
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:
[...]# Instale uno de proftpd-mod-mysql, proftpd-mod-pgsql o cualquier otro |
[...]# |
[...]## Frameworks de autenticación alternativos##Include /etc/proftpd/ldap.conf#Include /etc/proftpd/sql.confDefaultRoot ~SQLBackend mysql# Las contraseñas en MySQL se cifran usando CRYPTSQLAuthTypes Plaintext CryptSQLAuthenticate grupos de usuarios# 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 el " usertable"# con la 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[...] |
[...] |