===== SFTP enjaulado (chroot) y permitiendo el uso de llaves SSH para conectar =====
El protocolo [[https://es.wikipedia.org/wiki/SSH_File_Transfer_Protocol|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.