vsftpd con TLS explícito en CentOS

17 Julio 2013 at 11:30 by Adrián Pérez

Seguridad

vsftpd es un servidor FTP que debería ser "Very Secure FTP", pero que por defecto es justo lo contrario. Con un poco de trabajo, podemos dejarlo bastante mejor, que es precisamente, lo que voy a mirar de describir a continuación.

Lo que queremos es forzar a los clientes a usar FTP+TLS Explícito, en lugar de FTP simple, para forzar comunicaciones cifradas. Además, usaremos FTP pasivo, enjaularemos a los usuarios y crearemos un listado de usuarios que puedan conectar, para tener controlados a los usuarios FTP.

Las pruebas se han realizado sobre un servidor CentOS 5.4 con vsFTPd 2.0.5.

En primer lugar, si no lo tenemos ya, podremos instalar vsftpd desde yum.

[root@MyServer]# yum install vsftpd

Certificado SSL

A continuación, generaremos el certificado para el SSL y le daremos los valores adecuados:

[root@MyServer]# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
Country Name (2 letter code) [GB]:ES
State or Province Name (full name) [Berkshire]:Spain
Locality Name (eg, city) [Newbury]:Barcelona
Organization Name (eg, company) [My Company Ltd]:Mi Empresa S.A.
Organizational Unit Name (eg, section) []: IT
Common Name (eg, your name or your server's hostname) []:midominio.com
Email Address []:

Una vez generado, cambiaremos los permisos del fichero:

[root@MyServer]# chmod 600 /etc/vsftpd/vsftpd.pem

Configuración de vsftpd

Ahora estaremos listos para pasar a la configuración de vsftpd (tras hacer un backup del fichero de configuración original, por si las moscas):

[root@MyServer]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.ORIG
[root@MyServer]# vi /etc/vsftpd/vsftpd.conf

Lo primero que podemos hacer es deshabilitar el acceso anónimo.

anonymous_enable=NO

Nos aseguraremos de enjaular a los usuarios, para que no puedan moverse por el árbol de directorios del sistema.

chroot_local_user=YES

En cuanto al SSL, lo habilitaremos y le indicaremos la ubicación del certificado que hemos generado.

ssl_enable=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem

En mi caso, he tenido que además, configurar la siguiente directiva para que acabase de funcionar la conexión TLS:

ssl_ciphers=HIGH

Con el SSL habilitado, forzaremos su uso:

force_local_data_ssl=YES
force_local_logins_ssl=YES

Para configurar FTP Pasivo, podremos especificar el rango de puertos que usará para la conexión de datos. Recordemos que FTP pasivo usará un puerto aleatorio dentro del rango especificado:

pasv_min_port=12000
pasv_max_port=20000

Finalmente, podremos especificar el listado de usuarios con acceso al FTP. Como estaremos usando los usuarios del sistema (especificados en /etc/passwd), delimitaremos el acceso al FTP con los siguientes parámetros:

userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd/vsftpd.allowed_users

Usuarios FTP

Ahora podremos guardar el fichero de configuración, y añadir los usuarios FTP, tal que así:

[root@MyServer]# useradd ftpuser -d /home/ftpuser -s /sbin/nologin
[root@MyServer]# passwd ftpuser

Fijémonos en que no le estamos dando un shell al usuario, porqué no permitiremos que conecte por SSH ni que pueda iniciar una sesión en la terminal, únicamente permitiremos su acceso FTP. Una vez dado de alta el usuario en el sistema, lo añadiremos a la lista de usuarios FTP permitidos:

[root@MyServer]# vi /etc/vsftpd/vsftpd.allowed_users

En este fichero, básicamente, añadiremos un usuario permitido en cada línea:

ftpuser
joe

Finalmente, reiniciaremos para aplicar los cambios:

[root@MyServer]# /etc/init.d/vsftpd restart

Ahora estaremos listos para conectar con uno de los usuarios FTP autorizados, usando FTP pasivo + TLS Explícito, y por tanto, tendremos nuestro servidor FTP algo más seguro.

A modo de resumen, el fichero de configuración final de vsftpd, quedaría parecido al siguiente:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
ls_recurse_enable=NO
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
ssl_enable=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_ciphers=HIGH
force_local_data_ssl=YES
force_local_logins_ssl=YES
pasv_min_port=12000
pasv_max_port=20000
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd/vsftpd.allowed_users

 

Fuentes:

http://crunchtools.com/vsftpd-ssl/

http://serverfault.com/questions/385286/...

http://ubuntuforums.org/archive/index.php/t-518293.html

Flickr! Foto por Alexandre Dulaunoy