SFTP, chroot, Connection reset by peer y bad ownership or modes

Con Openssh y a través del fichero de configuración sshd_config, podemos establecer una jaula (chroot) para los usuarios que se conecten vía sftp al servidor. Es posible hacerlo a nivel general, por usuario o por grupos.

El siguiente ejemplo muestra como configurar una jaula sftp para el usuario «foo», donde %h es $HOME del usuario, se podría establecer otro directorio de acceso si fuera necesario. Especificamos otras opciones como evitar el forward de X, deshabilitar los túneles, etc:

/etc/ssh/sshd_config
Match User foo
  ChrootDirectory %h
  ForceCommand internal-sftp
  AllowTcpForwarding no
  PermitTunnel no
  X11Forwarding no

Con una configuración estándar, intentamos acceder con el usuario por sftp:

$ sftp localhost
foo@localhost's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

No hemos podido, podemos ver información relevante sobre el problema en el log auth.log:

Nov 12 19:20:25 lab01 sshd[11839]: pam_unix(sshd:session): session opened for user foo by (uid=0)
Nov 12 19:20:26 lan01 sshd[11998]: fatal: bad ownership or modes for chroot directory "/home/foo"
Nov 12 19:20:26 lab01 sshd[11839]: pam_unix(sshd:session): session closed for user foo
Nov 12 19:21:02 lab01 su[11827]: pam_unix(su:session): session closed for user foo

El problema se reproduce con cualquier combinación de permisos estándar:

drwxr-x---  2 foo        foo        4096 2014-10-23 19:23 foo
drwxr-xr-x  2 foo        foo        4096 2014-10-23 19:23 foo
drwx------  2 foo        foo        4096 2014-10-23 19:23 foo

La clave de la situación es que estamos accediendo con chroot activado. Para que esto sea posible y evitar un posible escalado de privilegios y poder salir del chroot la ruta establecida en el parámetro ChrootDirectory debe tener como propietario al usuario root, y que además ni el grupo ni otros usuarios puedan escribir en ese directorio. En este caso, deberíamos modificar la home del usuario a los siguientes permisos y propietario:

# chown root.foo /home/foo/
# chmod 750 /home/foo/
# ls -l /home/
total 8
drwxr-x---  4 root       foo        4096 2014-11-12 19:22 foo

Y el acceso ya es correcto:

$ sftp localhost
foo@localhost's password: 
Connected to localhost.
sftp>

El problema de esta configuración es que el usuario que accede al servicio sftp nunca va a tener permiso de escritura en el directorio principal de la jaula. Siempre tendrá que tenerlo un nivel a partir del raíz del sftp, en este ejemplo puede escribir a partir del directorio «test»:

# ls -l /home/foo/
total 4
drwxr-xr-x 2 foo  foo  4096 2014-11-12 19:32 test
-rw-r--r-- 1 foo  foo  0    2014-11-12 19:33 aqui_solo_lectura

4 comentarios en “SFTP, chroot, Connection reset by peer y bad ownership or modes

  1. Hola gracias por el articulo, queria saber si es posible escribir en la raiz de la jaula asignada al usuario ya que he intentado todas la combianciones de permisos, propietario y grupo pero no dejas siempre se puede es a partir del directorio que crees dentro de esa jaula sea /home/sftp/pepito/documentos/ y no en /home/sftp/pepito/, lo intente haciendo trampa ya el usuario conectado a su directorio y por otra consola con root cambio los permisos a 777 en /home/sftp/pepito/ y si deja crear directorios pero al crear archivos me salta la alerta que no tengo permisos y el cliente no deja hacer nada, si existe una forma? o esa es la jerarquia de la jaula de root para estos usuario sftp

  2. Hola,

    ¿Habría alguna forma de que el usuario creado para ese directorio pudiera escribir en el directorio raiz?

    Gracias.

    Saludos.

Comments are closed.