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
Linux-Container
- Was sind Linux-Container?
- Eine Einführung in die Containerterminologie
- Download:Einführung in Container
- Kubernetes-Operatoren:Automatisierung der Container-Orchestrierungsplattform
- eBook:Kubernetes-Muster zum Entwerfen cloudnativer Apps
- Was ist Kubernetes?
Wie Sun Tzu sagte:„Der weise Krieger vermeidet den Kampf.“ 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)."
Legen Sie los
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, hat die hohe Akzeptanz die Anfälligkeit der Benutzer für Sicherheitsrisiken erhöht.
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 Nicht-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
Hack deinen 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 Schlimmes anstellen 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 zunächst, in welcher Gruppe sich mcalizo
befindet Benutzer gehört zu:
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo
Die Ausgabe zeigt, dass mcalizo
gehört nur zu seiner eigenen Gruppe. Das bedeutet mcalizo
kann Docker-Container nicht instanziieren und erhält 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'.
Um mcalizo
zuzulassen Um den Container zu instanziieren, fügen Sie den Benutzer zum docker
hinzu Gruppe:
[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker
Stellen Sie als Nächstes ein fedora:latest
bereit Container und melden Sie sich beim 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#
Als 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 hängt den /
des Docker-Hosts ein Verzeichnis in den Container unter /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 gemountet ist, können Sie alles tun 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.
Überprüfen Sie, ob 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 /etc/docker/daemon.json
aktualisieren oder erstellen 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]$
Es ist zwar weiterhin möglich, ein bestimmtes Dateisystem in Ihrem Docker-Host in Ihrem Docker-Container bereitzustellen, aber das Aktualisieren oder Zugreifen auf die Datei ist nicht mehr zulässig:
[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 /]#
Weitere Informationen
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, die 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.
Weitere Informationen finden Sie unter:
- So installieren Sie Docker CE auf CentOS 8 / RH
- Docker-Sicherheits-Spickzettel
- dockerd-Dokumentation
- Volumen-Dokumentation verwenden
- Was ist SELinux?