Eine Einführung in SELinux unter CentOS 7 - Teil 1: Grundlegende Konzepte

Einführung

Security Enhanced Linux oder SELinux ist ein erweiterter Zugriffskontrollmechanismus, der in die meisten modernen Linux-Distributionen integriert ist. Es wurde ursprünglich von der US National Security Agency entwickelt, um Computersysteme vor böswilligen Eingriffen und Manipulationen zu schützen. Im Laufe der Zeit wurde SELinux gemeinfrei veröffentlicht, und verschiedene Distributionen haben es seitdem in ihren Code aufgenommen.

Für viele Systemadministratoren ist SELinux ein Neuland. Das Thema kann entmutigend und manchmal ziemlich verwirrend wirken. Ein ordnungsgemäß konfiguriertes SELinux-System kann jedoch die Sicherheitsrisiken erheblich verringern. Wenn Sie ein wenig darüber Bescheid wissen, können Sie Probleme mit Fehlermeldungen im Zusammenhang mit dem Zugriff beheben. In diesem Tutorial lernen wir die Konzepte hinter SELinux kennen - seine Pakete, Befehle und Konfigurationsdateien - und die Fehlermeldungen, die protokolliert werden, wenn der Zugriff verweigert wird. Wir werden auch einige praktische Beispiele sehen, wie SELinux in die Tat umgesetzt wird.

_ * Hinweis * + Die in diesem Tutorial gezeigten Befehle, Pakete und Dateien wurden unter CentOS 7 getestet. Die Konzepte bleiben für andere Distributionen gleich. _

In diesem Lernprogramm führen wir die Befehle als Root-Benutzer aus, sofern nicht anders angegeben. Wenn Sie keinen Zugriff auf das Root-Konto haben und ein anderes Konto mit Sudo-Berechtigungen verwenden, müssen Sie den Befehlen das Schlüsselwort "+ sudo +" voranstellen.

Warum SELinux?

Bevor wir beginnen, wollen wir einige Konzepte verstehen.

SELinux implementiert die sogenannte * MAC * (Mandatory Access Control). Dies wird zusätzlich zu dem implementiert, was bereits in jeder Linux-Distribution vorhanden ist, dem * DAC * (Discretionary Access Control).

Um DAC zu verstehen, betrachten wir zunächst die Funktionsweise der herkömmlichen Linux-Dateisicherheit.

In einem herkömmlichen Sicherheitsmodell haben wir drei Entitäten: Benutzer, Gruppe und Andere (u, g, o), die über eine Kombination von Lese-, Schreib- und Ausführungsberechtigungen (r, w, x) für eine Datei oder ein Verzeichnis verfügen können. Wenn ein Benutzer * jo * eine Datei in seinem Ausgangsverzeichnis erstellt, hat dieser Benutzer Lese- / Schreibzugriff darauf, ebenso wie die Gruppe * jo *. Die "andere" Entität wird möglicherweise keinen Zugriff darauf haben. Im folgenden Codeblock können wir den hypothetischen Inhalt des Ausgangsverzeichnisses von jo betrachten.

Sie müssen diesen * jo * -Benutzer nicht einrichten - wir werden später in diesem Lernprogramm viele Benutzer einrichten.

So führen Sie einen Befehl aus:

ls -l /home/jo/

kann die Ausgabe wie folgt anzeigen:

total 4
-rwxrw-r--. 1 jo jo 41 Aug  6 22:45 myscript.sh

Jetzt kann jo diesen Zugang ändern. jo kann anderen Benutzern und Gruppen den Zugriff auf diese Datei gewähren (und einschränken) oder den Eigentümer der Datei ändern. Durch diese Aktionen können wichtige Dateien Konten zugänglich gemacht werden, die diesen Zugriff nicht benötigen. jo kann auch einschränken, um sicherer zu sein, dies ist jedoch freiwillig: Der Systemadministrator kann dies nicht für jede einzelne Datei im System erzwingen.

Stellen Sie sich einen anderen Fall vor: Wenn ein Linux-Prozess ausgeführt wird, kann er als Root-Benutzer oder ein anderes Konto mit Superuser-Berechtigungen ausgeführt werden. Das heißt, wenn ein Black-Hat-Hacker die Kontrolle über die Anwendung übernimmt, kann er mit dieser Anwendung auf alle Ressourcen zugreifen, auf die das Benutzerkonto Zugriff hat. Für Prozesse, die als Root ausgeführt werden, bedeutet dies im Grunde alles auf dem Linux-Server.

Stellen Sie sich ein Szenario vor, in dem Sie verhindern möchten, dass Benutzer Shell-Skripts aus ihren Basisverzeichnissen ausführen. Dies kann passieren, wenn Entwickler an einem Produktionssystem arbeiten. Sie möchten, dass sie Protokolldateien anzeigen, möchten jedoch nicht, dass sie die Befehle "+ su " oder " sudo +" verwenden, und Sie möchten nicht, dass sie Skripts aus ihren Ausgangsverzeichnissen ausführen. Wie machst du das?

SELinux ist eine Möglichkeit, solche Anforderungen an die Zugriffskontrolle zu optimieren. Mit SELinux können Sie definieren, was ein Benutzer oder ein Prozess tun kann. Es beschränkt jeden Prozess auf seine eigene Domäne, sodass der Prozess nur mit bestimmten Dateitypen und anderen Prozessen aus zulässigen Domänen interagieren kann. Dies verhindert, dass ein Hacker einen Prozess missbraucht, um systemweiten Zugriff zu erhalten.

Einrichten eines Testsystems

Zum Erlernen der Konzepte erstellen wir einen Testserver, auf dem sowohl ein Web- als auch ein SFTP-Server ausgeführt wird. Wir beginnen mit einer Bare-Installation von CentOS 7 mit minimal installierten Paketen und installieren die Apache- und vsftp-Dämonen auf diesem Server. Wir werden jedoch keine dieser Anwendungen konfigurieren.

Wir werden auch einige Testbenutzerkonten auf unserem Cloud-Server erstellen. Wir werden diese Konten im Laufe der Lektion an verschiedenen Stellen verwenden.

Schließlich werden wir die benötigten SELinux-bezogenen Pakete installieren. Dies soll sicherstellen, dass wir mit den neuesten SELinux-Befehlen arbeiten können.

Installieren von Apache- und SFTP-Diensten

Melden Sie sich zuerst als * root * -Nutzer am Server an und führen Sie den folgenden Befehl aus, um Apache zu installieren:

yum install httpd

Die Ausgabe zeigt das heruntergeladene Paket und bittet Sie um Erlaubnis zur Installation:

Loaded plugins: fastestmirror, langpacks
...
...
================================================================================
Package       Arch           Version                     Repository       Size
================================================================================
Installing:
httpd         x86_64         2.4.6-18.el7.centos         updates         2.7 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 2.7 M
Installed size: 9.3 M
Is this ok [y/d/N]:

Durch Drücken von * y * wird der Apache-Webserver-Daemon installiert.

Downloading packages:
httpd-2.4.6-18.el7.centos.x86_64.rpm                       | 2.7 MB   00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : httpd-2.4.6-18.el7.centos.x86_64                             1/1
 Verifying  : httpd-2.4.6-18.el7.centos.x86_64                             1/1

Installed:
 httpd.x86_64 0:2.4.6-18.el7.centos

Complete!

Starten Sie den Daemon manuell:

service httpd start

Wenn Sie den Befehl + service httpd status ausführen, wird angezeigt, dass der Dienst jetzt ausgeführt wird:

Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
  Active: active (running) since Tue 2014-08-19 13:39:48 EST; 1min 40s ago
Main PID: 339 (httpd)
...
...

Als nächstes installieren wir vsftpd:

yum install vsftpd

Die Ausgabe sollte ungefähr so ​​aussehen:

Loaded plugins: fastestmirror, langpacks
...
...
==============================================================================================================
Package                  Arch                     Version                       Repository              Size
==============================================================================================================
Installing:
vsftpd                   x86_64                   3.0.2-9.el7                   base                   165 k

Transaction Summary
==============================================================================================================
Install  1 Package

Total download size: 165 k
Installed size: 343 k
Is this ok [y/d/N]:

Drücken Sie * y *, um das Paket zu installieren.

Als nächstes verwenden wir den Befehl + service vsftpd start +, um den vsftpd-Daemon zu starten. Die Ausgabe sollte ungefähr so ​​aussehen:

Redirecting to /bin/systemctl status  vsftpd.service
vsftpd.service - Vsftpd ftp daemon
  Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
  Active: active (running) since Tue 2014-08-19 13:48:57 EST; 4s ago
 Process: 599 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 600 (vsftpd)
...
...

SELinux-Pakete installieren

In SELinux wird eine Reihe von Paketen verwendet. Einige sind standardmäßig installiert. Hier ist eine Liste für Red Hat-basierte Distributionen:

  • policycoreutils (stellt Dienstprogramme zum Verwalten von SELinux bereit)

  • policycoreutils-python (stellt Dienstprogramme zum Verwalten von SELinux bereit)

  • selinux-policy (stellt SELinux-Referenzrichtlinie bereit)

  • selinux-policy-targeted (bietet SELinux-Targeted-Policy)

  • libselinux-utils (enthält einige Tools zum Verwalten von SELinux)

  • setroubleshoot-server (stellt Tools zum Entschlüsseln von Überwachungsprotokollnachrichten bereit)

  • setools (stellt Tools für die Überwachung des Überwachungsprotokolls, das Abfragen von Richtlinien und die Dateikontextverwaltung bereit)

  • setools-console (stellt Tools zur Überwachung des Überwachungsprotokolls, zum Abfragen von Richtlinien und zur Verwaltung des Dateikontexts bereit)

  • mcstrans (Tools zum Übersetzen verschiedener Ebenen in ein leicht verständliches Format)

Einige davon sind bereits installiert. Um zu überprüfen, welche SELinux-Pakete auf Ihrem CentOS 7-System installiert sind, können Sie als Root-Benutzer einige Befehle wie den folgenden ausführen (mit unterschiedlichen Suchbegriffen nach "+ grep +"):

rpm -qa | grep selinux

Die Ausgabe sollte ungefähr so ​​aussehen:

libselinux-utils-2.2.2-6.el7.x86_64
libselinux-2.2.2-6.el7.x86_64
selinux-policy-targeted-3.12.1-153.el7.noarch
selinux-policy-3.12.1-153.el7.noarch
libselinux-python-2.2.2-6.el7.x86_64

Sie können alle Pakete mit dem folgenden Befehl installieren (yum aktualisiert nur die bereits vorhandenen) oder nur diejenigen, die auf Ihrem System fehlen:

yum install policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans

Jetzt sollten wir ein System haben, das mit allen SELinux-Paketen geladen ist. Wir haben auch Apache- und SFTP-Server mit ihren Standardkonfigurationen. Zusätzlich zum * root * -Konto stehen vier reguläre Benutzerkonten zum Testen bereit.

SELinux-Modi

Es ist an der Zeit, mit SELinux herumzuspielen. Beginnen wir also mit den SELinux-Modi. SELinux kann sich zu jeder Zeit in einem von drei möglichen Modi befinden:

  • Durchsetzung

  • Freizügig

  • Deaktiviert

Im erzwungenen Modus wird SELinux seine Richtlinie auf dem Linux-System durchsetzen und sicherstellen, dass nicht autorisierte Zugriffsversuche von Benutzern und Prozessen verweigert werden. Die Zugriffsverweigerungen werden auch in relevante Protokolldateien geschrieben. Wir werden später über SELinux-Richtlinien und Überwachungsprotokolle sprechen.

Der zulässige Modus entspricht einem halbaktivierten Status. SELinux wendet seine Richtlinie nicht im zulässigen Modus an, sodass kein Zugriff verweigert wird. Verstöße gegen die Richtlinien werden jedoch weiterhin in den Überwachungsprotokollen protokolliert. Es ist eine großartige Möglichkeit, SELinux zu testen, bevor Sie es erzwingen.

Der deaktivierte Modus ist selbsterklärend. Das System wird nicht mit erhöhter Sicherheit ausgeführt.

SELinux-Modi und -Status prüfen

Wir können den Befehl + getenforce + ausführen, um den aktuellen SELinux-Modus zu überprüfen.

getenforce

SELinux sollte derzeit deaktiviert sein, damit die Ausgabe so aussieht:

Disabled

Wir können auch den Befehl + sestatus + ausführen:

sestatus

Wenn SELinux deaktiviert ist, zeigt die Ausgabe:

SELinux status:        disabled

SELinux-Konfigurationsdatei

Die Hauptkonfigurationsdatei für SELinux ist / etc / selinux / config. Wir können den folgenden Befehl ausführen, um seinen Inhalt anzuzeigen:

cat /etc/selinux/config

Die Ausgabe sieht ungefähr so ​​aus:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Diese Datei enthält zwei Anweisungen. Die SELINUX-Direktive schreibt den SELinux-Modus vor und kann drei mögliche Werte haben, wie wir zuvor besprochen haben.

Die SELINUXTYPE-Direktive bestimmt die Richtlinie, die verwendet wird. Der Standardwert ist "+ gezielt +". Mit einer gezielten Richtlinie können Sie in SELinux die Zugriffssteuerungsberechtigungen anpassen und optimieren. Der andere mögliche Wert ist "MLS" (Multilevel Security), ein erweiterter Schutzmodus. Auch bei MLS müssen Sie ein zusätzliches Paket installieren.

Aktivieren und Deaktivieren von SELinux

Das Aktivieren von SELinux ist recht einfach. Im Gegensatz zur Deaktivierung sollte dies jedoch in zwei Schritten erfolgen. Wir gehen davon aus, dass SELinux derzeit deaktiviert ist und dass Sie alle SELinux-Pakete aus dem vorherigen Abschnitt installiert haben.

Als ersten Schritt müssen wir die Datei "+ / etc / selinux / config +" bearbeiten, um die SELINUX-Direktive in den zulässigen Modus zu versetzen.

vi /etc/sysconfig/selinux
...
SELINUX=permissive
...

Das erstmalige Setzen des Status auf * permissive * ist erforderlich, da jeder Datei im System ein Kontext zugewiesen werden muss, bevor SELinux erzwungen werden kann. Wenn nicht alle Dateien ordnungsgemäß gekennzeichnet sind, schlagen Prozesse in begrenzten Domänen möglicherweise fehl, da sie nicht auf Dateien mit den richtigen Kontexten zugreifen können. Dies kann dazu führen, dass der Startvorgang fehlschlägt oder mit Fehlern beginnt. Wir werden Kontexte und Domänen später im Tutorial vorstellen.

Führen Sie nun einen Systemneustart durch:

reboot

Beim Neustart werden alle Dateien auf dem Server angezeigt, die mit einem SELinux-Kontext gekennzeichnet sind. Da das System im zulässigen Modus ausgeführt wird, werden SELinux-Fehler und Zugriffsverweigerungen gemeldet, aber es wird nichts gestoppt.

Melden Sie sich erneut als * root * bei Ihrem Server an. Suchen Sie als Nächstes nach der Zeichenfolge "SELinux verhindert" in der Datei / var / log / messages.

cat /var/log/messages | grep "SELinux is preventing"

Wenn keine Fehler gemeldet werden, können wir sicher mit dem nächsten Schritt fortfahren. Es ist jedoch immer noch eine gute Idee, in der Datei / var / log / messages nach Text zu suchen, der „SELinux“ enthält. In unserem System haben wir den folgenden Befehl ausgeführt:

cat /var/log/messages | grep "SELinux"

Dies zeigte einige Fehlermeldungen bezüglich des ausgeführten GNOME-Desktops. Dies geschah, als SELInux entweder deaktiviert war oder sich im zulässigen Modus befand:

Aug 20 11:31:14 localhost kernel: SELinux:  Initializing.
Aug 20 11:31:16 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:31:21 localhost journal: Unable to lookup SELinux process context: Invalid argument
Aug 20 11:33:20 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.

Aug 20 11:37:15 localhost kernel: SELinux:  Initializing.
Aug 20 11:37:17 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:37:23 localhost journal: Unable to lookup SELinux process context: Invalid argument
Aug 20 11:37:44 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.

Aug 20 11:39:42 localhost kernel: SELinux:  Initializing.
Aug 20 11:39:44 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:39:50 localhost journal: Unable to lookup SELinux process context: Invalid argument

Diese Arten von Fehlern sind in Ordnung.

In der zweiten Phase müssen wir die Konfigurationsdatei bearbeiten, um die SELINUX-Direktive in der Datei + / etc / sysconfig / selinux + von * permissive * auf * enforcing * zu ändern:

...
SELINUX=enforcing
...

Starten Sie als Nächstes den Server erneut.

reboot

Sobald der Server wieder online ist, können wir den Befehl + sestatus + ausführen, um den SELinux-Status zu überprüfen. Es sollte nun mehr Details zum Server anzeigen:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          error (Success)
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

Überprüfen Sie die Datei / var / log / messages:

cat /var/log/messages | grep "SELinux"

Es sollte keine Fehler geben. Die Ausgabe sollte ungefähr so ​​aussehen:

Aug 20 11:42:06 localhost kernel: SELinux:  Initializing.
Aug 20 11:42:09 localhost systemd[1]: Successfully loaded SELinux policy in 183.302ms.

Aug 20 11:44:25 localhost kernel: SELinux:  Initializing.
Aug 20 11:44:28 localhost systemd[1]: Successfully loaded SELinux policy in 169.039ms.

SELinux-Modi und -Status überprüfen (erneut)

Wir können den Befehl + getenforce + ausführen, um den aktuellen SELinux-Modus zu überprüfen.

getenforce

Wenn sich unser System im Erzwingungsmodus befindet, sieht die Ausgabe folgendermaßen aus:

Enforcing

Die Ausgabe ist anders, wenn SELinux deaktiviert ist:

Disabled

Wir können auch den Befehl "+ sestatus +" ausführen, um ein besseres Bild zu erhalten.

sestatus

Wenn SELinux nicht deaktiviert ist, zeigt der Ausgang seinen aktuellen Status, seinen aktuellen Modus, den in der Konfigurationsdatei definierten Modus und den Richtlinientyp an.

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
Max kernel policy version:      28

Wenn SELinux deaktiviert ist, zeigt die Ausgabe:

SELinux status:        disabled

Mit dem Befehl + setenforce + können wir auch vorübergehend zwischen erzwingendem und zulässigem Modus wechseln. (Beachten Sie, dass wir + setenforce + nicht ausführen können, wenn SELinux deaktiviert ist.)

Ändern Sie zunächst den SELinux-Modus in unserem CentOS 7-System von erzwingen auf zulassen:

setenforce permissive

Das Ausführen des Befehls "+ sestatus +" zeigt nun, dass sich der aktuelle Modus von dem in der Konfigurationsdatei definierten Modus unterscheidet:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

Wechseln Sie zurück zu * Durchsetzen *:

setenforce enforcing

SELinux-Richtlinie

Das Herzstück der SELinux-Sicherheits-Engine ist ihre Policy. Der Name impliziert eine Richtlinie: eine Reihe von Regeln, die die Sicherheit und die Zugriffsrechte für alles im System definieren. Und wenn wir alles sagen, meinen wir Benutzer, Rollen, Prozesse und Dateien. Die Richtlinie definiert, in welcher Beziehung diese Entitäten zueinander stehen.

Einige Grundbegriffe

Um die Politik zu verstehen, müssen wir einige grundlegende Begriffe lernen. Wir werden später auf die Details eingehen, aber hier ist eine kurze Einführung. Eine SELinux-Richtlinie definiert den Benutzerzugriff auf Rollen, den Rollenzugriff auf Domänen und den Domänenzugriff auf Typen.

  • Benutzer *

SELinux verfügt über eine Reihe vorgefertigter Benutzer. Jedes reguläre Linux-Benutzerkonto wird einem oder mehreren SELinux-Benutzern zugeordnet.

Unter Linux führt ein Benutzer einen Prozess aus. Dies kann so einfach sein, wie der Benutzer * jo *, der ein Dokument im vi-Editor öffnet (dies ist das Konto von jo, das den vi-Prozess ausführt), oder ein Dienstkonto, das den httpd-Daemon ausführt. In der SELinux-Welt wird ein Prozess (ein Daemon oder ein laufendes Programm) als subject bezeichnet.

  • Rollen *

Eine Rolle ist wie ein Gateway, das sich zwischen einem Benutzer und einem Prozess befindet. Eine Rolle definiert, welche Benutzer auf diesen Prozess zugreifen können. Rollen sind keine Gruppen, sondern eher Filter: Ein Benutzer kann jederzeit eine Rolle eingeben oder übernehmen, sofern die Rolle dies zulässt. Die Definition einer Rolle in der SELinux-Richtlinie definiert, welche Benutzer Zugriff auf diese Rolle haben. Außerdem wird definiert, auf welche Prozessdomänen die Rolle selbst Zugriff hat. Rollen spielen eine Rolle, da ein Teil von SELinux die so genannte * Role Based Access Control * (RBAC) implementiert.

  • Subjekte und Objekte *

Ein subject ist ein Prozess und kann möglicherweise ein object beeinflussen.

Ein Objekt in SELinux ist alles, worauf reagiert werden kann. Dies kann eine Datei, ein Verzeichnis, ein Port, ein TCP-Socket, der Cursor oder ein X-Server sein. Die Aktionen, die ein Betreff für ein Objekt ausführen kann, sind die Berechtigungen des Betreffs.

  • Domains sind für Subjekte *

Eine Domäne ist der Kontext, in dem ein SELinux-Subjekt (Prozess) ausgeführt werden kann. Dieser Kontext ist wie eine Hülle um das Thema. Es teilt dem Prozess mit, was er kann und was nicht. Die Domäne definiert beispielsweise, auf welche Dateien, Verzeichnisse, Links, Geräte oder Ports der Betreff zugreifen kann.

  • Typen sind für Objekte *

Ein Typ ist der Kontext für den Kontext einer Datei, der den Zweck der Datei festlegt. Beispielsweise kann der Kontext einer Datei vorgeben, dass es sich um eine Webseite handelt, dass die Datei zum Verzeichnis "+ / etc +" gehört oder dass der Eigentümer der Datei ein bestimmter SELinux-Benutzer ist. Der Kontext einer Datei wird in SELinux-Jargon als type bezeichnet.

  • Also, was ist SELinux-Politik? *

Die SELinux-Richtlinie definiert den Benutzerzugriff auf Rollen, den Rollenzugriff auf Domänen und den Domänenzugriff auf Typen. Zuerst muss der Benutzer berechtigt sein, eine Rolle einzugeben, und dann muss die Rolle berechtigt sein, auf die Domäne zuzugreifen. Die Domain kann nur auf bestimmte Dateitypen zugreifen.

Bei der Richtlinie selbst handelt es sich um eine Reihe von Regeln, nach denen Standardbenutzer nur Standardrollen übernehmen können und diese Rollen nur für den Zugriff auf Standarddomänen berechtigt sind. Die Domänen können wiederum nur auf Standarddateitypen zugreifen. Das folgende Bild zeigt das Konzept:

image: https://assets.digitalocean.com/articles/SELinuxCentOS7/1.jpg [SELinux-Benutzer, Rollen, Domänen und Dateien]

Terminologietipp: Das letzte Bit, bei dem ein Prozess, der in einer bestimmten Domäne ausgeführt wird, nur bestimmte Vorgänge für bestimmte Objekttypen ausführen kann, heißt Type Enforcement (TE).

Zurück zum Thema Richtlinien: SELinux-Richtlinienimplementierungen sind in der Regel ebenfalls standardmäßig gerichtet. Wenn Sie sich an die SELinux-Konfigurationsdatei erinnern, die wir zuvor gesehen haben, ist die SELINUXTYPE-Direktive auf "+ target +" gesetzt. Dies bedeutet, dass SELinux standardmäßig nur bestimmte Prozesse im System einschränkt (d. H. nur bestimmte Prozesse sind betroffen). Diejenigen, auf die nicht abgezielt wird, werden in nicht beschränkten Domänen ausgeführt.

Die Alternative ist ein standardmäßig verweigertes Modell, bei dem jeder Zugriff verweigert wird, es sei denn, die Richtlinie genehmigt dies. Es wäre eine sehr sichere Implementierung, aber dies bedeutet auch, dass Entwickler jede einzelne mögliche Berechtigung vorwegnehmen müssen, die jeder einzelne Prozess für jedes einzelne mögliche Objekt benötigt. Das Standardverhalten sieht vor, dass SELinux nur bestimmte Prozesse betrifft.

  • SELinux-Richtlinienverhalten *

SELinux-Richtlinien ersetzen nicht die herkömmliche DAC-Sicherheit. Wenn eine DAC-Regel einem Benutzer den Zugriff auf eine Datei untersagt, werden SELinux-Richtlinienregeln nicht ausgewertet, da die erste Verteidigungslinie den Zugriff bereits blockiert hat. SELinux-Sicherheitsentscheidungen spielen eine Rolle, nachdem die DAC-Sicherheit evaluiert wurde.

Wenn ein SELinux-fähiges System gestartet wird, wird die Richtlinie in den Speicher geladen. SELinux-Richtlinien sind modular aufgebaut, ähnlich wie die Kernel-Module, die beim Booten geladen werden. Und genau wie die Kernelmodule können sie zur Laufzeit dynamisch hinzugefügt und aus dem Speicher entfernt werden. Der von SELinux verwendete policy store verfolgt die geladenen Module. Der Befehl + sestatus + zeigt den Namen des Richtlinienspeichers an. Der Befehl + semodule -l + listet die SELinux-Richtlinienmodule auf, die derzeit in den Speicher geladen sind.

Um ein Gefühl dafür zu bekommen, führen wir den Befehl "+ semodule +" aus:

semodule -l | less

Die Ausgabe sieht ungefähr so ​​aus:

abrt    1.2.0
accountsd       1.0.6
acct    1.5.1
afs     1.8.2
aiccu   1.0.2
aide    1.6.1
ajaxterm        1.0.0
alsa    1.11.4
amanda  1.14.2
amtu    1.2.3
anaconda        1.6.1
antivirus       1.0.0
apache  2.4.0
...
...

+ semodule + kann für eine Reihe anderer Aufgaben verwendet werden, z. B. zum Installieren, Entfernen, Neuladen, Aktualisieren, Aktivieren und Deaktivieren von SELinux-Richtlinienmodulen.

Inzwischen würden Sie wahrscheinlich interessiert sein, wo sich die Moduldateien befinden. Die meisten modernen Distributionen enthalten Binärversionen der Module als Teil der SELinux-Pakete. Die Richtliniendateien haben die Erweiterung .pp. Für CentOS 7 können wir den folgenden Befehl ausführen:

ls -l /etc/selinux/targeted/modules/active/modules/

Die Liste enthält eine Reihe von Dateien mit der Erweiterung "+ .pp +". Wenn Sie genau hinschauen, beziehen sie sich auf verschiedene Anwendungen:

...
-rw-r--r--. 1 root root 10692 Aug 20 11:41 anaconda.pp
-rw-r--r--. 1 root root 11680 Aug 20 11:41 antivirus.pp
-rw-r--r--. 1 root root 24190 Aug 20 11:41 apache.pp
-rw-r--r--. 1 root root 11043 Aug 20 11:41 apcupsd.pp
...

Die + .pp + Dateien sind jedoch nicht für Menschen lesbar.

Die Funktionsweise der SELinux-Modularisierung besteht darin, dass beim Systemstart Richtlinienmodule zu der so genannten aktiven Richtlinie kombiniert werden. Diese Richtlinie wird dann in den Speicher geladen. Die kombinierte Binärversion dieser geladenen Richtlinie befindet sich im Verzeichnis "+ / etc / selinux / target / policy +".

ls -l /etc/selinux/targeted/policy/

zeigt die aktive Richtlinie an.

total 3428
-rw-r--r--. 1 root root 3510001 Aug 20 11:41 policy.29

Boolesche SELinux-Einstellungen ändern

Obwohl Sie die Richtlinienmoduldateien nicht lesen können, gibt es eine einfache Möglichkeit, ihre Einstellungen zu optimieren. Dies geschieht mit SELinux booleans.

Um zu sehen, wie es funktioniert, führen wir den booleschen Befehl "+ semanage -l +" aus.

semanage boolean -l | less

Dies zeigt die verschiedenen Schalter, die ein- oder ausgeschaltet werden können, was sie tun und ihren aktuellen Status:

ftp_home_dir                   (off  ,  off)  Allow ftp to home dir
smartmon_3ware                 (off  ,  off)  Allow smartmon to 3ware
mpd_enable_homedirs            (off  ,  off)  Allow mpd to enable homedirs
xdm_sysadm_login               (off  ,  off)  Allow xdm to sysadm login
xen_use_nfs                    (off  ,  off)  Allow xen to use nfs
mozilla_read_content           (off  ,  off)  Allow mozilla to read content
ssh_chroot_rw_homedirs         (off  ,  off)  Allow ssh to chroot rw homedirs
mount_anyfile                  (on   ,   on)  Allow mount to anyfile
...
...

Wir können sehen, dass die erste Option dem FTP-Daemon erlaubt, auf die Home-Verzeichnisse der Benutzer zuzugreifen. Die Einstellung ist momentan deaktiviert.

Um eine der Einstellungen zu ändern, können wir den Befehl + setsebool + verwenden. Betrachten wir als Beispiel den anonymen FTP-Schreibzugriff:

getsebool ftpd_anon_write

Dies zeigt uns, dass der Schalter momentan ausgeschaltet ist:

ftpd_anon_write --> off

Als nächstes ändern wir den Booleschen Wert, um ihn zu aktivieren:

setsebool ftpd_anon_write on

Wenn Sie den Wert erneut überprüfen, sollte die Änderung angezeigt werden:

ftpd_anon_write --> on

Geänderte Boolesche Werte sind nicht permanent. Sie kehren nach einem Neustart zu ihren alten Werten zurück. Um die Dinge dauerhaft zu machen, können wir den Schalter -P mit dem Befehl + setsebool + verwenden.

Fazit

Im ersten Teil dieses Tutorials haben wir versucht, einige grundlegende Konzepte rund um SELinux zu verstehen. Wir haben gesehen, wie SELinux ein System sichern kann, wie wir es aktivieren können und in welchen Modi es ausgeführt werden kann. Wir haben auch das Thema SELinux-Politik angesprochen. Als nächstes erfahren wir, wie Sie mit SELinux den Zugriff einschränken können zu Dateien und Prozessen].