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.
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
Comentarios
Publicar un comentario
Son bienvenidos tus comentarios, solo se respetuoso. Saludos