MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So konfigurieren Sie SELinux für MongoDB-Replikatsätze

Bis 2025 wird die Welt etwa 200 Zettabyte an Daten speichern. Diese Daten werden entweder in öffentlichen, privaten, lokalen oder Cloud-Speichern, PCs, Laptops, Smartphones und auch Internet-of-Things (IoT)-Geräten gespeichert. Hochgerechnet wird auch erwartet, dass die Zahl der mit dem Internet verbundenen Geräte bis 2025 auf fast 75 Milliarden steigen wird. Für einige von uns oder Menschen mit weniger IT-Hintergrund sind diese Zahlen nichts. Für Sicherheitsbegeisterte ist dies jedoch besorgniserregend, da immer mehr Daten gefährdet sind.

In der Welt der Open-Source-Technologien und Datenbanken ist Sicherheit eines der wichtigen Themen. Hin und wieder wird es viele neue Erfindungen und Entwicklungen im Zusammenhang mit Sicherheit geben. Eines davon ist Security-Enhanced Linux oder kurz SELinux, das vor fast 21 Jahren von der United States National Security Agency (NSA) entwickelt wurde. Obwohl dies vor so vielen Jahren eingeführt wurde, hat es sich schnell weiterentwickelt und wird häufig als eine der Sicherheitsmaßnahmen für das Linux-System verwendet. Obwohl es nicht einfach ist, Informationen zur Konfiguration mit einer Datenbank zu finden, hat MongoDB dies ausgenutzt. In diesem Blogbeitrag werden wir SELinux durchgehen und erfahren, wie es in MongoDB-Replikatsätzen konfiguriert wird.

Zu diesem Zweck werden wir 3 CentOS 8-VMs für unsere Testumgebung verwenden und MongoDB 4.4 verwenden. Bevor wir loslegen, tauchen wir etwas tiefer in SELinux ein.

Enforced, Permissive und Disabled Mode

Dies sind die drei Modi, die SELinux jederzeit ausführen kann. Natürlich haben sie alle ihre eigene Funktion und ihren eigenen Zweck in Bezug auf die Sicherheitspolitik. Wir werden es nacheinander durchgehen.

Im Erzwingungsmodus wird jede konfigurierte Richtlinie auf dem System erzwungen und jeder einzelne unbefugte Zugriffsversuch sowohl durch Benutzer als auch durch Prozesse wird von SELinux verweigert. Darüber hinaus werden diese Zugriffsverweigerungsaktionen auch in den zugehörigen Protokolldateien aufgezeichnet. Obwohl dies der am meisten empfohlene Modus ist, wird dieser Modus heutzutage bei den meisten Linux-Systemen nicht vom Systemadministrator aktiviert, und zwar aus verschiedenen Gründen wie der Komplexität von SELinux selbst.

Für den permissiven Modus können wir sicher sagen, dass sich SELinux in einem halb aktivierten Zustand befindet. In diesem Modus wird von SELinux keine Richtlinie angewendet, gleichzeitig wird kein Zugriff verweigert. Trotzdem wird jeder Richtlinienverstoß weiterhin aufgezeichnet und in den Überwachungsprotokollen protokolliert. Normalerweise wird dieser Modus verwendet, um SELinux zu testen, bevor es finalisiert und mit der Durchsetzung fortgefahren wird.

Für den letzten deaktivierten Modus läuft keine erweiterte Sicherheit auf dem System. Wissen Sie, in welchem ​​SELinux-Modus Ihr System jetzt läuft? Führen Sie einfach den folgenden Befehl aus, um Folgendes anzuzeigen:

$ 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

Für unsere Testsysteme wurde SELinux aktiviert und als erzwingend konfiguriert, sodass wir mit dem Rest des Leitfadens fortfahren konnten. Falls SELinux in Ihrem System deaktiviert oder zulässig ist, können Sie die folgenden Schritte ausführen, um es zu aktivieren und zur Durchsetzung zu wechseln.

  1. Bearbeiten Sie die /etc/selinux/config-Datei, um die Direktive auf Erzwingen zu ändern

vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…

Sie müssen sicherstellen, dass die obige Direktive auf enforcing eingestellt ist.

  1. Starten Sie das System neu, um die Einstellung zu übernehmen

$ Neustart

Sobald das System online ist, müssen wir bestätigen, dass SELinux korrekt konfiguriert wurde und die Änderung stattgefunden hat. Führen Sie den folgenden Befehl aus, um dies zu überprüfen. Dies ist eine weitere Möglichkeit, es zu überprüfen, abgesehen von der ersten, die ich zuvor erwähnt habe (sestatus).

$ getenforce

Erzwingen

Sobald wir das Wort „Enforcing“ sehen, können wir jetzt bestätigen, dass es losgehen kann. Da wir einen Replikatsatz verwenden werden, müssen wir sicherstellen, dass SELinux auf allen MongoDB-Knoten konfiguriert wurde. Ich glaube, das ist der wichtigste Teil, den wir abdecken sollten, bevor wir mit der Konfiguration von SELinux für MongoDB fortfahren.

Empfohlene „ulimit“-Einstellungen 

In diesem Beispiel gehen wir davon aus, dass MongoDB 4.4 auf 3 Knoten installiert wurde. Die Installation ist sehr einfach und leicht, um unsere Zeit zu sparen, werden wir Ihnen die Schritte nicht zeigen, aber hier ist der Link zur Dokumentation.

In einigen Fällen verursacht „ulimit“ des Systems einige Probleme, wenn die Grenzwerte einen niedrigen Standardwert haben. Um sicherzustellen, dass MongoDB korrekt läuft, empfehlen wir dringend, „ulimit“ gemäß der MongoDB-Empfehlung hier einzustellen. Obwohl jede Bereitstellung ihre eigenen Anforderungen oder Einstellungen haben kann, ist es am besten, die folgenden „ulimit“-Einstellungen zu befolgen:

-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000

Um den Wert „ulimit“ zu ändern, geben Sie einfach den folgenden Befehl ein, ändern Sie beispielsweise den Wert für „-n“ (Dateien öffnen):

$ ulimit -n 64000

Nachdem alle Limits geändert wurden, muss die Mongod-Instanz neu gestartet werden, um sicherzustellen, dass die neuen Limitänderungen wirksam werden:

$ sudo systemctl restart mongod

SELinux konfigurieren

Laut der MongoDB-Dokumentation erlaubt die aktuelle SELinux-Richtlinie dem MongoDB-Prozess nicht, auf /sys/fs/cgroup zuzugreifen, was erforderlich ist, um den verfügbaren Speicher auf Ihrem System zu bestimmen. Für unseren Fall, in dem sich SELinux im Enforcing-Modus befindet, muss also die folgende Anpassung vorgenommen werden.

Zugriff auf Kontrollgruppe erlauben

Der erste Schritt besteht darin, sicherzustellen, dass auf unserem System das Paket „checkpolicy“ installiert ist:

$ sudo yum install checkpolicy

yum install checkpolicy

Last metadata expiration check: 2:13:40 ago on Fri 11 Jun 2021 05:32:10 AM UTC.

Package checkpolicy-2.9-1.el8.x86_64 is already installed.

Dependencies resolved.

Nothing to do.

Complete!

Als nächstes müssen wir eine benutzerdefinierte Richtliniendatei für „mongodb_cgroup_memory.te“ erstellen:

cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}

#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF

Nachdem die Richtliniendatei erstellt wurde, bestehen die letzten Schritte darin, das benutzerdefinierte Richtlinienmodul zu kompilieren und zu laden, indem Sie diese drei Befehle ausführen:

$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp

Der letzte Befehl sollte eine Weile dauern und sobald er fertig ist, sollte der MongoDB-Prozess im SELinux-Erzwingungsmodus auf die richtigen Dateien zugreifen können.

Zugriff auf netstat für FTDC zulassen

/proc/net/netstat ist für die Vollzeit-Diagnosedatenerfassung (FTDC) erforderlich. FTDC ist kurz gesagt ein Mechanismus zur Erleichterung der Analyse des MongoDB-Servers. Die Datendateien in FTDC sind komprimiert, nicht für Menschen lesbar und erben dieselbe Dateizugriffsberechtigung wie die MongoDB-Datendateien. Aus diesem Grund können nur Benutzer mit Zugriff auf die FTDC-Datendateien die Daten übertragen.

Die Schritte zum Konfigurieren sind fast identisch mit dem vorherigen. Es ist nur so, dass die benutzerdefinierte Richtlinie anders ist.

$ sudo yum install checkpolicy
Create a custom policy file “mongodb_proc_net.te”:
cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;
require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}

#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF

Die letzten Schritte bestehen darin, die benutzerdefinierte Richtlinie zu kompilieren und zu laden:

$ checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
$ semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
$ sudo semodule -i mongodb_proc_net.pp

Benutzerdefinierter MongoDB-Verzeichnispfad

Beachten Sie unbedingt, dass Sie, wenn Sie MongoDB im benutzerdefinierten Verzeichnis installiert haben, auch die SELinux-Richtlinie anpassen müssen. Die Schritte unterscheiden sich geringfügig von den vorherigen, sind aber nicht zu komplex.

Zuerst müssen wir die SELinux-Richtlinie aktualisieren, damit der mongod-Dienst das neue Verzeichnis verwenden kann. Beachten Sie, dass wir sicherstellen müssen, dass das .* am Ende des Verzeichnisses eingefügt wird:

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t für Datenverzeichnis

  • mongod_log_t für Protokolldateiverzeichnis

  • mongod_var_run_t für PID-Dateiverzeichnis

Aktualisieren Sie dann die SELinux-Benutzerrichtlinie für das neue Verzeichnis:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t für Datenverzeichnis

  • mongod_log_t für Protokollverzeichnis

  • mongod_var_run_t für PID-Dateiverzeichnis

Der letzte Schritt besteht darin, die aktualisierten SELinux-Richtlinien auf das Verzeichnis anzuwenden:

restorecon -R -v </some/MongoDB/directory>

Da MongoDB den Standardpfad sowohl für Daten- als auch für Protokolldateien verwendet, können wir uns die folgenden Beispiele ansehen, wie man ihn anwendet:

Für den nicht standardmäßigen MongoDB-Datenpfad von /mongodb/data:

$ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*'
$ sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data'
$ restorecon -R -v '/mongodb/data'
For non-default MongoDB log directory of /mongodb/log (e.g. if the log file path is /mongodb/log/mongod.log):

$ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*'
$ sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log'
$ restorecon -R -v '/mongodb/log'

Benutzerdefinierter MongoDB-Port

In einigen Situationen verwenden einige der MongoDB-Installationen eine andere Portnummer als die Standardportnummer 27017. In diesem speziellen Fall müssen wir auch SELinux konfigurieren und der Befehl ist ziemlich einfach :

$ sudo semanage port -a -t mongod_port_t -p tcp <portnumber>
For example, we are using port 37017:
$ sudo semanage port -a -t mongod_port_t -p tcp 37017

Bereitstellen von MongoDB SELinux aktiviert mit ClusterControl

Mit ClusterControl haben Sie die Möglichkeit, SELinux während der Bereitstellung Ihres MongoDB-Replikatsatzes zu aktivieren. Sie müssen den Modus jedoch noch auf Enforcing ändern, da ClusterControl ihn nur auf Permissive setzt. Um es während der Bereitstellung zu aktivieren, können Sie „AppArmor/SELinux deaktivieren“ wie im Screenshot unten gezeigt deaktivieren.

Danach können Sie fortfahren und die Knoten für Ihren MongoDB-Replikatsatz hinzufügen und starten Sie die Bereitstellung. In ClusterControl verwenden wir Version 4.2 für MongoDB.

Sobald der Cluster bereit ist, müssen wir SELinux auf Enforcing for ändern alle Knoten und fahren Sie mit der Konfiguration fort, indem Sie sich auf die Schritte beziehen, die wir gerade durchlaufen haben.

Fazit

Es gibt 3 Modi von SELinux, die für jedes Linux-System verfügbar sind. Für den SELinux-Erzwingungsmodus müssen einige Schritte befolgt werden, um sicherzustellen, dass MongoDB ohne Probleme ausgeführt wird. Es ist auch erwähnenswert, dass einige der „ulimit“-Einstellungen ebenfalls geändert werden müssen, um den Systemanforderungen und Spezifikationen zu entsprechen.

Mit ClusterControl kann SELinux während der Bereitstellung aktiviert werden, Sie müssen jedoch immer noch in den Erzwingungsmodus wechseln und die Richtlinie konfigurieren, nachdem der Replikatsatz fertig ist.

Wir hoffen, dass dieser Blogbeitrag Ihnen hilft, SELinux für Ihre MongoDB-Server einzurichten