
Índice
- 1 Por qué necesitas un usuario SFTP restringido
- 2 Paso 1: Crear el usuario y el grupo
- 3 Paso 2: Preparar el directorio de acceso (Chroot Directory)
- 4 Paso 3: Configurar el servicio SSHD
- 5 Configuración específica para el grupo sftp-restringido
- 6 Paso 4: Reiniciar y verificar el servicio
- 7 Solución de problemas comunes
- 8 Conclusión
Por qué necesitas un usuario SFTP restringido
Manejar un servidor privado virtual (VPS) no es broma. Un descuido puede costarte caro. Uno de los fallos más frecuentes que veo es facilitar el acceso SSH o SFTP usando el usuario root para tareas cotidianas, como subir una actualización del sitio web. Es cómodo, sí, pero peligroso. Si alguien roba esas credenciales, no solo entrará a tu servidor; se quedará con el control total.
La solución es crear un usuario SFTP restringido. La idea es sencilla: este usuario solo accede a una carpeta concreta, por ejemplo /var/www/tu-sitio. Nada de navegar por el resto del sistema. Nada de ejecutar comandos en la terminal. Ese aislamiento es clave para cumplir con las prácticas de hardening básicas.
Paso 1: Crear el usuario y el grupo
Empecemos por el principio. Ordenar la estructura de usuarios te ahorrará dolores de cabeza. Aunque podrías usar el grupo por defecto del sistema, te recomiendo crear un grupo dedicado específicamente para quien tenga este acceso restringido. Así, si mañana necesitas añadir a otro desarrollador, ya tienes el grupo listo.
Abre la terminal y conéctate al servidor. Ejecuta esto para crear el grupo:
sudo groupadd sftp-restringidoAhora crea el usuario. En el ejemplo le llamaré desarrollador, pero pon el nombre que te guste. El flag -m crea el directorio home y, muy importante, -s /bin/false le quita el acceso a la shell de login. Así evitas que ejecuten comandos.
sudo useradd -m desarrollador -s /bin/false -G sftp-restringidoY ponle una contraseña decente:
sudo passwd desarrolladorNota importante: Si el usuario ya existía, cambia su shell a /bin/false para cortar el acceso a la terminal con: sudo usermod -s /bin/false desarrollador.
Paso 2: Preparar el directorio de acceso (Chroot Directory)
El corazón de todo esto es el «chroot jail». Básicamente, engañamos al usuario para que, cuando se conecte, crea que la carpeta a la que le damos acceso es la raíz del sistema (/). No podrá hacer «cd ..» para ir hacia atrás. Es una jaula.
Pero Ojo. Para que el chroot funcione en OpenSSH, el directorio debe cumplir una regla estricta: tiene que ser de root y no puede ser escribible por otros. Si lo es, el servicio SFTP te cerrará la puerta por seguridad.
Imagina que quieres dar acceso a /var/www/html/mi-proyecto. No podemos hacer chroot directo ahí porque el usuario necesita escribir en esa carpeta, y el chroot no permite escritura en su raíz.
La solución es crear una estructura de directorios padre. Ejecuta lo siguiente:
sudo mkdir -p /var/www/sftp-home/desarrolladorAquí, /var/www/sftp-home/desarrollador será el directorio chroot (la «raíz» que ve el usuario). Ajusta los permisos:
sudo chown root:root /var/www/sftp-home/desarrollador
sudo chmod 755 /var/www/sftp-home/desarrollador
El dueño es root, cumple la norma. Ahora, dentro de este «búnker», creamos una carpeta donde el usuario sí pueda escribir y subir archivos:
sudo mkdir /var/www/sftp-home/desarrollador/www
sudo chown desarrollador:sftp-restringido /var/www/sftp-home/desarrollador/www
sudo chmod 775 /var/www/sftp-home/desarrollador/www
Montando el directorio real
Si tu objetivo es que el usuario gestione archivos en /var/www/html/mi-proyecto, no hace falta mover nada de sitio. Usa un mount bind. Esto «monta» la carpeta real dentro de la accesible sin duplicar datos.
sudo mount --bind /var/www/html/mi-proyecto /var/www/sftp-home/desarrollador/wwwPara que esto sobreviva a un reinicio del servidor, añade esta línea al fstab:
/var/www/html/mi-proyecto /var/www/sftp-home/desarrollador/www none bind 0 0Paso 3: Configurar el servicio SSHD
Toca modificar el demonio SSH para forzar el uso del subsistema SFTP interno y aplicar el chroot a nuestro grupo. Antes de tocar nada, haz una copia de seguridad del archivo de configuración. Siempre.
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bakAbre el archivo con tu editor (nano, vim…):
sudo nano /etc/ssh/sshd_configBaja al final. Verás una línea como Subsystem sftp /usr/lib/openssh/sftp-server. Coméntala (pon un # delante) y añade esta configuración nueva:
# Subsistema SFTP interno para chroot
Subsystem sftp internal-sftp
Configuración específica para el grupo sftp-restringido
Match Group sftp-restringido
ForceCommand internal-sftp
ChrootDirectory /var/www/sftp-home/%u
PasswordAuthentication yes
AllowTcpForwarding no
X11Forwarding no
Veamos qué hacen estas directivas clave:
- Match Group sftp-restringido: Lo que sigue solo aplica a quien esté en este grupo.
- ForceCommand internal-sftp: Obliga al servidor a usar el proceso SFTP interno de OpenSSH, imprescindible para que el chroot funcione.
- ChrootDirectory /var/www/sftp-home/%u: Define la jaula.
%use cambia automáticamente por el nombre del usuario que se conecta. - AllowTcpForwarding no y X11Forwarding no: Cierran el reenvío de puertos y gráfico. Menos vías de escape.
Guarda y sal. En Nano: CTRL+O, Enter y CTRL+X.
Paso 4: Reiniciar y verificar el servicio
Para aplicar los cambios, reinicia el servicio SSH. Ten un poco de cuidado aquí; un error de sintaxis podría dejarte fuera si solo usas claves SSH. Si tienes acceso por consola (VNC) o contraseña, es seguro seguir.
sudo systemctl restart sshdO en distribuciones como Ubuntu:
sudo service ssh restartLlegó el momento de la verdad. Abre tu cliente FTP (FileZilla, WinSCP, Cyberduck) y prueba.
- Protocolo: SFTP.
- Host: La IP de tu VPS.
- Usuario: desarrollador.
- Contraseña: La que definiste en el Paso 1.
- Puerto: 22 (o el que tengas).
Al conectar, la ruta remota debe mostrar solo /. Si intentas ir a /etc o /var, el cliente te denegará el acceso o no verás nada más allá de la carpeta www. Dentro de www, puedes subir y borrar, pero no salir de ahí.
Solución de problemas comunes
La primera vez no siempre funciona. Estos son los errores más típicos al montar un usuario SFTP restringido y cómo arreglarlos.
Error: «Bad ownership or modes for chroot directory»
El clásico. Significa que el directorio del ChrootDirectory no es de root o tiene permisos de escritura para el grupo/u otros. Recuerda: chown root:root y chmod 755 en la carpeta padre. El usuario escribe solo en las subcarpetas de dentro.
El usuario no puede escribir archivos
¿Te conectas bien pero te da «Permiso denegado» al subir algo a www? Revisa que esa carpeta interna sea del usuario (desarrollador) y no de root. El chroot es de root, la carpeta de trabajo es del usuario.
Acceso denegado en el log
Si el login falla del todo, mira el log de autenticación:
sudo tail -f /var/log/auth.log
Busca mensajes que te digan si el usuario es rechazado por el grupo o por temas de PAM.
Preguntas Frecuentes
¿Puedo usar claves SSH en lugar de contraseña?
Claro, y es mejor. Copia tu clave pública (.pub) en /home/desarrollador/.ssh/authorized_keys (crea la carpeta .ssh si hace falta) y cuida los permisos (700 para la carpeta .ssh y 600 para el archivo authorized_keys).
¿Es esto seguro para entornos de producción?
Totalmente. Limitar el movimiento y restringir la shell reduce mucho la superficie de ataque. Si filtran las credenciales de este usuario, el daño se queda en los archivos de su carpeta www. No tocan el sistema operativo ni otras bases de datos.
Conclusión
Configurar bien el acceso a tu servidor no es opcional. Es necesario. Hemos visto cómo crear y ajustar un usuario SFTP restringido para aislar el entorno de trabajo y proteger el resto del VPS. Aprendimos a manejar permisos, a tocar el SSHD y a usar montajes bind para tener flexibilidad sin perder seguridad. Implementar esto te salva de accesos no autorizados y de tus propios errores. Si te atascas o prefieres que un experto se encargue, en RedServicio (redservicio.net) estamos listos para ayudarte con la configuración de tu servidor.

