Wenn die Dinge in Ihrer Linux-Umgebung nicht richtig funktionieren, ist es am einfachsten, Security-Enhanced Linux (SELinux) zu deaktivieren. Die Dinge beginnen plötzlich zu funktionieren, und Sie vergessen es – aber dies ist eine häufige Falle, die bedeutet, dass Sie ein sehr leistungsfähiges Sicherheitstool verloren haben.
Mit dem Aufkommen von Containern, Microservices und verteilten Architekturen nehmen die Bedrohungen zu. Dies liegt an einem alten, wohlbekannten Problem: Geschwindigkeit. Der Vorteil von Containern besteht darin, dass Sie sich schnell bewegen, mehr erledigen und schnell wechseln können. Das bedeutet, dass die Einführung von Containern aus dem Ruder gelaufen ist, aber die Geschwindigkeit, die sie bietet, bedeutet auch, dass Sie auf mehr Probleme und Schwachstellen stoßen werden. Dies geschieht ganz natürlich, wenn Sie immer mehr Dinge immer schneller erledigen.
So mindern Sie Bedrohungen
Wie Sun Tzu sagte: „Der weise Krieger vermeidet die Schlacht.“ Dieses Zitat trifft wirklich zu, wenn es um die grundlegende Verteidigung von Containern geht. Um Probleme (Schlachten) zu vermeiden, stellen Sie sicher, dass Ihr Container-Host sicher ist und Sie SELinux als erste Verteidigungslinie verwenden können.
SELinux ist ein Open-Source-Projekt, das im Jahr 2000 veröffentlicht und 2003 in den Linux-Kernel integriert wurde. Laut Red Hats Erklärer ist „SELinux eine Sicherheitsarchitektur für Linux-Systeme, die es Administratoren ermöglicht, mehr Kontrolle darüber zu haben, wer auf das System zugreifen kann entwickelt von der United States National Security Agency (NSA) als eine Reihe von Patches für den Linux-Kernel unter Verwendung von Linux Security Modules (LSM).”
Loslegen
Wenn Sie an Container denken, fällt Ihnen wahrscheinlich zuerst Docker ein. Docker hat nach seinem Erscheinen im Jahr 2013 eine Revolution bei der Einführung von Containern ausgelöst. Dies ist einer der Hauptgründe für die explosionsartige Popularität von Containern, aber wie oben erwähnt, erhöhte die hohe Akzeptanz die Anfälligkeit der Benutzer für Sicherheitsrisiken.
Bevor Sie Ihre Docker-Container mit SELinux sichern können, müssen Sie einige Dinge einrichten.
Voraussetzungen:
- CentOS 8/RHEL 8 installiert und konfiguriert
- Docker CE installiert und konfiguriert
- Zwei Konten erstellt: root und non-root (
mcalizo
in den Beispielen unten)
Wenn Sie Docker auf Ihrem RHEL 8/CentOS 8-Server einrichten müssen, können Sie diesen Anweisungen folgen. Wenn Sie RHEL 8 ausführen, müssen Sie die vorinstallierten Podman- und Runc-Pakete entfernen, bevor Sie beginnen.
Stellen Sie zunächst sicher, dass SELinux aktiviert ist:
[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 ~]$
Überprüfen Sie dann Ihre Betriebssystemversion und ob Docker ausgeführt wird. Melden Sie sich als root an und führen Sie Folgendes aus:
[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
Überprüfen Sie Ihre Docker-Version:
[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d
Hacken Sie Ihren Host
Eine der besten Möglichkeiten, ein Problem zu verstehen, besteht darin, es zu erleben. Ich zeige Ihnen also, wie einfach es ist, bösartigen Code in einen Docker-Host einzuschleusen, wenn Ihre Sicherheit nicht richtig eingerichtet ist.
Um auf dem Docker-Host etwas Schlechtes tun zu können, muss der böswillige Nicht-Root-Benutzer (mcalizo
in diesem Tutorial) muss Teil der Gruppe sein, die Docker-Container instanziieren kann.
Bestätigen Sie zuerst, welche Gruppe die mcalizo
Benutzer gehört zu:
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo
Das zeigt die Ausgabe mcalizo
gehört nur zu seiner eigenen Gruppe. Das heisst mcalizo
Docker-Container können nicht instanziiert werden und erhalten diesen Fehler, wenn es versucht:
[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'.
Erlauben mcalizo
Um den Container zu instanziieren, fügen Sie den Benutzer der hinzu docker
Gruppe:
[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker
Stellen Sie als Nächstes a bereit fedora:latest
Container und melden Sie sich bei dem instanziierten Container an, um ihn zu erkunden:
[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)
Während Sie beim neu erstellten Container angemeldet sind, können Sie sehen, dass Sie automatisch als root angemeldet sind:
sh-5.0# whoami
root
sh-5.0#
Wie root
Benutzer können Sie in diesem Container alles tun, was bedeutet, dass Sie den Container-Host ausnutzen und viel Schaden anrichten können. Da Sie einen Container instanziieren können, können Sie Dinge mit dem Host tun, selbst wenn Sie nicht Teil des sudoers-Kontos des Hosts sind.
Beenden Sie den gerade erstellten Container und erstellen Sie einen neuen Container, um den Exploit zu demonstrieren:
[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#
Die Option -v mountet die des Docker-Hosts /
Verzeichnis in den Container unter der /exploit
Verzeichnis:
[root@131043f2e306 /]#ls exploit/
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Da es montiert ist, können Sie tun irgendetwas auf dem Docker-Host. Sie können beispielsweise Dateien löschen, bestimmte Konfigurationen bearbeiten, um das System zu beschädigen, oder sogar eine Trojaner-Anwendung oder andere Malware installieren, um wichtige Informationen zu stehlen.
Warum passiert das?
Sie fragen sich vielleicht, warum dies möglich ist, da sich SELinux im Erzwingungsmodus befindet. Tauchen Sie tiefer in SELinux ein, um zu sehen, wo etwas schief gelaufen ist.
Stellen Sie sicher, dass SELinux einen Docker-Kontext hat:
[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$
Wie erwartet tut es das. Das bedeutet, dass SELinux den Docker-Daemon verwaltet. Untersuchen Sie den Docker-Daemon, um festzustellen, ob SELinux standardmäßig aktiviert ist:
[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.0-193.el8.x86_64
SELinux ist nicht standardmäßig aktiviert. Das ist das Problem! Um das Problem zu beheben, aktivieren Sie SELinux, um Docker zu steuern und zu verwalten, indem Sie die Datei aktualisieren oder erstellen /etc/docker/daemon.json
wie hier dokumentiert (Sie müssen dazu Root-Zugriff haben):
[root@Rhel82 ~]# cat /etc/docker/daemon.json
{
"selinux-enabled": true
}
[root@Rhel82 ~]#
[root@Rhel82 ~]# systemctl restart docker
Nachdem Sie die Datei erstellt oder aktualisiert und Docker neu gestartet haben, sollten Sie sehen, dass die SELinux-Unterstützung im Docker-Daemon aktiviert ist:
[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
Security Options:
seccomp
Profile: default
selinux
[mcalizo@Rhel82 root]$
Während es immer noch möglich ist, ein bestimmtes Dateisystem in Ihrem Docker-Host auf Ihrem Docker-Container zu mounten, ist das Aktualisieren oder Zugreifen auf die Datei nicht mehr erlaubt:
[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 /]#
Mehr erfahren
Ihre erste Verteidigungslinie in der Container-Welt hängt davon ab, wie stark Sie das Betriebssystem Ihrer Container-Hosts einrichten. Es gibt zahlreiche Möglichkeiten, Linux-Sicherheit zu implementieren, einschließlich der auf dem Markt erhältlichen Optionen zur Verbesserung Ihrer Sicherheitslage.
SELinux ist eine zusätzliche Sicherheitsebene, die standardmäßig in Linux-Distributionen integriert ist. Um davon zu profitieren und Ihr System vor Kompromittierung zu schützen, stellen Sie sicher, dass SELinux eingeschaltet bleibt.
Wenn Sie mehr erfahren möchten, siehe:
- So installieren Sie Docker CE auf CentOS 8 / RH
- Docker-Sicherheits-Spickzettel
- Dockerd-Dokumentation
- Volume-Dokumentation verwenden
- Was ist SELinux?