de-charleta

De Charleta: “¿Dónde están los hackers de las canciones?” (Román Ramírez)

En esta ocasión os traigo una charla que acabo de ver tras la recomendación en la lista de la rooted. Román Ramírez habla a pecho descubierto en la CONPilar17 sobre experiencias y recomendaciones para los que quieren estar en el mundo de la Seguridad. Hay cosas muy interesantes que escuchar y sobre las que reflexionar, ¡no te la pierdas!

Román es un profesional con más de 15 años en el mundo tecnológico, especializado en seguridad. Actualmente es el responsable de Seguridad en Ferrovial, pero casi todos le hemos conocido como fundador de nuestro congreso favorito: RootedCON.

Famoso por su sinceridad y la fuerza con la que dice las cosas, todo bien claro y directo. Escuchar una charla suya no deja indiferente, no dejes de ver esta.

CONPilar 2017.

Español.

voluntechies

Voluntechies, tecnología al servicio de los niños

Hace unas semanas mi antiguo profesor, Chema Alonso, publicó en su blog una entrada sobre Voluntechies, una iniciativa muy interesante que utiliza la realidad virtual para tratar de aportar a niños enfermos un poco de distracción y diversión de cara a su lucha diaria.

La verdad es que el post me tocó la fibra sensible por varios motivos, el primero por una introducción de Chema sobre sus dos hijas en las que me sentí muy identificado. Los que tenemos esos pequeños seres por casa sabemos de su increíble capacidad para asombrarse, pasarlo bien y ser felices durante todo el día. Mis pitufas de 3 y 1 año hacen que viva cansado, sin fuerzas, tomando café como un condenado para sobrevivir a las noches de tos, mocos y despertares varios. Convierten mis tardes en juegos de alfombra (o en visionados recurrentes de películas de princesas) y los fines de semana en interminables sesiones de parque rodeados por padres que no miran por la seguridad y educación de sus hijos (o de aquellos a los que sus hijos no respetan).

Lo increíble es que me encanta, adoro a esas pequeñas personitas que se saltan todos mis protocolos de seguridad y me hacen salir de la rutina y el ajetreo laboral.

El segundo motivo, por mi experiencia personal trabajando con niños. Allá por 2.007 tuve la gran suerte de poder formar parte del grupo de investigación del departamento de Lenguajes y Sistemas Informáticos de la Universidad de Granada, en el proyecto Sc@ut.

Sc@ut era un comunicador basado en pda (si, en aquel momento no existían los smartphones…) que permitía una comunicación básica a personas con autismo o daños cerebrales. Su uso era muy sencillo y se podían configurar acciones mediante un editor de plantillas. Con un poco de entrenamiento, se comenzaron a obtener resultados muy buenos. Fruto de aquello obtuvimos varios premios, siendo el más importante la Imagine Cup de Microsoft, un concurso de desarrollo de software que nos terminó llevando a Korea para participar en las finales mundiales.

Os dejo un enlace a un video de TVE2 en el que se comenta el concurso y en el que me podéis ver simulando ser una persona con autismo:

¿Por qué os cuento esto? Sencillo, Sc@ut era un ejemplo de tecnología que ayudaba a personas con un problema y les permitía mejorar su calidad de vida. ¿No es maravilloso que lo que hacemos los que nos dedicamos a esto de la informática pueda ser de utilidad más allá del mundo laboral? Yo tengo dos pequeñas por las que daría la vida, pero hay veces en las que no está en tu mano poder encontrar soluciones. Si la tecnología puede hacer que su complicado día a día sea mejor, entonces hay que celebrarlo y difundirlo.

Es por eso que recojo el guante lanzado por Chema para hacer llegar la labor de Voluntechies un poco más lejos y animo a los muchos o pocos lectores de este blog a echarle un vistazo a su web y a asistir a alguno de sus talleres.

Os aseguro que no hay nada más gratificante que trabajar en algo que ayuda a los demás. ¿Os animáis a probarlo?

De cañas con el CDO y el CISO de Telefónica (Chema Alonso y Alejandro Ramos)

Al igual que hace Chema Alonso con algunos de sus posts, aprovecho la vuelta de vacaciones para tirar de batallita. En aquel momento no podía imaginarlo (ni ellos tampoco), pero ahora puedo decir que estuve de cañas con los que han llegado a ser dos de las personas más importantes dentro de la jerarquía de Telefónica.

Corría el año 2011 y era el último día de clase del Máster de Seguridad en las TICs de la Universidad Europea de Madrid. Tocaba resolver los ejercicios de forense en Linux que un tal Alejandro Ramos nos había asignado.

CDO-CISO-Telefonica-Clase1

Acabamos de corregir el último problema y una cabeza con gorro asomó por la puerta. Era Chema que venía a despedirse del grupo. Como delegado de clase, tuve que insistir por lo menos diez segundos para convencer a los dos de una despedida como marcan los cánones granaínos: en un bar.

CDO-CISO-Telefonica-Clase2

El resto de la historia es confidencial y queda para el recuerdo de los colegas de clase. Aunque en ese momento Chema estaba un poco mosqueado con algunos de nosotros por un proyecto de fin de curso… ambos invitaron a unas rondas de cierre de clases.

El tiempo pasa volando y, cinco años después, Chema Alonso ha sido nombrado como nuevo Chief Data Officer (CDO) de Telefónica y ahora ha sido Alejandro Ramos el que llega como Chief Informacion Security Officer (CISO) al mismo sitio.

Desde este blog, queremos felicitar a estos dos cracks y les deseamos la mejor de las suertes (aunque con tanto talento, la suerte apenas les haga falta).

Por supuesto, recomiendo a todos los que estén interesados en el mundo de la seguridad que le echen un vistazo al Máster, ya que tanto Chema como Alex siguen siendo profesores.

También os enlazo los canales de Youtube que tienen ambos en los que podréis ver las charlas que ofrecen en los diferentes congresos de seguridad en los que participan:

 

Dicho todo esto, seguimos con la actividad habitual del blog. En breve hablamos de APIs, ¿te lo vas a perder?

Contenedores Linux y seguridad. Docker

Un poco de historia

Las técnicas de para circunscribir un proceso a un espacio aislado dentro de un sistema operativo no es algo nuevo. El primer antecedente, chroot, se remonta a 1979 y fue introducido como un concepto en desarrollo para sistemas Unix que permitía aislar dentro una ruta un proceso y sus hijos de modo que para ellos, esa ruta pareciese ser el directorio raíz. Más adelante,  en 1982, chroot se incorpora a sistemas operativos BSD. En 1991 es utilizado por William Cheswick, un programador e investigador en seguridad de red, para implementar una honeypot y monitorizar comportamientos maliciosos.

Estas semillas iniciales supusieron los primeros pasos de lo que se acabaría consolidando como virtualización de sistemas con la aparición de hypervisores, software que permite la ejecución virtual de sistemas completos emulando tanto el hardware como el sistema operativo.

Dejando a un lado lo que a virtualización de hardware e hypervisores se refiere, en este artículo vamos a ofrecer una visión de los contenedores, una tecnología que,  partiendo de la idea base de chroot, extiende este concepto para conseguir ejecutar entornos aislados del sistema. Con el uso de contenedores, en realidad no se está virtualizando nada sino que se están manteniendo en un espacio aislado (namespace) los procesos y ficheros necesarios mientras se reutiliza el kernel del sistema anfitrión.

La primera aproximación sólida a los contenedores en sistemas *nix aparece  en FreeBSD en el año 2000 con la introducción del comando jail que orienta y amplia las funcionalidades de chroot. A partir de ahí, se empieza a extender a otras plataformas como Solaris, el sistema operativo de Sun Microsystems, que en  2005 incorpora Solaris Zones permitiendo crear subsistemas aislados denominados zonas. De igual forma otros fabricantes como IBM con AIX WPARs,  o HP con HP-UX Containers adoptan implementan soluciones similares.

Finalmente, en 2008, llega a Linux con LXC (Linux Containers) que da soporte al kernel para los namespaces. Los namespaces constituyen el elemento base de los contendores y es una funcionalidad del kernel que proporcionan facilidades para crear una abstracción del sistema de modo que, todo lo que sucede fuera del espacio del contenedor sea invisible al interior.

¿Virtualización? ¿Qué virtualización?

La evolución de los namespaces ha permitido pasar del “enjaulamiento” de rutas de chroot hasta los contenedores que proporcionan espacios aislados en todos los niveles: espacio de usuario, espacio de procesos, de red, puntos de montaje, etc. Esta situación se acerca a estado parecido a la virtualización que quizás podemos entender mejor como una virtualización de sistema operativo o mejor dicho, una “paralelización” puesto que se comparte una arquitectura y un kernel y no se virtualiza ningún elemento hardware o dispositivo lo que contribuye a un mejor rendimiento.

 

Screen Shot 2016-06-21 at 08.10.45

Contenedores vs virtualización

La popularidad y la utilización de los namespaces ha crecido enormemente desde su integración directa, en 2013 en el kernel 3.8 de Linux. Desde entonces se han consolidado y afianzado desarrollos basados en contenedores como por ejemplo  Docker o CoreOS Rkt entre otros.

Contenedores vs hipervisores

Los contenedores frente a la virtualización de hardware mejoran aspectos como:

Velocidad: Compartir el kernel significa cero latencia para levantar con contenedor.

Gestión de disco: El almacenamiento basado en sistemas de ficheros con características Copy on Write (CoW) permiten reutilizar y compartir segmentos de sólo lectura de datos (imágenes base)  entre distintos contenedores y trabajar con deltas (capas de escritura) que cada contenedor puede ir añadiendo y manteniendo de forma independiente. Sistemas de ficheros como Union Filesystems (aufs), OverlayFS o Brtfs permiten este modo de operación.

lobo@SI_$ docker info
Containers: 3
 Running: 2
 Paused: 0
 Stopped: 1
Images: 102
Server Version: 1.11.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 87
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge null host
Kernel Version: 4.0.0-kali1-amd64
Operating System: Kali GNU/Linux 2.0 (sana)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 997.8 MiB

Portabilidad: Un contenedor puede trasladarse a cualquier otro sistema siempre que comparta la misma arquitectura de CPU, sin necesidad de adaptaciones. Esto permite trabajar de forma rápida y cómoda con repositorios que facilitan enormemente tareas de despliegue y desarrollo.
Por otro lado algunos inconvenientes son:
Seguridad: La implementación de los namespaces es relativamente reciente, y esto unido a que el kernel es compartido, incrementa los riesgos de comprometer el host y con ello todos los contenedores que estuviesen en el mismo. Punto único de fallo.
Entornos únicos: La imposibilidad de virtualizar otros sistemas operativos puede ser una desventaja en desarrollos multiplataforma.
Escalado y migración: Aunque existen soluciones de orquestación que permiten la ejecución multicontenedor distribuidos en distintas ubicaciones, la complejidad aumenta notablemente según lo hace el número de hosts. Esto unido a la imposibilidad de migración “en caliente” para mover contenedores supone una desventaja ante soluciones completas de virtualización.

Contenedores y seguridad. Namespaces, cgroups, capabilities y más.

El aislamiento en los contenedores Linux se sustenta principalmente en dos funcionalidades del kernel: los namespaces y cgroups, que haciendo una aproximación sencilla podemos identificar como los mecanismos que proporcionarán la base para el aislamiento a nivel cualitativo y cuantitativo respectivamente. Desde la versión de kernel 2.6, ambas tecnologías se han ido asentando paulatinamente hasta una completa integración en el kernel 3.8. Revisando la configuración del kernel (generalmente existe un fichero de config en /boot) podemos averiguar el grado de soporte en la compilación en uso, como muestran las siguientes imágenes para un kernel 4.0:

lobo@SI_$ grep -E 'NAMESPACES|_NS=y' /boot/config-4.0.0-kali1-amd64
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_NCPFS_NFS_NS=y
CONFIG_NCPFS_OS2_NS=y

lobo@SI_$ grep CGROUP /boot/config-4.0.0-kali1-amd64
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
# CONFIG_CGROUP_HUGETLB is not set
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=m
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y

Desde el punto de vista de la seguridad, los namespaces permitirán espacios aislados para los procesos que contienen, lo que protege el sistema de acciones que suceden en el interior de la sandbox creada. Por otra  parte los control groups (cgroups), permiten gestionar los recursos que se atribuyen a ciertos procesos, siendo posible de este modo asignar límites cuantitativos de CPU, memoria, acceso a disco, etc. Esto es muy útil para asegurar que el sistema no pueda ver comprometidos sus recursos.

Por otra parte, el uso de las capabilities del kernel complementaría la seguridad de los namespaces y los cgroups, restringiendo y evitando acciones privilegiadas dentro del contenedor que podrían establecer una vía de escape de la sandbox.

Todo lo anterior unido a la integración de los contenedores con mecanismos de control de acceso como SELinux completa un entorno de seguridad suficientemente robusto que, como siempre, necesita de un ajuste y una configuración apropiada.

containers_security_layers

Aislamiento en contenedores

Una vez introducidos los mecanismos principales de seguridad de los contenedores: namespaces, cgroups, capabilities y SELinux, vamos a echar un vistazo a su funcionamiento.

Namespaces

Existen 6 tipos básicos de namespaces relacionados con distintos aspectos del sistema:

  • NETWORK namespace. Aislamiento de red. Así, cada namespace de red tendrá sus propios interfaces de red, direcciones de red, tablas de enrutamiento, puertos de red, etc.
  • PID namespace. Aísla el espacio de identificadores de proceso. Un contenedor tendrá su propia jerarquía de procesos y su proceso padre o init (PID 1).
  • UTS namespace. Aísla el dominio y hostname, permitiendo a un contenedor poseer su propio dominio de nombres.
  • MOUNT namespace. Aísla los puntos de montaje de los sistemas de ficheros que puede ver un grupo de procesos. Este namespace fue el punto de partida que nació con chroot.
  • USER namespace. Aísla identificadores de usuarios y grupos. Así dentro un contenedor es posible tener un usuario con ID 0 (root) que se corresponda con un ID de usuario cualquiera en el host.
  • IPC namespace. Aísla la intercomunicación entre procesos dentro del espacio.

Así, sobre un kernel con soporte para namespaces es posible aislar procesos utilizando las llamadas al kernel (clone) con los flags necesarios (CLONE_NEWNET, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWNS, CLONE_NEWUSER, CLONE_NEWIPC) según lo deseado. Esta es la  base utilizada por frameworks como Docker para crear contenedores.

Utilizando Docker, verifiquemos en un ejemplo como los procesos dentro de un contenedor tienen namespaces distintos, lo que significa que se mueven en espacios independientes y aislados entre sí. En el escenario mostrado en la imagen siguiente,  podemos ver la ejecución de una shell (sh) dentro un contenedor utilizando Docker. Con el comando “docker ps” mostramos efectivamente, un contenedor con nombre loving_albatanni  que está ejecutando una shell. El pid del contenedor es 11344 desde el punto del host  que, correspondería al proceso 1 dentro del mismo y que identifica al  proceso “sh”,  el primer comando ejecutado en el contenedor.

Podemos verificar los cambios de namespaces con el comando pstree con el flag –S, que nos mostrará la jerarquía de procesos, indicándonos entre paréntesis los cambios de contexto en los namespaces. De forma más directa, inspeccionando /proc identificamos claramente identificadores distintos en los namespaces de proceso 1 del host y el proceso 11344 del contenedor (pid 1 dentro).

Namespace de procesos

Namespace de procesos

lobo@SI_$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1c14004ad6d debian "bash" 6 days ago Up 6 days nostalgic_leavitt
lobo@SI_$ docker inspect loving_albatanni | grep -i pid
 "Pid": 11344,
 "PidMode": "",
 "PidsLimit": 0,
lobo@SI_$ pstree -gsS 11344
systemd(1)───docker(751,mnt)───docker-containe(828)───docker-containe(13340)───bash(11344,ipc,mnt,net,pid,uts)───s
lobo@SI_$ ls -l /proc/1/ns
total 0
lrwxrwxrwx 1 root root 0 jun 8 11:22 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 jun 8 11:22 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 jun 8 11:22 net -> net:[4026531957]
lrwxrwxrwx 1 root root 0 jun 8 11:22 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 jun 8 11:22 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 jun 8 11:22 uts -> uts:[4026531838]
lobo@SI_$
lobo@SI_$ ls -l /proc/11344/ns
total 0
lrwxrwxrwx 1 root root 0 jun 6 08:34 ipc -> ipc:[4026532153]
lrwxrwxrwx 1 root root 0 jun 6 08:34 mnt -> mnt:[4026532151]
lrwxrwxrwx 1 root root 0 jun 6 08:34 net -> net:[4026532156]
lrwxrwxrwx 1 root root 0 jun 6 08:34 pid -> pid:[4026532154]
lrwxrwxrwx 1 root root 0 jun 8 11:22 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 jun 6 08:34 uts -> uts:[4026532152]
lobo@SI_$
lobo@SI_$ docker attach loving_albatanni
root@c1c14004ad6d:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 20244 1960 ? Ss Jun01 0:00 bash
root 17 0.0 0.1 17500 1828 ? R+ 09:26 0:00 ps aux

NOTA: Nótese que no hay cambio en el namespace de usuario ya que este es opcional y debe fijarse al arrancar docker. Al no haber cambio en el namespace de usuario, el usuario dentro del contenedor es el mismo usuario fuera de él. Esto quiere decir que root dentro del contenedor es root fuera, lo que entraña un riesgo de seguridad que conviene evitar configurando oportunamente la ejecución.

Cgroups

Los grupos de control o cgroups son una excelente herramienta para controlar la asignación de recursos hardware. Para ello se definen jerarquías en árbol en las que se agrupan los procesos del sistema apoyándose en una ruta del sistema de ficheros, generalmente ubicado en /sys/fs/cgroup (debian) o /cgroup (redhat). Simplificando, podemos imaginar como el tradicional ulimit pero mucho más extenso y granular. No es objeto de este artículo profundizar en la descripción funcional de los grupos de control, pero si es interesante ver como gracias a ello es posible recortar recursos a un contenedor y por tanto contribuir a aislar su impacto en el sistema.

De nuevo utilizando docker arrancamos dos contenedores uno sin especificar límite de memoria y un segundo aplicando un límite de 64mb utilizando el flag –m 64mb. Para demostrar la restricción de memoria corremos el programa stress para consumir 100Mb de memoria ( stress –vm 1 –vm-bytes 100M )

lobo@SI_$  docker run -it -m 64mb debian bash
WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.
root@39769040071c:/# stress --vm 1 --vm-bytes 100M
stress: info: [6] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

lobo@SI_$ docker run -it debian bash
WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.
root@21e5fd19b14963:/# stress --vm 1 --vm-bytes 100M
stress: info: [6] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

 

Con el comando systemd-cgtop podemos ver el consumo de recursos por distintos grupos de control y verificamos efectivamente que, uno de los contenedores no es capaz de consumir más de 64Mb:

lobo@SI_$ systemd-cgtop

 

cgroups

Las propiedades del contenedor y sus límites podemos comprobarlas con docker inspect:

cgroups_limit

Capabilities

Las capabilities proporcionan un buen mecanismo para restringir privilegios. En el caso de los contenedores es especialmente útil y por ejemplo en Docker, por defecto cualquier contenedor sufre un recorte de capabilities que impiden numerosas operaciones privilegiadas tales como el montaje de sistemas de ficheros o administración de interfaces de red entre otras.

Verifiquemos con un ejemplo real como se produce este recorte de capabilities comparando una shell en el host y una shell en el contenedor.

Una shell de root en el host tiene todas las capabilities:

lobo@SI_$ echo $$
26599
lobo@SI_$ cat /proc/26599/status | grep ^Cap
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
lobo@SI_$ capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,
cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,
cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,
cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,
cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,
cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,
cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,
cap_wake_alarm,cap_block_suspend,37
lobo@SI_$

Sin embargo, por defecto en un contenedor se restringen capabilities y como se puede ver en la siguiente imagen de un contenedor docker se eliminan todas menos unas pocas:

lobo@SI_$ docker ps
CONTAINER     ID    IMAGE COMMAND CREATED STATUS PORTS NAMES
39769040071c debian "bash" 15 minutes ago Up 15 minutes condescending_lumiere
21e5fd19b149 debian "bash" 17 minutes ago Up 17 minutes sad_blackwell
lobo@SI_$ docker inspect condescending_lumiere | grep -i pid
 "Pid": 26579,
 "PidMode": "",
 "PidsLimit": 0,
lobo@SI_$ cat /proc/26579/status | grep ^Cap
CapInh: 00000000a80425fb
CapPrm: 00000000a80425fb
CapEff: 00000000a80425fb
CapBnd: 00000000a80425fb
lobo@SI_$ capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,
cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,
cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap

Esto se traduce en restricciones dentro del contenedor. Para ilustrar con un ejemplo: obsérvese que se han quitado las capabilities cap_net_admin y cap_sys_time, de modo quelo el kernel denegaría operaciones de cambio de fecha del sistema o manipulación de interfaces de red dentro del contenedor (aun siendo root):

lobo@SI_$ docker exec -it condescending_lumiere bash
root@39769040071c:/#
root@39769040071c:/# date
Wed Jun 8 10:20:25 UTC 2016
root@39769040071c:/# date +Y%m%d -s "20160609"
date: cannot set date: Operation not permitted
root@39769040071c:/# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03
 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
 inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:65 errors:0 dropped:0 overruns:0 frame:0
 TX packets:43 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0
 RX bytes:234083 (228.5 KiB) TX bytes:3295 (3.2 KiB)

root@39769040071c:/# ifconfig eth0:1 172.17.0.5
SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
root@39769040071c:/#

Las capabilities necesarias pueden otorgarse o denegarse al arrancar el contenedor según se necesite.
Así por ejemplo podemos comprobar el efecto de quitar la capability NET_RAW necesaria para ejecutar ping:

lobo@SI_$ docker run -it --cap-drop net_raw alpine sh
/ # ping localhost
PING localhost (127.0.0.1): 56 data bytes
ping: permission denied (are you root?)
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(t ape),27(video)

Comprobamos que en las capabilities del contenedor ya no tenemos CAP_NET_RAW:

lobo@SI_$ docker ps
 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
 a57f71180937 alpine "sh" 24 seconds ago Up 22 seconds focused_stallman

 lobo@SI_$ docker inspect focused_stallman | grep -i pid
 "Pid": 27070,
 "PidMode": "",
 "PidsLimit": 0,
 lobo@SI_$ cat /proc/27070/status | grep ^Cap
 CapInh: 00000000a80405fb
 CapPrm: 00000000a80405fb
 CapEff: 00000000a80405fb
 CapBnd: 00000000a80405fb
 lobo@SI_$ capsh --decode=00000000a80405fb
 0x00000000a80405fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,
cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,
cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
El comando ping necesita de la capability NET_RAW como podemos comprobar con el comando getcap:
 lobo@SI_$ getcap /bin/ping
 /bin/ping = cap_net_raw+ep

Contenedores y aseguramiento del contenido

Los contenedores de Linux y las tecnologías subyacentes tienen un desarrollo suficientemente sólido que han propiciado que su utilización se vaya asentando y teniendo en cuenta cada vez más. No obstante, ha de tenerse en cuenta que la falta de rodaje que conlleva esta relativa inmadurez se hace extensiva a la seguridad se echa en falta aún una base de metodologías para configurar, fortalecer y verificar aspectos que sin la debida atención pueden poner en entredicho la seguridad de sistemas “containerizados”.

aws-summit-madrid-16

SecurityInside en el AWS Summit de Madrid 2016

Tras la visita el año pasado al AWS Summit de Barcelona, en esta ocasión nos pillaba mucho más cerca. El AWS Summit de Madrid se celebró el pasado Jueves en cines Kinépolis con una gran participación de público y de empresas patrocinadoras.

Puesto que trabajo en un entorno compuesto principalmente por servicios cloud de Amazon WS, la visita a este tipo de eventos es totalmente recomendada. Ya sabéis que la filosofía de SecurityInside es no dejar nunca de aprender.

El evento

Tal y como os comenté en la entrada de la Rooted CON, el sitio es un acierto total. Parece que los grandes eventos se están poniendo de acuerdo en utilizar las instalaciones de Kinépolis y, para el asistente, es una gran noticia. No hay problema de aparcamiento, gran oferta de restaurantes, cafeterías, espacio para apagar fuegos en remoto… todo genial.

Para el que no lo tenga claro, el AWS Summit es un evento en el que los responsables de diferentes servicios de Amazon nos explican las novedades y casos prácticos para que podamos utilizarlos en nuestro día a día. Además, lo complementan con ejemplos reales de empresas que han tenido éxito utilizando los diferentes servicios que se ofrecen y que siguen creciendo año a año.

aws-summit-2

Las sesiones

Puesto que el pasado Summit fue hace relativamente poco tiempo, en esta ocasión no hubo demasiadas novedadas, pero sí ejemplos de uso que te hacen pensar y que posiblemente acaben en nuestros sistemas a corto plazo. Lo bueno de este tipo de eventos es que te dan ideas y soluciones en las que no habías caído.

En mi caso particular, la sesión más interesante fue la relativa a la gestión de seguridad. Un repaso completo a la forma en la que tener todo bajo control desde el minuto cero que se nos contó en primera persona por Bill Murray, Director of AWS Security Programs y por los diferentes partners del evento:

aws-summit-madrid-sponsors

Seguridad en Amazon WS

La infraestructura en la nube de Amazon WS está diseñada para ser uno de los entornos de informática en la nube más flexibles y seguros de los disponibles en la actualidad. Ofrece una plataforma extremadamente escalable y de alta fiabilidad para que los clientes puedan implementar aplicaciones y datos de forma rápida y segura.

Los centros de datos de AWS disponen de la máxima seguridad 24/7. Los sistemas ambientales de los centros están diseñados para minimizar el impacto de las interrupciones en las operaciones. La existencia de varias regiones geográficas disponibles hace que la información sobreviva a la mayoría de las averías, incluidas catástrofes naturales.

AWS establece exhaustivos sistemas de supervisión de seguridad y red, protegiendo frente a ataques DDoS y detección de ataques de fuerza bruta contra sistemas de contraseñas en las cuentas de AWS, poniendo a prueba la infraestructura constantemente, desde todos los ángulos posibles y desde diferentes regiones.

Además del amplio equipo de expertos, AWS cuenta con una gran variedad de herramientas y sistemas que automatizan muchas de las tareas de seguridad, desde la gestión de credenciales hasta la supervisión del uso del servidor y red. Los programas de análisis automatizados, por ejemplo, han reducido el tiempo de una evaluación de ingeniería de seguridad de horas a minutos e incrementando la velocidad de análisis de docenas de hosts al día a miles de hosts en el mismo tiempo.

La infraestructura de AWS es mejorada constantemente, sustituyendo el hardware que llega al final de su vida con procesadores más recientes, mejorando así el rendimiento e incorporando tecnologías de seguridad, buscando reducir al máximo las fricciones entre los procesos de seguridad y los servicios.

AWS construye sus centros en múltiples regiones geográficas y numerosas zonas de disponibilidad dentro de cada región. Esto es, las zonas de disponibilidad están físicamente aisladas en una región y ubicadas en zonas de menor riesgo. En caso de improbable fallo, los procesos automatizados pueden desviar el tráfico de datos del cliente de la zona afectada (si hacemos uso de la configuración multi AZ), equilibrando la carga de tráfico entre los demás sitios.

Para clientes obligados a cumplir con determinadas leyes o normas de seguridad, AWS proporciona informes de certificación que describen cómo su infraestructura en la nube cumple con los controles exigidos por estas normas. Cada certificación que AWS obtiene significa que un auditor ha verificado que están instaurados los controles específicos y que funcionan según lo previsto.

Para ayudar al mantenimiento de seguridad de datos y sistemas en la nube, AWS dispone de una amplia variedad de funcionalidades y servicios:

  • Seguridad de red: Provee de diferentes opciones de seguridad a nivel de red para mantener los recursos y comunicaciones con la privacidad deseada.
  • Control de acceso: Solo permite acceso a usuarios, clientes y aplicaciones autorizadas a los recursos AWS, estableciendo políticas de control de acceso, cuentas individuales de usuarios y credenciales únicas.
  • Monitorización y seguimiento: AWS ofrece herramientas para hacer seguimiento y monitorizar los recursos en la nube. Con ellas, hay inmediata visibilidad del inventario, así como sobre usuarios y actividades sobre la aplicación.
  • Copias de seguridad: Una estrategia de seguridad debe incluir backups o snapshots de los datos con regularidad. Por eso, AWS realiza backups automáticos y, en otros casos, es posible configurar snapshots usando las diferentes opciones de configuración.
  • Cifrado: AWS utiliza sistemas de cifrado siempre que sea posible y recomienda su uso. Permite el almacenamiento de datos cifrados, centralización de gestión de claves y almacenamiento en hardware cifrado dedicado.
  • Región aislada: Para clientes con necesidades adicionales por cumplimiento de regulación especial, AWS ofrece regiones aisladas llamadas GovCloud (US) con estrictos y únicos requerimientos de seguridad que permiten un entorno en el que lanzar aplicaciones ITAR.

Ya sabemos que nada es 100% seguro, pero Amazon WS hace un gran esfuerzo por mantener unos servicios con el máximo nivel de fortificación para que nuestra actividad pueda resistir los múltiples vectores de ataque a los que estamos expuestos.

Y tu, ¿utilizas Amazon WS? Recuerda que tienes un gran abanico de recursos gratuitos para empezar a familiarizarte con este ecosistema.

 

De momento, eso es todo. Como siempre digo, si ves algún error, no estás de acuerdo con lo que cuento o quieres hacer alguna aportación, no dudes en pasarte por los comentarios.