GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sichern Sie Ihre Container mit SELinux

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?

Linux
  1. Zeichnen Sie Ihre Terminalsitzung mit Asciinema auf

  2. Spielen Linux-Distributionen bei Containern noch eine Rolle?

  3. Beheben Sie Probleme in Ihrem Netzwerk mit tcpdump

  4. Legen Sie den SELinux-Erzwingungsmodus mit Ansible fest

  5. Sichern Sie Ihren Linux-Server mit Fail2Ban [Anfängerleitfaden]

Schützen Sie Ihre Online-Privatsphäre mit diesen Linux-Distributionen

Sichern Sie Ihr Linux-Netzwerk mit firewall-cmd

So sichern Sie Linux-Server mit SE Linux

So sichern Sie SSH mit Fail2Ban

Verwalten Sie Ihre Server mit Cockpit Linux

So sichern Sie Ihre Website mit Let’s Encrypt auf Ubuntu 20.04