Hoy toca ver cómo configurar openSSH (como siempre, en entornos Red Hat) para aceptar únicamente peticiones SFTP enjaulando a los usuarios sftp en sus homes. Para añadirle contenido, además, configuraremos este servicio en un segundo proceso que correrá en la máquina de forma independiente al proceso openssh habitual, para evitar tener problemas con nuestras conexiones SSH, y por tanto, se configurará un puerto de escucha diferente al habitual, en el ejemplo, el 12022.
Fichero de configuración
En primer lugar copiaremos el fichero de configuración de openssh para adaptar la copia a nuestras necesidades:
[root@myserver]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_12022
# Cambiamos el puerto
Port 12022
# Modificamos el Subsystem original
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
# Añadimos el enjaulado
Match Group sftp12022
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
Cambios en el sistema
[root@myserver]# groupadd sftp12022
[root@myserver]# mkdir /sftp
[root@myserver]# /usr/sbin/sshd -f /etc/ssh/sshd_config_12022
[root@myserver]# netstat -natp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2228/sshd
tcp 0 0 0.0.0.0:12022 0.0.0.0:* LISTEN 13007/sshd
Usuarios SFTP
[root@myserver]# mkdir /sftp/joe
[root@myserver]# useradd -g sftp12022 -d /joe -s /sbin/nologin joe
[root@myserver]# passwd joe
[root@myserver]# mkdir /sftp/joe/joe
[root@myserver]# chown joe:sftp12022 /sftp/joe/joe
Lo malo de hacerlo así, es que efectivamente, a pesar de que el usuario no tendrá home de conexión SSH, porqué no conectará por SSH, su home se habrá creado en la raíz ( /joe ). Bajo mi punto de vista es un poco engorro tener las homes de los usuarios SFTP en la raíz, pero no he encontrado una solución a este problema. Si no vas a usar la autentificación de usuarios mediante clave pública, quizá sea una buena idea eliminar las homes de la raíz, puesto que no deberías necesitarlas. Update: Para ello, símplemente puedes crear el usuario con la opción «-M», lo cual no creará la home del usuario durante su alta:
[root@myserver]# useradd -g sftp12022 -M -d /joe -s /sbin/nologin joe
Conexión desde cliente
[joe@myworkstation]$ sftp -P 12022 [email protected]
La conexión le ubicará dentro de /sftp/joe/joe, con lo que tendrá permisos de escritura, y además quedará enjaulado en /sftp/joe. Es decir, el usuario podrá hacer un único «cd..» hasta ubicarse en /sftp/joe, pero no podrá salir de ahí. Como por defecto el usuario se conecta a /sftp/joe/joe, tendrá todos los permisos y habrá quedado enjaulado y controlado.
De nuevo recalcar que el usuario tampoco podrá conectar por SSH al no tener una shell válida.
Ejecución al inicio
A falta de configurar el correspondiente script de inicio, podremos meter en el rc.local la instrucción para lanzar el nuevo sshd. Para ello, símplemente añadiremos la siguiente línea al final del fichero /etc/rc.local:
/usr/sbin/sshd -f /etc/ssh/sshd_config_12022
FUENTES:
http://www.thegeekstuff.com/
Foto por bulldog1
Gracias Adrian! Un buen manual para habilitar SFTP!
Si quisiera crear una carpeta compartida para todos los usuarios del grupo y que todos puedieran compartir informacion dentro de esta como podria configurarlo ?
No sé si pudiste resolverlo, si lo pudiste hacer, por fa puedes compartirlo? pero se me ocurriría en la configuración del sshd_config_12022 quitar el «%u» en ChrootDirectory /sftp/%u de esa forma todos los que pertenecen al grupo estarían enjaulados en ese directorio,
Y si quisiera que también tengan la opción de tener sus propias carpetas únicas, crearía otro servicio siguiendo la misma metodología pero con otro puerto.
Hola Adrian gracias por el tutorial, tengo un problema q al parecer no está controlado.
si estoy conectado con el usuario «pepito» y trato de conectarme al sftp se logra y me coloca en el directorio /home/pepito. Pero el problema es que me permite navegar por los directorios del home incluso dentro de carpetas de otros usuarios.
El usuario pepito pertenece al grupo sudo.
Pasa lo mismo si se prueba con otro usuario sin permisos sudo.