Daten sind das wichtigste Gut in einem Unternehmen, daher sollten Sie alle Sicherheitsüberlegungen in Ihrer Datenbank berücksichtigen, um sie so sicher wie möglich zu halten. Eine wichtige Sicherheitsfunktion auf RedHat-basierten Betriebssystemen ist SELinux. In diesem Blog werden wir sehen, was diese Funktion ist und wie sie für PostgreSQL- und TimescaleDB-Datenbanken konfiguriert wird.
Was ist SELinux?
Security-Enhanced Linux (SELinux) ist eine Sicherheitsarchitektur für Linux-Systeme, die es Administratoren ermöglicht, mehr Kontrolle darüber zu haben, wer auf das System zugreifen kann. Es definiert Zugriffskontrollen für die Anwendungen, Prozesse und Dateien auf einem System mithilfe von Sicherheitsrichtlinien, bei denen es sich um eine Reihe von Regeln handelt, die SELinux mitteilen, auf was zugegriffen werden kann.
Wenn eine Anwendung oder ein Prozess, bekannt als Subjekt, eine Anforderung für den Zugriff auf ein Objekt wie eine Datei stellt, prüft SELinux mit einem Zugriffsvektor-Cache (AVC), in dem Berechtigungen für Subjekte und Objekte zwischengespeichert werden . Wenn SELinux anhand der zwischengespeicherten Berechtigungen keine Entscheidung über den Zugriff treffen kann, sendet es die Anfrage an den Sicherheitsserver. Der Sicherheitsserver prüft den Sicherheitskontext der App oder des Prozesses und der Datei. Der Sicherheitskontext wird aus der SELinux-Richtliniendatenbank angewendet und die Berechtigung wird gewährt oder verweigert.
Es gibt verschiedene Möglichkeiten, es zu konfigurieren. Sie können sich die Hauptkonfigurationsdatei von SELinux in /etc/selinux/config ansehen, um zu sehen, wie sie derzeit konfiguriert ist.
$ cat /etc/selinux/config
# 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=enforcing
# SELINUXTYPE= can take one of these three 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 gibt den SELinux-Modus an und kann drei mögliche Werte haben:Enforcing, Permissive oder Disabled.
-
Erzwingen (Standard):Es aktiviert und erzwingt die SELinux-Sicherheitsrichtlinie auf dem System und verweigert unbefugte Zugriffsversuche von Benutzern und Prozessen.
-
Zulässig:Wenn Sie es verwenden, wird SELinux aktiviert, erzwingt jedoch nicht die Sicherheitsrichtlinie. Alle Richtlinienverstöße werden in den Überwachungsprotokollen protokolliert. Es ist eine gute Möglichkeit, SELinux zu testen, bevor es erzwungen wird.
-
Deaktiviert:SELinux ist ausgeschaltet.
Die SELINUXTYPE-Direktive gibt die zu verwendende Richtlinie an. Der Standardwert ist zielgerichtet und mit dieser Richtlinie ermöglicht Ihnen SELinux die Anpassung und Feinabstimmung der Zugriffssteuerungsberechtigungen.
Selbst wenn der Enforcing-Modus der Standardmodus ist, ist das Deaktivieren von SELinux zu einer gängigen Praxis geworden, da es einfacher ist, als damit fertig zu werden. Dies wird natürlich nicht empfohlen und Sie sollten es zumindest im Permissive-Modus konfiguriert haben und die Protokolle regelmäßig auf ungewöhnliches Verhalten überprüfen.
So konfigurieren Sie SELinux
Wenn SELinux in Ihrer Umgebung deaktiviert ist, können Sie es aktivieren, indem Sie die Konfigurationsdatei /etc/selinux/config bearbeiten und SELINUX=permissive oder SELINUX=enforcing.
setzenWenn Sie SELinux noch nie verwendet haben, konfigurieren Sie es am besten, indem Sie zuerst den Permissive-Modus verwenden, die Protokolle nach abgelehnten Nachrichten in der Nachrichtenprotokolldatei durchsuchen und diese bei Bedarf beheben:
$ grep "SELinux" /var/log/messages
Nachdem alles überprüft wurde und Sie sicher fortfahren können, können Sie SELinux so konfigurieren, dass es mit der vorherigen Methode oder ohne Neustart erzwungen wird, indem Sie den folgenden Befehl verwenden:
$ setenforce 1
Wenn Sie ein Rollback durchführen müssen, führen Sie Folgendes aus:
$ setenforce 0
Dieser Befehl kann verwendet werden, um spontan zwischen dem Enforcing- und dem Permissive-Modus zu wechseln, aber diese Änderungen bleiben nicht erhalten, wenn Sie das System neu starten. Sie müssen den Wert in der Konfigurationsdatei konfigurieren, um ihn dauerhaft zu machen.
Sie können den aktuellen SELinux-Status mit dem getenforce-Befehl prüfen:
$ getenforce
Enforcing
Oder für detailliertere Informationen können Sie stattdessen sestatus verwenden:
$ 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: 33
So konfigurieren Sie SELinux für PostgreSQL und TimescaleDB
Wenn Sie PostgreSQL/TimescaleDB mit der Standardkonfiguration und dem Standarddatenverzeichnis installieren und SELinux ebenfalls standardmäßig konfiguriert ist, werden Sie höchstwahrscheinlich keine Probleme haben, aber das Problem ist, wenn Sie möchten Verwenden Sie beispielsweise einen bestimmten Ort, an dem Sie Ihre Datenbank speichern. Lassen Sie uns also sehen, wie Sie SELinux konfigurieren, damit es funktioniert. Für dieses Beispiel installieren wir PostgreSQL 13 auf CentOS 8 und verwenden /pgsql/data/ als Datenverzeichnis.
Aktivieren Sie zuerst das postgresql-Modul:
$ dnf module enable postgresql:13
Installieren Sie die entsprechenden PostgreSQL 13-Pakete:
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
Dienst aktivieren:
$ systemctl enable postgresql.service
Initialisieren Sie Ihre PostgreSQL-Datenbank:
$ postgresql-setup --initdb
Wenn Sie jetzt einfach den Dienst starten, ohne etwas zu ändern, wie das Datenverzeichnis, wird er problemlos starten, andernfalls sehen Sie einen Fehler wie:
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal postmaster[29116]: postmaster: could not access the server configuration file "/pgsql/data/postgresql.conf": Permission denied
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Failed with result 'exit-code'.
Mal sehen, wie man es behebt. Ändern Sie zunächst Ihr Datenverzeichnis in Ihrer PostgreSQL-Konfigurationsdatei und Ihrem Dienst. Bearbeiten Sie dazu die PostgreSQL-Dienstdatei und ändern Sie den PGDATA-Speicherort:
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
Bearbeiten Sie die PostgreSQL-Bash-Profildatei und ändern Sie den PGDATA-Speicherort:
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
Änderungen lesen:
$ systemctl daemon-reload
Initialisieren Sie die neue PostgreSQL-Datenbank:
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Es ist nicht notwendig, den neuen Speicherort des Datenverzeichnisses anzugeben, wie Sie dies zuvor in den Konfigurationsdateien getan haben. Jetzt müssen Sie vor dem Start das SELinux-Label ändern:
$ chcon -Rt postgresql_db_t /pgsql/data
Dieser Befehl ändert den SELinux-Sicherheitskontext und die Flags sind:
-
-R, --recursive:rekursiv auf Dateien und Verzeichnissen operieren
-
-t, --type=TYPE:Typ TYPE im Zielsicherheitskontext setzen
Starten Sie dann den PostgreSQL-Dienst:
$ systemctl start postgresql.service
Und Ihre Datenbank läuft jetzt:
$ ps aux |grep postgres |head -1
postgres 28566 0.0 3.0 497152 25312 ? Ss 21:16 0:00 /usr/bin/postmaster -D /pgsql/data
Dies ist nur ein einfaches Beispiel für die Konfiguration von SELinux für PostgreSQL/TimescaleDB. Es gibt verschiedene Möglichkeiten, dies mit unterschiedlichen Einschränkungen oder Tools zu tun. Die beste SELinux-Implementierung oder -Konfiguration hängt von den Geschäftsanforderungen ab.
Verwendung von PostgreSQL und TimescaleDB mit ClusterControl und SELinux
ClusterControl verwaltet keine Linux-Kernel-Sicherheitsmodule wie SELinux. Beim Bereitstellen eines PostgreSQL- oder TimescaleDB-Clusters mithilfe von ClusterControl können Sie angeben, ob ClusterControl SELinux während des Bereitstellungsprozesses für Sie deaktivieren soll, um das Fehlerrisiko zu verringern:
Wenn Sie es nicht deaktivieren möchten, können Sie Permissive verwenden Modus und überwachen Sie das Protokoll auf Ihren Servern, um sicherzustellen, dass Sie die richtige SELinux-Konfiguration haben. Danach können Sie es gemäß den oben genannten Anweisungen in Erzwingen ändern.
Weitere Informationen zur SELinux-Konfiguration finden Sie auf den offiziellen Websites von RedHat oder CentOS.