Configurar rssh Chroot Jail en Linux para bloquear a los usuarios en su directorio home

0 Comments

El dia de hoy un amigo me pregunto como puede restringir a un usuario para que cuando se conecte por ssh solo tenga acceso a su /home.

Esto de restringir acceso a los directorios del sistema de un usuario en especifico no es nada nuevo, pero yo lo desconocia.

Asi que para no quedar mal me puse a investigar y encontre que el software rssh soporta la opcion de chroot. Si queremos encarcelar usuarios tenemos la opcion chrootpath.

chrootpath

Esta opcion es utilizada para establecer el directorio raiz donde la cárcel chroot estara ubicada, esto con el fin de aumentar la seguridad del sistema.

Un chroot en Linux o Unix es una operacion la cual cambia el directorio raiz para el usuario. Solo afecta el proceso actual y sus hijos.

Si tu directorio home predeterminado es /home/usuario normalmente puedes acceder a los archivos en los directorios /etc, /bin o sbin. Esto permite a un atacante instalar programas desde el servidor web dentro de /tmp. La funcionalidad de chroot permite restringuir los accesos al sistema de archivos y encierra al usuario dentro de su directorio inicial o home.

Configurando rssh chroot

Directorio Chroot: /usuarios
Es posible montar el sistema de archivoscon las opciones noexec/nosuid para mejorar la seguridad.

Directorios requeridos en la jaula:

  • /usuarios/dev – Archivo de dispositivos
  • /usuarios/etc – Archivos de configuracion tales como passwd
  • /usuarios/lib – Librerias compartidas
  • /usuarios/usr – rssh y otros binarios
  • /usuarios/bin – Copiar el shell predeterminado (/bin/csh o /bin/bash)

Archivos necesarios en la jaula en el directorio /usuarios (predeterminado para RHEL / CentOS / Linux Debian ):

  • /etc/ld.so.cache
  • /etc/ld.so.cache.d/*
  • /etc/ld.so.conf
  • /etc/nsswitch.conf
  • /etc/passwd
  • /etc/group
  • /etc/hosts
  • /etc/resolv.conf
  • /usr/bin/scp
  • /usr/bin/rssh
  • /usr/bin/sftp
  • /usr/libexec/openssh/sftp-server o /usr/lib/openssh/sftp-server
  • /usr/libexec/rssh_chroot_helper o /usr/lib/rssh/rssh_chroot_helper (el suid tiene que ser establecido en este binario)
  • /bin/sh or /bin/bash (shell predeterminado)

Para aumentar la seguridad limiten la cantidad de binarios dentro de la jaula al minimo. Usualmente /bin/bash y /bin/sh no son necesarios pero en algunos sistemas puede dar error.

Acerca del sistema de archivos

Los archivos tienen que estar dentro del directorio de la jaula (en nuestro caso de ejemplo, /usuarios) y a su vez dentro de directorios que imiten su ubicacion en el sistema de archivos de root (/).
Por ejemplo, /usr/bin/rssh se encuentra en /. Si nuestra jaula esta localizada en /usuarios, entonces copiamos /usr/bin/rssh a /usuarios/usr/bin/rssh.

Las siguientes instucciones han sido probadas satisfactoriamente en:

  • FreeBSD
  • Solaris UNIX
  • RHEL / Redhat / Fedora / CentOS Linux
  • Debian Linux

Constuyendo el entorno Chroot

Creamos todos los directorios necesarios:

deathbian:~# mkdir -p /usuarios/{dev,etc,lib,usr,bin}
deathbian:~# mkdir -p /usuarios/usr/bin
deathbian:~# mkdir -p /usuarios/libexec/openssh

Creamos /usuarios/dev/null:

deathbian:~# mknod -m 666 /usuarios/dev/null c 1 3

Copiamos los archivos de configuracion de /etc/, dentro del directorio de la jaula /usuarios/etc:

deathbian:~# cd /usuarios/etc
deathbian:~# cp /etc/ld.so.cache .
deathbian:~# cp -avr /etc/ld.so.cache.d/ .
deathbian:~# cp /etc/ld.so.conf .
deathbian:~# cp /etc/nsswitch.conf .
deathbian:~# cp /etc/passwd .
deathbian:~# cp /etc/group .
deathbian:~# cp /etc/hosts .
deathbian:~# cp /etc/resolv.conf .

Abrimos los archivos /usuarios/group y /usuarios/passwd para remover las cuentas de root y las demas.

Ahora copiamos los archivos binarios requeridos hacia el directorio /usuarios/bin:

deathbian:~# cd /usuarios/usr/bin
deathbian:~# cp /usr/bin/scp .
deathbian:~# cp /usr/bin/rssh .
deathbian:~# cp /usr/bin/sftp .
deathbian:~# cd /usuarios/usr/libexec/openssh/
deathbian:~# cp /usr/libexec/openssh/sftp-server .
O
deathbian:~# cp /usr/lib/openssh/sftp-server .
deathbian:~# cd /usuarios/usr/libexec/
deathbian:~# cp /usr/libexec/rssh_chroot_helper
O
deathbian:~# cp /usr/lib/rssh/rssh_chroot_helper
deathbian:~# cd /usuarios/bin/
deathbian:~# cp /bin/sh .
O
deathbian:~# cp /bin/bash .

Copiamos todos los archivos de las librerias compartidas

Los archivos de las librerias que cualquiera de estos archivos necesite se pueden encontrar utilizando el comando ldd / strace. Por ejemplo, al correr ldd contra /usr/bin/wget, produce la siguiente informacion:

deathbian:~# ldd /usr/bin/wget
linux-gate.so.1 =>  (0xb7fdc000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fc2000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7fb9000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7f76000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7e34000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ce5000)
/lib/ld-linux.so.2 (0xb7fdd000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7ccd000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7cb8000)

Necesitamos copiar todas esas librerias, les recomiendo usar el script l2chroot con este proposito. El script lo descargan de esta manera:

deathbian:~# cd /sbin
deathbian:~# wget -O l2chroot http://www.cyberciti.biz/files/lighttpd/l2chroot.txt
deathbian:~# chmod +x l2chroot

Editamos el script l2chroot y cambian la variable BASE por nuestro directorio chroot (jail), BASE=”/usuarios”:
Ahora copiamos todos los archivos de las librerias compartidas:

deathbian:~# l2chroot /usr/bin/scp
deathbian:~# l2chroot /usr/bin/rssh
deathbian:~# l2chroot /usr/bin/sftp
deathbian:~# l2chroot /usr/libexec/openssh/sftp-server
O
deathbian:~# l2chroot /usr/lib/openssh/sftp-server
deathbian:~# l2chroot /usr/libexec/rssh_chroot_helper
O
deathbian:~# l2chroot /usr/lib/rssh/rssh_chroot_helper
deathbian:~# l2chroot /bin/sh
O
deathbian:~# l2chroot /bin/bash

Modificar la Configuracion de Syslogd

La funcion de la libreria de syslog trabaja escribiendo mensajes a un archivo FIFO como /dev/log. Se necesita pasar la opcion -a /path/to/chroot/dev/log. Utilizando este argumento se puede especificar sockets adicionales en los que syslogd escucha. Esto es necesario si van a permitir que un daemon corra dentro del entorno chroot(). Se pueden utilizar hasta 19 sockets adicionales. Si el entorno necesita mas, se puede aumentar el simbolo MAXFUNIX dentro del archivo fuente syslogd.c.

Editamos el archivo /etc/sysconfig/syslog, buscamos la linea:
SYSLOGD_OPTIONS="-m 0"
y la cambiamos por:
SYSLOGD_OPTIONS="-m 0 -a /usuarios/dev/log"

Guardamos y cerramos el archivo para luego reiniciar syslog.

deathbian:~# /etc/init.d/syslog restart

Si estan utilizando Debian / Ubuntu, apliquen estos cambios descritos al archivo /etc/default/syslogd.

Establecer el path de chroot

Editamos el archivo /etc/rssh.conf, y cambiamos la variable a chrootpath=/usuarios y guardamos.

Agregar el usuario a la jaula

Ahora configuramos la cuenta del usuario de rssh. Por ejemplo, con el siguiente comando agregamos al usuario fher98 dentro de chroot:

deathbian:~# useradd -m -d /usuarios/fher98 -s /usr/bin/rssh fher98
deathbian:~# passwd fher98

Ahora fher98 puede logearse usando sftp o copiar archivos utilizando scp. Incluso podra crear, trabajar y transferir archivos, pero no tendra acceso a navegar a otro directorio del sistema.

Deja tus preguntas o comentarios