Instalar vsFtpd con usuarios virtuales usando MySQL

En el post de hoy hablaremos de como tener un servicio de ftp trabajando con mysql para validar los accesos. Esto es practico ya que se puede tener N cantidad de usuario sin estar creando a nivel de Linux.

Lo siguiente se hizo en un CentOS 5, pero puede aplicar para cualquier distro, solo revisar lo metodos de cada una para hacer que cargue los servicios al inicio, y demas temas (archivos de configuración, instalación de paquetes, etc.)

En este tutorial se presume ya tener instalado mysql y funcionando, en caso de no revisar el siguiente manual, posterior les daré uno mas detallado.

Primer paso, instalar vsftpd



# yum install vsftpd

No debe existir problemas en la instalación ya que los repositorios de CentOS tiene el paquete.

Segundo paso, configurar MySQL 


Entrar a la consola de mysql con privilegios de root

# mysql -u root -p

Una vez en la consola de mysql, crear la base de datos que consultara el servicio

mysql> CREATE DATABASE vsftpd; 
Query OK, 1 row affected (0.00 sec)

Lo siguiente es crear y asignar permisos al usuario que utilizara el servicio

mysql> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'myftps3cr3t';
Query OK, 0 rows affected (0.02 sec)

Seleccionar la base de datos y crear la tabla que contendra los usuario, el password que se almacenara en la tabla tendra un hash MD5

mysql> USE vsftpd;
Database changed
mysql> 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 ;
Query OK, 0 rows affected (0.00 sec)

Tercer paso, crear usuario en linux


Lo siguiente es crear un usuario con privilegios normales en linux, pero con algunas propiedades, para lo cual ejecutamos

# useradd -G users -s /sbin/nologin -d /home/vsftpd  vsftpd

Cuarto paso, configurar vsftpd


Antes que nada crearemos una copia del archivo de configuración por default del servico vsftpd

# cp -v /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-orig

Y limpiamos el contenido del archivo de configuración con el siguiente comando

# cat /dev/null > /etc/vsftpd/vsftpd.conf

Una vez limpio, editamos el archivo

# vim /etc/vsftpd/vsftpd.conf

Agregamos el siguiente contenido

# No ANONYMOUS users allowed
anonymous_enable=NO
# Allow 'local' users with WRITE permissions (0755)
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES

# if you want to LOG vsftpd activity then uncomment this log_ftp_protocol
# log_ftp_protocol=YES

connect_from_port_20=YES

# uncomment xferlog_file and xferlog_std_format if you DIDN'T use the line above
# with log_ftp_protocol - it must be excluding each other
# The name of log file when xferlog_enable=YES and xferlog_std_format=YES
# WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log
#xferlog_file=/var/log/xferlog
#
# xferlog_std_format Switches between logging into vsftpd_log_file and xferlog_file files.
# NO writes to vsftpd_log_file, YES to xferlog_file
# xferlog_std_format=YES

#
# You may change the default value for timing out an idle session (in seconds).
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection (in seconds).
#data_connection_timeout=120
#
# define a unique user on your system which the
# ftp server can use as a totally isolated and unprivileged user.
nopriv_user=vsftpd

chroot_local_user=YES

listen=YES

# here we use the authentication module for vsftpd to check users name and passw
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# If userlist_deny=YES (default), never allow users in this file
# /etc/vsftpd/user_list , and do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
userlist_deny=yes

# here the vsftpd will allow the 'vsftpd' user to login into '/home/vsftpd/$USER directory
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/vsftpd_user_conf

force_local_data_ssl=NO
force_local_logins_ssl=NO

# PASV - passive ports for FTP (range 44000 - 44100 ; 100 PASV ports, OPEN FIREWALL FOR ALLOWING CONNECTIONS
pasv_enable=YES
pasv_min_port=44000
pasv_max_port=44100

Nota: con la opción user_confir_dir puede especificar un directorio de archivos de configuración por usuario que sobre-escribe partes de la configuración global, Esto es totalmente opcional y puedes hacerlo si deseas usar esta opción. De cualquier forma recomiendo agregar por si posterior desea usarlo

# mkdir /etc/vsftpd/vsftpd_user_conf

En caso de desear utilizar esta opción, por ejemplo con el usuario 'user1' y tener un directorio diferente a /home/vsftpd/user1 entonces sera necesario crear un archivo de configuración para el usuario con sus permisos, para esto ejecutar:

# mkdir /home/users/user1
# chmod 700 /home/users/user1
# chown vsftpd:users /home/users/user1

Con lo anterior el usuario 'user1' tendrá un directorio diferente a los demás usuario, es decir, tendrá /home/users/user1 en vez de /home/vsftpd/user1

Quinto paso, configurar la autenticación


A continuación viene el truco que hace la magia de validar contra la base de datos, primero hacemos una copia de seguridad y limpiamos el archivo

# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd-orig
# cat /dev/null > /etc/pam.d/vsftpd
editamos el archivo

# vi /etc/pam.d/vsftpd

y le agregamos el siguiente contenido

#%PAM-1.0
session     optional     pam_keyinit.so     force revoke
auth required pam_mysql.so user=vsftpd passwd=myftps3cr3t host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
account required pam_mysql.so user=vsftpd passwd=myftps3cr3t host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3

Hay que asegurarnos en poner los datos de conexión a como hayas creado, me refiero a nombre de base de datos, tabla, usuario y password de mysql

Si te diste cuenta, en el archivo anterior hace referencia a un modulo, pam_mysql.so, este por default no existe en linux y es necesario instalarlo, el mismo no se encuentra en los repositorios de CentOS, por lo que se tendra que descargar por separado, puedes obtenerlo en:

CentOS 5 64bits: centos.karan.org/el5/extras/testing/x86_64/RPMS/pam_mysql-0.6.2-4.el5.kb.x86_64.rpm
CentOS 5 32bits: centos.karan.org/el5/extras/testing/i386/RPMS/pam_mysql-0.6.2-4.el5.kb.i386.rpm

En mi caso es 32 bits por lo que para descargar es:

# wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/pam_mysql-0.6.2-4.el5.kb.i386.rpm

Una vez descargado procedemos a instalarlo

# rpm -iUvh pam_mysql-0.6.2-4.el5.kb.i386.rpm

No debe haber problemas de dependencias, por lo que la instalación es rápida. Solo para confirmar que instalo correctamente ejecutamos

# ls -a /lib/security/pam_m*
/lib/security/pam_mail.so  /lib/security/pam_mkhomedir.so  /lib/security/pam_motd.so  /lib/security/pam_mysql.so

Sexto paso, crear usuario virtual


Con lo anterior, ya podemos proceder a crear usuarios virtuales para vsftpd. Para esto hacemos:

# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> USE vsftpd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> INSERT INTO accounts (username, pass) VALUES('isos', md5('download'));
Query OK, 1 row affected (0.00 sec)

mysql> SELECT *  FROM accounts;
+----+----------+----------------------------------+
| id | username | pass                             |
+----+----------+----------------------------------+
|  1 | isos     | fd456406745d816a45cae554c788e754 | 
+----+----------+----------------------------------+
1 row in set (0.00 sec)

mysql>\q 

Ahora para el usuario isos el directorio raíz sera /home/vsftpd/isos/ lamentablemente este método no crea automático el directorio del usuario (de hecho es la aplicación vsftpd), por lo que hay que crearlo manualmente y darles el permisos de usuario (linux)

# mkdir /home/vsftpd/isos
# chown vsftpd:users /home/vsftpd/isos/

Solo resta reiniciar el servicio de vsftpd, esto lo hacemos

# service vsftpd restart

Listo, ha probar con un cliente, en mi caso tengo filezilla, aquí les dejo una muestra de como fue:



Ahí tienen, a disfrutar

Entradas populares de este blog

Desactivando NetworkManager

Como montar particiones LVM en Linux

Configurando interfaces de red virtuales en Linux