Ir al contenido principal

Integrar OpenSSH y Chroot

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:
ldd /bin/more
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

Entradas más populares de este blog

JSP y MySQL Conexion a Base de Datos

Tema anterior: http://superahacker.blogspot.com/2009/06/instalacion-netbeans-glassfish.html El modulo JSP con conexion a una base de datos MySQL, tiene las siguientes caracteristicas usar una clase Java llamada "Customers" que se encuentra en un package llamado "Mypackage" , para usar sus metodos y con ellos llevar acabo una consulta.

JSP y MsSQL Conexion a Base de Datos

Tema anterior: http://superahacker.blogspot.com/2009/09/jsp-y-mysql-conexion-base-de-datos.html El modulo JSP con conexion a una base de datos Ms SQL Server, tiene las siguientes caracteristicas usar una clase Java llamada "Customers" que se encuentra en un package llamado "Mypackage" , para usar sus metodos y con ellos llevar acabo una consulta.

FreeTDS para el acceso a MsSQL desde PHP en Linux CentOS 5

Tema Anterior: http://superahacker.blogspot.com/2009/04/instalacion-de-unixodbc-para-la.html En esta ocasion la situación es como conectar con PHP 5 desde un Servidor Linux a una base de Datos Ms Sql Server en Servidor Windows.