In der Zeit, in der wir jetzt leben, ist alles mit einer weniger sicheren Umgebung leicht ein Ziel für einen Angriff und wird zu einem Kopfgeld für die Angreifer. Im Vergleich zu den letzten 20 Jahren sind Hacker heutzutage nicht nur in Bezug auf die Fähigkeiten, sondern auch in Bezug auf die von ihnen verwendeten Tools fortschrittlicher. Es ist keine Überraschung, warum einige riesige Unternehmen gehackt werden und ihre wertvollen Daten durchsickern.
Allein im Jahr 2021 gibt es bereits mehr als 10 Vorfälle im Zusammenhang mit Datenschutzverletzungen. Der jüngste Vorfall wurde von BOSE, einem bekannten Audiohersteller, gemeldet, der sich im Mai ereignete. BOSE entdeckte, dass die Angreifer auf einige der persönlichen Daten seiner derzeitigen und ehemaligen Mitarbeiter zugegriffen hatten. Die bei dem Angriff offengelegten persönlichen Daten umfassen Namen, Sozialversicherungsnummern, Vergütungsinformationen und andere HR-bezogene Informationen.
Was ist Ihrer Meinung nach der Zweck dieser Art von Angriff und was motiviert den Hacker dazu? Es geht offensichtlich nur ums Geld. Da gestohlene Daten auch häufig verkauft werden, können Hacker mit Angriffen auf große Unternehmen Geld verdienen. Nicht nur die wichtigen Daten können an die Konkurrenten des Unternehmens verkauft werden, sondern die Hacker können gleichzeitig auch ein riesiges Lösegeld fordern.
Wie könnten wir das also mit Datenbanken in Verbindung bringen? Da die Datenbank eines der großen Vermögenswerte des Unternehmens ist, wird empfohlen, sie mit erhöhter Sicherheit zu behandeln, damit unsere wertvollen Daten die meiste Zeit geschützt sind. In meinem letzten Blogbeitrag haben wir bereits eine Einführung in SELinux gegeben, wie man es aktiviert, welche Art von Modus SELinux hat und wie man es für MongoDB konfiguriert. Heute werfen wir einen Blick darauf, wie SELinux für MySQL-basierte Systeme konfiguriert wird.
Die 5 wichtigsten Vorteile von SELinux
Bevor Sie fortfahren, fragen sich vielleicht einige von Ihnen, ob SELinux irgendwelche positiven Vorteile bietet, da es ein bisschen mühsam ist, es zu aktivieren. Hier sind die Top-5-Vorteile von SELinux, die Sie nicht missen und in Betracht ziehen sollten:
-
Vertraulichkeit und Integrität von Daten durchsetzen und gleichzeitig Prozesse schützen
-
Die Fähigkeit, Dienste und Daemons einzuschränken, um vorhersehbarer zu sein
-
Reduzierung des Risikos von Privilegieneskalationsangriffen
-
Die Richtlinie wird systemweit durchgesetzt, nicht nach Ermessen des Benutzers festgelegt und administrativ definiert
-
Bereitstellung einer differenzierten Zugriffskontrolle
Bevor wir mit der Konfiguration von SELinux für unsere MySQL-Instanzen beginnen, warum gehen Sie nicht durch, wie Sie SELinux mit ClusterControl für alle MySQL-basierten Bereitstellungen aktivieren. Obwohl der Schritt für alle Datenbankverwaltungssysteme gleich ist, halten wir es für eine gute Idee, einige Screenshots als Referenz beizufügen.
Schritte zum Aktivieren von SELinux für die MySQL-Replikation
In diesem Abschnitt werden wir die MySQL-Replikation mit ClusterControl 1.8.2 bereitstellen. Die Schritte sind für MariaDB, Galera Cluster oder MySQL gleich:Angenommen, alle Knoten sind bereit und passwortloses SSH ist konfiguriert, beginnen wir mit der Bereitstellung. Um SELinux für unser Setup zu aktivieren, müssen wir „AppArmor/SELinux deaktivieren“ deaktivieren, was bedeutet, dass SELinux für alle Knoten als „permissiv“ festgelegt wird.
Als Nächstes wählen wir Percona als Anbieter (Sie können auch MariaDB , Oracle oder MySQL 8), dann geben Sie das „root“-Passwort an. Abhängig von Ihrer Einrichtung können Sie einen Standardspeicherort oder Ihre anderen Verzeichnisse verwenden.
Sobald alle Hosts hinzugefügt wurden, können wir die Bereitstellung starten und ausführen lassen beenden, bevor wir mit der SELinux-Konfiguration beginnen können.
Schritte zum Aktivieren von SELinux für die MariaDB-Replikation
In diesem Abschnitt stellen wir die MariaDB-Replikation mit ClusterControl 1.8.2 bereit.
Wir werden MariaDB als Anbieter und Version 10.5 auswählen sowie die angeben „root“-Passwort. Abhängig von Ihrer Einrichtung können Sie einen Standardspeicherort oder Ihre anderen Verzeichnisse verwenden.
Sobald alle Hosts hinzugefügt wurden, können wir die Bereitstellung starten und durchführen lassen beenden, bevor wir mit der SELinux-Konfiguration fortfahren können.
Schritte zum Aktivieren von SELinux für Galera Cluster
In diesem Abschnitt werden wir Galera Cluster mit ClusterControl 1.8.2 bereitstellen. Deaktivieren Sie erneut „AppArmor/SELinux deaktivieren“, was bedeutet, dass SELinux für alle Knoten als „permissiv“ festgelegt wird:
Als Nächstes wählen wir Percona als Anbieter und MySQL 8 sowie Geben Sie das „root“-Passwort an. Abhängig von Ihrer Einrichtung können Sie einen Standardspeicherort oder Ihre anderen Verzeichnisse verwenden. Sobald alle Hosts hinzugefügt wurden, können wir die Bereitstellung starten und abschließen.
Wie üblich können wir den Status der Bereitstellung im Abschnitt „Aktivität“ der Benutzeroberfläche überwachen.
So konfigurieren Sie SELinux für MySQL
Da alle unsere Cluster MySQL-basiert sind, sind auch die Schritte zur Konfiguration von SELinux gleich. Bevor wir mit dem Setup beginnen und da dies eine neu eingerichtete Umgebung ist, empfehlen wir Ihnen, den automatischen Wiederherstellungsmodus für Cluster und Knoten zu deaktivieren, wie im folgenden Screenshot gezeigt. Auf diese Weise können wir vermeiden, dass der Cluster während des Testens in einen Failover gerät, oder den Dienst neu starten:
Lassen Sie uns zuerst sehen, was der Kontext für „mysql“ ist. Fahren Sie fort und führen Sie den folgenden Befehl aus, um den Kontext anzuzeigen:
$ ps -eZ | grep mysqld_t
Und das Beispiel der Ausgabe ist wie folgt:
system_u:system_r:mysqld_t:s0 845 ? 00:00:01 mysqld
Die Definition für die obige Ausgabe lautet:
-
system_u - Benutzer
-
system_r - Rolle
-
mysqld_t - Typ
-
s0 845 - Empfindlichkeitsstufe
Wenn Sie den SELinux-Status überprüfen, können Sie sehen, dass der Status „zulässig“ ist, was noch nicht vollständig aktiviert ist. Wir müssen den Modus auf „Erzwingen“ ändern und um dies zu erreichen, müssen wir die SELinux-Konfigurationsdatei bearbeiten, um sie dauerhaft zu machen.
$ vi /etc/selinux/config
SELINUX=enforcing
Fahren Sie fort, das System nach den Änderungen neu zu starten. Da wir den Modus von „permissive“ auf „enforcing“ ändern, müssen wir das Dateisystem erneut umbenennen. In der Regel können Sie wählen, ob Sie das gesamte Dateisystem oder nur eine Anwendung umbenennen möchten. Der Grund, warum eine Umbenennung erforderlich ist, liegt darin begründet, dass der „Erzwingen“-Modus die richtige Bezeichnung oder Funktion benötigt, um korrekt ausgeführt zu werden. In einigen Fällen werden diese Labels während des „permissiven“ oder „deaktivierten“ Modus geändert.
Für dieses Beispiel werden wir nur eine Anwendung (MySQL) mit dem folgenden Befehl umbenennen:
$ fixfiles -R mysqld restore
Bei einem System, das schon seit geraumer Zeit verwendet wird, ist es eine gute Idee, das gesamte Dateisystem neu zu kennzeichnen. Der folgende Befehl erledigt die Aufgabe ohne Neustart und dieser Vorgang kann je nach System eine Weile dauern:
$ fixfiles -f -F relabel
Wie viele andere Datenbanken verlangt auch MySQL das Lesen und Schreiben vieler Dateien. Ohne einen korrekten SELinux-Kontext für diese Dateien wird der Zugriff zweifellos verweigert. Um die Richtlinie für SELinux zu konfigurieren, ist „semanage“ erforderlich. „semanage“ ermöglicht auch jede Konfiguration, ohne dass die Richtlinienquellen neu kompiliert werden müssen. Bei den meisten Linux-Systemen ist dieses Tool bereits standardmäßig installiert. In unserem Fall ist es bereits mit der folgenden Version installiert:
$ rpm -qa |grep semanage
python3-libsemanage-2.9-3.el8.x86_64
libsemanage-2.9-3.el8.x86_64
Für das System, auf dem es nicht installiert ist, hilft Ihnen der folgende Befehl bei der Installation:
$ yum install -y policycoreutils-python-utils
Sehen wir uns nun an, was die MySQL-Dateikontexte sind:
$ semanage fcontext -l | grep -i mysql
Wie Sie vielleicht bemerkt haben, gibt es eine Reihe von Dateien, die mit MySQL verbunden sind, sobald der obige Befehl ausgeführt wird. Wenn Sie sich an den Anfang erinnern, verwenden wir ein standardmäßiges „Server Data Directory“. Sollte Ihre Installation einen anderen Speicherort des Datenverzeichnisses verwenden, müssen Sie den Kontext für „mysql_db_t“ aktualisieren, der sich auf /var/lib/mysql/
beziehtDer erste Schritt besteht darin, den SELinux-Kontext zu ändern, indem Sie eine dieser Optionen verwenden:
$ semanage fcontext -a -t mysqld_db_t /var/lib/yourcustomdirectory
$ semanage fcontext -a -e /var/lib/mysql /var/lib/yourcustomdirectory
After the step above, run the following command:
$ restorecon -Rv /var/lib/yourcustomdirectory
Und zuletzt starten Sie den Dienst neu:
$ systemctl restart mysql
In einigen Konfigurationen ist wahrscheinlich für jeden Zweck ein anderer Protokollspeicherort erforderlich. Für diese Situation muss „mysqld_log_t“ ebenfalls aktualisiert werden. „mysqld_log_t“ ist ein Kontext für den Standardspeicherort /var/log/mysqld.log und die folgenden Schritte können ausgeführt werden, um ihn zu aktualisieren:
$ semanage fcontext -a -t mysqld_log_t "/your/custom/error.log"
$ restorecon -Rv /path/to/my/custom/error.log
$ systemctl restart mysql
Es kann vorkommen, dass der Standardport mit einem anderen Port als 3306 konfiguriert ist. Wenn Sie beispielsweise Port 3303 für MySQL verwenden, müssen Sie den SELinux-Kontext mit dem folgenden Befehl definieren :
$ semanage port -a -t mysqld_port_t -p tcp 3303
Und um zu überprüfen, ob der Port aktualisiert wurde, können Sie den folgenden Befehl verwenden:
$ semanage port -l | grep mysqld
Verwenden von audit2allow zum Generieren von Richtlinien
Eine andere Möglichkeit, die Richtlinie zu konfigurieren, ist die Verwendung von „audit2allow“, das bereits während der Installation von „semanage“ soeben enthalten ist. Dieses Tool ruft die Protokollereignisse aus audit.log ab und verwendet diese Informationen zum Erstellen einer Richtlinie. Manchmal benötigt MySQL möglicherweise eine nicht standardmäßige Richtlinie, daher ist dies der beste Weg, dies zu erreichen.
Lassen Sie uns zuerst den Modus für die MySQL-Domain auf permissiv setzen und die Änderungen überprüfen:
$ semanage permissive -a mysqld_t
$ semodule -l | grep permissive
permissive_mysqld_t
permissivedomains
Der nächste Schritt besteht darin, die Richtlinie mit dem folgenden Befehl zu generieren:
$ grep mysqld /var/log/audit/audit.log | audit2allow -M {yourpolicyname}
$ grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_new
Sie sollten die Ausgabe wie folgt sehen (kann je nach festgelegtem Richtliniennamen unterschiedlich sein):
******************** WICHTIG ********************* **
Um dieses Richtlinienpaket zu aktivieren, führen Sie Folgendes aus:
semodule -i mysql_new.pp
Wie bereits erwähnt, müssen wir „semodule -i mysql_new.pp“ ausführen, um die Richtlinie zu aktivieren. Fahren Sie fort und führen Sie es aus:
$ semodule -i mysql_new.pp
Der letzte Schritt besteht darin, die MySQL-Domain wieder in den „erzwingenden“ Modus zu versetzen:
$ semanage permissive -d mysqld_t
libsemanage.semanage_direct_remove_key:Entfernen des letzten permissive_mysqld_t-Moduls (es existiert kein anderes permissive_mysqld_t-Modul mit einer anderen Priorität).
Was sollten Sie tun, wenn SELinux nicht funktioniert?
Häufig erfordert die SELinux-Konfiguration so viel Testen. Eine der besten Möglichkeiten, die Konfiguration zu testen, besteht darin, den Modus auf „permissiv“ zu ändern. Wenn Sie es nur für die MySQL-Domäne festlegen möchten, können Sie einfach den folgenden Befehl verwenden. Dies ist eine bewährte Vorgehensweise, um zu vermeiden, dass das gesamte System auf „zulässig“ konfiguriert wird:
$ semanage permissive -a mysqld_t
Sobald alles erledigt ist, können Sie den Modus wieder auf „Erzwingen“ ändern:
$ semanage permissive -d mysqld_t
Zusätzlich dazu stellt /var/log/audit/audit.log alle Protokolle bereit, die sich auf SELinux beziehen. Dieses Protokoll wird Ihnen sehr dabei helfen, die Ursache und den Grund zu identifizieren. Alles, was Sie tun müssen, ist, mit „grep“ nach „denied“ zu filtern.
$ more /var/log/audit/audit.log |grep "denied"
Wir sind jetzt mit der Konfiguration der SELinux-Richtlinie für MySQL-basierte Systeme fertig. Erwähnenswert ist, dass dieselbe Konfiguration auf allen Knoten Ihres Clusters vorgenommen werden muss, möglicherweise müssen Sie denselben Vorgang für sie wiederholen.