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?