FTPS en Centos 8

Ahora que está tan caro el almacenamiento en la nube (igual lo ha estado siempre, qué sabré yo) tener un servidor FTP propio es una opción a considerar si se nos quedan cortos los 6GB que ofrece Dropbox en su versión gratuita (o los 15GB de Google Drive, los 5GB de iCloud…). Bien sea por esto o porque recelamos de la privacidad de nuestros datos al guardarlos en servidores de multinacionales que han tenido problemas con la LOPD, al albur de sus espurios intereses, el siguiente texto pretende ser una guía para configurar el servicio vsftpd en un servidor Centos 8 y securizarlo hasta donde uno sabe: aislando el espacio en un fs independiente, enjaulando a los usuarios con chroot e impidiéndoles el acceso por SSH y aplicando certificados TLS/SSL a fin de cifrar el proceso y evitar que la transferencia de datos se realice en texto plano.

Vamos allá: en primer lugar instalamos el servicio (si no lo encontramos en el repositorio actualizamos con yum -y update), lo habilitamos y lo iniciamos.

yum install -y vsftpd && systemctl enable vsftpd && systemctl start vsftpd

Hecho esto modificamos unos parámetros en el archivo de configuración vsftpd.conf, que se ubica en /etc/vsftpd/. A mi modo de verlo, estos archivos únicamente han de servir como referencia, no se deben aplicar las directivas directamente sobre ellos, ya que el gran número de comentarios y políticas desactivadas por defecto dificulta una lectura comprensiva de cómo está configurado el servicio. Lo propio, pues, es renombrar el archivo de serie (por ejemplo, como vsftpd.conf.bak) para tenerlo como respaldo y que el archivo original no contenga más directivas de las que consideremos necesarias. Para quitar ruido al archivo .bak ejecutamos el siguiente comando:

grep -v «#» /etc/vsftpd/vsftpd.conf.bak | sed -e ‘/^$/d’ >> /etc/vsftpd/vsftpd.conf

Las directivas que nos interesan son las siguientes. Todas son de serie salvo las dos últimas y log_ftp_protocol, que sustituye a xferlog_std_format=YES (este se debe comentar u omitir) y genera el archivo vsftpd.log en /var/log/.

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES

De las opciones anteriores es esencial que figuren las de chroot_local_user, que enjaulará al usuario en su directorio personal y le impedirá navegar por el sistema de archivos, y la de allow_writeable_chroot, ya que de otro modo no podremos escribir ni ejecutar la carpeta raíz de dicho usuario: al intentar establecer la conexión nos aparecería el error 500 OOPS: vsftpd: refusing to run with writable root inside chroot. En aras de que nos quede una instalación hermética, podría ser una buena opción asegurarnos de que los usuarios que tengamos pensado crear para el uso exclusivo del FTP no puedan acceder por SSH declarando la variable DenyUsers en /etc/ssh/sshd_config, seguida de sus nombres.

Vamos con el TLS: creamos un directorio en el que almacenar los certificados, por ejemplo tls dentro del directorio raíz del vsftpd, y creamos el certificado y la clave privada mediante el siguiente comando:

openssl req -newkey rsa:2048 -x509 -nodes -days 365 -keyout /etc/vsftpd/tls/nuestrakey.key -out /etc/vsftpd/tls/nuestrocerti.crt

En el archivo de confguración añadimos las siguientes tres directivas en aras de referenciar los archivos de autenticación y habilitar este nuevo modo de transferencia de datos:

ssl_enable=YES
rsa_cert_file=/etc/vsftpd/tls/nuestrocerti.crt
rsa_private_key_file=/etc/vsftpd/tls/nuestrakey.key

allow_anon_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

Por último, añadimos otros tres parámetros, también al archivo de configuración de vsftpd, que habilitarán y definirán los puertos usados en el modo pasivo (modo al que pasa el cliente FTP una vez creada la primera conexión). Podemos definir un abanico tan grande como queramos, dependiendo de las características del servicio que pretendamos ofrecer.

pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100

Finalizada la configuración del servicio, sólo nos queda habilitar la regla del ftp y los puertos anteriores en el firewall del sistema, haciendo uso de los siguientes comandos, que únicamente modificaremos con el rango de puertos que hayamos decidido:

firewall-cmd –permanent –add-service=ftp
firewall-cmd –permanent –add-port=40000-40100/tcp
firewall-cmd –reload

Por último, vamos con la configuración del router. Esta parte sólo aplica si queremos que nuestro servicio sea accesible desde fuera de nuestra red local. Abrir el puerto 21 sería un suicidio por razones evidentes, de modo que abrimos otro puerto en el rango externo que en la LAN redirija a este. No encuentro razones para modificar los puertos definidos para el modo pasivo a la hora de hacer el port forwarding, ya que al haber sido escogidos de modo arbitrario, tanto da. Para el caso, quedaría así:

Hecho todo esto ya tendremos nuestro servidor FTPS instalado y configurado, con lo que podremos compartir nuestros archivos a nuestro antojo, facilitando el acceso del modo que consideremos oportuno.