Servidor ProFTPD y enjaulamiento de usuarios


Servidor ProFTPD y enjaulamiento de usuarios

En este articulo utilizaré el servidor ProFTPD versión 1.3.4, el cual se presenta como uno de los más estables y altamente configurables. Además, ha sido uno de los que más información he encontrado sobre su utilización y configuración.

Es posible realizar una configuración básica, pero a la vez robusta con sólo editar un archivo, el cual permite enjaular usuarios, trabajar bajo IPv6, entre otros.

La instalación del servidor se realizará sobre el sistema operativo Debian 7.5 totalmente actualizado.

En las siguientes lineas mostraré una serie de pasos desde la instalación del servidor, pasando por una buena configuración hasta aplicar una medida básica, pero efectiva de seguridad.

Instalación de ProFTPD

Para instalar el servidor ProFTPD, debemos ingresar el siguiente comando:

root@FTP:~# apt-get install proftpd -y

Dentro de la instalación nos aparecerá la siguiente imagen:

La diferencia entre estas opciones es la velocidad de ejecución que se obtendrá del servicio y la carga que se le dará al equipo. Si utilizamos “inetd”, el equipo iniciará un proceso nuevo por cada llamada ftp. Si utilizamos “independiente”, el proceso ya está inicializado (se clona el proceso, generando una nueva instancia del mismo para atender al cliente ftp que inicio el requerimiento).

  • Inetd: En cada conexión nueva que realicemos al servidor, se crea un nuevo proceso.
  • Independiente: Cada conexión se ejecuta como un proceso independiente del mismo.

Para este articulo utilizaré la opción “independiente”. Enter.

Al finalizar la instalación ya podemos utilizar nuestro servidor FTP, sin embargo veremos que será necesario realizar algunas configuraciones y darle un poco de seguridad.

Conexión a servidor FTP sin configuración

Para realizar la prueba de conexión a nuestro servidor, primero confirmaremos cual es el IP de éste y agregaremos un usuario identificable.

Nuestro servidor FTP tiene el IP 192.168.0.101.

Agregamos un usuario llamado “cliente” y su contraseña “laclave”.

Con esto ya podemos verificar si podemos conectarnos vía cliente FTP.

Para la conexión, utilizaremos el cliente ftp de Linux desde otra máquina (cliente) y el cliente Filezilla desde Windows.

Primero verificaremos con ambos clientes si es posible ingresar como anónimo por defecto a nuestro servidor FTP.

Como podemos ver, nuestro servidor viene con la opción de ingresar como anónimo deshabilitada por defecto. Es posible habilitarla desde el archivo de configuración, sin embargo no es recomendable por muy seguro que este nuestro servidor.

Ahora ingresaremos por ambos clientes a nuestro usuario “cliente”.

Logramos entrar al servidor, sin embargo el usuario no sólo puede ingresar a su directorio, sino que también podrá ver la raíz del servidor y todos sus directorios como veremos en las siguientes imágenes:

Enjaulamiento usuarios


Para que lo anterior no suceda y logremos que el usuario sólo sea capaz de revisar los archivos de su directorio, debemos configurar el archivo /etc/proftpd/proftpd.conf.

El archivo contiene las configuraciones para nuestro servidor. Para esta prueba editaremos sólo dos líneas. La línea de la versión IPv6 la cual comentaremos (también podemos editarla a “off”) y la línea que enjaulará a los usuarios DefaultRoot la cual descomentaremos.

Encima de la línea aparece el comentario que señala que es usado para enjaular todos los usuarios en sus respectivos directorios “home”.

Guardamos los cambios y reiniciamos el servidor:

root@FTP:~# service proftpd restart

Teniendo ya esta configuración, procedemos a realizar la misma prueba de conexión y verificaremos si es posible ver la raíz del servidor o sólo nos podremos mover dentro de nuestro directorio “home”.

Como podemos ver, en Filezilla nos muestra 3 archivos los cuales pertenecen a la configuración del usuario.

Restringir acceso a Shell

Para esta prueba ingresaremos a nuestro servidor vía Putty (teniendo previamente instalado Openssh-server).

Logramos entrar al servidor vía SSH y podemos ejecutar comandos. Esto no es conveniente para nosotros.

Para restringir el acceso a la Shell, debemos cambiar en el archivo passwd /bin/bash por /bin/false. Antes de eso, debemos agregar /bin/false a nuestro archivo shells.

Abrimos el archivo /etc/shells y agregamos al final /bin/false:

Guardamos los cambios y editamos el siguiente archivo.

Abrimos /etc/passwd y bajamos hasta el usuario “cliente” para cambiar /bin/bash por /bin/false.

Antes:

Después:

Ahora guardamos los cambios y realizamos nuevamente la prueba desde Putty:

Sólo llegaremos al login, ya que al ingresar la contraseña y dar Enter, el programa se cerrará.

Con esto evitamos que el usuario utilice la Shell para poder ejecutar algún software malicioso o algún comando que no tiene permitido.

Limitando acceso FTP a un grupo específico

Dentro de un mismo servidor podemos tener usuarios de otros servicios, por lo que no es muy beneficioso que todos tengan acceso a todos estos.

Para el caso de ProFTPD, podemos limitar el acceso grupos y/o usuarios específicos.

Lo primero que haremos será configurar el archivo proftpd.conf.

root@FTP:~# nano /etc/proftpd/proftpd.conf

Vamos al final del archivo y luego de “Include /etc/proftpd/conf.f/” agregamos lo siguiente:

Con esta configuración, le estamos diciendo a ProFTPD que sólo permita conectarse a él a los usuarios que pertenezcan al grupo “ftp”.

Guardamos los cambios y reiniciamos el servidor.

Como nuestro usuario “cliente” no pertenece a este grupo, no debería poder conectarse. Realizaremos la prueba para verificar lo señalado.

Como podemos ver, es imposible conectarnos al no pertenecer al grupo “ftp”.

Ahora crearemos el grupo e ingresaremos a nuestro usuario “cliente” a él.

Intentaremos nuevamente conectarnos al servidor.

Ya podemos ingresar al servidor al ser parte del grupo “ftp”.

Encriptar clave y sesión con SSL

Hasta aquí hemos intentado configurar nuestro servidor FTP de una manera óptima, sin embargo aún tenemos un grave problema.
La sesión y la clave de FTP pasan por texto plano y es muy fácil obtenerla con tan sólo hacer una captura con Wireshark o Tshark en un ataque MITM (Man in the middle).

Opción Wireshark de Windows

Realizaremos la prueba para ver qué tan fácil es capturar la clave de un usuario.
Abrimos Wireshark, seleccionamos la interfaz y comenzamos la captura dando click a “start”:

Como no tenemos páginas abiertas u otra conexión, el programa no nos muestra información.

Ahora nos conectaremos desde Filezilla y veremos que nos mostrará que estamos conectados.

Para revisar de una manera más rápida, utilizaremos el siguiente filtro:

ftp contains “USER”

Al aplicar el filtro nos mostrará el nombre del usuario FTP:

Ahora aplicaremos el siguiente filtro:

ftp contains “PASS”

Al aplicar el filtro, nos mostrará el password del usuario detectado anteriormente:

Como podemos ver en la fila seleccionada en azul, aparece PASS laclave, que es el password asignado al usuario “cliente”.

Opción Tshark Linux

La opción a Wireshark en Linux es Tshark. Lo descargaremos en el servidor con el siguiente comando :

root@FTP:~# apt-get install tshark –y

 

Teniendo tshark instalado, vamos a realizar las capturas con el siguiente comando:

root@FTP:~# tshark –i eth0 –f “tcp port 21” –a duration:10 –w /tmp/cap.cap

Con esto le estamos diciendo que realice una captura en la interfaz eth0 con el filtro para FTP, la cual tendrá una duración de 10 segundos y lo guardará en el archivo /tmp/cap.cap.

Al aplicar el comando, debemos acceder vía FTP por un cliente, ya sea ftp de Linux o Filezilla y Tshark comenzará la captura.

Teniendo la captura guardada, ahora debemos leerla con el siguiente comando:

root@FTP:~# tshark –r /tmp/cap.cap

Evidentemente, debemos aplicar algún filtro para poder determinar el usuario y la clave. Para esto usaremos grep y filtraremos de la siguiente forma:

Con esto hemos logrado identificar el usuario “cliente” con la contraseña “laclave”.

Solución problema anterior

Para evitar esto, podemos encriptar la sesión utilizando OpenSSL. Instalaremos OpenSSL con el siguiente comando:

root@FTP:~# apt-get install openssl –y

Ahora debemos crear las llaves. El comando es el siguiente:

El detalle de los atributos es el siguiente:

  • openssl: Comando de openssl.
  • req: Es la solicitud de firma de certificado.
  • -new: Creación de un nuevo certificado.
  • -x509: Estándar para infraestructuras de claves públicas.
  • -days: Días de validación del certificado. (365 = 1 año).
  • -nodes: Especifica que no queremos una contraseña en la llave privada.
  • -out: Nombre y directorio del certificado raíz.
  • -keyout: Nombre y directorio de la llave privada.

Al aplicar este comando, nos pedirá la siguiente información:

Código de 2 letras del país, provincia, ciudad, nombre empresa, nombre de OU o sección, nombre del servidor o dominio, email de contacto.

El siguiente paso es dar los permisos respectivos a las llaves creadas.

Lo siguiente es configurar el archivo /etc/proftpd/tls.conf descomentando las siguientes lineas:

  • TLSEngine on
  • TLSLog /var/log/proftpd/tls.log
  • TLSProtocol SSLv23
  • TLSRSACertificateFile /etc/ssl/certs/proftpd.crt (y editarla)
  • TLSRSACertificateKeyFile /etc/ssl/certs/proftpd.key (y editarla)
  • TLSRequired on

Básicamente activamos las funciones que necesitamos para insertar las llaves a nuestro servidor.

Guardamos los cambios y ahora sólo nos queda activar la línea en proftpd.conf que hace referencia al archivo tls.conf.

root@FTP:~# nano /etc/proftpd/proftpd.conf

Descomentamos Include /etc/proftpd/tls.conf, guardamos los cambios y reiniciamos el servicio.

root@FTP:~# service proftpd restart

Comprobando los cambios

Comprobaremos si realmente la contraseña es cifrada. Haremos nuevamente la captura con Wireshark, pero esta vez deberemos conectarnos por Filezilla con la opción servidor tipo tls.

Al conectarnos nos pedirá que aceptemos el certificado. Damos aceptar y entraremos al FTP.

En el siguiente certificado se muestra la información que nosotros entregamos cuando lo creamos con el comando openssl: el tiempo de validez, nombre de dominio, de empresa, OU, etc.

Ahora veremos en Wireshark la sesión e intentaremos saber cuál es la contraseña.

Utilizaremos el filtro para buscar al usuario “cliente”.

Al aplicar el filtro, veremos que no aparece nada. Quitamos el filtro (con clear) y aplicamos otro filtro: ftp.

Podemos ver que la sesión esta encriptada y no es posible ver ni el usuario ni contraseña como texto plano.

Ahora intentaremos con Tshark.

Podemos ver que es ilegible y es imposible filtrar el usuario y la contraseña.

Más de ProFTPD


ProFTPD incluye un sin número de configuraciones de las cuales destacan:

  • Creación de usuarios y grupos virtuales.
  • Establecer límites a usuarios y directorios.
  • Limitar usuarios y grupos autorizados.
  • Permisos y restricciones en directorios.
  • Configuración para usuarios anónimos.
  • Entre otros.

Usuarios virtuales

Mostraremos una configuración básica de usuarios virtuales y daremos a conocer los PRO y CONTRA que a nuestro parecer tiene entre este método y los usuarios del sistema.

Teniendo instalado ProFTPD, podemos utilizar la herramienta ftpasswd (Se utiliza dentro del directorio /etc/proftpd/) para crear un nuevo grupo virtual de la siguiente manera:

root@FTP:/etc/proftpd# ftpasswd --group --name=grupovirtual --gid=1100

Con esto crearemos un nuevo grupo virtual.

Ahora debemos crear un usuario de la siguiente forma:

root@FTP:/etc/proftpd# ftpasswd --passwd --name=usuariovirtual--uid=1100 --gid=1100 --home=/var/ftp --shell=/bin/false

Con esto crearemos un usuario llamado “usuariovirtual” el cual estará en el grupo creado anteriormente “grupovirtual”.

El usuario está creado con contraseña “virtual”, sin embargo aún se debe editar el archivo proftpd.conf, crear el directorio y asignar los permisos correspondientes.

Creamos el directorio con los permisos.

Antes de ir a la configuración de proftpd.conf, podemos hacer un listado en el directorio actual y veremos que se crearon 2 archivos los cuales contienen información de los usuarios virtuales y los grupos virtuales:

Los archivos ftpd.passwd y ftpd.group.

Ahora configuraremos proftpd.conf de la siguiente manera. Luego del Include de modules.conf agregaremos las siguientes líneas:

AuthUserFile "/etc/proftpd/ftpd.passwd"
AuthGroupFile "/etc/proftpd/ftpd.group"
AuthOrder mod_auth_unix.c mod_auth_file.c

La primera línea indica la ubicación del archivo que contiene a los usuarios virtuales, la segunda línea indica la ubicación del archivo que contiene los grupos virtuales y la tercera línea indica a ProFTPD que la autenticación podrá ser por medio de usuarios virtuales y usuarios del sistema.

Otro punto importante es descomentar la línea “RequireValidShell off”.

Guardamos los cambios y reiniciamos el servicio.

Ingresamos con nuestro usuario virtual por el cliente ftp de Linux:

Podemos ver que el usuario virtual se autentica exitosamente.

Los PRO que podemos destacar de la utilización de usuarios virtuales es que es más personalizada, son usuarios ajenos al sistema y sólo tienen interacción con el servidor FTP, se pueden especificar de mejor manera las personalizaciones por cada usuario y/o grupo.

Los CONTRA que podemos destacar de la utilización de usuarios virtuales es que se debe conocer los uid de usuario y grupos que no estén utilizados para asignarlos, sin embargo por medio de un script en bash se puede alivianar el proceso de creación.

Administración servidor FTP

También es importante destacar que existen algunas herramientas básicas para administrar el servidor a través de la consola de Linux.

El comando ftptop muestra el estado actual de sesiones FTP:

El comando ftpwho muestra información sobre el proceso de todas las conexiones proftpd activas:

El comando ftpcount muestra el número actual de conexiones por servidor:

Nota de seguridad

Diariamente van apareciendo nuevos tipos de ataques y formas de explotar servidores, es por esto que es siempre recomendable mantener actualizados tanto nuestro sistema operativo como nuestro servidor (en este caso ProFTPD). También es recomendable buscar información y mantenernos al día sobre posibles fallas, vulnerabilidades y parches necesarios para mantener nuestro servidor operativo y relativamente seguro.

También es importante una buena administración del servidor incluyendo una lectura de logs y la utilización de software que ayude al control y bloqueo de ingresos malintencionados (como Fail2ban u otros).