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.