GNU/Linux >> Tutoriales Linux >  >> Linux

Asegure sus contenedores con SELinux

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?

Linux
  1. Graba tu sesión de terminal con Asciinema

  2. Escanee su seguridad Linux con Lynis

  3. Cómo proteger sus servicios de correo electrónico de Linux con SSL/TLS

  4. ¿Siguen siendo importantes las distribuciones de Linux con los contenedores?

  5. Solucione los problemas de su red con tcpdump

Asegure su privacidad en línea con estas distribuciones de Linux

Asegure su red Linux con firewall-cmd

Cómo asegurar servidores Linux con SE Linux

Cómo proteger SSH con Fail2Ban

Administre sus servidores con Cockpit Linux

Cómo proteger su sitio web con Let's Encrypt en Ubuntu 20.04