Cuando las cosas no funcionan correctamente en su entorno Linux, lo más fácil es desactivar Linux con seguridad mejorada (SELinux). De repente, las cosas comienzan a funcionar y te olvidas, pero este es un error común que significa que has perdido una herramienta de seguridad muy poderosa.
Las amenazas aumentan junto con el auge de los contenedores, los microservicios y la arquitectura distribuida. Esto se debe a un problema antiguo y bien conocido:la velocidad. La ventaja de los contenedores es que le permiten moverse rápido, hacer más y cambiar rápidamente. Esto significa que la adopción de contenedores se ha disparado, pero la velocidad que ofrece también significa que encontrará más problemas y vulnerabilidades. Esto sucede naturalmente cuando haces más cosas cada vez más rápido.
Cómo mitigar las amenazas
Contenedores Linux
- ¿Qué son los contenedores de Linux?
- Una introducción a la terminología de contenedores
- Descargar:Introducción a los contenedores
- Operadores de Kubernetes:automatización de la plataforma de orquestación de contenedores
- eBook:Patrones de Kubernetes para diseñar aplicaciones nativas de la nube
- ¿Qué es Kubernetes?
Como dijo Sun Tzu:"El guerrero sabio evita la batalla". Esta cita realmente resuena cuando se trata de la defensa básica de los contenedores. Para evitar problemas (batallas), asegúrese de que el host de su contenedor sea seguro y que pueda usar SELinux como su primera línea de defensa.
SELinux es un proyecto de código abierto lanzado en 2000 e integrado en el kernel de Linux en 2003. Según el explicador de Red Hat, "SELinux es una arquitectura de seguridad para sistemas Linux que permite a los administradores tener más control sobre quién puede acceder al sistema. Originalmente fue desarrollado por la Agencia de Seguridad Nacional de los Estados Unidos (NSA) como una serie de parches para el kernel de Linux utilizando módulos de seguridad de Linux (LSM)."
Comenzar
Cuando piensas en contenedores, lo primero que probablemente te viene a la mente es Docker. Docker inició una revolución en la adopción de contenedores después de que surgiera en 2013. Es una de las principales razones por las que los contenedores ganaron popularidad, pero como se mencionó anteriormente, el alto nivel de adopción aumentó la vulnerabilidad de los usuarios a los riesgos de seguridad.
Antes de que pueda proteger sus contenedores Docker con SELinux, debe configurar algunas cosas.
Requisitos previos:
- CentOS 8/RHEL 8 instalado y configurado
- Docker CE instalado y configurado
- Dos cuentas creadas:raíz y no raíz (
mcalizo
en los ejemplos a continuación)
Si necesita configurar Docker en su servidor RHEL 8/CentOS 8, puede seguir estas instrucciones. Si está ejecutando RHEL 8, debe eliminar los paquetes Podman y runc preinstalados antes de comenzar.
Primero, asegúrese de que SELinux esté habilitado:
[mcalizo@Rhel82 ~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 31
[mcalizo@Rhel82 ~]$
Luego, verifique la versión de su sistema operativo y que Docker se esté ejecutando. Inicie sesión como root y ejecute:
[root@rhel82 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
[root@rhel82 ~]#
[root@rhel82 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago
Docs: https://docs.docker.com
Main PID: 30768 (dockerd)
Tasks: 8
Memory: 39.0M
CGroup: /system.slice/docker.service
└─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg=">
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A>
Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine
Compruebe su versión de Docker:
[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d
Hackea tu host
Una de las mejores maneras de entender un problema es experimentarlo. Entonces, le mostraré lo fácil que es inyectar código malicioso en un host Docker si su seguridad no está configurada correctamente.
Para poder hacer algo malo en el host de Docker, el usuario no root malintencionado (mcalizo
en este tutorial) debe ser parte del grupo que puede crear instancias de contenedores Docker.
Primero, confirme qué grupo el mcalizo
el usuario pertenece a:
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo
El resultado muestra que mcalizo
pertenece sólo a su propio grupo. Esto significa mcalizo
no puede crear instancias de contenedores Docker y obtendrá este error si lo intenta:
[mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
Para permitir mcalizo
para crear una instancia del contenedor, agregue el usuario a la docker
grupo:
[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker
A continuación, implemente fedora:latest
contenedor e inicie sesión en el contenedor instanciado para explorarlo:
[mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
ee7e89337106: Pull complete
Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4
Status: Downloaded newer image for fedora:latest
sh-5.0# cat /etc/redhat-release
Fedora release 33 (Thirty Three)
Mientras está conectado al contenedor recién creado, puede ver que está conectado automáticamente como root:
sh-5.0# whoami
root
sh-5.0#
Como root
usuario, puede hacer cualquier cosa en este contenedor, lo que significa que puede explotar el host del contenedor y causar mucho daño. Debido a que puede crear instancias de un contenedor, puede hacerle cosas al host incluso si no es parte de la cuenta sudoers del host.
Salga del contenedor que acaba de crear y cree un nuevo contenedor para demostrar el exploit:
[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#
La opción -v monta el /
del host Docker directorio al contenedor bajo el /exploit
directorio:
[root@131043f2e306 /]#ls exploit/
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Debido a que está montado, puede hacer cualquier cosa en el host de Docker. Por ejemplo, puede eliminar archivos, editar configuraciones específicas para dañar el sistema o incluso instalar una aplicación de caballo de Troya u otro malware para robar información importante.
¿Por qué sucede esto?
Quizás se pregunte por qué esto es posible ya que SELinux está en modo de aplicación. Profundice en SELinux para ver dónde salieron mal las cosas.
Verifique que SELinux tenga un contexto Docker:
[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$
Como era de esperar, lo hace. Esto significa que SELinux administra el demonio Docker. Inspeccione el demonio Docker para ver si SELinux está habilitado de forma predeterminada:
[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-193.el8.x86_64
SELinux no habilitado por defecto. ¡Este es el problema! Para solucionarlo, habilite SELinux para controlar y administrar Docker actualizando o creando el archivo /etc/docker/daemon.json
como se documenta aquí (debe tener acceso de raíz para hacer esto):
[root@Rhel82 ~]# cat /etc/docker/daemon.json
{
"selinux-enabled": true
}
[root@Rhel82 ~]#
[root@Rhel82 ~]# systemctl restart docker
Después de crear o actualizar el archivo y reiniciar Docker, debería ver que la compatibilidad con SELinux está habilitada en el demonio de Docker:
[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
Security Options:
seccomp
Profile: default
selinux
[mcalizo@Rhel82 root]$
Si bien todavía es posible montar un sistema de archivos específico en su host Docker en su contenedor Docker, ya no se permite actualizar o acceder al archivo:
[mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh
touch: cannot touch '/exploit/etc/shadow.sh': Permission denied
[root@ecb5836da1f6 /]#
Más información
Su primera línea de defensa en el mundo de los contenedores depende de qué tan bien configure el sistema operativo de los hosts de su contenedor. Existen numerosas formas de implementar la seguridad de Linux, incluidas las opciones disponibles en el mercado para aumentar su postura de seguridad.
SELinux es una capa adicional de seguridad que está integrada en las distribuciones de Linux de forma predeterminada. Para aprovecharlo y proteger su sistema contra compromisos, asegúrese de que SELinux permanezca activado.
Si desea obtener más información, consulte:
- Cómo instalar Docker CE en CentOS 8/RH
- Hoja de trucos de seguridad de Docker
- documentación de dockerd
- Usar documentación de volúmenes
- ¿Qué es SELinux?