sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan konfigureres SELinux til MongoDB Replica Sets

I 2025 vil verden lagre cirka 200 zettabyte data. Disse data vil blive lagret enten i offentligt, privat, lokalt eller cloud-lager, pc'er, bærbare computere, smartphones og også Internet-of-Things (IoT) enheder. På fremskrivning forventes antallet af internetforbundne enheder også at stige til næsten 75 milliarder i 2025. For nogle af os eller folk med mindre it-baggrund er disse tal ingenting. Men for sikkerhedsentusiaster er dette bekymrende, fordi flere og flere data er i fare.

I verden af ​​open source-teknologi og databaser er sikkerhed et af de vigtige emner. I ny og næ vil der være en masse nye opfindelser og udviklinger forbundet med sikkerhed. En af dem er Security-Enhanced Linux eller (SELinux) for kort, som blev udviklet for næsten 21 år siden af ​​United States National Security Agency (NSA). Selvom dette er blevet introduceret for så mange år siden, har det udviklet sig hurtigt og i vid udstrækning brugt som en af ​​sikkerhedsforanstaltningerne for Linux-systemet. Selvom det ikke er ret nemt at finde information om, hvordan man konfigurerer det med en database, har MongoDB draget fordel af dette. I dette blogindlæg vil vi gennemgå SELinux og hvordan man konfigurerer det i MongoDB replikasæt.

Til dette formål vil vi bruge 3 CentOS 8 VM'er til vores testmiljø og bruge MongoDB 4.4. Inden vi går i gang, lad os dykke lidt dybere ned i SELinux.

Håndhævelse, tilladelig og deaktiveret tilstand

Dette er de tre tilstande, som SELinux kan køre på ethvert givet tidspunkt. Selvfølgelig har de alle deres egen funktion og formål i forhold til sikkerhedspolitikken. Vi vil gennemgå det én efter én.

Når den er i håndhævelsestilstand, vil enhver konfigureret politik blive håndhævet på systemet, og hvert enkelt uautoriseret adgangsforsøg af både brugere eller processer nægtes af SELinux. Ikke nok med det, de handlinger, der nægtes adgang, vil også blive registreret i de relaterede logfiler. Selvom dette er den mest anbefalede tilstand, har de fleste Linux-systemer i dag ikke denne tilstand aktiveret af systemadministratoren på grund af forskellige årsager, såsom kompleksiteten af ​​selve SELinux.

For permissive mode, kan vi roligt sige, at SELinux er i en semi-aktiveret tilstand. I denne tilstand vil ingen politik blive anvendt af SELinux, samtidig vil ingen adgang blive nægtet. På trods af det bliver enhver politikovertrædelse stadig registreret og logget i revisionsloggene. Typisk bruges denne tilstand til at teste SELinux før færdiggørelse og fortsætter med at håndhæve den.

For den sidste tilstand, der er deaktiveret, kører der ingen forbedret sikkerhed på systemet. Ved du, hvilken SELinux-tilstand dit system kører nu? Kør blot følgende kommando for at se:

$ 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

For vores testsystemer er SELinux blevet aktiveret og konfigureret til at håndhæve, så vi kunne fortsætte med resten af ​​guiden. Hvis SELinux er deaktiveret eller tilladt i dit system, kan du følge nedenstående trin for at aktivere det og skifte til håndhævelse.

  1. Rediger /etc/selinux/config fil for at ændre direktivet til at håndhæve

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

Du skal sikre dig, at ovenstående direktiv er indstillet til at håndhæve.

  1. Genstart systemet for at anvende indstillingen

$ genstart

Når systemet er online, skal vi bekræfte, at SELinux er konfigureret korrekt, og at ændringen har fundet sted. Kør følgende kommando for at kontrollere, dette er en anden måde at kontrollere det på bortset fra den første, som jeg nævnte tidligere (sestatus).

$ getenforce

Håndhævelse

Når vi ser ordet "Handhævelse", kan vi nu bekræfte, at det er godt at gå. Da vi skal bruge et replikasæt, skal vi sikre os, at SELinux er konfigureret på alle MongoDB-noder. Jeg tror, ​​at dette er den vigtigste del, vi bør dække, før vi fortsætter med at konfigurere SELinux til MongoDB.

Anbefalede "ulimit"-indstillinger 

I dette eksempel antager vi, at MongoDB 4.4 er installeret på 3 noder. Installationen er meget enkel og nem, for at spare tid vil vi ikke vise dig trinene, men her er linket til dokumentationen.

I nogle tilfælde vil systemets "ulimit" forårsage nogle få problemer, hvis grænserne har en lav standardværdi. For at sikre, at MongoDB kører korrekt, anbefaler vi stærkt at indstille "ulimit" i henhold til MongoDB-anbefaling her. Selvom hver implementering kan have sine unikke krav eller indstillinger, er det bedst at følge følgende "ulimit"-indstillinger:

-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

For at ændre "ulimit"-værdien skal du blot udsende følgende kommando, for eksempel ved at ændre værdien for "-n" (åbne filer):

$ ulimit -n 64000

Når alle grænserne er ændret, skal  mongod-forekomsten genstartes for at sikre, at de nye grænseændringer finder sted:

$ sudo systemctl restart mongod

Konfiguration af SELinux

Ifølge MongoDB-dokumentationen tillader den nuværende SELinux-politik ikke, at MongoDB-processen får adgang til /sys/fs/cgroup, som er påkrævet for at bestemme den tilgængelige hukommelse på dit system. Så i vores tilfælde, hvor SELinux er i håndhævelsestilstand, skal følgende justering foretages.

Tillad adgang til cgroup

Det første trin er at sikre, at vores system har "checkpolicy"-pakken installeret:

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

Derefter skal vi oprette en brugerdefineret politikfil for "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

Når politikfilen er oprettet, er de sidste trin at kompilere og indlæse det tilpassede politikmodul ved at køre disse tre kommandoer:

$ 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

Den sidste kommando bør tage et stykke tid, og når den er færdig, bør MongoDB-processen være i stand til at få adgang til de korrekte filer med SELinux-håndhævelsestilstand.

Tillad adgang til netstat for FTDC

/proc/net/netstat er påkrævet for Full Time Diagnostic Data Capture (FTDC). FTDC er kort fortalt en mekanisme til at lette analyse af MongoDB-serveren. Datafilerne i FTDC er komprimerede, kan ikke læses af mennesker og arver den samme filadgangstilladelse som MongoDB-datafilerne. På grund af dette kan kun brugere med adgang til FTDC-datafilerne overføre dataene.

Trinnene til at konfigurere det er næsten identiske med det forrige. Det er bare, at den tilpassede politik er anderledes.

$ 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

De sidste trin er at kompilere og indlæse den tilpassede politik:

$ 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

Tilpasset MongoDB-mappesti

En vigtig ting at bemærke er, at hvis du installerede MongoDB i den brugerdefinerede mappe, skal du også tilpasse SELinux-politikken. Trinene er lidt anderledes end det foregående, men det er ikke for kompliceret.

Først skal vi opdatere SELinux-politikken for at tillade mongod-tjenesten at bruge den nye mappe. Det er værd at bemærke, at vi skal sørge for at inkludere .* i slutningen af ​​mappen:

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t for datamappe

  • mongod_log_t for logfilmappe

  • mongod_var_run_t for pid-filmappe

Opdater derefter SELinux-brugerpolitikken for den nye mappe:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t for datamappe

  • mongod_log_t for log-mappe

  • mongod_var_run_t for pid-filmappe

Det sidste trin er at anvende de opdaterede SELinux-politikker på mappen:

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

Da MongoDB bruger standardstien til både data og logfiler, kan vi tage et kig på følgende eksempler på, hvordan man anvender det:

For ikke-standard MongoDB-datasti til /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'

Tilpasset MongoDB-port

I nogle situationer bruger nogle af MongoDB-installationerne et andet portnummer end standardnummeret, som er 27017. I dette særlige tilfælde skal vi også konfigurere SELinux, og kommandoen er ret enkel :

$ 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

Implementering af MongoDB SELinux aktiveret med ClusterControl

Med ClusterControl har du mulighed for at aktivere SELinux under udrulningen af ​​dit MongoDB replikasæt. Du skal dog stadig ændre tilstanden til at håndhæve, da ClusterControl kun indstiller den til eftergivende. For at aktivere det under installationen, kan du fjerne markeringen af ​​"Deaktiver AppArmor/SELinux" som på skærmbilledet nedenfor.

Derefter kan du fortsætte og tilføje noderne til dit MongoDB replikasæt og start udrulningen. I ClusterControl bruger vi version 4.2 til MongoDB.

Når klyngen er klar, skal vi ændre SELinux til at håndhæve for alle noder, og fortsæt med at konfigurere det ved at henvise til de trin, vi gik igennem lige nu.

Konklusion

Der er 3 SELinux-tilstande tilgængelige for ethvert Linux-system. Til SELinux-håndhævelsestilstand er der et par trin, der skal følges for at sikre, at MongoDB kører uden problemer. Det er også værd at bemærke, at nogle af "ulimit"-indstillingerne også skal ændres for at passe til systemkravene såvel som specifikationer.

Med ClusterControl kan SELinux aktiveres under implementeringen, men du skal stadig skifte til håndhævelsestilstand og konfigurere politikken, efter at replikasættet er klar.

Vi håber, at dette blogindlæg vil hjælpe dig med at konfigurere SELinux til dine MongoDB-servere


  1. MongoDB distinct()

  2. Løb redis i marathon (mesos) under én url

  3. Mongodb Healthcheck Trin for Trin

  4. ClusterControl Ydeevne og Sundhedsovervågning