GNU/Linux >> Tutoriales Linux >  >> Ubuntu

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

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:

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

vi /etc/proftpd/proftpd.conf

[...]
# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c [...] # Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c [...] # Install one of the previous SQL backends and decomment
# the previous mod_sql.c module to use this
LoadModule mod_quotatab_sql.c [...]

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

[...]
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
[...]

¡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


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

  2. Instalación de Lighttpd con soporte PHP5 (PHP-FPM) y MySQL 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 Proftpd y MySQL (incluida la cuota) 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

    [...]
    #
    # 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
    [...]