Cómo proteger un servidor FTP usando SSL/TLS para la transferencia segura de archivos en CentOS 7


Por su diseño original, FTP (Protocolo de transferencia de archivos) no es seguro, lo que significa que no cifra los datos que se transmiten entre dos máquinas, junto con las credenciales del usuario. Esto representa una amenaza masiva para los datos y la seguridad del servidor.

En este tutorial, explicaremos cómo habilitar manualmente los servicios de cifrado de datos en un servidor FTP en CentOS/RHEL 7 y Fedora; Pasaremos por varios pasos para asegurar los servicios VSFTPD (Very Secure FTP Daemon) usando certificados SSL/TLS.

  1. Debe haber instalado y configurado un servidor FTP en CentOS 7

Antes de comenzar, tenga en cuenta que todos los comandos de este tutorial se ejecutarán como root; de lo contrario, use el comando sudo para obtener privilegios de root si no está controlando el servidor utilizando la cuenta de root.

Paso 1. Generación de certificado SSL/TLS y clave privada

1. Necesitamos comenzar creando un subdirectorio en: /etc/ssl/ donde almacenaremos el certificado SSL/TLS y los archivos clave:

# mkdir /etc/ssl/private

2. Luego, ejecute el siguiente comando para crear el certificado y la clave para vsftpd en un solo archivo, aquí está la explicación de cada bandera utilizada.

  1. req: es un comando para la gestión de solicitudes de firma de certificado (CSR) X.509.
  2. x509: se refiere a la gestión de datos del certificado X.509.
  3. días: define el número de días durante los que es válido el certificado.
  4. newkey: especifica el procesador de claves del certificado.
  5. rsa: 2048: el procesador de claves RSA generará una clave privada de 2048 bits.
  6. keyout: establece el archivo de almacenamiento de claves.
  7. out: establece el archivo de almacenamiento del certificado; tenga en cuenta que tanto el certificado como la clave se almacenan en el mismo archivo: /etc/ssl/private/vsftpd.pem.

# openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048

El comando anterior le pedirá que responda las preguntas a continuación, recuerde usar valores que se apliquen a su escenario.

Country Name (2 letter code) [XX]:IN
State or Province Name (full name) []:Lower Parel
Locality Name (eg, city) [Default City]:Mumbai
Organization Name (eg, company) [Default Company Ltd]:TecMint.com
Organizational Unit Name (eg, section) []:Linux and Open Source
Common Name (eg, your name or your server's hostname) []:tecmint
Email Address []:[email protected]

Paso 2. Configurar VSFTPD para usar SSL/TLS

3. Antes de realizar cualquier configuración VSFTPD, abramos los puertos 990 y 40000-50000 para permitir que las conexiones TLS y el rango de puertos de los puertos pasivos se definan en el archivo de configuración VSFTPD respectivamente:

# firewall-cmd --zone=public --permanent --add-port=990/tcp
# firewall-cmd --zone=public --permanent --add-port=40000-50000/tcp
# firewall-cmd --reload

4. Ahora, abra el archivo de configuración VSFTPD y especifique los detalles de SSL en él:

# vi /etc/vsftpd/vsftpd.conf

Busque la opción ssl_enable y establezca su valor en YES para activar el uso de SSL, además, dado que TSL es más seguro que SSL, restringiremos VSFTPD para emplear TLS en su lugar, usando la opción ssl_tlsv1_2:

ssl_enable=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO

5. Luego, agregue las líneas a continuación para definir la ubicación del certificado SSL y el archivo de claves:

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

6. A continuación, tenemos que evitar que los usuarios anónimos usen SSL, luego obligar a todos los inicios de sesión no anónimos a usar una conexión SSL segura para la transferencia de datos y enviar la contraseña durante el inicio de sesión:

allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES

7. Además, podemos agregar las siguientes opciones para aumentar la seguridad del servidor FTP. Cuando la opción require_ssl_reuse se establece en YES , entonces, todas las conexiones de datos SSL son necesarias para exhibir la reutilización de la sesión SSL; demostrando que conocen el mismo secreto maestro que el canal de control.

Por lo tanto, tenemos que apagarlo.

require_ssl_reuse=NO

Nuevamente, debemos seleccionar qué cifrados SSL permitirá VSFTPD para conexiones SSL cifradas con la opción ssl_ciphers. Esto puede limitar en gran medida los esfuerzos de los atacantes que intentan forzar un cifrado en particular en el que probablemente hayan descubierto vulnerabilidades en:

ssl_ciphers=HIGH

8. Ahora, configure el rango de puertos (puerto mínimo y máximo) de los puertos pasivos.

pasv_min_port=40000
pasv_max_port=50000

9. Opcionalmente, permita la depuración SSL, lo que significa que los diagnósticos de conexión openSSL se registran en el archivo de registro VSFTPD con la opción debug_ssl:

debug_ssl=YES

Guarde todos los cambios y cierre el archivo. Luego, reiniciemos el servicio VSFTPD:

# systemctl restart vsftpd

Paso 3: prueba del servidor FTP con conexiones SSL/TLS

10. Después de realizar todas las configuraciones anteriores, pruebe si VSFTPD está usando conexiones SSL/TLS intentando usar FTP desde la línea de comando de la siguiente manera:

# ftp 192.168.56.10
Connected to 192.168.56.10  (192.168.56.10).
220 Welcome to TecMint.com FTP service.
Name (192.168.56.10:root) : ravi
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection
ftp>

En la captura de pantalla anterior, podemos ver que hay un error que nos informa que VSFTPD solo puede permitir que el usuario inicie sesión desde clientes que admitan servicios de cifrado.

La línea de comando no ofrece servicios de encriptación produciendo el error. Entonces, para conectarse de manera segura al servidor, necesitamos un cliente FTP que admita conexiones SSL/TLS como FileZilla.

Paso 4: Instale FileZilla para conectarse de forma segura a un servidor FTP

11. FileZilla es un cliente FTP multiplataforma moderno, popular y muy importante que admite conexiones SSL/TLS de forma predeterminada.

Para instalar FileZilla en Linux, ejecute el siguiente comando:

--------- On CentOS/RHEL/Fedora --------- 
# yum install epel-release filezilla

--------- On Debian/Ubuntu ---------
$ sudo apt-get install  filezilla   

12. Cuando se complete la instalación (o si ya lo tiene instalado), ábralo y vaya a Archivo u003d> Administrador de sitios o (presione Ctrl + S ) para obtener la interfaz del Administrador de sitios a continuación.

Haga clic en el botón Nuevo sitio para agregar un nuevo sitio/detalles de conexión de host.

13. A continuación, configure el nombre del host/sitio, agregue la dirección IP, defina el protocolo a usar, el cifrado y el tipo de inicio de sesión como en la captura de pantalla a continuación (use los valores que se apliquen a su escenario):

Host:  192.168.56.10
Protocol:  FTP – File Transfer Protocol
Encryption:  Require explicit FTP over   #recommended 
Logon Type: Ask for password	        #recommended 
User: username

14. Luego haga clic en Conectar para ingresar la contraseña nuevamente, y luego verifique el certificado que se está utilizando para la conexión SSL/TLS y haga clic en Aceptar una vez más para conectarse al servidor FTP:

En esta etapa, deberíamos haber iniciado sesión con éxito en el servidor FTP a través de una conexión TLS, consulte la sección de estado de la conexión para obtener más información de la interfaz a continuación.

15. Por último, pero no menos importante, intente transferir archivos desde la máquina local al servidor FTP en la carpeta de archivos, eche un vistazo al extremo inferior de la interfaz de FileZilla para ver informes sobre transferencias de archivos.

¡Eso es todo! Siempre tenga en cuenta que FTP no es seguro por defecto, a menos que lo configuremos para usar conexiones SSL/TLS como le mostramos en este tutorial. Comparta sus pensamientos sobre este tutorial/tema a través del formulario de comentarios a continuación.