miércoles, 14 de agosto de 2013

Mi charla de SecurimaTICa 2013

El 16 de mayo en Córdoba di una charla en SecurimaTIC2013 junto a Miguel Aguilar (@archuser). Fue una experiencia inolvidable y deseando que llegue el año que viene.
Hablé de NGiNX, Enjaular y Seguridad. Voy a realizar un pequeño resumen.

Lo primero, unos conceptos básicos:

Servidor web -->  Es un programa que se mantiene ejecutando en un ordenador de forma permanente esperando las peticiones de los clientes y este devuelve la información solicitada.

Servidor Proxy --> Es un equipo que actúa como intermediario entre los equipos de una red de área local e Internet. Generalmente, el servidor proxy se utiliza para la web. Se trata de un proxy HTTP. Sin embargo puede haber servidores proxy para cada protocolo de aplicación. EJ: FTP

Proxy inverso --> Es un servidor proxy que, en lugar de permitir el acceso a Internet a usuarios internos, permite a usuarios de Internet acceder indirectamente a determinados servidores internos.



¿Qué es NGiNX?


Es un servidor web, proxy inverso de alto rendimiento y un proxy para protocolos de correo electrónico. Su desarrollo comenzó en el 2002 por Igor Sysoev para solventar un problema llamado C10K (los servidores no soportaban más de 10000 conexiones a la vez).

Entre sus ventajas más importantes es su estabilidad, bajo consumo de recursos y su sencilla configuración.

Es utilizado por Github, Wikipedia, Wordpress y muchos más.

 Esquema del funcionamiento:


¿Qué es Enjaular? ¿Por qué es necesario?


Para explicar esta necesidad, vamos a hacer un ejercicio de abstracción:

Supongamos que queremos hacer una exposición (aplicación web) en nuestra casa (servidor).

Si queremos que asista gente, debemos abrir una puerta. Da igual que tengamos una reja de 3 metros (cortafuegos), electrificada y con cámaras, debemos abrir una puerta y dejar que entre el personal.

Una vez dentro, las habitaciones estarán cerradas, posiblemente con llave y además, habremos fijado los espacios donde nuestros invitados podrán estar. Sin embargo, si alguien consigue una de las llaves podría entrar en el resto de estancias.

Para evitar esto, lo que vamos a hacer es lo siguiente:

Crearemos una “casa” con la misma “·exposición” que la original, pero con todas las “habitaciones” vacías, de forma que los invitados, aunque consigan entrar en otra habitación, no hallarán nada.

Una jaula no es más que un directorio dentro de nuestro sistema, donde vamos a alojar los binarios y bibliotecas, archivos de configuración, etc. que necesitemos para ejecutar el servicio que queramos dar o aquello que queramos probar, sin comprometer nuestro sistema. Una vez está creada, con la orden chroot, le indicamos al sistema que, a partir de ese momento, el directorio raíz de nuestro sistema está situado en otro punto.

El enjaulado debe realizarse, sobre todo, con aquellos servicios que estén abiertos a Internet, pues serán los que sufrirán los ataques. Además, debemos tener en cuenta que dentro de esta jaula debemos dejar lo mínimo para que poder dar el servicio.

Jaula en Debian


#!/bin/bash --verbose
#######################################
# Empezamos
#######################################
# Creamos la estructura de directorios
#######################################

mkdir -vp /srv/nginx/dev
mkdir -vp /srv/nginx/etc/nginx/
mkdir -vp /srv/nginx/usr/{lib,sbin,bin}
mkdir -vp /srv/nginx/usr/share/nginx
mkdir -vp /srv/nginx/var/{log,lib}/nginx
mkdir -vp /srv/nginx/srv/http
mkdir -vp /srv/nginx/{run,tmp}

cd /srv/nginx/
ln -s usr/lib lib
cd lib
ln -s ../lib i386-linux-gnu
ln -s i386-linux-gnu i686
ln -s i386-linux-gnu/i686 cmov


[[ `uname -m` == "x86_64" ]] && {
 ln -s usr/lib lib64 ;
 cd usr ;
 ln -s lib lib64 ;
}

########################################
#Creamos los dispositivos
########################################

mknod -m 0666 /srv/nginx/dev/null c 1 3
mknod -m 0666 /srv/nginx/dev/random c 1 8
mknod -m 0444 /srv/nginx/dev/urandom c 1 9

sleep 5

########################################
#Copiamos los binarios
########################################

cp -vr /usr/share/nginx/* /srv/nginx/usr/share/nginx
cp -v /usr/sbin/nginx /srv/nginx/usr/sbin/
cp -vrp /var/lib/nginx /srv/nginx/var/lib/

touch /srv/nginx/etc/shells

#########################################
#Copiamos la bibliotecas necesarias
#########################################
cp -v $(ldd /usr/sbin/nginx |grep /usr/lib|sed -r 's/(.+) (\/.*) (.*)/\2/') /srv/nginx/usr/lib
cp -v /lib/i386-linux-gnu/i686/cmov/libnsl* /srv/nginx/lib
sleep 2
cp -v $(ldd /usr/sbin/nginx |grep /lib/ | grep -v /usr/lib|sed -r 's/(.+)(\/lib\/.*) .*/\2/') /srv/nginx/lib
sleep 2
cp -v /lib/libnss_* /srv/nginx/lib
cp -v /lib/i386-linux-gnu/libnss* /srv/nginx/lib
sleep 2
cp -rfvL /etc/{services,localtime,nsswitch.conf,protocols,hosts,ld.so.cache,ld.so.conf,resolv.conf,host.conf,nginx} /srv/nginx/etc

sleep 5
#########################################
#Creamos los usuarios
#########################################

echo -e "www-data:x:33:\nnogroup:x:65534:" > /srv/nginx/etc/group
echo -e "www-data:x:33:33:www-data:/var/www:/bin/sh\nnobody:x:65534:65534:nobody:/nonexistent:/bin/sh" > /srv/nginx/etc/passwd
echo -e "www-data:*:15836:0:99999:7:::\nnobody:*:15836:0:99999:7:::"  > /srv/nginx/etc/shadow
echo -e "www-data:*::\nnogroup:*::" > /srv/nginx/etc/gshadow

############################################################
#Para poder utilizar puertos hasta el 1024 dentro del chroot
############################################################

setcap 'cap_net_bind_service=+ep' /srv/nginx/usr/sbin/nginx

############################################################
#Estableciendo permisos y montando los dispositivos
############################################################

chmod ugo+rw /srv/nginx/tmp
chmod ugo+rw /srv/nginx/run
chown www-data:www-data /srv/nginx/var/log/nginx
mount -t tmpfs none /srv/nginx/run -o 'noexec,size=1M'
mount -t tmpfs none /srv/nginx/tmp -o 'noexec,size=100M'


#######################################################
#Copiamos las aplicaciones, phpmyadmin en nuestro caso
#######################################################
#mkdir -p /srv/nginx/{/usr/share/phpmyadmin/,/etc/phpmyadmin/,/var/lib/phpmyadmin/}
#cp -r /usr/share/phpmyadmin /srv/nginx/usr/share/
#cp -r /etc/phpmyadmin /srv/nginx/etc/
#cp -r /var/lib/phpmyadmin /var/lib/

######################################################
# Otro método, montando los directorios
#######################################################
mkdir -p /srv/nginx/usr/share/webapp/phpmyadmin
mkdir -p /srv/nginx/usr/etc/webapps/
mount --bind /home/mary /srv/nginx/home/mary



Jaula en Archlinux

#!/bin/bash --verbose
#######################################
# Empezamos
#######################################
# Creamos la estructura de directorios
#######################################

mkdir -p /srv/nginx/dev
mkdir -p /srv/nginx/etc/nginx
mkdir -p /srv/nginx/usr/{lib,bin}
mkdir -p /srv/nginx/usr/share/nginx
mkdir -p /srv/nginx/var/{log,lib}/nginx
mkdir -p /srv/nginx/srv/http
mkdir -p /srv/nginx/{run,tmp}
cd /srv/nginx/
ln -s usr/lib lib
[[ `uname -m` == "x86_64" ]] && {
   ln -s usr/lib lib64
   cd usr
   ln -s lib lib64
}


sleep 5
########################################
#Creamos los dispositivos
########################################
mknod -m 0666 /srv/nginx/dev/null c 1 3
mknod -m 0666 /srv/nginx/dev/random c 1 8
mknod -m 0444 /srv/nginx/dev/urandom c 1 9


sleep 5
########################################
#Copiamos los binarios
########################################
cp -r /usr/share/nginx/* /srv/nginx/usr/share/nginx
cp  /usr/bin/nginx /srv/nginx/usr/bin/
cp -rp /var/lib/nginx /srv/nginx/var/lib/

touch /srv/nginx/etc/shells

sleep 5
#########################################
#Copiamos la bibliotecas necesarias
#########################################
cp $(ldd /usr/bin/nginx |grep /usr/lib|sed -r 's/(.+) (\/.*) (.*)/\2/') /srv/nginx/usr/lib
cp /lib/ld-linux-x86-64.so.2 /srv/nginx/lib
cp /usr/lib/libnss_* /srv/nginx/usr/lib
cp -rfvL /etc/{services,localtime,nsswitch.conf,nscd.conf,protocols,hosts,ld.so.cache,ld.so.conf,resolv.conf,host.conf,nginx} /srv/nginx/etc

sleep 5
#########################################
#Creamos los usuarios
#########################################
echo -e  "http:x:33: \nnobody:x:99:" > /srv/nginx/etc/group
echo -e  "http:x:33:33:http:/:/bin/false \nnobody:x:99:99:nobody:/:/bin/false" > /srv/nginx/etc/passwd
echo -e  "http:::\nnobody:::" > /srv/nginx/etc/gshadow

sleep5
############################################################
#Para poder utilizar puertos hasta el 1024 dentro del chroot
############################################################
setcap 'cap_net_bind_service=+ep' /srv/nginx/usr/bin/nginx

sleep 5
############################################################
#Estableciendo permisos y montando los dispositivos
############################################################
chmod ugo+rw /srv/nginx/tmp
chmod ugo+rw /srv/nginx/run

mount -t tmpfs none /srv/nginx/run -o 'noexec,size=1M'
mount -t tmpfs none /srv/nginx/tmp -o 'noexec,size=100M'
chown  http:log /srv/nginx/var/log/nginx

sleep 5
######################################################
# Otro método, montando los directorios
#######################################################
mkdir -p /srv/nginx/usr/share/webapps/
mkdir -p /srv/nginx/etc/webapps/
mount --bind /usr/share/webapps/ /srv/nginx/usr/share/webapps/
mount --bind /etc/webapps /srv/nginx/etc/webapps
cd /srv/nginx/srv/http
sudo ln -s /usr/share/webapps/phpMyAdmin/ phpmyadmin

¿Está nuestro servidor protegido? ¡NO!


Un servidor web no es sólo la aplicación web sino también las opciones de conexiones que necesite el cliente FTP, SSH, correo, etc..

Con lo cual nos podemos encontrar con distintos ataques.

Malware --> Es un software que tiene como objetivo infiltrarse o dañar un ordenador o sistema de información sin el consentimiento de su propietario. Esté termino incluye virus, gusanos, troyanos, rootkits, etc. Podemos ser infectados de muchas formas por ejemplo: un usb corrupto, al descargar una aplicación, etc...

DDOS --> Hablar de ataques de denegación de servicio es hablar de una red de zombis (un conjunto de ordenadores controlados con fines maliciosos)

¿Cómo consiguen tener un ejército de zombis?

Es muy sencillo: Mediante la infección de  cualquier dispositivo con un malware.  El usuario, normalmente, no es consciente de que su dispositivo es uno de los zombies.

Este germen permanece latente en el núcleo del sistema hasta que es llamado para atacar.

Al hablar de este tipo de ataque, no podemos dejar de hablar del gran negocio  negro, en el que empresas y particulares alquilan estos servicios para atacar a la competencia. Un claro ejemplo lo vi en Rooted Con 2013 en la charla de David Barroso.

video


Fuerza bruta --> Es la forma de recuperar una clave probando todas las combinaciones posibles hasta encontrar aquellas que permite acceso.

Miguel habló de las herramientas para defendernos de estos ataques, pueden encontrar información aquí.

2 comentarios:

  1. Gracias, veo que aquí hay cosas diferentes que en la revista #6 sobre la instalación de este servidor.

    Voy a probar y luego te cuento, porque llegue aquí para preguntarte :)

    ResponderEliminar
  2. Hola amiga, otra vez posteo aquí, mira lo que me da cuando intenta hacer un status al servicio.

    sudo systemctl status nginx-jail.service
    nginx-jail.service - A high performance web server and a reverse proxy server
    Loaded: loaded (/usr/local/lib/systemd/system/nginx-jail.service; disabled)
    Active: failed (Result: exit-code) since lun 2013-08-19 21:12:33 AST; 6s ago
    Process: 775 ExecStartPre=/usr/bin/chroot --userspec=http:http /srv/nginx/usr/sbin/nginx -t -q -g pid /srv/nginx/run/nginx.pid; daemon on; master_process on; (code=exited, status=125)

    ago 19 21:12:33 Core2Duo systemd[1]: Starting A high performance web server and a reverse proxy server...
    ago 19 21:12:33 Core2Duo systemd[1]: nginx-jail.service: control process exited, code=exited status=125
    ago 19 21:12:33 Core2Duo systemd[1]: Failed to start A high performance web server and a reverse proxy server.
    ago 19 21:12:33 Core2Duo systemd[1]: Unit nginx-jail.service entered failed state.

    Pienso que talvez sea un error de permisos.

    Este es el estado de ls -l
    ls -l /srv/nginx/
    total 20
    drwxr-xr-x 2 root root 4096 ago 19 20:48 dev
    drwxr-xr-x 4 root root 4096 ago 19 20:48 etc
    lrwxrwxrwx 1 root root 7 ago 19 20:48 lib -> usr/lib
    lrwxrwxrwx 1 root root 7 ago 19 20:48 lib64 -> usr/lib
    drwxrwxrwt 2 root root 60 ago 19 20:54 run
    drwxr-xr-x 3 root root 4096 ago 19 20:48 srv
    drwxrwxrwt 2 root root 40 ago 19 20:48 tmp
    drwxr-xr-x 6 root root 4096 ago 19 21:02 usr


    Espero que puedas ayudarme, porque quiero tener ese servidor funcionando en chroot.

    Gracias por el post.

    ResponderEliminar