SFTP enjaulado (chroot) y permitiendo el uso de llaves SSH para conectar
El protocolo SFTP permite una serie de operaciones sobre archivos remotos. SFTP intenta ser más independiente de la plataforma que SCP, por ejemplo, con el SCP encontramos la expansión de comodines especificados por el cliente hasta el servidor, mientras que el diseño SFTP evita este problema. Aunque SCP se aplica con más frecuencia en plataformas Unix, existen servidores SFTP en la mayoría de las plataformas.
El Secure Internet Live Conferencing (SILC) define el protocolo SFTP como su protocolo de transferencia de archivos por omisión. En el SILC, los datos del protocolo SFTP no están protegidos con SSH pero el protocolo de paquetes seguros de SILC se utiliza para encapsular los datos SFTP dentro de los paquetes de SILC para que se la llevara de igual a igual (peer to peer, P2P). Esto es posible ya que SFTP está diseñado para ser un protocolo independiente.
Esta guía muestra como configurar una cuenta SFTP para el envío o recepción de ficheros según los siguientes requirimientos.
- Usuario: user
- Grupo: sftponly
- ssh no estará permitido, solo sftp.
- Se usarán claves ssh para entrar pero no se prohubirá el uso de passwords.
- Carpeta donde tendrá permisos de escritura: /home/user/incoming (puede estar a su vez enlazada a otra)
- Directorio que el verá como raiz: /home/user (Pero no tiene permisos de escritura, únicamente en incoming).
groupadd sftponly useradd user gpasswd -a user sftponly # Se da por hecho que el usuario dispone de un directorio y fichero authorized_keys (/home/user/.ssh/authorized_keys) # Como usuario crear el directorio /home/user/incoming/ su - user mkdir incoming # /home/user/incoming/ exit mkdir -p /etc/ssh/authorized_keys/ cp /home/user/.ssh/authorized_keys /etc/ssh/authorized_keys/user cp /root/.ssh/authorized_keys /etc/ssh/authorized_keys/root chmod 644 /etc/ssh/authorized_keys/user # /etc/ssh/authorized_keys/root kann nur 600 haben. rm -fr /home/user/.* chown root:root /home/user/
Evitar el uso de SSH: cambiar la shell del usuario “user” en /etc/passwd (Se puede utilizar usermod para tal fin, entre otros comandos).
user:x:500:500::/home/user:/bin/false # usermod -s /bin/false user
Modificar la configuración del servidor ssh editando el fichero /etc/ssh/sshd_config.
# override default of no subsystems #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp AuthorizedKeysFile /etc/ssh/authorized_keys/%u Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
service sshd restart
Agregar nuevos usuarios (Borrar ficheros y directorios ocultos del home de cada uno es lógicamente optativo).
sudo usermod -g sftponly username sudo usermod -s /bin/false username
Vincular cualquier otra carpeta del sistema con el directorio incoming previamente creado. De esta manera el usuario estará siempre encerado en la jaula pero podrá trabajar en cualquier otro directorio mientras sea de su propiedad, por ejemplo los ficheros php de un virtualhost.
mkdir /tmp/prueba chown user:user /tmp/prueba/ mount --bind /tmp/prueba/ /home/fauser/incoming/
Si se quiere montar el directorio de manera automática al inicio del sistema, se puede agregar la siguiente linea al fichero “/etc/fstab”.
/tmp/prueba /home/user/incoming none bind'
SFTP Test
sftp user@sftp.servidor Connected to sftp.servidor. sftp> pwd Remote working directory: / sftp> ls incoming sftp> cd incoming sftp> mkdir test sftp> cd test/ sftp> pwd Remote working directory: /incoming/test sftp>
SSH Test. (No se permite el acceso).
ssh user@sftp.servidor This service allows sftp connections only. Connection to sftp.servidor closed.