GNU/Linux >> Linux Esercitazione >  >> Linux

Proteggi i tuoi container con SELinux

Quando le cose non funzionano correttamente nel tuo ambiente Linux, la cosa più semplice da fare è disabilitare Security-Enhanced Linux (SELinux). Le cose iniziano improvvisamente a funzionare e te ne dimentichi, ma questa è una trappola comune che significa che hai perso uno strumento di sicurezza molto potente.

Le minacce sono in aumento insieme all'aumento dei container, dei microservizi e dell'architettura distribuita. Ciò è dovuto a un vecchio problema ben noto:la velocità. Il vantaggio dei container è che ti consentono di muoverti velocemente, fare di più e cambiare rapidamente. Ciò significa che l'adozione dei container è andata fuori dal tetto, ma la velocità che offre significa anche che incontrerai più problemi e vulnerabilità. Questo accade naturalmente quando fai più cose sempre più velocemente.

Come mitigare le minacce

Contenitori Linux

  • Cosa sono i container Linux?
  • Un'introduzione alla terminologia dei contenitori
  • Download:Primer sui contenitori
  • Operatori Kubernetes:automatizzare la piattaforma di orchestrazione dei container
  • eBook:modelli Kubernetes per la progettazione di app cloud native
  • Cos'è Kubernetes?

Come ha detto Sun Tzu, "Il saggio guerriero evita la battaglia". Questa citazione risuona davvero quando si tratta della difesa di base dei container. Per evitare problemi (battaglie), assicurati che il tuo container host sia sicuro e che tu possa usare SELinux come prima linea di difesa.

SELinux è un progetto open source rilasciato nel 2000 e integrato nel kernel Linux nel 2003. Secondo l'esplicatore di Red Hat, "SELinux è un'architettura di sicurezza per i sistemi Linux che consente agli amministratori di avere un maggiore controllo su chi può accedere al sistema. Originariamente era sviluppato dalla National Security Agency (NSA) degli Stati Uniti come una serie di patch al kernel Linux che utilizza Linux Security Modules (LSM)."

Inizia

Quando si pensa ai container, la prima cosa che probabilmente viene in mente è Docker. Docker ha avviato una rivoluzione nell'adozione dei container dopo la sua comparsa nel 2013. È uno dei motivi principali per cui i container sono esplosi in popolarità, ma come accennato in precedenza, l'alto livello di adozione ha aumentato la vulnerabilità degli utenti ai rischi per la sicurezza.

Prima di poter proteggere i tuoi container Docker con SELinux, devi configurare alcune cose.

Prerequisiti:

  • CentOS 8/RHEL 8 installato e configurato
  • Docker CE installato e configurato
  • Due account creati:root e non root (mcalizo negli esempi di seguito)

Se devi configurare Docker sul tuo server RHEL 8/CentOS 8, puoi seguire queste istruzioni. Se stai utilizzando RHEL 8, devi rimuovere i pacchetti Podman e runc preinstallati prima di iniziare.

Innanzitutto, assicurati che SELinux sia abilitato:

[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 ~]$

Quindi, verifica la versione del tuo sistema operativo e che Docker sia in esecuzione. Accedi come root ed esegui:

[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

Controlla la tua versione Docker:

[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d

Hackera il tuo host

Uno dei modi migliori per capire un problema è sperimentarlo. Quindi, ti mostrerò com'è facile iniettare codice dannoso in un host Docker se la tua sicurezza non è impostata correttamente.

Per essere in grado di fare qualcosa di male sull'host Docker, l'utente maligno non root (mcalizo in questo tutorial) deve far parte del gruppo che può creare un'istanza di container Docker.

Per prima cosa, conferma quale gruppo è il mcalizo l'utente appartiene a:

[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo

L'output mostra che mcalizo appartiene solo al proprio gruppo. Questo significa mcalizo non è possibile creare un'istanza di contenitori Docker e verrà visualizzato questo errore se tenta:

[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'.

Per consentire mcalizo per creare un'istanza del contenitore, aggiungi l'utente alla docker gruppo:

[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker

Quindi, distribuisci un fedora:latest container e accedi al container di cui è stata creata un'istanza per esplorarlo:

[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)

Mentre sei connesso al container appena creato, puoi vedere che sei connesso automaticamente come root:

sh-5.0# whoami
root
sh-5.0#

Come root utente, puoi fare qualsiasi cosa in questo contenitore, il che significa che puoi sfruttare l'host del contenitore e fare molti danni. Poiché puoi creare un'istanza di un contenitore, puoi fare cose all'host anche se non fai parte dell'account sudoers dell'host.

Esci dal contenitore appena creato e crea un nuovo contenitore per dimostrare l'exploit:

[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#

L'opzione -v monta il / dell'host Docker directory nel contenitore sotto /exploit directory:

[root@131043f2e306 /]#ls exploit/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Poiché è montato, puoi fare qualsiasi cosa sull'host Docker. Ad esempio, puoi eliminare file, modificare configurazioni specifiche per danneggiare il sistema o persino installare un'applicazione cavallo di Troia o altro malware per rubare informazioni importanti.

Perché succede?

Ti starai chiedendo perché questo è possibile poiché SELinux è in modalità di applicazione. Scava più a fondo in SELinux per vedere dove le cose sono andate storte.

Verifica che SELinux abbia un contesto Docker:

[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$

Come previsto, lo fa. Ciò significa che SELinux gestisce il demone Docker. Ispeziona il demone Docker per vedere se SELinux è abilitato per impostazione predefinita:

[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.18.0-193.el8.x86_64

SELinux non abilitato per impostazione predefinita. Questo è il problema! Per risolverlo, abilita SELinux a controllare e gestire Docker aggiornando o creando il file /etc/docker/daemon.json come documentato qui (è necessario disporre dell'accesso come root per farlo):

[root@Rhel82 ~]# cat /etc/docker/daemon.json 
{
  "selinux-enabled": true
}
[root@Rhel82 ~]#
[root@Rhel82 ~]# systemctl restart docker

Dopo aver creato o aggiornato il file e riavviato Docker, dovresti vedere che il supporto SELinux è abilitato nel demone Docker:

[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
  selinux
[mcalizo@Rhel82 root]$

Sebbene sia ancora possibile montare un filesystem specifico nel tuo host Docker sul tuo container Docker, l'aggiornamento o l'accesso al file non è più consentito:

[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 /]#

Ulteriori informazioni

La tua prima linea di difesa nel mondo dei container dipende dalla forza con cui hai configurato il sistema operativo dei tuoi host container. Esistono numerosi modi per implementare la sicurezza Linux, comprese le opzioni disponibili sul mercato per aumentare la tua posizione di sicurezza.

SELinux è un ulteriore livello di sicurezza integrato nelle distribuzioni Linux per impostazione predefinita. Per trarne vantaggio e proteggere il tuo sistema dai compromessi, assicurati che SELinux rimanga attivo.

Se vuoi saperne di più, vedi:

  • Come installare Docker CE su CentOS 8 / RH
  • Cheat sheet sulla sicurezza di Docker
  • documentazione Docker
  • Utilizzare la documentazione dei volumi
  • Cos'è SELinux?

Linux
  1. Scansiona la tua sicurezza Linux con Lynis

  2. Come proteggere i tuoi servizi di posta elettronica Linux con SSL/TLS

  3. Risolvi i problemi della tua rete con tcpdump

  4. Imposta la modalità di applicazione di SELinux con Ansible

  5. Eseguire il backup dei file con rsync

Proteggi la tua privacy online con queste distribuzioni Linux

Proteggi la tua rete Linux con firewall-cmd

Come proteggere i server Linux con SE Linux

Come proteggere SSH con Fail2Ban

Gestisci i tuoi server con Cockpit Linux

Come proteggere il tuo sito Web con Let's Encrypt su Ubuntu 20.04