Do roku 2025 bude svět ukládat přibližně 200 zettabajtů dat. Tato data budou uložena buď ve veřejném, soukromém, místním nebo cloudovém úložišti, v počítačích, noteboocích, chytrých telefonech a také v zařízeních internetu věcí (IoT). Podle projekcí se také očekává, že počet zařízení připojených k internetu v roce 2025 vzroste na téměř 75 miliard. Pro některé z nás nebo pro lidi s menším IT zázemím tato čísla nejsou ničím. Ale pro bezpečnostní nadšence je to znepokojivé, protože stále více dat je ohroženo.
Ve světě open-source technologií a databází je bezpečnost jedním z důležitých témat. Tu a tam se objeví spousta nových vynálezů a vývoje spojených s bezpečností. Jedním z nich je Security-Enhanced Linux nebo zkráceně (SELinux), který byl vyvinut před téměř 21 lety Národní bezpečnostní agenturou Spojených států (NSA). I když to bylo představeno před tolika lety, rychle se vyvinulo a široce se používá jako jedno z bezpečnostních opatření pro systém Linux. I když není docela snadné najít informace o tom, jak ji nakonfigurovat s databází, MongoDB toho využil. V tomto blogovém příspěvku si projdeme SELinux a jak jej nakonfigurovat v sadách replik MongoDB.
Pro tento účel použijeme 3 virtuální počítače CentOS 8 pro naše testovací prostředí a použijeme MongoDB 4.4. Než začneme, pojďme se ponořit trochu hlouběji do SELinuxu.
Režim vynucení, povolení a zakázán
Toto jsou tři režimy, které může SELinux spustit kdykoli. Všechny mají samozřejmě svou funkci a účel z hlediska bezpečnostní politiky. Projdeme si to jeden po druhém.
V režimu vynucení bude v systému vynucena jakákoli nakonfigurovaná politika a každý jednotlivý pokus o neoprávněný přístup ze strany uživatelů nebo procesů je SELinuxem zamítnut. Nejen, že tyto akce odepřeného přístupu budou také zaznamenány v souvisejících souborech protokolu. I když se jedná o nejvíce doporučovaný režim, většina linuxových systémů dnes tento režim nemá povolený správcem systému z různých důvodů, jako je složitost samotného SELinuxu.
V případě permisivního režimu můžeme s jistotou říci, že SELinux je v částečně povoleném stavu. V tomto režimu nebudou SELinuxem aplikovány žádné zásady a zároveň nebude odepřen žádný přístup. Navzdory tomu je jakékoli porušení zásad stále zaznamenáno a zaznamenáno do protokolů auditu. Obvykle se tento režim používá k testování SELinuxu před dokončením a pokračováním v jeho vynucení.
Pro poslední režim, který je zakázán, v systému neběží žádné rozšířené zabezpečení. Víte, v jakém režimu SELinux váš systém nyní běží? Jednoduše spusťte následující příkaz a uvidíte:
$ 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
Pro naše testovací systémy byl SELinux povolen a nakonfigurován jako vynucující, abychom mohli pokračovat se zbytkem průvodce. V případě, že je SELinux ve vašem systému zakázán nebo povolený, můžete jej povolit a změnit na vynucování podle následujících kroků.
-
Upravte soubor /etc/selinux/config a změňte směrnici na vynucování
vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…
Musíte se ujistit, že výše uvedená směrnice je nastavena na vynucování.
-
Restartujte systém, abyste použili nastavení
$ restartovat
Jakmile je systém online, musíme potvrdit, že SELinux byl správně nakonfigurován a změna proběhla. Pro kontrolu spusťte následující příkaz, toto je další způsob, jak to zkontrolovat, kromě prvního, který jsem zmínil dříve (stav).
$ getenforce
Vynucování
Jakmile uvidíme slovo „Vynucování“, můžeme potvrdit, že je to dobré. Protože budeme používat sadu replik, musíme se ujistit, že SELinux byl nakonfigurován na všech uzlech MongoDB. Věřím, že toto je nejdůležitější část, kterou bychom měli probrat, než přistoupíme k konfiguraci SELinuxu pro MongoDB.
Doporučená nastavení „ulimit“
V tomto příkladu předpokládáme, že MongoDB 4.4 byl nainstalován na 3 uzlech. Instalace je velmi jednoduchá a snadná, pro úsporu času vám nebudeme ukazovat kroky, ale zde je odkaz na dokumentaci.
V některých případech způsobí „ulimit“ systému několik problémů, pokud mají limity nízkou výchozí hodnotu. Abyste se ujistili, že MongoDB běží správně, důrazně doporučujeme nastavit „ulimit“ podle doporučení MongoDB zde. I když každé nasazení může mít své jedinečné požadavky nebo nastavení, je nejlepší postupovat podle následujících nastavení „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
Chcete-li změnit hodnotu „ulimit“, jednoduše zadejte následující příkaz, například změňte hodnotu pro „-n“ (otevřené soubory):
$ ulimit -n 64000
Po změně všech limitů je třeba instanci mongodu restartovat, aby se zajistilo provedení nových změn limitů:
$ sudo systemctl restart mongod
Konfigurace SELinux
Podle dokumentace MongoDB současné zásady SELinux neumožňují procesu MongoDB přístup k /sys/fs/cgroup, který je nutný k určení dostupné paměti ve vašem systému. Takže pro náš případ, kdy je SELinux v režimu vynucování, je třeba provést následující úpravu.
Povolit přístup k cgroup
Prvním krokem je zajistit, aby náš systém měl nainstalovaný balíček „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!
Dále musíme vytvořit vlastní soubor zásad pro „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 vytvoření souboru zásad je posledními kroky zkompilovat a načíst modul vlastních zásad spuštěním těchto tří příkazů:
$ 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
Poslední příkaz by měl chvíli trvat, a jakmile bude hotový, proces MongoDB by měl mít přístup ke správným souborům s režimem vynucování SELinux.
Povolit přístup k netstat pro FTDC
Pro Full Time Diagnostic Data Capture (FTDC) je vyžadován/proc/net/netstat. FTDC je ve zkratce mechanismus pro usnadnění analýzy serveru MongoDB. Datové soubory ve FTDC jsou komprimované, nečitelné pro člověka a dědí stejné oprávnění k přístupu k souborům jako datové soubory MongoDB. Díky tomu mohou data přenášet pouze uživatelé s přístupem k datovým souborům FTDC.
Postup konfigurace je téměř shodný s předchozím. Jde jen o to, že vlastní zásady jsou jiné.
$ 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
Posledními kroky je kompilace a načtení vlastní zásady:
$ 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
Vlastní cesta k adresáři MongoDB
Jedna důležitá věc, kterou je třeba poznamenat, je, že pokud jste nainstalovali MongoDB do vlastního adresáře, budete muset upravit také zásady SELinux. Kroky se mírně liší od předchozího, ale nejsou příliš složité.
Nejprve musíme aktualizovat zásady SELinux, aby služba mongod mohla používat nový adresář. Je třeba poznamenat, že musíme na konec adresáře zahrnout příponu .*:
$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
-
mongod_var_lib_t pro datový adresář
-
mongod_log_t pro adresář souboru protokolu
-
mongod_var_run_t pro adresář souboru pid
Potom aktualizujte zásady uživatele SELinux pro nový adresář:
$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
-
mongod_var_lib_t pro datový adresář
-
mongod_log_t pro adresář protokolu
-
mongod_var_run_t pro adresář souboru pid
Posledním krokem je použití aktualizovaných zásad SELinux na adresář:
restorecon -R -v </some/MongoDB/directory>
Protože MongoDB používá výchozí cestu pro data i soubory protokolu, můžeme se podívat na následující příklady, jak ji použít:
Nevýchozí datová cesta MongoDB pro /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'
Vlastní port MongoDB
V některých situacích používají některé instalace MongoDB jiné číslo portu, než je výchozí číslo, které je 27017. V tomto konkrétním případě musíme nakonfigurovat také SELinux a příkaz je velmi jednoduchý :
$ 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
Nasazení MongoDB SELinux s povoleným ClusterControl
S ClusterControl máte možnost povolit SELinux během nasazení vaší sady replik MongoDB. Stále však musíte změnit režim na vynucování, protože ClusterControl jej nastaví pouze na permisivní. Chcete-li jej povolit během nasazení, můžete zrušit zaškrtnutí políčka „Zakázat AppArmor/SELinux“ podle níže uvedeného snímku obrazovky.
Poté můžete pokračovat a přidat uzly pro vaši sadu replik MongoDB a spusťte nasazení. V ClusterControl používáme verzi 4.2 pro MongoDB.
Jakmile bude cluster připraven, musíme změnit SELinux na vynucení pro všechny uzly a pokračujte v jeho konfiguraci podle kroků, kterými jsme právě prošli.
Závěr
Pro jakýkoli systém Linux jsou k dispozici 3 režimy SELinuxu. Pro režim vynucování SELinux je třeba dodržet několik kroků, aby se zajistilo, že MongoDB běží bez problémů. Za zmínku také stojí, že je třeba změnit i některá nastavení „ulimit“, aby vyhovovala systémovým požadavkům a také specifikacím.
S ClusterControl lze SELinux povolit během implementace, ale i přesto je třeba přejít do režimu vynucení a nakonfigurovat zásady, až bude sada replik připravena.
Doufáme, že vám tento příspěvek na blogu pomůže nastavit SELinux pro vaše servery MongoDB