GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Ubuntu 12.10

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:

Luego abra /etc/proftpd/proftpd.conf y comente las siguientes líneas:

vi /etc/proftpd/proftpd.conf
[...]# Instale uno de proftpd-mod-mysql, proftpd-mod-pgsql o cualquier otro
# motor SQL backend para usar este módulo y el backend requerido.
# Este módulo debe cargarse obligatoriamente antes que cualquiera de
# los respaldos SQL existentes.
LoadModule mod_sql.c[...]# Install proftpd- mod-mysql y elimine el comentario del módulo anterior
# mod_sql.c para usar este.
LoadModule mod_sql_mysql.c[...]# Instale uno de los backends SQL anteriores y elimine
# el anterior módulo mod_sql.c para usar este
LoadModule mod_quotatab_sql.c[...]

Más abajo en el archivo, agregue las siguientes líneas:

[...]##QuotaEngine off#[...]

¡Asegúrese de reemplazar la contraseña de cadena con la contraseña real para el usuario de MySQL proftpd en la línea SQLConnectInfo!

Luego reinicie Proftpd:

/etc/init.d/proftpd reiniciar

6 Completar la base de datos y probar

Para llenar la base de datos, puede usar el shell de MySQL:

mysql -u raíz -p
UTILIZAR ftp;

Primero creamos una entrada en la tabla ftpgroup. Contiene el nombre de grupo, el ID de grupo y el nombre de usuario del grupo/usuario de ftp que creamos al final del paso dos (reemplace el ID de grupo adecuadamente si usa otro que no sea 2001):

INSERTAR EN `ftpgroup` (`groupname`, `gid`, `members`) VALORES ('ftpgroup', 2001, 'ftpuser');

Ahora hemos terminado con la tabla ftpgroup. No tenemos que crear más entradas aquí. Cada vez que crea un nuevo usuario de ftp virtual, lo hace en las tablas ftpquotalimits y ftpuser. Así que vamos a crear nuestro primer usuario de ejemplousuario con una cuota de 15 MB y la contraseña secreta (todavía estamos en el shell de MySQL):

VALORES ('usuario de ejemplo', 'usuario', 'verdadero', 'duro', 15728640, 0, 0, 0, 0, 0);
INSERTAR EN `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accedido`, `modificado`) VALORES (1, 'usuarioejemplo', 'secreto', 2001, 2001, '/home/www.ejemplo.com', '/sbin/nologin', 0, '', '');
salir;

(¡No olvide reemplazar el groud- y el ID de usuario 2001 apropiadamente en la última declaración INSERT si está usando otros valores distintos a los de este tutorial!)

Ahora abra su programa de cliente FTP en su estación de trabajo (algo como FileZilla, WS_FTP, SmartFTP o gFTP) e intente conectarse. Como nombre de host, utiliza server1.example.com (o la dirección IP del sistema), el nombre de usuario es exampleuser y la contraseña es secreta.

Si puede conectarse, ¡felicidades! Si no, algo salió mal.

Ahora, si corres

ls -l /inicio/

debería ver que el directorio /home/www.example.com (directorio de inicio del usuario de ejemplo) se ha creado automáticamente y es propiedad de ftpuser y ftpgroup (el usuario/grupo que creamos al final del paso dos):

[email protected]:~# ls -l /home/
total 8
drwxr-xr-x 3 administrador administrador 4096 19 de octubre 13:08 administrador
drwx------ 2 ftpuser       ftpgroup      4096 18 de abr 18:13 www.example.com
[email protected]:~#

7 Administración de la base de datos

Para la mayoría de las personas es más fácil si tienen una interfaz gráfica para MySQL; por lo tanto, también puede usar phpMyAdmin (en este ejemplo en http://server1.example.com/phpmyadmin/) para administrar la base de datos ftp.

Cada vez que cree un nuevo usuario, solo tiene que crear entradas en las tablas ftpquotalimits y ftpuser, por lo que explicaré las columnas de estas tablas aquí:

Tabla ftpuser:

Las columnas importantes son estas (las otras son manejadas por MySQL o Proftpd automáticamente, ¡así que no las llene manualmente!):

  • ID de usuario:el nombre del usuario virtual de Proftpd (por ejemplo, usuario de ejemplo).
  • passwd:la contraseña no cifrada (es decir, en texto claro) del usuario.
  • uid:el ID de usuario del usuario ftp que creó al final del paso dos (por ejemplo, 2001).
  • gid:el groupid del grupo ftp que creó al final del paso dos (por ejemplo, 2001).
  • homedir:El directorio de inicio del usuario Proftpd virtual (por ejemplo, /home/www.example.com). Si no existe, se creará cuando el nuevo usuario inicie sesión por primera vez a través de FTP. El usuario virtual será encarcelado en este directorio de inicio, es decir, no puede acceder a otros directorios fuera de su directorio de inicio.
  • shell:está bien si completa /sbin/nologin aquí de forma predeterminada.

Tabla de ftpquotalimits:

Las columnas importantes son estas (las otras son manejadas por MySQL o Proftpd automáticamente, ¡así que no las llene manualmente!):

  • nombre:el nombre del usuario virtual de Proftpd (por ejemplo, usuarioejemplo).
  • tipo_cuota:usuario o grupo. Normalmente, usamos usuario aquí.
  • por_sesión:verdadero o falso. true significa que los límites de cuota son válidos solo para una sesión. Por ejemplo, si el usuario tiene una cuota de 15 MB y ha cargado 15 MB durante la sesión actual, no puede cargar nada más. Pero si cierra la sesión y vuelve a iniciarla, vuelve a tener 15 MB disponibles. falso significa que el usuario tiene 15 MB, sin importar si cierra la sesión y vuelve a iniciarla.
  • limit_type:duro o blando. Un límite de cuota estricta es un límite que nunca se debe exceder, mientras que una cuota blanda se puede exceder temporalmente. Normalmente usas duro aquí.
  • bytes_in_avail:límite de carga en bytes (por ejemplo, 15728640 para 15 MB). 0 significa ilimitado.
  • bytes_out_avail:límite de descarga en bytes. 0 significa ilimitado.
  • bytes_xfer_avail:límite de transferencia en bytes. La suma de cargas y descargas que un usuario puede hacer. 0 significa ilimitado.
  • files_in_avail:límite de carga en archivos. 0 significa ilimitado.
  • files_out_avail:límite de descarga en archivos. 0 significa ilimitado.
  • files_xfer_avail:Límite de transferencia en archivos. 0 significa ilimitado.

Proftpd utiliza la tabla ftpquotatallies internamente para administrar las cuotas, de modo que no tenga que realizar entradas allí.

8 FTP anónimo

Si desea crear una cuenta ftp anónima (una cuenta ftp en la que todos pueden iniciar sesión sin contraseña), puede hacerlo así:

Primero creamos un usuario y un grupo con el nombre anonymous_ftp. El usuario tiene el directorio de inicio /home/anonymous_ftp:

groupadd -g 2002 unknown_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Usuario de FTP anónimo" -g anonymous_ftp anonymous_ftp

(Reemplace 2002 con un ID de grupo/usuario que esté libre en su sistema).

Algunos archivos que comienzan con un . han sido creados por el último comando (useradd) en el directorio /home/anonymous_ftp. No los necesitamos, así que los eliminamos:

cd /home/anonymous_ftp
rm -f .bash_logout
rm -f .profile
rm -f .bashrc

Luego creamos el directorio /home/anonymous_ftp/incoming que permitirá a los usuarios anónimos cargar archivos:

mkdir /home/ftp_anonimo/entrante
chown unknown_ftp:nogroup /home/ftp_anonimo/entrante

Y finalmente, abra /etc/proftpd/proftpd.conf y agregue las siguientes directivas:

vi /etc/proftpd/proftpd.conf
[...]## 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[...]

Finalmente reinicie Proftpd:

/etc/init.d/proftpd reiniciar

Ahora los usuarios anónimos pueden iniciar sesión y pueden descargar archivos desde /home/anonymous_ftp, pero las cargas están limitadas a /home/anonymous_ftp/incoming (y una vez que se carga un archivo en /home/anonymous_ftp/incoming, no se puede leer ni descargar desde allí; el administrador del servidor tiene que moverlo a /home/anonymous_ftp primero para que esté disponible para otros).

(Tenga en cuenta:¡Solo puede tener una cuenta ftp anónima por dirección IP!)

9 Referencias

Mandrake 10.1 - Proftpd + Autenticación MySQL + Cuotas Howto:http://www.khoosys.net/single.htm?ipg=848

10 enlaces

  • Proftpd:http://www.proftpd.org/
  • MySQL:http://www.mysql.com/
  • phpMyAdmin:http://www.phpmyadmin.net/
  • Ubuntu:http://www.ubuntu.com/

Ubuntu
  1. Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Ubuntu 14.04LTS)

  2. Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Ubuntu 14.04LTS

  3. Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Ubuntu 13.10)

  4. Alojamiento virtual con PureFTPd y MySQL (incluida la gestión de cuotas y ancho de banda) en CentOS 7.0

  5. Alojamiento virtual con PureFTPd y MySQL (incluida la gestión de cuotas y ancho de banda) en Ubuntu 7.10 (Gutsy Gibbon)

Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Ubuntu 12.10)

Alojamiento virtual con vsftpd y MySQL en Ubuntu 12.10

Alojamiento virtual con PureFTPd y MySQL (incluida la gestión de cuotas y ancho de banda) en Ubuntu 12.10

Alojamiento virtual con PureFTPd y MySQL (incluida la gestión de cuotas y ancho de banda) en Ubuntu 14.04LTS

Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Debian Lenny

Alojamiento virtual con vsftpd y MySQL en Debian Squeeze

    [...]
     Usuario anonymous_ftp Group nogroup # Queremos que los clientes puedan iniciar sesión con "anónimo" y " ftp" UserAlias ​​anónimo anónimo_ftp # Cambios estéticos, todos los archivos pertenecen al usuario de ftp DirFakeUser en anónimo_ftp DirFakeGroup en anónimo_ftp RequireValidShell desactivado # Limitar el número máximo de inicios de sesión anónimos MaxClients 10 # Queremos que se muestre 'welcome.msg' al iniciar sesión y '.message' # mostrado en cada directorio recién cambiado. DisplayLogin welcome.msg DisplayChdir .message # Limite ESCRIBIR en todas partes en el chroot anónimo   DenyAll   # Quite el comentario si es valiente.  # Umask 022 es un buen umask estándar para evitar que nuevos archivos y directorios # (segundo parámetro) sean de escritura grupal y mundial. Umask 022 022  DenyAll   AllowAll