Català  

Servidor FTP

De Guifi.net - Wiki Hispano

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 ;)

Herramientas personales