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