Para encontrar algo que me guste, hay que rebuscar mucho

User login

FTP simple y muy seguro en Linux con IP dinámica (Parte 1/2)

0. Disclaimer y agradecimientos

  • No soy informático, programador, administrador de Linux ni nada por el estilo.
  • Lo que expongo es mi opinión y lo que he aprendido por mi mismo con algunas indicaciones de amigos.
  • El método que expongo funciona a mi en mi servidor doméstico (Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29) x86_64 GNU/Linux) tras el típico router barato que proporcionan los suministradores de internet, pero no recomiendo a nadie seguir a ciegas mis pasos o consejos en un servidor "serio".
  • Si te cargas algo siguiendo mis instrucciones, ¡jó-de-te! ;)
  • No dudes en dejar un comentario con cualquier sugerencia o error que hayas encontrado, siempre me gusta aprender y mejorar.

Quiero dar las gracias a:

  • @shaishern, quien me confirmó que también sufría configurando vsftpd y tenía que recurrir a dyndns para poder acceder sin problemas.
  • @chousa72, quien me sugirió utilizar SFTP y me advirtió de la posible inseguridad de usar FTP "normal".
  • @dskywalk, quien me ayudó con algunas dudas generales de configuración y me dijo que mi red doméstica es una mierda (siempre viene bien la motivación para mejorar).

1. Introducción

En esta entrada voy a explicar cómo instalar un servidor SFTP (SSH FTP o SSH File Transfer Protocol) y hacer que ciertos usuarios sólo puedan acceder a la máquina remotamente a través del SFTP, evitando acceso a la consola del sistema.

Las ventajas con respecto a otro tipo de servidor FTP y en particular con respecto a VSFTPD son:

  1. Configuración más sencilla.
  2. Más seguro. Aunque VSFTPD bien configurado es igual de seguro que SFTP, require redireccionar un mayor número de puertos en el router (sólo 1 para SFTP) y ésto hace que seamos más susceptibles a ataques o a que cometamos errores de configuración.
  3. Funcional con IP dinámica y detrás de un router. En vsftpd con IP dinámica estamos obligados a usar modo pasivo (complicando la configuración y necesitando múltiples puertos) y a indicar la IP del servidor. Dado que ésta es dinámica, tendríamos que recurrir a un servicio externo como DynDNS (~40$ al año) o a complicados y poco efectivos scripts que modifiquen la configuración de vsftpd por nosotros cada vez que haya un cambio de IP.
  4. Menor consumo de recursos y menor número de programas instalados. Si tenemos un servidor Linux, es casi seguro que ya tengamos instalado el servidor SSH y con él viene incluído SFTP.

Y las desventajas son:

  1. Imposibilidad de apagar el SFTP y dejar SSH activo. Para mayor seguridad, me gustaría apagar el servidor FTP cuando no lo necesite, pero está ligado al SSH y éste lo necesito activo todo el tiempo para realizar la administración remota del servidor.
  2. Nada más :D

2. Pasos a seguir

PASO 1: Crear un grupo para los usuarios que van a acceder a los datos

sudo groupadd sftpusers

Si lo hemos hecho bien, al listar los grupos presentes en el ordenador con…

cut -d: -f1 /etc/group

…al final de la lista deberíamos ver sftpusers.

PASO 2: Crear los usuarios que van a acceder a los datos

Creamos los nuevos usuarios en el grupo sftpusers sin carpeta en /home (opción -M) del anterior punto con:

sudo useradd -M -G sftpusers carlos

Dicho usuario sólo tendrá acceso a ficheros a través de SFTP así que le desactivamos la consola de comandos con:

sudo usermod -s /usr/sbin/nologin carlos

Los usuarios del grupo sftp sólo tendrán acceso a datos y éstos están situados en la carpeta /mnt/data/people/<user> donde <user> será en éste ejemplo carlos. Por lo tanto modificamos el directorio del usuario, que por defecto es /home/<user>, con el comando:

sudo usermod -d carlos carlos

NOTA: La razón de que no creemos la ruta completa para el home del usuario con sudo usermod -d /mnt/data/people/carlos carlos es que la primera parte del home será luego especificado desde la configuración de SSH y SFTP (es el mismo archivo de configuración).

Ya sólo queda asignarle una clave al usuario con:

sudo passwd carlos

PASO 3: Crear las carpetas para los datos de usuario

En mi caso, los voy a poner en /mnt/data/people/carlos, así que creo dicha(s) carpetas. Es MUY importante que la carpeta "padre", o sea people, pertenezca al usuario root.

sudo chown root:root /mnt/data/people

Y la carpeta carlos se la vamos a asignar al usuario carlos del grupo sftpusers:

sudo chown carlos:sftpusers /mnt/data/people/carlos

Por mantener las cosas un poco organizadas y que evitar olvidarme de que hay unos usuarios especiales sin directorio propio en /home, lo que hago es crear un enlace simbólico en /home/carlos que apunte a la carpeta de datos /mnt/data/people/carlos:

sudo ln -s /mnt/data/people/carlos/ /home/carlos

PASO 4: Forzar al usuario a usar SFTP

Editamos el archivo de configuración /etc/ssh/sshd_config con:

sudo nano /etc/ssh/sshd_config

Comentamos la línea Subsystem y añadimos debajo la nueva con internal-sftp:

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Al final del archivo añadimos la siguiente directiva para los usuarios del grupo sftpusers:

Match Group sftpusers
    ChrootDirectory /mnt/data/people
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp -d %u

NOTA: A mi modo de ver (repito que no soy un experto en el tema), SFTP tiene un problema o error de configuración, nada más abrir el SFTP, nuestro usuario está obligado a ir a una carpeta que pertenezca al usuario root (como ya se comentó en el PASO 3). Sin embargo, cuando el usuario carlos se loguee, no tendrá permisos para crear nada en dicha carpeta y deberá entrar en su carpeta, llamada carlos que sí será suya y podrá leer y escribir ficheros. En mi configuración, ese paso lo hago automáticamente con el -d %u, cambiando el directorio (-d) a la carpeta que se llama como el usuario (%u). Pero no deja de ser una pequeña chapuza porque nada impide al usuario subir un nivel cuando abra el FTP y ver las carpetas de los otros usuarios aunque no pueda entrar en ellas. Lo deseable sería que el usuario carlos entrara directamente y de verdad a su carpeta y que le fuera imposible salir de ella.

Llegados a este punto, podemos intentar acceder a nuestro FTP con SSH desde la consola de otro ordenador en nuestra LAN y deberíamos ver el siguiente mensaje de error:

ssh carlos@<lan_ip_servidor>
carlos@<lan_ip_servidor>'s password: *******************
This service allows sftp connections only.
Connection to <lan_ip_servidor> closed.

Donde <lan_ip_servidor> será la IP de nuestro servidor en la red local, 192.168.xxx.yyy en mi caso.

Sin embargo, si intentamos logearnos con sftp, todo debería estar en orden. Podemos probar a ejecutar los comandos help o dir

sftp carlos@<lan_ip_servidor>
carlos@<lan_ip_servidor>'s password: 
Connected to <lan_ip_servidor>.
sftp> 

PASO 5: Redireccionar el puerto 20 del router al servidor SFTP

Siguiendo los pasos descritos, nuestro servidor SFTP funciona sólo dentro de nuestra red doméstica usando su IP, algo del estilo de 192.168.x.y. Para poder acceder desde el exterior, tenemos que redireccionar el puerto 20 de nuestro router hacia nuestro servidor. De ese modo, cuando al router le llegue un solicitud entrante de datos por el puerto 20, la redirigirá a nuestro servidor. Para ello, lo mejor es que busquéis en google qué pasos seguir con vuestro modelo de router ya que suelen variar bastante.

Y eso es todo, nuestro servidor SFTP es 100% funcional. La configuración para FileZilla, el cliente de SFTP que uso yo, es muy sencilla y se puede ver en la siguiente imagen.:

alternate

En el cuadro rojo superior debemos indicar la IP externa de nuestro servidor SFTP (la IP de nuestra casa, vaya). De momento debemos mirarla manualmente en whatsmyip.org, por ejemplo. Dado que tengo IP dinámica, en la segunda parte de esta entrada explicaré como recibir un email de notificación con la IP de nuestro server. En el cuadro inferior pondríamos el nombre del usuario, carlos.

3. Para el futuro…

Aunque el SFTP ya es funcional, en la segunda parte de la entrada resolveré algunos problemas pendientes:

  1. Como dije al principio de la entrada, mi proveedor de internet me asigna una IP dinámica y cuando intente conectarme al SFTP desde el exterior, no la conoceré. Para solucionarlo, explicaré cómo recibir la IP automáticamente por email.
  2. Dejar abierto el acceso al SSH o SFTP desde el exterior es relativamente peligroso ya que alguien podría intentar loguearse por fuerza bruta. Para dificultarlo, añadiremos un baneo temporal si un usuario falla la clave determinadas veces.