vsFTPD con usuarios virtuales usando MySQL

Sube tu how-tos o revisa los ya creados por usuarios de debian para ayudarte a configurar o usar alguna app en tu sistema.

Moderador: payperme

vsFTPD con usuarios virtuales usando MySQL

Notapor miguex » Jue Ene 31, 2008 6:12 am

Instalacion de VSFTPD con usuarios virtuales usando MySQL en debian lenny

Hace algunos dias me vi en la penosa necesidad de instalar un servidor ftp temporal en mi sistema debian lenny para intercambiar una serie de archivos entre mas de 20 usuarios .Con los consigueintes contratiempos de administracion de dichos usuarios en el sistema que esto implicaba me puse manos a la obra.
No soy muy partidario de agregar usuario para todo ,asi que sin pensarlo mucho me decidi por la opcion de asignar cuentas de manera virtual para asi mantener en lo posible la limpieza de mi archivo pssswd; Sin embargo ,esto no fue tarea facil , ya que en primera instancia opte por el uso de un servidor ftp ligero , funcional y con su propia base de datos llamado pure-ftpd , sin embargo por alguna extraña razon la conexion ftp no se llevaba a cabo correctamente debido a un inexplicable bloqueo de los puertos en modo pasivo , digo inexplicable por que para hacer pruebas puse mi sistema en DMZ (fuera de cualquier firewall) por un corto tiempo y aun asi persistia el problema.
A pesar de tener a la mano Proftpd y haber trabajado ya anterirormente con este server me parecio demasiado profesional para lo que necesitaba , asi pues revisando alternativas me decidi por vsftpd , el cual es muy ligero y facil de configurar.
En el siguiente manual intentare explicar de manera clara como instalar dicho servidor con usuarios virtuales (que no existen en el sistema) almacenados en una base de datos proporcionada por MySQL server.

Como regla general se estableceran durante el desarrollo de este documento la sigueinetes directivas

1-Todos los comando ejecutados como usuario normal estaran precedidos por un simbolo "$" el cual no forma parte del comando y solo se usara como referencia , por ejemplo :

$ mkdir -p /home/loquesea

2-Todos los comandos ejecutados com root (administardor) estaran precedidos por el simbolo "#" el cual no forma parte del coamdo y solo se usara comor eferencia , por ejemplo:

# mkdir -p /etc/loquesea

3-En caso de que un comando no presente ninguno de los 2 sombolos anterirores , es entonces un indicativo de que puede ser ejecutado indistintamente ya sea como root o como user , como ejemplo

mysql -u root -p

4-Para crear archivos de configuracion nuevos se usuara un comando del tipo

cat > /etc/vsftpd.conf << EOF
aca va el contenido
EOF


El ejemplo anteriror ilustra el funcionamiento del comando , es decir , dicho comando solicita al sistema la creacion de un archivo llamado "vsftp.conf" en la ruta /etc con el contenido "aca va el contenido"

4-Todas las sentencias en el servidor MySQL estan resaltadas con una letra mas pequeña y a manera de guia he de mencionar que cada sentencia en la mayoria de los casos ha de terminar con un simbolo de punto y coma
";"

5-si vas a hacer "copy and paste" no olvides omitir los simbolos "#" "$" en el comando.

INSTALANDO LA BASE DE DATOS

Como mencione anteriromente necesitamos un servidor de bases de datos y el servidor ftp. Asi pues mi eleccion fue MySQL y VsFTP, entonces hay que instalar

Código: Seleccionar todo
# apt-get install vsftpd libpam-mysql mysql-server mysql-client


Durante el proceso de einstalacion se pedira el cambio de la contraseña del administrador de MySQL ,...OJO este es el administrador unicamente de el servidor de bases de datos y no tiene ninguna relacion con el administrador ("root") del sistema.


No se por que demonios como dependencia mandatoria de alguno de los paquetes que necitan estos 2 programas se instala exim4 , el cual en mi caso es absolutamente inecesario , pues no ocupo MTA (Mail Transpor Agent) asi pues los remuevo de mi sistema

Código: Seleccionar todo
# apt-get autoremove --purge exim4*


Obiamente este ultimo paso no es absolutamente necesario y queda a eleccion de cada quien dejar o desinstalar exim4. Si no estas seguro de lo que debes hacer , entonces deja el MTA intacto y pasate a la sigueinte seccion de este documento.

CREANDO LAS BASE DE DATOS Y LA TABLA NECESARIA

En este punto como regularmente sucede en debian ,todo deberia estar corriendo como relojito, asi pues habra que darse a la tarea de crear la base de datos en donde sera almacenada la tabla que contendra la informacion a cerca de nuestros usuario virtuales .Entonces ingresamos a MySQL como administrador de el servidor con el siguiente comando

Código: Seleccionar todo
mysql -u root -p


y crearemos la base de datos vsftp y un usuario con todos los privilegios sobre esta base de datos.llamado tambien vsftpd. Debo recalcar que a manera de ejemplo el pass para usuario vsftp sera passvsftp el cual debe ser reeemplazado por una contraseña valida en las siguientes sentencias

Código: Seleccionar todo
CREATE DATABASE vsftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'passvsftp';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost.localdomain' IDENTIFIED BY 'passvsftp';
FLUSH PRIVILEGES;


A manera informativa he de mencionar que el usuario vsftp que acaba de ser creado ,sera el encargado de ejecutar todas las consultas provenientes del servidor FTP hacia la base de datos MySQL cada vez que un usuario solicite conexion al sistema.
Bien , sin salir de el shell de MySQL ahora crearemos la tabla necesaria .Debido a que no se almacenara una gran cantidad de datos solo necesitaremos esta unica tabla, entonce ejecutamos las siguintes 2 setencias.

Código: Seleccionar todo
USE vsftpd;
CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;


Listo , podemos dejar la shell de MySQL executando la sentencia :

quit;


CREANDO EL USUARIO DEL SISTEMA

Para que el login de usuario almacenados en la base de datos y no existentes en el archivo passwd sea posible (usuarios virtuales), necesitamos asociar estos a un solo usuario real y no privilegiado del sistema ,el cual se llmara vsftpd con shell /bin/false y directorio personal /home/vsftpd debajo del cual se crearan a mano los
directorios personales para los usuarios virtuales inmediatamente despues de ser insertados estos en la base de datos. Este usuario (vsftpd) debera pertenecer al grupo primario vsftpd el cual tambien tendra que ser creado.

Código: Seleccionar todo
# groupadd vsftpd
# useradd -d /home/vsftpd -g vsftpd -m -s /bin/false vsftpd


Hay que asegurarse que "/bin/false" exista en /etc/shells , si no es asi habra que agregarla al final del archivo.

CONFIGURANDO VSFTPD

La configuracion de vsftpd es especialmente sencilla , comparada por ejemplo con la de proftpd , para ahorrar tiempo y poner en marcha el servidor omitire la explicacion larga de las opciones de configuracion; Sin embargo en el man de vsftp vienen perfectamente explicadas todas y cada una de estas.Adicionalmente si deseas darle una mirada a todas la directivas existentes para este archivo de configuracion puedes consultar la documentacion en la pagina oficial :

http://vsftpd.beasts.org/vsftpd_conf.html

Las mas importantes y por su relevancia en el funcionamiento del servidor son:
chroot_local_user
guest_enable
guest_username
user_sub_token
local_root,
virtual_use_local_privs

Otro punto importante y que correctamente hizo la adecuada observacion herymix es referente al modo en el que el servidor operara (pasivo - activo)

MODO ACTIVO: es el modo normal en que funciona un servidor ftp se llama activo porque cuando descargas algo del server es él quien inicia la transmision de datos a traves del puerto 20. Por lo regular se tiene que abrir en el firewall de lado del servidor los puertos 20 y 21. Muchas veces este modo puede ser causa de falla al momento de hacer una transferencia por bloqueos del firewall de lado del cliente porque la peticion es de afuera hacia adentro.

MODO PASIVO: En este modo el cliente es quien establece primero la comunicacion con el servidor siendo una comunicacion de adentro hacia afuera en este caso se necesita del puerto 21 para la negociacion de conexión y un rango de puertos por ejemplo yo uso 40000 al 40100 para la transferencia de datos ya que el cliente le pide al servidor un puerto para la transferencia.

El archivo de configuracion a continuacion esta preparado para trabajar en modo pasivo ; Sin embargo si se desea usar en modo activo sera suficioente con comantar las siguientes opciones:

Código: Seleccionar todo
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address= AQUI VA TU IP


Para comenzar entonces , primero debemos hacer un respaldo del archivo original de configuracion de vsftpd y crear uno nuevo con las directivas necesarias. Para eso ejecutamos los siguientes 2 comandos

Código: Seleccionar todo
# mv /etc/vsftpd.conf /etc/vsftpd.conf.orig


Código: Seleccionar todo
# cat > /etc/vsftpd.conf << EOF
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=vsftpd
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address= AQUI VA TU IP
EOF


Luego creamos un directorio para las configuraciones separadas por usuario las cuales sobreescribiran en parte bajo ciertas circunstancias algunas opciones por defecto del archivo global e configuracion /etc/vsftpd.con

Código: Seleccionar todo
# mkdir /etc/vsftpd_user_conf


Ahora debemos editar el archivo /etc/pam.d/vsftpd , no sin antes crear un respaldo del mismo:

Código: Seleccionar todo
# mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.orig


Código: Seleccionar todo
# cat > /etc/pam.d/vsftpd << EOF
auth required pam_mysql.so user=vsftpd passwd=passvsftp host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=vsftpd passwd=passvsftp host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
EOF


Cabes recordar que el campo correspondiente a "passwd=passvsftp" debe ser llenado correctamente con la misma contraseña valida que se le asigno al usuario vsftpd creado en la base de datos MySQL .
Otra cosa de suma importancia es que se debe procurar colocar los datos en el archivo /etc/pam.d/vsftpd de forma que solo queden en 2 lineas ; Es decir , la linea 1 y2 en realidad son una sola , asi mismo con la linea 3 y 4 ,Por ultimo reiniciamos el servidor ftp para que las nuevas configuraciones tomen efecto

Código: Seleccionar todo
# /etc/init.d/vsftpd force-reload


Si no tira ningun error grave o alerta podemos entonces prodeguir con la sigueinte seccion


CREANDO EL PRIMER USUARIO VIRTUAL

Para crear el primer usuario he introducirlo en la base de datos se hara uso del shell MySQL. Este usuario de prueba llevara el nombre de "prueba" y contraseña "pruebapass" , debido a que este usuario es unicamente para testear el funcionamiento de nuestro sistema de autentificacion virtual , es altamente recomendable eliminnar dicho usario apenas se verifique el buen funcionamiento del login. Para crear el usuario ejecutamos las siguientes sentencias.

Código: Seleccionar todo
mysql -u root -p
USE vsftpd;
INSERT INTO accounts (username, pass) VALUES('prueba', PASSWORD('pruebapass'));
quit;


Por ultimo creamos el directorio home de nuestro usuario virtual pues es necesario que este directorio exista para que el usuario virtual pueda hacer login y luego sea enjaulado en dicho directorio.

Código: Seleccionar todo
# mkdir -p /home/vsftpd/prueba


Cada vez que se desee agregar un usuario virtual a nuestro sistema ftp sera necesario ejecutar estos ultimos 2 pasos los cuales si bien es altamente recomendable ejecutarlos desde un terminal nada impide tambien usar alguna aplicacion grafica para esto , por ejemplo

Código: Seleccionar todo
# apt-get insatll mysql-query-browser


el cual es el cliente grafico (gui) ofical de MySQL Server.Tambien podria optarse por el uso de phpMyAddmin , pero debido a que esto implicaria instalar un servidor web asi como php omitire su uso.


PROBANDO ............PROBANDO

Bien , ha llegado la hora de testear nuestro sistema de autentificacion , para ello necesitaremos un cliente ftp .En esta ocacion he elegido un cliente bastante bueno y versatil ademas de ser ligero , para instalarlo solo bastaria con:

Código: Seleccionar todo
# apt-get install ncftp


luego intentamos el login en localhost con nuestro primer usuario virtual previamente creado (prueba)

Código: Seleccionar todo
ncftp -u prueba -p pruebapass localhost

la sintaxis es sencilla

-u = usuario para conectarse , si no se especifica ncftp intentara conectar con el usuario logueado en el shell
-p = contraseña del usuario , si no se especifica ncftp intentara con anonymous
localhost = es el host al que se desea conectar

si el logion en el sistema ha sido existoso deberiamos ver algo como esto:

Código: Seleccionar todo
miguel@ikimlive:~$ ncftp -u prueba -p pruebapass localhost
NcFTP 3.2.1 (Jul 29, 2007) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 127.0.0.1...                                                     
(vsFTPd 2.0.5)
Logging in...                                                                   
Login successful.
Logged in to localhost.                                                         
ncftp / >


Saludo y espero le sea de utilidad este tutorial.


Imagen
Documento escrito por Miguel A. Reynosso (miguex) bajo liencia Creative Commons.
En caso de panico.......... grite y corra en circulos !!
miguex
Administrador del Sitio
 
Mensajes: 325
Registrado: Vie Ene 18, 2008 6:05 pm

Re: vsFTPD con usuarios virtuales usando MySQL

Notapor dag » Mar Feb 05, 2008 9:22 am

Muy buena la guia!! Te pasaste :D
dag
Usuario Registrado
 
Mensajes: 10
Registrado: Mar Feb 05, 2008 5:04 am

Re: vsFTPD con usuarios virtuales usando MySQL

Notapor herymx » Vie Feb 08, 2008 6:48 am

Que buen aporte Miguex pero wey te has tardado en escribirlo jajaja no te creas como aporte a tu HOW TO seria bueno agregar en el archivo de configuracion el modo de operacion del server ftp (PASIVO o ACTIVO) por default lo tienes activo. ¿Cual es la diferencia entre cada uno?

MODO ACTIVO: es el modo normal en que funciona un servidor ftp se llama activo porque cuando descargas algo del server es él quien inicia la transmision de datos a traves del puerto 20. Por lo regular se tiene que abrir en el firewall de lado del servidor los puertos 20 y 21. Muchas veces este modo puede ser causa de falla al momento de hacer una transferencia por bloqueos del firewall de lado del cliente porque la peticion es de afuera hacia adentro.

MODO PASIVO: En este modo el cliente es quien establece primero la comunicacion con el servidor siendo una comunicacion de adentro hacia afuera en este caso se necesita del puerto 21 para la negociacion de conexión y un rango de puertos por ejemplo yo uso 40000 al 40100 para la transferencia de datos ya que el cliente le pide al servidor un puerto para la transferencia.

Yo recomiendo usar MODO PASIVO y un ejemplo de agregarlo al archivo vsftpd.conf es:
Código: Seleccionar todo
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address= AQUI VA TU IP


OJO que el firewall del server tienes que abrir el puerto 21 y el rango 40000 al 40100. OJO

SUERTE!!!!
PARA VER LA FIRMA RASCA AQUI----> |||||||||||||||||||||||||||||

Imagen
herymx
Usuario Registrado
 
Mensajes: 163
Registrado: Dom Ene 20, 2008 9:20 pm
Ubicación: Cancún

Re: vsFTPD con usuarios virtuales usando MySQL

Notapor miguex » Vie Feb 08, 2008 10:42 pm

Código: Seleccionar todo
seria bueno agregar en el archivo de configuracion el modo de operacion del server ftp (PASIVO o ACTIVO) por default lo tienes activo. ¿Cual es la diferencia entre cada uno?


jejejeje.....se, se me olvido mencionar ese pequeño detalle por que mi server esta en DMZ , pero tienes toda la razon ..........Corregido y aumentado el post , gracias

Saludos.
En caso de panico.......... grite y corra en circulos !!
miguex
Administrador del Sitio
 
Mensajes: 325
Registrado: Vie Ene 18, 2008 6:05 pm

Servidor FTP multiusuario con VSFTPD + PAM + MySQL

Notapor narcisgarcia » Jue Feb 14, 2008 10:27 am

Una guía específica, para Ubuntu/Debian:
http://www.actiu.net/infordoc/servidors/
Narcís Garcia Langa
narcisgarcia
Usuario Registrado
 
Mensajes: 1
Registrado: Jue Feb 14, 2008 10:26 am

Re: vsFTPD con usuarios virtuales usando MySQL

Notapor DarkFRoG » Sab Feb 16, 2008 10:04 am

pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address= AQUI VA TU IP <--- me imagino que es la ip de la lan o no?
DarkFRoG
Usuario Registrado
 
Mensajes: 18
Registrado: Mié Ene 30, 2008 2:24 am

Re: vsFTPD con usuarios virtuales usando MySQL

Notapor miguex » Dom Feb 17, 2008 12:09 am

DarkFRoG escribió:pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address= AQUI VA TU IP <--- me imagino que es la ip de la lan o no?


Es correcto, ahi debe ir la IP de la maquina servidor por ejemplo ; 192.168.1.100

Saludos
En caso de panico.......... grite y corra en circulos !!
miguex
Administrador del Sitio
 
Mensajes: 325
Registrado: Vie Ene 18, 2008 6:05 pm


Volver a How-To

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado