Introducción:
Para los códigos que veréis en el mini-howto utilizo lo siguiente:
Para el código que tecleo (NEGRITA CURSIVA).
Para el código que muestra la pantalla (CURSIVA).
Sistema y Paquetes:
Pues como siempre en Debian, versión estable a día de hoy (Sarge)
Debian Sarge 31r5
Ssh 3.8.1p1-8
Vim 6.3-071
MySql-Server 4.0.24-10
libpam-mysql 0.5.0-6
Vsftpd 2.0.3-1
Instalación Sistema:
Pues la instalación de Debian ha sido la mas simple, solamente el sistema base, no elijo ninguna opción cuando me pide la instalación ya iremos instalando los paquetes necesarios.
Instalación SSH:
Instalaremos el ssh si es necesario, para mi si lo es ya que realizo estas instalación sobre maquinas virtuales y el manejo es mas fácil desde ssh (puedo copiar y pegar textos)
vsftpd:~# apt-get install ssh
Nos generará las RSA DSA keys y ya podremos entrar al servidor por ssh.
Ahora retocaremos el archivo de configuración de repositorios para que siempre baje los archivos más actuales y no los coja del cd.
vsftpd:~# vi /etc/apt/sources.list
Borraremos todas las lineas menos las del repositorio que más nos guste:
deb http://ftp.rediris.es/debian/ stable main
deb http://security.debian.org/ stable/updates main contrib
Muy bien actualicemos el sistema por si el cd es antiguo:
vsftpd:~# apt-get update
vsftpd:~# apt-get upgrade
Instalaremos VIM para que la edición de textos sea más fácil:
vsftpd:~# apt-get install vim vim-common
Editaremos el archivo de configuración de vim para que nos reconozca la sintaxis y quitar el autoindent (para que no nos tabule automaticamente y podamos copiar y pegar sin problemas)
vsftpd:~# vi /etc/vim/vimrc
Buscad y comentad la línea que pone set autoindent
Buscad y descomentad las líneas que ponen syntax on y set background=dark
Instalación de MySQL:
Utilizaremos Mysql para crearnos una base de datos con los usuarios virtuales que utilizaran el ftp. Podemos utilizar otro gestor de bases de datos como Postgre o el que más nos guste.
vsftpd:~# apt-get install libdbd-mysql-perl libdbi-perl libmysqlclient12 libnet-daemon-perl libplrpc-perl mysql-client mysql-common mysql-server
Por defecto la instalación de MySql nos deja acceso libre al gestor de bases de datos para el usuario root, esto debería ser cambiado para más seguridad, lo haremos de la siguiente forma:
vsftpd:~# mysqladmin -u root password «PONAQUITUPASSWORD»
Crearemos la base de datos con los siguientes pasos, yo lo hago de la siguiente forma, me creo un archivo de texto y pongo todas las líneas que debe interpretar el mysql y luego se las paso:
vsftpd:~# mkdir /cosas
vsftpd:~# vi /cosas/crea_bbdd.txt
#
# Creo al usuario vsftpd para que puedan entrar a la bbdd de usuarios y que solo pueda realizar consultas, no necesitara hacer nada mas.
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','vsftpd',password('PONAQUITUPASSWORD'));
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','vsftpd','vsftpd','Y');
FLUSH PRIVILEGES;
#
# Creamos la bbdd vsftpd
#
CREATE DATABASE vsftpd;
#
# Creamos la estructura de la tabla usuarios
#
USE vsftpd;
CREATE TABLE `usuarios` (
`usuario` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default ''
);
Una vez creado el archivo le diremos a MySql que realice todo lo que diga nuestro archivo:
vsftpd:~# mysql -u root -p < /cosas/crea_bbdd.txt
Nos pedirá la password que hemos puesto al usuario root para acceder al gestor de la base de datos.
Podemos comprobar si lo ha hecho todo bien metiéndonos en mysql:
vsftpd:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13 to server versión: 4.0.24_Debian-10sarge2-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
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> desc usuarios;
———- ————– —— —– ——— ——-
| Field | Type | Null | Key | Default | Extra |
———- ————– —— —– ——— ——-
| usuario | varchar(255) | | | | |
| password | varchar(255) | | | | |
———- ————– —— —– ——— ——-
2 rows in set (0.00 sec)
Instalación de libpam-mysql:
Necesitamos instalar esta librería para poder acceder a la base de datos y consultar los usuarios que intentar loguearse a nuestro ftp, manos a la obra:
vsftpd:/# apt-get install libmysqlclient10 libpam-mysql
La configuración la haremos luego, una vez tengamos instalado el demonio VSFTPD
Instalación de VSFTPD:
Hasta aquí tenemos casi todo hecho para instalar el demonio que nos dará acceso FTP al nuevo servidor.
Necesitamos crear a un usuario virtual o usuario fantasma para que sea él el que «maneje el ftp» para poder «usarlo» necesitaremos loguearnos con el usuario y la contraseña que demos de alta en mysql. La explicación es un poco liosa, pero una vez que la instalación este realizada se entenderá perfectamente.
Antes de crear al usuario fantasma debemos saber donde tendremos los directorios del FTP, yo por ejemplo lo he creado para que la gente que tenga una web en mi servidor pueda acceder a su directorio y manejarlo como quiera, como sabemos en Debian, el servidor web Apache deja los archivos en /var/www/, pues ese será el «home» del usuario fantasma. Luego cada usuario que creemos en la base de datos tendrá su propio «home» dentro de ese directorio, es decir, que el usuario «pepe» tendrá el home /var/www/pepe/ (es un ejemplo, ya que no es un home ni existirá ese usuario realmente). NUNCA podrá ser un directorio superior a /var/www/ siempre deberá ser un «hijo» del «home» del usuario fantasma. Espero que haya quedado claro 😉
La instalación de apache no es obligatoria con lo cual lo dejo a vuestra elección, si no lo instaláis, debéis cambiar el home.
Creemos al usuario con su respectivo home:
vsftpd:/# useradd -d /var/www fantasma
Podemos ver que lo hemos hecho correctamente viendo los usuarios del sistema:
vsftpd:/# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
Debian-exim:x:102:102::/var/spool/exim4:/bin/false
identd:x:100:65534::/var/run/identd:/bin/false
sshd:x:101:65534::/var/run/sshd:/bin/false
mysql:x:103:104:MySQL Server,,,:/var/lib/mysql:/bin/false
fantasma:x:1001:100::/var/www:
Perfecto, instalemos ahora el demonio, por fin…..
vsftpd:/# apt-get install vsftpd
Configuraciones:
Empecemos dando de alta un usuario en la base de datos, mas adelante lo utilizaremos.
vsftpd:~# vi /cosas/crea_usuarios.txt
use vsftpd;
INSERT INTO usuarios (usuario, password) VALUES ('Juanmi',password('Juanmi'));
Ahora, de la misma forma que antes, le diremos a mysql que interprete las ordenes:
vsftpd:~# mysql -u root -p < /cosas/crea_usuarios.txt
Nos pedirá la password que hemos puesto al usuario root para acceder al gestor de la base de datos.
Y de nuevo comprobemos que lo ha hecho bien:
vsftpd:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17 to server versión: 4.0.24_Debian-10sarge2-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
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> select * from usuarios;
——— ——————
| usuario | password |
——— ——————
| Juanmi | 76143fba05a82082 |
——— ——————
1 row in set (0.00 sec)
Configuremos ahora el archivo que conectara contra la base de datos y validara al usuario:
vsftpd:/# vi /etc/pam.d/vsftpd
Borraremos todo su contenido para dejarlo de la siguiente forma:
auth required /lib/security/pam_mysql.so user=vsftpd passwd=PASSWORDQUEPUSISTE host=localhost db=vsftpd table=usuarios usercolumn=usuario passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftpd passwd=PASSWORDQUEPUSISTE host=localhost db=vsftpd table=usuarios usercolumn=usuario passwdcolumn=password crypt=2
session required /lib/security/pam_mysql.so user=vsftpd passwd=PASSWORDQUEPUSISTE host=localhost db=vsftpd table=usuarios usercolumn=usuario passwdcolumn=password crypt=2
El password que hay que poner aquí es el que pusiste al usuario vsftpd en el archivo crea_bbdd.txt
Configuremos ahora el demonio Vsftpd, moveremos el archivo original y crearemos uno nuevo con nuestra configuración:
vsftpd:/# mv /etc/vsftpd.conf /etc/vsftpd.conf.ORIGINAL
vsftpd:/# vi /etc/vsftpd.conf
Dejaremos el archivo igualito que lo que pongo aquí abajo:
ftpd_banner= «Servidor FTP propiedad de PONAQUIENTUQUIERAS»
# Configuracion Base
anonymous_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=fantasma
hide_ids=YES
listen=yes
listen_address=0.0.0.0
listen_port=11122
local_enable=YES
max_clients=100
max_per_ip=1
pam_service_name=vsftpd
pasv_max_port=65535
pasv_min_port=64000
#session_support=NO
use_localtime=YES
user_config_dir=/etc/vsftpd/users
userlist_enable=YES
userlist_file=/etc/vsftpd/denied_users
virtual_use_local_privs=YES
xferlog_enable=YES
async_abor_enable=YES
connect_from_port_20=YES
dirlist_enable=NO
download_enable=NO
local_umask=000
Sobre el archivo de configuración, comentar que NO dejaremos acceso anónimo, escuchara por el puerto 11122 y que los puertos pasivos iran desde el 64000 al 65535, y que tendremos que dejar las configuraciones de cada usuario (de la bbdd) en el sitio /etc/vsftpd/users.
Sigamos configurando….
Crearemos ahora loas configuraciones de cada usuario de la base de datos, las cuales dejaremos en el directorio que le hemos dicho al vsftpd.conf
vsftpd:/# mkdir /etc/vsftpd
Generaremos el archivo de usuarios denegados con la siguiente orden, de esta forma no dejaremos loguearse a ningún usuario físico del servidor, solo a los virtuales:
vsftpd:/# cat /etc/passwd | cut -d «:» -f 1 | sort > /etc/vsftpd/denied_users
Para crear las configuraciones del los usuarios generaremos un archivo por cada usuario de la base de datos, en mi caso creare el archivo llamado Juanmi:
vsftpd:/# mkdir /etc/vsftpd/users/
vsftpd:/# vi /etc/vsftpd/users/Juanmi
dirlist_enable=YES
download_enable=YES
local_root=/var/www/Juanmi/
write_enable=YES
anon_world_readable_only=NO
En este caso si el usuario logueado es Juanmi, su «home» será /var/www/Juanmi y solo podrá moverse por los directorios hijos de /var/www/Juanmi, permito la escritura, el listado de archivos y la descarga de archivos.
Lo que nos hace falta ahora mismo es dar permisos 777 a la carpeta de cada usuario:
vsftpd:/# chmod 777 -R /var/www/Juanmi/
Bien podemos empezar a probar que tal nos funciona. Deciros que el método que utilizaremos es PASV mode, es decir al conectar por el puerto 11122 nuestro servidor mandara el numero de puerto por el cual el cliente debe pasar los datos al servidor, el puerto de paso estará entre el rango 64000 y 65535 (definido en el archivo de configuración). Con esto lo que quiero decir es que no funcionara con el explorador de pindous por ejemplo, necesitaremos para subir archivos algún cliente (en pindous por ejemplo smartftp, en linux gftp por decir uno).
Problemas que pueden surgir:
Desde la red interna, seguramente no tengamos ningún problema, esto se debe a que en la red privada tenemos todos los puertos abiertos, con lo cual cuando el servidor manda el puerto pasivo al cliente no tendremos ningún problema. Pero que ocurre si tenemos un router o un firewall en medio de la conexión, no funcionara, esto se debe a que un router por ejemplo no acepta paquetes no establecidos.
Os pongo la solución a este problema siempre y cuando utilicemos iptables, se que alguno routers de telefónica aceptan esta situación si se les indica.
La solución en iptables es instalar el modulo «ip_conntrack_ftp» e «ip_nat_ftp». En Debian Sarge y Etch vienen instalados por defecto, lo único que tendremos que hacer es «activarlos». Yo lo hago de la siguiente forma, en el script donde tengo el firewall, en un apartado añado todos los modulo que quiero, este se encuentra antes de aplicar ninguna regla, las líneas para realizar el ftp correctamente son las siguientes:
modprobe ip_conntrack_ftp «ports=11122»
modprobe ip_nat_ftp «ports=11122»
Si queremos poner dos servidores utilizaremos un puerto para cada uno, es decir 11121 11122, por ejemplo y las líneas quedaran de la siguiente forma:
modprobe ip_conntrack_ftp «ports=11121,11122»
modprobe ip_nat_ftp «ports=11121,11122»
Con estas líneas añadidas y el firewall correctamente configurado funcionara a las mil maravillas…..
Conclusiones:
Desde que he instalado el servidor no he tenido que reiniciarlo ni una sola vez, funciona perfectamente. Cuesta un poco de trabajo realizar todo esto de primeras sin ningún manual, pero ahora ya tenéis uno ;-). Merece la pena «pringarse», que otro servidor ftp utiliza usuarios virtuales, una vez realizada toda la configuración la administración se hace facilísima, alta o baja de usuarios, con simples scripts se hace comodísima.
Agradecimientos:
A Alfonso de Microalcarria, me ayudo con el problema de iptables, muchas gracias 😉 te debo muchas cenas…..
Al creador de Vsftpd y a toda la comunidad que sigue apostando por el software libre.
Referencias:
http://vsftpd.beasts.org/
Utilice tambien un breve documento de un tal Chacal, no os puedo decir su pagina web ya que en su día copie el texto y me he basado en eso.