1. Introducción
FTP (File Transfer Protocol): protocolo de transferencia de archivos, que funciona sobre la pila de protoclos TCP/IP y una arquitectura cliente-servidor. El empleo del protocolo TCP (protocolo de control de transporte) asegura el envío de datos al ser un protocolo orientado a conexión (a diferencia del UDP empleado en TFTP, por ejemplo).
1.1. FTP activo VS pasivo
El FTP activo y pasivo no son más que 2 formas diferentes de establecer la conexión entre un cliente y un servidor FTP. La diferencia fundamental es que en una conexión de FTP activo la conexión de datos es iniciada por el servidor y en el pasivo por el cliente.
Si queréis profundizar un poco más, aquí están resumidos los procesos de conexión en un FTP activo y pasivo:
FTP activo:
El cliente, desde un puerto de comandos efímero (>1024) se conecta con el puerto de comandos del servidor (21) y le envía el número de puertos en el que estará escuchando para recibir datos.
El servidor desde su puerto 21 manda un ACK (acknowledgement) al puerto cmd del cliente.
El servidor inicia la conexión de datos entre su puerto de datos (20) y el puerto de datos del cliente (el de cmd+1).
El cliente acepta el inicio de conexión de datos con un ACK al puerto 20 del servidor.
FTP pasivo:
El cliente envía un PASV al servidor mediante los puertos de control, diciendo que quiere iniciar una transferencia pasiva.
El servidor le responde al puerto de control indicando un puerto efímero (>1024) que utilizará para transferir los datos.
El cliente inicia una conexión de datos desde su puerto efímero de datos al puerto efímero de datos del servidor.
El servidor manda un ACK al puerto de datos del cliente.
La desventaja del FTP activo consiste en que si el cliente tiene un cortafuegos es muy probable que rechace la conexión del servidor. Esto se soluciona mediante FTP pasivo, donde la conexión de datos es iniciada por el cliente.
2. Instalamos el servidor
Por algún motivo desconocido, mi Ubuntu Server no es capaz de localizar el paquete vsftpd, a pesar de tener los repositorios actualizados y la conexión a internet establecida:
Por ello en este tutorial voy a utilizar Ubuntu Desktop, pero todo el procedimiento de instalación y configuración va a ser idéntico al uno de Ubuntu Server, ya que lo haré todo en modo texto.
Instalamos vsftpd:
Hacemos una copia de respaldo del fichero de configuración /etc/vsftpd.conf:
Comprobamos que se haya creado correctamente:
3. Asignamos una @IP estática a nuestro servidor
Voy a asignar una 10.0.0.1/8 a mi servidor. Para ello, igual que siempre, abrimos el archivo /etc/network/interfaces y especificamos la configuración de siguiente manera:
Reiniciamos el servicio de red y comprobamos que nuestra interfaz haya cogido correctamente la configuración anterior. Si no lo hace, probamos un ifconfig eth0 down && ifconfig eth0 up o reiniciamos la máquina:
4. Configuramos el servidor
4.1. Configuramos un mensaje de bienvenida y el acceso anónimo
En el fichero /etc/vsftpd.conf comenzaremos configurando un mensaje de bienvenida y el acceso a usuarios anónimos.
Para configurar un banner o mensaje de bienvenida buscamos la siguiente línea y después del igual introducimos el mensaje:
Ponemos el parámetro anonymous_enable a YES y añadimos la línea de anon_root, asignándole un directorio del usuario anónimo (que vamos a crear enseguida):
Creamos un directorio de trabajo para el usuario anónimo (mencionado en el paso anterior):
Dentro de él voy a crear también un documento de texto prueba.txt, con un contenido dentro:
Reiniciamos el servicio vsftpd para aplicar los cambios anteriores:
Si además queréis permitir subidas al usuario anónimo, cambiamos el parámetro de anon_upload_enable a YES, sin olvidar a descomentarlo por supuesto.
Prueba en una máquina con Windows 7
Voy a realizar una sencilla prueba en una máquina con Windows 7. Para ello en el cmd nos conectamos al servidor ejecutando ftp @IP_nuestro_servidor. Ponemos anonymous en nombre de usuario y la contraseña se dejaría vacía. A continuación listamos el contenido del directorio mediante un dir y descargamos el fichero prueba.txt mediante el comando get fichero_servidor ubicación_local:
Comprobamos el contenido del fichero Prueba.txt:
4.2. Configuramos acceso a usuarios locales
Para configurarlo, tenemos que modificar 4 líneas en el fichero de configuración:
local_enable para habilitarlo, local_root para establecer su directorio de trabajo y write_enable para permitir escibirles en ese directorio. Además tendremos que deshabilitar el control de acceso predeterminado via PAM (uno de los sistemas de autentiación más seguros) y definir uno nuevo mediante la línea pam_service_name=ftp.
Permitimos el acceso a usuarios locales, definimos su directorio y permitimos que suban ficheros al servidor:
Creamos su directorio de trabajo y hacemos la comprobación:
Además le damos el permiso de escritura para todos los usuarios:
Agregamos 2 usuarios nuevos mediante useradd -m nombre_de_usuario (-m para craer también el directorio de usuario si no lo tiene) y les asignamos las contraseñas con passwd nombre_de_usuario.
Definimos una cadena nueva para la lista de acceso:
Al igual que antes, para aplicar los cambios vamos a tener que reiniciar el servicio vsftpd. Para ello: service vsftpd restart.
Prueba con Windows 7
Entramos con alguno de los 2 usuarios que hemos creado y comprobamos que somos capaces de subir ficheros y después eliminarlos. Voy a hacerlo con el fichero Prueba.txt, descargado anteriormente desde el usuario anónimo.
Para subir ficheros emplearemos put fichero_local fichero_servidor. Para eliminar delete archivo_servidor:
Como podemos observar, todas las pruebas han tenido éxito (igualmente las podríamos haber hecho desde el propio servidor).
Sin embargo, dejando la configuración así, el servidor se queda con un importante fallo de seguridad. Consiste en que cualquier usuario atentificado puede moverse por los directorios del sistema. He aquí la prueba:
Nuestro objetivo consiste en que su propia carpeta sea la única que pueda ver y trabajar solo con ella.
Aquí entra en juego el concepto de "jaula". Enjaular en este caso significa permitir a los usuarios del servidor acceder solamente a un directorio concreto y prohibirles subir a niveles superiores.
Para enjaular a los usuarios locales, abrimos el fichero de configuración /etc/vsftpd.conf y cambiamos las directivas chroot_local_user, allow_writeable_chroot y chroot_list_enable:
También podríamos especificar en el fichero /etc/vsftpd.chroot_list a usuarios concretos que queramos enjaular.
Prueba
Aunque aparentemente parezca que nos deja ascender en los directorios, sólo podemos ver el contenido de /srv/ftp/USERS.
4.3. Diferentes usuarios con diferentes permisos
Vamos a crear otro usuario más, además de los que creamos anteriormente y conseguiremos que cada uno de ellos solamente pueda trabajar con su carpeta (leer y escribir), sin poder ni leer ni escribir en las de los demás.
Vamos a agregar un tercer usuario con su carpeta home y le establecemos una contraseña:
En el directorio /srv/ftp/USERS vamos a crear una carpeta para cada usuario (con mkdir), vamos a otorgar a cada usuario la propiedad de la carpeta correspondiente (con chown) y vamos a modificar los permisos de una manera que solo el dueño pueda leer, escribir y listar su contenido (chmod):
Prueba con Windows 8.1
Nos conectamos con cada uno de los 3 usuarios (user1, user3 y user3), nos cambiamos a su capeta y probamos subir un fichero. A continuación intentamos meternos en las carpetas de los demás usuarios y ya veremos que no nos deja.
Pruebas con el usuario user1:
Pruebas con user2:
Pruebas con user3:
4.4. Analizamos la seguridad del protocolo FTP
Como bien se sabe, los datos que circulan por el protoclo ftp, incluyendo las contraseñas, viajan en texto plano. Esto significa que cualquiera estando en la misma red que el cliente o el servidor ftp con un analizador de paquetes podría interceptar nuestra contraseña y conectarse al servidor de forma no legítima.
Vamos a realizar una sencilla prueba con Wireshark, que es un analizador de paquetes gratuito.
Al iniciar el programa tendremos que elegir la interfaz por la cual vamos a escuchar (en mi caso Ethernet0):
Pulsamos start e iniciamos una sesión FTP en la línea de comandos de nuestro sistema:
¿Y cómo se puede evitar un fallo de seguridad tan importante?
Para ello se han desarrollado diversos protocolos FTP seguros: sFTP (FTP por ssh) y FTPs (FTP por SSL o TLS). Estos protocolos FTP mejorados hacen que los datos que viajan entre el cliente y servidor estén cifrados. Y aunque alguien consiga interceptar la contraseña, se tendría que descifrar primero, y eso en la mayoría de los casos es un proceso muy lento y costoso.
5.- FTPS (FTP por SSL)
Nota: OpenSSL es un robusto paquete de herramientas de adminsitración y bibliotecas relacionadas con la criptografía. Es una herramienta de software libre.
5.1.- Empleamos OpenSSL para generar un certificado de tipo x509, para 365 dias junto con una clave privada (RSA de 2048 bits) exportada en /etc/vsftpd.pem:
5.2.- Configuramos el SSL en el fichero de configuración /etc/vsftpd.conf (habilitamos SSL, denegamos su uso a los usuarios anónimos y lo forzamos a los autorizados; emplearemos la versión 1 del socket):
5.2.1.- Reiniciamos el servicio para aplicar los cambios anteriores:
5.3.- Prueba.
5.3.1.- CMD.
El Símbolo del sistema de Windows no permite conexiones ftp seguras, por lo que si intentamos conectarnos con un usuario a partir de ahora nos va a rechazar la conexión con siguiente error:
5.3.2.- Filezilla Client.
Nota: Filezilla es una herramienta libre y gratuita de FTP que existe tanto en versión de cliente como de servidor.
Para las conexiones FTP seguras vamos a emplear Filezilla. Para ello introducimos los datos de nuestro servidor (@IP, nombre de usuario, contraseña y puerto):
Nos va a salir una ventana de advertencia con los datos de nuestro certificado, diciendo que es un certificado desconocido. Pulsamos Aceptar:
Ya estamos dentro. Al igual que con los comandos del cmd o de la terminal unix, podemos trabajar con el directorio de nuestro usuario subiendo, descargando o eliminando diferentes ficheros:
5.3.3.- Prueba de seguridad de FTPS
Si ahora realizamos una conexión segura de Filezilla a nuestro servidor e interceptamos los paquetes con un analizador de paquetes, podemos ver que ahora la única información que viaja sin cifrar es el mensaje de bienvenida. Ni siquiera podemos ver ahora el nombre del usuario.
6. SFTP (FTP por SSH)
Nota: SSH (Secure SHell) es un protocolo seguro para las conexiones remotas. De manera predeterminada emplea el puerto 22.
Conectarse a nuestro servidor FTP a través del protocolo ssh es otra forma de securizarlo. Quizá se emplea más que la anterior debido a su sencillez.
6.1. Instalamos el OpenSSH en servidor y en el cliente
Normalmente, tanto cliente como servidor SSH ya vienen preinstalados en el sistema. Si no es así, ejecutamos apt-get install openssh-server (en el servidor) y apt-get install openssh-client (en el cliente):
6.2. Enjaulamos a los usuarios
La enjaulación de los usuarios que se conectan al servidor por ssh se realiza a parte de la enjaulación normal. Para poder hacerlo seguiremos los siguientes pasos:
6.2.1. Dueño del directorio raíz (chroot) y sus permisos
El propietario del directorio al que vamos a limitar a los usuarios (en mi caso es /srv/ftp/USERS) tiene que ser root (chown root USERS). Si no lo hacemos, el servidor denegará los intentos de conexión.
Además los otros usuarios tienen que tener permiso de lectura y de recorrer el directorio (aplicamos chmod 755 USERS).
En el interior de USERS no cambiaremos nada, pero cada usuario tiene que ser propietario de su carpeta (user1 de la carpeta user1_carpeta, por ejemplo) y los demás no tendrán ningún permiso sobre ella. Igualmente con los demás usuarios:
¡Atentción! A diferencia de lo que aparece en la captura, el directorio USERS tiene que tener el permiso de escritura para otros. Si no, no dejará escribir a usuarios que no sean root. Quedarían como: drwxr-xrwx.
6.2.2. Creamos grupos nuevo y metemos en él a los usuarios
Para facilitarnos la tarea del enjaulado, vamos a crear un grupo nuevo (ftpusers en mi caso) y meteremos a los usuarios en él utilizando los siguientes comandos:
6.2.3. Configuramos /etc/ssh/sshd_config
En el fichero de configuración del ssh tenemos que especificar el grupo de usuarios que vamos a enjaular y a qué directorio. Para ello agregamos las siguientes líneas en el fichero /etc/ssh/sshd_config:
Si queremos enjaular a un usuario concreto, descomentamos la línea UserPAM yes y cambiamos la línea siguiente por Match user nombre_de_usuario.
6.2.4. Prueba de conexión con FileZilla
Creamos un sitio nuevo y especificamos la @IP de nusetro servidor, el puerto 22, y el protocolo (SFTP). En el modo de acceso elegimos que nos pregunte la contraseña.
Conectamos. Introducimos el password:
Estamos dentro. Y limitados al directorio que especificamos:
6.2.5. Prueba con Debian via terminal
En cualquier sistema tipo Unix tenemos un cliente sftp preinstalado. Para conectarnos utilizamos el comando sftp.
Nota: Si no especificamos el usuario, intentará conectarse con root.
6.2.6. Prueba de seguridad final con Wireshark
Iniciamos la escucha de paquetes por nuestra interfaz principal y establecemos filtro ftp. Podemos comprobar que toda la información que viaja está cifrada. Ni siquiera podemos visualizar el mensaje de bienvenida:
7. Hardening
En computación, hardening es el proceso de securizar un sistema reduciendo su superficie de vulnerabilidad. Cuantas más funciones implementa un servidor, más superficie de vulnerabilidad tiene. Reducir los vectores disponibles de ataque normalmente supone eliminar software innecesario, nombres de usuario no usados o deshabilitar servicios innecesarios.
Resumiendo, el proceso de hardening de un servidor consiste en reducir al máximo vulnerabilidades presentes, que equivale a maximizar su seguridad. En este post hemos adoptado las siguientes medidas de seguridad en nuestro servidor:
- Hemos "enjaulado" a los usuarios al directorio FTP. Para ello hemos empleado la directiva chroot y hemos establecido solamente los permisos necesarios a cada usuario del servidor.
- Además hemos asegurado de 2 formas diferentes (FTPS y SFTP) que los datos de control viajen cifrados. Por lo que si alguien intercepta los paquetes de sesión, no podrá visualizar su contenido en texto plano.
- Deshabilitar las subidas desde usuario anónimo o el acceso desde un usuarios anónimo (ya se menciona cómo al comienzo del tutorial).
Y hasta aquí este mega-post.
Un saludo y hasta otra ;)
No hay comentarios:
Publicar un comentario