La idea de este artículo es crear un usuario que pueda acceder a un servidor a través del servicio SFTP pero que no se le permita acceder mediante SSH. Además, debe restringirse el acceso SFTP a un determinado directorio.
Antes de comenzar es recomendable instalar la última versión de OpenSSH.
El primer paso consiste en crear un usuario llamado "cliente" que no tenga asignada una shell:
# useradd -c "Usuario cliente SFTP" -M -s /bin/nologin cliente # passwd cliente
Crear un directorio base para el servicio SFTP con los permisos adecuados para que el subsistema sftp funcione:
# mkdir /sftpd # chown root:root /sftpd # chmod 755 /sftpd
El usuario "cliente" no tiene permisos para crear nuevos archivos o cerpetas en el directorio base. Es necesario crear un directorio de trabajo para el usuario "cliente" dentro del directorio /sftpd
:
# mkdir /sftpd/cliente
Setear los permisos adecuados para el directorio de trabajo del usuario "cliente":
# chown cliente:cliente /sftpd/cliente # chmod 755 /sftpd/cliente
Verificar los permisos de ambos directorios:
# ll / | grep sftpd drwxr-xr-x 3 root root 4096 May 9 08:02 sftpd
# ll /sftpd total 8 drwxrwx--- 2 cliente cliente 4096 May 9 08:05 cliente
Una vez que se han configurado correctamente los directorios de trabajo, permisos en el sistema de archivos y creado el usuario "cliente", es necesario configurar el servicio SFTP. Editar el archivo de configuración del demonio sshd
(la ubicación cambia si se instala desde los repositorios):
vi /usr/local/etc/sshd_config
Para el caso de este servidor Red Hat Enterprise Linux 5.5 es necesario cambiar el subsistema sftp:
#Subsystem sftp /usr/local/bin/sftp-server Subsystem sftp internal-sftp -f AUTH -l VERBOSE
Agregar las siguientes líneas para configurar el acceso SFTP para el grupo "cliente":
# El grupo "cliente" puede conectarse por sftp pero no por ssh Match Group cliente ForceCommand internal-sftp PasswordAuthentication yes ChrootDirectory /sftpd AllowTcpForwarding no MaxSessions 10
La directiva ForceCommand
impide el acceso por SSH mientras que la directiva ChrootDirectory
restringe el acceso SFTP al directorio /sftpd
y sus subdirectorios (ejecuta chroot
luego de la conexión exitosa). Esta configuración solo aplica para usuarios pertenecientes al grupo "cliente" (de acuerdo a la directiva Match Group
), el resto de los usuarios tienen acceso SSH y SFTP normalmente.
Si se desea restringir el acceso SSH a otros usuarios es posible agregarlos al grupo "cliente" o definir un nuevo grupo secundario, llamado por ejemplo "solosftp", al que pertenezcan todos. El artículo Mantenimiento de usuarios en GNU/Linux explica cómo modificar grupos en usuarios GNU/Linux.
Finalmente es necesario reiniciar el servicio opensshd:
service opensshd restart
Desde un cliente verificar la conexión:
$ sftp cliente@pepeserver37.pepe.org Connecting to pepeserver37.pepe.org... cliente@pepeserver37.pepe.org's password: sftp>
Exito!
Ahora resta confirmar que no se le permita el acceso SSH:
$ ssh cliente@pepeserver37.pepe.org cliente@pepeserver37.pepe.org's password: This service allows sftp connections only. Connection to pepeserver37.pepe.org closed.
Exito! (x2)