До 2025 г. светът ще съхранява приблизително 200 зетабайта данни. Тези данни ще се съхраняват в публични, частни, локални или облачни хранилища, компютри, лаптопи, смартфони, както и устройства за интернет на нещата (IoT). Според прогнозите броят на свързаните с интернет устройства също се очаква да нарасне до почти 75 милиарда през 2025 г. За някои от нас или хора с по-малко ИТ опит, тези числа са нищо. Но за любителите на сигурността това е тревожно, защото все повече данни са изложени на риск.
В света на технологиите и бази данни с отворен код сигурността е една от важните теми. От време на време ще има много нови изобретения и разработки, свързани със сигурността. Един от тях е Security-Enhanced Linux или (SELinux) за кратко, който е разработен преди близо 21 години от Агенцията за национална сигурност на САЩ (NSA). Въпреки че това беше въведено преди толкова много години, то се разви бързо и широко се използва като една от мерките за сигурност за системата Linux. Въпреки че не е лесно да се намери информация как да го конфигурирате с база данни, MongoDB се възползва от това. В тази публикация в блога ще разгледаме SELinux и как да го конфигурираме в комплекти реплики на MongoDB.
За тази цел ще използваме 3 виртуални машини CentOS 8 за нашата тестова среда и ще използваме MongoDB 4.4. Преди да започнем, нека се потопим малко по-дълбоко в SELinux.
Принудителен, разрешителен и деактивиран режим
Това са трите режима, които SELinux може да изпълнява по всяко време. Разбира се, всички те имат своя функция и предназначение по отношение на политиката за сигурност. Ще го преминем един по един.
Когато е в режим на прилагане, всяка конфигурирана политика ще бъде приложена в системата и всеки отделен опит за неоторизиран достъп както от потребители, така и от процеси се отказва от SELinux. Не само това, тези действия за отказан достъп също ще бъдат записани в свързаните регистрационни файлове. Въпреки че това е най-препоръчваният режим, повечето от системите на Linux в днешно време нямат този режим активиран от системния администратор поради различни причини, като сложността на самия SELinux.
За разрешителен режим можем спокойно да кажем, че SELinux е в полуактивно състояние. В този режим няма да се прилага никаква политика от SELinux, в същото време няма да бъде отказан достъп. Въпреки това всяко нарушение на правилата все още се записва и записва в регистрационните файлове за одит. Обикновено този режим се използва за тестване на SELinux, преди да го финализирате и да продължите да го прилагаме.
За последния режим, който е деактивиран, в системата не се изпълнява подобрена защита. Знаете ли какъв режим SELinux работи в момента? Просто изпълнете следната команда, за да видите:
$ 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
За нашите тестови системи SELinux е активиран и конфигуриран като принудителен, за да можем да продължим с останалата част от ръководството. В случай, че SELinux е деактивиран или разрешен във вашата система, можете да следвате стъпките по-долу, за да го активирате и да преминете към прилагане.
-
Редактирайте /etc/selinux/config файл, за да промените директивата на принудителна
vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…
Трябва да се уверите, че горната директива е настроена на налагане.
-
Рестартирайте системата, за да приложите настройката
$ рестартиране
След като системата е онлайн, трябва да потвърдим, че SELinux е конфигуриран правилно и промяната е извършена. Изпълнете следната команда, за да проверите, това е друг начин да я проверите, освен първия, който споменах по-рано (sestatus).
$ getenforce
Прилагане
След като видим думата „Прилагане“, вече можем да потвърдим, че това е добре. Тъй като ще използваме набор от реплики, трябва да се уверим, че SELinux е конфигуриран на всички възли на MongoDB. Вярвам, че това е най-важната част, която трябва да покрием, преди да продължим с конфигурирането на SELinux за MongoDB.
Препоръчителни настройки за „ulimit“
В този пример приемаме, че MongoDB 4.4 е инсталиран на 3 възела. Инсталацията е много проста и лесна, за да спестим времето си, няма да ви показваме стъпките, но ето връзката към документацията.
В някои случаи „ulimit“ на системата ще причини няколко проблема, ако ограниченията имат ниска стойност по подразбиране. За да сте сигурни, че MongoDB работи правилно, силно препоръчваме да зададете „ulimit“ според препоръката на MongoDB тук. Въпреки че всяко внедряване може да има своите уникални изисквания или настройки, най-добре е да следвате следните настройки за „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
За да промените стойността на „ulimit“, просто издайте следната команда, например, променяйки стойността за „-n“ (отворени файлове):
$ ulimit -n 64000
След като всички ограничения бъдат променени, екземплярът mongod трябва да бъде рестартиран, за да се гарантира, че новите промени в лимита ще се осъществят:
$ sudo systemctl restart mongod
Конфигуриране на SELinux
Според документацията на MongoDB, текущата политика на SELinux не позволява на процеса на MongoDB достъп до /sys/fs/cgroup, което е необходимо за определяне на наличната памет във вашата система. Така че за нашия случай, в който SELinux е в режим на прилагане, трябва да се направи следната корекция.
Разрешаване на достъп до cgroup
Първата стъпка е да се уверим, че системата ни има инсталиран пакет „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!
След това трябва да създадем персонализиран файл с правила за “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
След като файлът с правила е създаден, последните стъпки са да компилирате и заредите модула за персонализирана политика, като изпълните тези три команди:
$ 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
Последната команда трябва да отнеме известно време и след като приключи, процесът MongoDB трябва да има достъп до правилните файлове с режим на прилагане на SELinux.
Разрешаване на достъп до netstat за FTDC
/proc/net/netstat се изисква за пълно захващане на диагностични данни (FTDC). FTDC накратко е механизъм за улесняване на анализа на сървъра MongoDB. Файловете с данни в FTDC са компресирани, не са четими от човека и наследяват същото разрешение за достъп до файлове като файловете с данни MongoDB. Поради това само потребители с достъп до файловете с данни на FTDC могат да предават данните.
Стъпките за конфигурирането му са почти идентични с предишните. Просто персонализираната политика е различна.
$ 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
Последните стъпки са да компилирате и заредите персонализираната политика:
$ 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
Персонализиран път към директорията на MongoDB
Едно важно нещо, което трябва да се отбележи, е, че ако сте инсталирали MongoDB в персонализираната директория, ще трябва да персонализирате и политиката на SELinux. Стъпките са малко по-различни от предишните, но не са твърде сложни.
Първо, трябва да актуализираме политиката на SELinux, за да позволим на услугата mongod да използва новата директория, заслужава да се отбележи, че трябва да се уверим, че включваме .* в края на директорията:
$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
-
mongod_var_lib_t за директория с данни
-
mongod_log_t за директория с регистрационни файлове
-
mongod_var_run_t за pid файлова директория
След това актуализирайте потребителските правила на SELinux за новата директория:
$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
-
mongod_var_lib_t за директория с данни
-
mongod_log_t за директория на журнал
-
mongod_var_run_t за pid файлова директория
Последната стъпка е да приложите актуализираните правила на SELinux към директорията:
restorecon -R -v </some/MongoDB/directory>
Тъй като MongoDB използва пътя по подразбиране както за данни, така и за регистрационни файлове, можем да разгледаме следните примери как да го приложим:
За пътя на данните на MongoDB, който не е по подразбиране на /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'
Персонализиран порт на MongoDB
За някои ситуации някои от инсталациите на MongoDB използват различен номер на порт, различен от този по подразбиране, който е 27017. В този конкретен случай трябва да конфигурираме и SELinux и командата е доста проста :
$ 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
Разгръщане на MongoDB SELinux активирано с ClusterControl
С ClusterControl имате възможност да активирате SELinux по време на внедряването на вашия комплект реплики на MongoDB. Въпреки това, все още трябва да промените режима на принудителен, тъй като ClusterControl го задава само на разрешително. За да го активирате по време на внедряването, можете да премахнете отметката от „Деактивиране на AppArmor/SELinux“ според екранната снимка по-долу.
След това можете да продължите и да добавите възлите за вашия набор реплики на MongoDB и започнете внедряването. В ClusterControl използваме версия 4.2 за MongoDB.
След като клъстерът е готов, трябва да променим SELinux на принудителен за всички възли и продължете с конфигурирането му, като се обърнете към стъпките, през които преминахме току-що.
Заключение
Има 3 режима на SELinux, налични за всяка Linux система. За режима на прилагане на SELinux има няколко стъпки, които трябва да се следват, за да се гарантира, че MongoDB работи без проблеми. Също така си струва да се отбележи, че някои от настройките на „ulimit“ трябва да бъдат променени, за да отговарят на системните изисквания, както и на спецификациите.
С ClusterControl SELinux може да бъде активиран по време на внедряването, но все пак трябва да преминете към режим на прилагане и да конфигурирате политиката, след като наборът от реплика е готов.
Надяваме се, че тази публикация в блога ще ви помогне да настроите SELinux за вашите MongoDB сървъри