He encontrado un tema muy interesante realizado por Nestor os pongo aquí su trabajo.
Vamos a configurar un servidor de archivos o FTP, para permitir a usuarios transferir archivos desde y hacia nuestro server. En este caso elegimos ProFTPd, el cual es uno de los más usados actualmente, ya que es muy escalable y flexible; además de que permite integrarse con varios servicios, entre ellos Mysql, que es la base de datos que amos a usar en este caso para configurar para manejar todo lo relacionado con autentificación de usuarios, manejo de recursos y asignación de quotas de espacio en disco.
FTP viene de File Transfer Protocol, que es el protocolo que maneja la transferencia de archivos y todo lo relacionado con esto por defecto, trabaja utilizando los puertos 21 y 20 para datos y control respectivamente. Y tiene 2 modos de funcionamiento, como FTP Pasivo o Activo:
- Modo Activo: en este caso se establece una conexión por el puerto 20 para negociar los parámetros de conexión y luego se hace todo el tráfico de datos por el puerto 21.
- Modo Pasivo: este caso es similar al anterior, pero con la diferencia de que una vez que se negocia la conexión, el FTP server envía un paquete al cliente indicándole un puerto aleatorio entre 1024 y 5000 para establecer la conexión. Si bien esto es más seguro, es un poco más difícil de utilizar si tenemos el FTP detrás de un firewall, como en nuestro caso, pero simplemente tenemos que permitir un rango de puertos y listop.
Bien, vamos por parte, en este caso utilizaremos Debian Etch Stable 4.1 para hacer la configuración, en este caso como nosotros teniamos instalada una base de datos Mysql decidimos aprovecharla para manejar la gestión de usuarios y no usar otro método de autentificación (existen varios), asi que primero instalamos los paquetes básicos:
apt-get install mysql-server mysql-client proftpd proftpd-mysql
Se nos van a preguntar un par de opciones de configuración de los servicios, en una parte se nos va a preguntar como queremos correr ProFTPd desde inet, y elegimos en modo Stand Alone.
Una vez hecho esto, verificamos que mysql esté escuchando en el puerto tcp 2713 y únicamente para conexiones locales, esto lo podemos hacer con el comando netstat.
Ahora para el manejo de permisos de los archivos del filesystem, vamos a crear un usuario y un grupo para que se mapeen los permisos a los directorios y archivos que vamos a utilizar para transferencia en el equipo.
groupadd -d 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c “Usuario para el manejo de ProFTPd” -g ftpgroup ftpuser
Simplemente creamos un gropo y un usuario perteneciente al mismo, sin shell y son el GID y UID 2001.
Ahora vamos a crear la base de datos para el uso del FTP, en MySql, nos logueamos como root:
mysql -u root -p
Y creamos la instancia de la base de datos y establecemos los permisos para manejarla:
create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpd’@'localhost’ IDENTIFIED BY ‘password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpd’@'localhost.localdomain’ IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;
Esto crea la base, le da permisos a un usuario local para accederla y aplica los privilegios. Debemos campiar ‘password’ por la contraseña que elijamos para esto.
Ahora vamos a trabajar con esa base de datos, creando las tablas necesarias para su uso:
USE ftp;
Y creamos las tablas necesarias:
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default ”,
gid smallint(6) NOT NULL default ‘5500′,
members varchar(16) NOT NULL default ”,
KEY groupname (groupname)
) TYPE=MyISAM COMMENT=’ProFTP group table’;
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) unsigned NOT NULL default ‘0′,
bytes_out_avail int(10) unsigned NOT NULL default ‘0′,
bytes_xfer_avail int(10) unsigned NOT NULL default ‘0′,
files_in_avail int(10) unsigned NOT NULL default ‘0′,
files_out_avail int(10) unsigned NOT NULL default ‘0′,
files_xfer_avail int(10) unsigned NOT NULL default ‘0′
) TYPE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default ”,
quota_type enum(’user’,'group’,'class’,'all’) NOT NULL default ‘user’,
bytes_in_used int(10) unsigned NOT NULL default ‘0′,
bytes_out_used int(10) unsigned NOT NULL default ‘0′,
bytes_xfer_used int(10) unsigned NOT NULL default ‘0′,
files_in_used int(10) unsigned NOT NULL default ‘0′,
files_out_used int(10) unsigned NOT NULL default ‘0′,
files_xfer_used int(10) unsigned NOT NULL default ‘0′
) TYPE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default ”,
passwd varchar(32) NOT NULL default ”,
uid smallint(6) NOT NULL default ‘5500′,
gid smallint(6) NOT NULL default ‘5500′,
homedir varchar(255) NOT NULL default ”,
shell varchar(16) NOT NULL default ‘/sbin/nologin’,
count int(11) NOT NULL default ‘0′,
accessed datetime NOT NULL default ‘0000-00-00 00:00:00′,
modified datetime NOT NULL default ‘0000-00-00 00:00:00′,
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT=’ProFTP user table’;
Y salimos de Mysql:
quit;
Ahora vamos a configurar proftpd para que se maneje con MySQL, editamos el archivo /etc/proftpd/proftpd.conf
Cambiamos la línea UseIpv6 a off, para que no utilice este protocolo, solo utilizaremos Ipv4. Y agregamos la siguientes líneas al final del archivo:
[...]
DefaultRoot ~
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes Plaintext Crypt
SQLAuthenticate users groups
# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo ftp@localhost 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
SQLHomedirOnDemand 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
[...]
Simplemente le estamos diciendo que vamos a usar las tablas de la base de datos para manejo de usuarios, autentificación de los mismos y manejo de cuotas, debemos cambiar el password del usuario en esta configuración por el que ya utilizamos cuando creamos la base de datos en Mysql y asignamos permisos.
Ahora simplemente editamos el archivo /etc/proftpd/modules.conf
Y comentamos la línea LoadModule mod_sql_postgres.c (ponemos un caracter ‘#’ al principio). De esta forma solamente decimos que use el módulo de mysql para conectarse a la base de datos.
Bien simplemente ahora queda llenar las tablas de la base con los valores por defecto y crear un usuario de prueba, para esto volvemos a entrar a MySql, entramos a la base de datos de ftp y ejecutamos el siguiente query:
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES (’ftpgroup’, 2001, ‘ftpuser’);
INSERT INTO `ftpquotalimits` (`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`) VALUES
(’exampleuser’, ‘user’, ‘true’, ‘hard’, 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`,
`homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1,
‘exampleuser’, ’secret’, 2001, 2001, ‘/home/www.example.com’,
‘/sbin/nologin’, 0, ”, ”);
Y salimos, esto lo que hace fue asociar el usuario ftp al grupo, y crear un usuario de prueba (exampleuser en este caso, con un directorio de trabajo en /home/www.example.com).
Y listo, ya tenemos todo configurado.
Ahora para añadir usuarios y quotas vamos a ver como son las estructuras de las tablas:
- Tabla ftpuser: los campos que nos interesan son:
userid: el nombre de usuario FTP
password: la contraseña del usuario
uid: el USER ID del usuario (debería ser 2001 que fue el que usamos cuando creamos el usuario)
gid: el GROUP IP del usuario (también debería ser 2001 en este caso)
homedir: el directorio de trabajo donde el usuario gestionará los archivos.
- Tabla ftpquotalimimits: esto dejo que lo miren y evaluen tranquilos, establecen los limites de transferencia por sesión o en total del usuario asi como sus limites, basta con agregar un usuario con el campo user acá para que este pueda trabajar.
Para el manejo de esto quizás es conviente que instalen PhpMyAdmin o alguna herramienta para administrar MySQL via web por ejemplo, a mi me ayudó bastante. Bueno espero les haya servido.
Referencias:
http://www.howtoforge.com/proftpd_mysql_virtual_hosting_debian_etch








Sin comentarios
Post al azar
Deje sus comentario: