MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak skonfigurować SELinux dla zestawów replik MongoDB?

Do 2025 roku świat będzie przechowywać około 200 zetabajtów danych. Dane te będą przechowywane w pamięci publicznej, prywatnej, lokalnej lub w chmurze, komputerach osobistych, laptopach, smartfonach, a także urządzeniach Internetu Rzeczy (IoT). Prognozuje się, że liczba urządzeń podłączonych do Internetu ma również wzrosnąć do prawie 75 miliardów w 2025 roku. Dla niektórych z nas lub osób z mniejszym doświadczeniem informatycznym te liczby to nic. Ale dla entuzjastów bezpieczeństwa jest to niepokojące, ponieważ coraz więcej danych jest zagrożonych.

W świecie technologii open-source i baz danych bezpieczeństwo jest jednym z ważnych tematów. Co jakiś czas pojawi się wiele nowych wynalazków i rozwiązań związanych z bezpieczeństwem. Jednym z nich jest Security-Enhanced Linux, w skrócie (SELinux), który został opracowany prawie 21 lat temu przez Narodową Agencję Bezpieczeństwa (NSA). Mimo że zostało to wprowadzone tak wiele lat temu, szybko ewoluowało i jest szeroko stosowane jako jeden ze środków bezpieczeństwa dla systemu Linux. Chociaż znalezienie informacji o tym, jak skonfigurować go za pomocą bazy danych, nie jest łatwe, MongoDB to wykorzystał. W tym wpisie na blogu omówimy SELinux i jak go skonfigurować w zestawach replik MongoDB.

W tym celu użyjemy 3 maszyn wirtualnych CentOS 8 dla naszego środowiska testowego i użyjemy MongoDB 4.4. Zanim zaczniemy, zanurkujmy trochę głębiej w SELinux.

Tryb wymuszania, zezwalania i wyłączenia

Są to trzy tryby, które SELinux może uruchomić w dowolnym momencie. Oczywiście wszystkie mają swoją funkcję i cel w zakresie polityki bezpieczeństwa. Przejdziemy przez to jeden po drugim.

W trybie wymuszania każda skonfigurowana polityka będzie egzekwowana w systemie, a każda nieautoryzowana próba dostępu zarówno przez użytkowników, jak i procesy jest odrzucana przez SELinux. Co więcej, te działania związane z odmową dostępu będą również rejestrowane w powiązanych plikach dziennika. Chociaż jest to najbardziej zalecany tryb, obecnie większość systemów Linux nie ma tego trybu włączanego przez administratora systemu z różnych powodów, takich jak złożoność samego SELinux.

Dla trybu permisywnego możemy śmiało powiedzieć, że SELinux jest w stanie częściowo włączonym. W tym trybie SELinux nie zastosuje żadnej polityki, jednocześnie nie odmówi dostępu. Mimo to wszelkie naruszenia zasad są nadal rejestrowane i rejestrowane w dziennikach kontrolnych. Zazwyczaj ten tryb jest używany do testowania SELinux przed sfinalizowaniem i przystąpieniem do jego egzekwowania.

Dla ostatniego wyłączonego trybu w systemie nie są uruchomione żadne rozszerzone zabezpieczenia. Czy wiesz, w jakim trybie SELinux działa teraz Twój system? Po prostu uruchom następujące polecenie, aby zobaczyć:

$ 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

Dla naszych systemów testowych SELinux został włączony i skonfigurowany jako wymuszający, abyśmy mogli kontynuować resztę przewodnika. W przypadku, gdy SELinux jest wyłączony lub zezwala na to w twoim systemie, możesz wykonać poniższe czynności, aby go włączyć i zmienić na wymuszanie.

  1. Edytuj plik /etc/selinux/config, aby zmienić dyrektywę na wymuszanie

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

Musisz się upewnić, że powyższa dyrektywa jest ustawiona na wymuszanie.

  1. Uruchom ponownie system, aby zastosować ustawienie

Restart $

Gdy system jest online, musimy potwierdzić, że SELinux został poprawnie skonfigurowany i zmiana nastąpiła. Uruchom następujące polecenie, aby sprawdzić, jest to inny sposób na sprawdzenie tego, oprócz pierwszego, o którym wspomniałem wcześniej (sestatus).

$ getenforce

Wymuszanie

Gdy zobaczymy słowo „Wymuszanie”, możemy teraz potwierdzić, że warto to zrobić. Ponieważ zamierzamy używać zestawu replik, musimy upewnić się, że SELinux został skonfigurowany na wszystkich węzłach MongoDB. Uważam, że jest to najważniejsza część, którą powinniśmy omówić przed przystąpieniem do konfiguracji SELinux dla MongoDB.

Zalecane ustawienia „ulimit” 

W tym przykładzie zakładamy, że MongoDB 4.4 został zainstalowany na 3 węzłach. Instalacja jest bardzo prosta i łatwa, aby zaoszczędzić nasz czas, nie będziemy pokazywać kroków, ale tutaj jest link do dokumentacji.

W niektórych przypadkach „ulimit” systemu spowoduje kilka problemów, jeśli limity mają niską wartość domyślną. Aby upewnić się, że MongoDB działa poprawnie, zdecydowanie zalecamy ustawienie „ulimit” zgodnie z zaleceniem MongoDB tutaj. Chociaż każde wdrożenie może mieć swoje unikalne wymagania lub ustawienia, najlepiej jest przestrzegać następujących ustawień „ulimit”:

-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

Aby zmienić wartość „ulimit”, po prostu wydaj następujące polecenie, na przykład zmieniając wartość na „-n” (otwieranie plików):

$ ulimit -n 64000

Po zmianie wszystkich limitów należy ponownie uruchomić instancję mongod, aby zapewnić wprowadzenie nowych zmian limitów:

$ sudo systemctl restart mongod

Konfiguracja SELinux

Zgodnie z dokumentacją MongoDB, obecna polityka SELinux nie pozwala procesowi MongoDB na dostęp do /sys/fs/cgroup, który jest wymagany do określenia dostępnej pamięci w systemie. Tak więc w naszym przypadku, w którym SELinux jest w trybie wymuszania, należy dokonać następującej korekty.

Zezwól na dostęp do cgroup

Pierwszym krokiem jest upewnienie się, że nasz system ma zainstalowany pakiet „checkpolicy”:

$ 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!

Następnie musimy utworzyć niestandardowy plik zasad dla „mongodb_cgroup_memory.te”:

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

Po utworzeniu pliku zasad ostatnie kroki to skompilowanie i załadowanie niestandardowego modułu zasad przez uruchomienie tych trzech poleceń:

$ 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

Ostatnie polecenie powinno chwilę potrwać, a po jego wykonaniu proces MongoDB powinien mieć dostęp do poprawnych plików w trybie wymuszania SELinux.

Zezwól na dostęp do netstat dla FTDC

/proc/net/netstat jest wymagany do przechwytywania danych diagnostycznych w pełnym wymiarze czasu (FTDC). FTDC w skrócie to mechanizm ułatwiający analizę serwera MongoDB. Pliki danych w FTDC są skompresowane, nieczytelne dla człowieka i dziedziczą te same uprawnienia dostępu do plików, co pliki danych MongoDB. Z tego powodu tylko użytkownicy z dostępem do plików danych FTDC mogą przesyłać dane.

Kroki konfiguracji są prawie identyczne jak w poprzednim. Tyle, że niestandardowa zasada jest inna.

$ 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

Ostatnie kroki to skompilowanie i załadowanie niestandardowej polityki:

$ 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

Niestandardowa ścieżka katalogu MongoDB

Jedną ważną rzeczą, o której należy pamiętać, jest to, że jeśli zainstalowałeś MongoDB w katalogu niestandardowym, będziesz musiał również dostosować politykę SELinux. Kroki różnią się nieco od poprzedniego, ale nie są zbyt skomplikowane.

Najpierw musimy zaktualizować politykę SELinux, aby umożliwić usłudze mongod korzystanie z nowego katalogu, warto zauważyć, że musimy upewnić się, że umieściliśmy .* na końcu katalogu :

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t dla katalogu danych

  • mongod_log_t dla katalogu plików dziennika

  • mongod_var_run_t dla katalogu z plikami pid

Następnie zaktualizuj politykę użytkownika SELinux dla nowego katalogu:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t dla katalogu danych

  • mongod_log_t dla katalogu dziennika

  • mongod_var_run_t dla katalogu z plikami pid

Ostatnim krokiem jest zastosowanie zaktualizowanych zasad SELinux do katalogu:

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

Ponieważ MongoDB używa domyślnej ścieżki zarówno dla plików danych, jak i dzienników, możemy przyjrzeć się następującym przykładom, jak ją zastosować:

Dla innej niż domyślna ścieżka danych MongoDB do /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'

Niestandardowy port MongoDB

W niektórych sytuacjach niektóre instalacje MongoDB używają innego numeru portu niż domyślny 27017. W tym konkretnym przypadku również musimy skonfigurować SELinux, a polecenie jest dość proste :

$ 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

Wdrażanie MongoDB SELinux z obsługą ClusterControl

Dzięki ClusterControl masz możliwość włączenia SELinux podczas wdrażania zestawu replik MongoDB. Jednak nadal musisz zmienić tryb na wymuszający, ponieważ ClusterControl ustawia go tylko na permisywny. Aby włączyć go podczas wdrażania, możesz odznaczyć „Wyłącz AppArmor/SELinux”, jak na poniższym zrzucie ekranu.

Po tym możesz kontynuować i dodać węzły do ​​swojego zestawu replik MongoDB i rozpocznij wdrażanie. W ClusterControl używamy wersji 4.2 dla MongoDB.

Gdy klaster będzie gotowy, musimy zmienić SELinux na wymuszający dla wszystkie węzły i kontynuuj konfigurację, odnosząc się do kroków, które przed chwilą przeszliśmy.

Wnioski

Istnieją 3 tryby SELinux dostępne dla każdego systemu Linux. W przypadku trybu wymuszania SELinux należy wykonać kilka kroków, aby upewnić się, że MongoDB działa bez żadnych problemów. Warto również zauważyć, że niektóre ustawienia „ulimit” również muszą zostać zmienione, aby dostosować je do wymagań systemowych i specyfikacji.

Dzięki ClusterControl SELinux można włączyć podczas wdrażania, jednak nadal musisz przejść do trybu wymuszania i skonfigurować zasady, gdy zestaw replik będzie gotowy.

Mamy nadzieję, że ten wpis na blogu pomoże Ci skonfigurować SELinux dla Twoich serwerów MongoDB


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose nadpisuje dokument zamiast pól `$set`

  2. Jak uzyskać rozmiar pojedynczego dokumentu w Mongodb?

  3. Czy MongoDB jest w jakiś sposób ograniczony do jednego rdzenia?

  4. MongoDB Analytics Series:SlamData — uruchamiaj SQL i twórz raporty bezpośrednio w MongoDB

  5. MongoDB — Zapytanie o ostatni element tablicy?