Introducción
SSH es un protocolo que permite realizar transferencias seguras a través de un túnel seguro donde toda la información trasmitida va cifrada. Sin embargo, SSH potencialmente se puede volver un arma de dos filo si una cuenta de usuario se ve comprometida. Configurar un sistema con OpenSSH con soporte para Chroot brinda una mayor seguridad al aislar a los usuarios dentro de un entorno separado del sistema principal con un mínimo de herramientas para trabajar y que disminuye los riesgos potenciales en caso de verse comprometida alguna cuenta.
Este manual considera el lector utiliza Red Hat™ Enterprise Linux 4, CentOS 4 o White Box Enterprise Linux 4.
Procedimientos
Se requiere instalar los paquetes se OpenSSH modificados con el parche disponible en
http://chrootssh.sourceforge.net/.
Los siguientes son los componentes mínimos de la jaula.
/bin/sh
/bin/cp
/bin/false
/bin/ls
/bin/mv
/bin/pwd
/bin/rm
/bin/rmdir
/bin/sh
/bin/true
/etc/group
/etc/passwd
/lib/ld-linux.so.2
/lib/libacl.so.1
/lib/libattr.so.1
/lib/libc.so.6
/lib/libcom_err.so.2
/lib/libcrypt.so.1
/lib/libcrypto.so.4
/lib/libdl.so.2
/lib/libnsl.so.1
/lib/libpthread.so.0
/lib/libresolv.so.2
/lib/librt.so.1
/lib/libselinux.so.1
/lib/libtermcap.so.2
/lib/libutil.so.1
/usr/lib/libz.so.1
/usr/lib/libgssapi_krb5.so.2
/usr/lib/libk5crypto.so.3
/usr/lib/libkrb5.so.3
/usr/libexec/openssh/sftp-server
/sbin/nologin |
Es decir, si se requiere utilizar
/bin/sh
, y suponiendo se utiliza
/chroot/
como directorio raíz para la jaula, se debe copiar dentro de éste como
/chroot/bin/sh
, si se requiere
/lib/libtermcap.so.2
se debe copiar como
/chroot/lib/libtermcap.so.2
, si se requiere
/usr/libexec/openssh/sftp-server
se debe copiar como
/chroot/usr/libexec/openssh/sftp-server
, y asi sucesivamente.
Cualquier otra herramienta que se quiera agregar solo requiere estén presentes dentro de la jaula las
bibliotecas correspondientes. Éstas se determinan a través del mandato
ldd
aplicado sobre la herramienta que se quiere utilizar. Por ejemplo, si se quiere añadir el mandato
more
a la jaula, primero se determina que
bibliotecas requiere para funcionar:
Lo anterior devuelve algo como lo siguiente:
libtermcap.so.2 => /lib/libtermcap.so.2 (0x00bea000)
libc.so.6 => /lib/tls/i586/libc.so.6 (0x00515000)
/lib/ld-linux.so.2 (0x004fe000)
|
Lo anterior significa que para poder utilizar
more
dentro de la jaula deberán estar presentes dentro de ésta y en el subdirectorio
lib/
las
bibliotecas libtermcap.so.2, libc.so.6 y ld-linux.so.2.
Los ficheros
/etc/group
y
/etc/passwd
solo necesitan contener la información de los usuarios que interese enjaular así como la
ruta relativa al directorio donde se encuentra la jaula de sus directorios de inicio (es decir, se define
/home/usuario, suponiendo que realmente se localiza en
/var/www/sitiocliente/home/usuario
).
Es indispensable esté presente esta información dentro de la jaula o de otro modo no será posible realizar el ingreso al sistema.
Ejemplo del contenido de /etc/passwd dentro de la jaula
usuario:x:503:503::/home/usuario:/bin/bash
|
Ejemplo del contenido de /etc/group dentro de la jaula
usuario:x:503:
|
Aunque no del todo indispensable para utilizar OpenSSH con Chroot, es buena idea crear los siguiente nodos dentro de la jaula:
mkdir dev
mknod -m 0666 dev/tty c 5 0
mknod -m 0644 dev/urandom c 1 9
mknod -m 0666 dev/null c 1 3
mknod -m 0666 dev/zero c 1 12
|
Solo root deberá poder modificar la estructura de la jaula y su contenido. El objeto es poder permitir el acceso por SSH/SFTP a un entorno aislado del sistema principal. Adicionalmente si se configura el servicio de FTP con jaulas, se podrá acceder indistintamente por FTP, SSH o SFTP.
Ejemplo práctico:
Suponiendo que se tiene un cliente, y éste ha solicitado servicio de hospedaje para su sitio de red a través de HTTP. El cliente quiere dos usuarios diferentes para subir distinto contenido al sitio de red. Los usuarios serán fulano y mengano. El dominio a administrar sera empresa-ejemplo.com, que será administrado exclusivamente por fulano, y se quiere un sub-dominio denominado ventas.empresa-ejemplo.com que será administrado por mengano.
Crear las cuentas de los usuarios
Se crea el directorio /var/www/empresa-ejemplo.com y se copia la estructura de la jaula antes mencionada dentro de subdirectorios relativos a /var/www/empresa-ejemplo.com, teniendo cuidado de dejar a root como propietario a fin de impedir que los usuarios puedan borrar algún subdirectorio del interior.
Se crean las cuentas de los dos usuarios, tomando en cuenta que si se asigna /sbin/nologin o /bin/false como interprete de mandatos, se podrá acceder por FTP pero no se podrá acceder por SSH o SFTP, y si se asigna /usr/libexec/openssh/sftp-server, solo se podrá acceder por SFTP. Si se asigna /bin/sh como interprete de mandatos, se podrá acceder por SSH, SFTP y FTP.
useradd -s /bin/sh -d /var/www/empresa-ejemplo.com/./ fulano
mkdir /var/www/empresa-ejemplo.com
chown root.apache /var/www/empresa-ejemplo.com
passwd fulano
useradd -s /bin/sh -m -d /var/www/empresa-ejemplo.com/./ventas mengano
mkdir /var/www/empresa-ejemplo.com/ventas
chown root.apache /var/www/empresa-ejemplo.com/ventas
passwd mengano |
Cabe señalar que los directorios de inicio pertenecen a root, de este modo se impide que el usuario pueda borrar subdirectorio relativos que se utilizarán para guardar las bitácoras de Apache.
Suponiendo que fulano tiene UID 513 y mengano tiene UID 514, el fichero /var/www/empresa-ejemplo.com/etc/passwd debería tener lo siguiente:
fulano:x:513:513::/var/www/empresa-ejemplo.com/./home/fulano:/bin/sh
mengano:x:514:514::/var/www/empresa-ejemplo.com/./home/mengano:/bin/sh |
El fichero /var/www/empresa-ejemplo.com/etc/group debería tener lo siguiente:
apache:x:48:
fulano:x:513:
mengano:x:514: |
Configuración de Apache.
El dominio www.empresa-ejemplo.com se configurará del siguiente modo:
ServerName www.empresa-ejemplo.com
ServerAlias empresa-ejemplo.com
DocumentRoot /var/www/empresa-ejemplo.com/html
ErrorLog /var/www/empresa-ejemplo.com/logs/error_log
CustomLog /var/www/empresa-ejemplo.com/logs/access_log combined
Options Indexes Indexes Includes
AllowOverrride all
|
Los directorios necesarios se crearán del siguiente modo con siguientes permisos:
mkdir /var/www/empresa-ejemplo.com
chown root.apache /var/www/empresa-ejemplo.com
mkdir -p /var/www/empresa-ejemplo.com/html
chown fulano.apache /var/www/empresa-ejemplo.com/html
mkdir -p /var/www/empresa-ejemplo.com/configs
chown fulano.apache /var/www/empresa-ejemplo.com/configs |
El sub-dominio ventas.empresa-ejemplo.com se configurará del siguiente modo:
ServerName ventas.empresa-ejemplo.com
DocumentRoot /var/www/empresa-ejemplo.com/ventas/html
ErrorLog /var/www/empresa-ejemplo.com/ventas/logs/error_log
CustomLog /var/www/empresa-ejemplo.com/ventas/logs/access_log combined
Options Indexes Indexes Includes
AllowOverrride all
|
Los directorios necesarios se crearán del siguiente modo con siguientes permisos:
mkdir /var/www/empresa-ejemplo.com/ventas
chown root.apache /var/www/empresa-ejemplo.com/ventas
mkdir -p /var/www/empresa-ejemplo.com/ventas/html
chown fulano.apache /var/www/empresa-ejemplo.com/ventas/html
mkdir -p /var/www/empresa-ejemplo.com/ventas/configs
chown fulano.apache /var/www/empresa-ejemplo.com/ventas/configs |
Comprobaciones.
Al acceder con el usuario fulano por SSH o FTP hacia
www.empresa-ejemplo.com se deberá acceder hacia
/var/www/empresa-ejemplo.com
, el cual será presentado como
"/"
. El usuario publicará el contenido HTML dentro de
/html
, podrá guardar contenido fuera de Apache en
/configs
y podrá acceder hacia las bitácoras generadas por apache en
/logs
. Es importante recalcar que mengano no podrá borrar contenido de
/ventas
, como son el directorio de bitácoras
/logs
y el directorio
/html
que se mostrará en Apache como
http://ventas.empresa-ejemplo.com/. En la ausencia de estos Apache no podría iniciar.
Al acceder con el usuario mengano por SSH o FTP hacia www.empresa-ejemplo.com se deberá acceder hacia
/var/www/empresa-ejemplo.com
, el cual será presentado como
"/"
. El usuario publicará el contenido HTML dentro de
/ventas/html
, podrá guardar contenido fuera de Apache en /ventas/configs y podrá acceder hacia las bitácoras generadas por apache en
/ventas/logs
. Es importante recalcar que mengano no podrá borrar contenido de
/ventas
, como son el directorio de bitácoras
/ventas/logs
y el directorio
/ventas/html
que se mostrará en Apache como
http://ventas.empresa-ejemplo.com/. En la ausencia de estos Apache no podría iniciar.
Comentarios
Publicar un comentario