Servidor FTP con vsftpd

Llevo ya unos días peleándome con el proftpd tratando de tener un usuario anónimo en RO y un directorio incoming con RW, además de tener un usuario para el FTP con derechos RW sobre el directorio de trabajo del usuario anónimo. La primera parte muy bien, pero la segunda me encontraba con problemas de autenticación y no podía salir de ahí, pero de tertúlia por el IRC x-ip me ha presentado otro servidor de FTP, el very secure ftp, vsftpd, que permite añadir usuarios con una base de datos externa (en este manual voy a usar una berkeley DB) y configurar de forma individual lo que puede hacer cada usuario, así que vamos a ver hasta donde se puede llegar :)

Partimos de una debian squeeze 6.0.1.

Lo primero es instalar el servicio

# apt-get install vsftpd

Y las herramientas para gestionar bases de datos Berkeley.

# apt-get install db4.8-util

A continuación creamos un fichero con los datos de login y passwords poniendo el usuario y debajo el password, de esta forma:

# vi /root/ftpusers
usuario1
password1
usuario2
password2
:wq
# chmod 600 /root/ftpusers

Y generamos la base de datos en formato berkeley y la protegimos ante ojos indiscretos:

# db4.8_load -T -t hash -f /root/ftpusers /etc/vsftpd_login.db
# chmod 600 /etc/vsftpd_login.db

Una vez creada nuestra base de datos, necesitamos editar el archivo PAM para indicar que use nuestra base de datos.

# vi /etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

atención: comentamos el resto de líneas de este fichero

Y al fichero de configuración vsftpd que use el fichero de autenticación pam al cual le hemos definido la autenticación con la base de datos Berkeley (esto ya está por defecto)

# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd

La instalación por defecto de debian nos deja instalado el servicio con un acceso anónimo bajo el usuario ftp y el directorio de trabajo /usr/ftp, como en el sistema que estoy configurando la partición tocha es /var, voy a cambiar el directorio de trabajo del usuario ftp editando el fichero /etc/passwd:

# vi /etc/passwd
ftp:x:104:106:ftp daemon,,,:/var/ftp:/bin/false
# mkdir /var/ftp
# chgrp -R ftp /var/ftp

Ahora mismo podemos escoger si queremos permitir el usuario anónimo o no en este directorio, tal como he comentado al principio vamos a definir permisos restrictivos para los usuarios anónimos y más permisivos para los autenticados, si queremos en algún momento realizar la acción contraria es tan simple como cambiar la afirmación a negación o viceversa ;)

# vi /etc/vsftpd.conf
listen=YES
anonymous_enable=YES # permitir login anónimo
local_enable=YES # permitir login usuarios del sistema (en este caso pam.d)
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES # enjaulamos al usuario FTP, para que no pueda ir a directorios superiores
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
user_config_dir=/etc/vsftpd/users
guest_enable=YES
guest_username=ftp
anon_root=/var/ftp/

A partir de aquí ya tenemos que el usuario anónimo sólo tiene lectura pero no escritura sobre el directorio de trabajo (/var/ftp), así que vamos a definir los usuarios. Para ello añadimos una línea más al fichero /etc/vsftpd.conf

user_config_dir=/etc/vsftpd/users

y creamos los directorios /etc/vsftpd/ y /etc/vsftpd/users/

Ahora tendremos que decirle a vsftpd que no permita el login de los usuarios del sistema al FTP, ya que el password en el FTP es en claro y con un sniffer es sencillo conseguir el password de un usuario con acceso ssh al sistema, por esto se recomienda que los passwords de los usuarios del FTP sean distintos al de los del sistema.

Una forma rápida de sacar los usuarios del sistema es así:

# cat /etc/passwd | cut -d ":" -f 1 > /etc/vsftpd/denied_users

Ahora solo nos queda definir usuario a usuario los permisos de cada uno. Para ello lo unico que tenemos que hacer es crear un archivo por usuario, con el nombre del mismo dentro de /etc/vsftpd/users/, especificando las opciones ‘extras’ que queremos que tenga cada uno de ellos.
Por ejemplo a usuario1, le vamos a permitir leer y descargar lo que hay en /var/ftp, para ello como indicamos antes, creamos el archivo /etc/vsftpd/users/usuario1

# cd /etc/vsftpd/users/
# vi usuario1
dirlist_enable=YES
download_enable=YES
local_root=/var/ftp
write_enable=NO
anon_world_readable_only=NO
:wq

Y al usuario2, le vamos a permitir escribir en /var/ftp, así que creamos otro archivo usuario2, que contenga:

# vi usuario2
dirlist_enable=YES
download_enable=YES
local_root=/var/ftp
anon_upload_enable=YES
anon_world_readable_only=NO
anon_other_write_enable=YES # permitir borrar ficheros propios y de otros usuarios
write_enable=YES
anon_mkdir_write_enable=YES # permitir escribir al directorio
local_umask=022 # mascara para los ficheros propios
anon_umask=022 # mascara para los ficheros desde otros usuarios
:wq

Tras hechas todas las modificaciones ya sólo nos falta reiniciar el servicio y probar que funciona ;)

# /etc/init.d/vsftpd restart

Nota: He estado un rato, pero hasta que lo he encontrado… bufff!!! el directorio superior del FTP no puede tener los permisos del usuario FTP en escritura a other, ya que entra en conflicto con alguno de los parámetros de la configuración del servicio. Para que el FTP funcione tenemos que definir los permisos así:

root@xava:/var# ls -l |grep ftp
drw-rwxr-x  5 blackhold blackhold  4096  7 set 04:36 ftp

root@xava:/var# cd ftp

root@xava:/var/ftp# ls -lh
total 12K
drwxrwxr-x 2 ftp ftp 4,0K  7 set 04:35 incoming
drwxrwxr-x 2 ftp ftp 4,0K  7 set 04:51 musica
drwxrwxr-x 2 ftp ftp 4,0K  7 set 04:36 videos

El usuario anónimo no he conseguido que tenga derechos de escritura sobre incoming, pero como mínimo ya tenemos medio camino hecho ;)

Vía: esdebian + rascar un rato!

5 Comments

  1. Pingback: Punto de montaje: FTP | Blackhold

  2. Pingback: Punto de montaje: FTP | Blackhold

  3. Hola, ya hace casi un año que monte un servidor FTP siguiendo estos pasos, y ademas tu blackhold me lo terminaste de configurar cuando viniste a ayudarnos a montar los supernodos.

    Ahora me sale que el unico usuario que tengo guifi/guifi ha llegado a su tope de megas subidas (aun que no me sale ningun aviso, no me deja colgar nada mas), si borro datos me deja volver a cargar ese espacio borrado.

    El disco duro esta solo un 1% lleno, y el espacio subido por el usuario guifi son unas 260 GB. aproximadamente.

    En ningun sitio de la configuración se le pone limite a este usuario.

    A que puede ser debido?

    Saludos, Jordi

    Respon
    • He creado otro usuario, y me hace lo mismo, no me deja colgar nada mas, hasta que no borro algo. He visto que usa el mismo usuario del sistema “ftp” 104 107, aun que cree mas usuarios el “limite” ya esta superado.

      Respon
  4. Ya descubri que era el error, y no tiene nada que ver con la configuracion del FTP:

    tengo la carpeta ftp en /var/ftp y yo pensava que la tenia en /datos/ftp (que es otro disco duro) solo con mover ftp a /datos/ y hacer un enlace simbolico se soluciono.

    PD: estos 3 comentarios se pueden borrar ya que no tienen nada que ver con el post.

    saludos! Jordi.

    Respon

Respon a Idroj Cancel·la les respostes

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.