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.

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.