sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man konfigurerar SELinux för MongoDB Replica Sets

Senast 2025 kommer världen att lagra cirka 200 zettabyte data. Dessa data kommer att lagras antingen i offentlig, privat, lokal eller molnlagring, PC, bärbara datorer, smartphones och även Internet-of-Things (IoT) enheter. I prognosen förväntas antalet internetanslutna enheter också öka till nästan 75 miljarder år 2025. För vissa av oss eller personer med mindre IT-bakgrund är dessa siffror ingenting. Men för säkerhetsentusiaster är detta oroande eftersom mer och mer data är i fara.

I en värld av öppen källkodsteknologi och databaser är säkerhet ett av de viktiga ämnena. Då och då kommer det att dyka upp en hel del nya uppfinningar och utvecklingar kopplade till säkerhet. En av dem är Security-Enhanced Linux eller (SELinux) för kort, som utvecklades för nästan 21 år sedan av United States National Security Agency (NSA). Även om detta har introducerats för så många år sedan, har det utvecklats snabbt och flitigt använt som en av säkerhetsåtgärderna för Linux-systemet. Även om det inte är ganska lätt att hitta information om hur man konfigurerar det med en databas, har MongoDB utnyttjat detta. I det här blogginlägget kommer vi att gå igenom SELinux och hur man konfigurerar det i MongoDB-replikuppsättningar.

För detta ändamål kommer vi att använda 3 CentOS 8 virtuella datorer för vår testmiljö och använda MongoDB 4.4. Innan vi sätter igång, låt oss dyka lite djupare in i SELinux.

Tillämpande, tillåtande och inaktiverat läge

Detta är de tre lägen som SELinux kan köra vid varje given tidpunkt. Alla har givetvis sin egen funktion och syfte vad gäller säkerhetspolitiken. Vi kommer att gå igenom det en efter en.

När du är i upprätthållande läge, kommer alla konfigurerade policyer att tillämpas på systemet och varje enskilt obehörigt åtkomstförsök av både användare eller processer nekas av SELinux. Inte bara det, dessa åtkomst nekade åtgärder kommer också att registreras i de relaterade loggfilerna. Även om detta är det mest rekommenderade läget, har de flesta Linux-system numera inte det här läget aktiverat av systemadministratören på grund av olika anledningar som komplexiteten hos själva SELinux.

För tillåtande läge kan vi med säkerhet säga att SELinux är i ett semi-aktiverat tillstånd. I det här läget kommer ingen policy att tillämpas av SELinux, samtidigt kommer ingen åtkomst att nekas. Trots det registreras alla policyöverträdelser fortfarande och loggas i granskningsloggarna. Vanligtvis används det här läget för att testa SELinux innan det slutförs och fortsätter att upprätthålla det.

För det senaste läget som var inaktiverat, körs ingen utökad säkerhet på systemet. Vet du vilket SELinux-läge ditt system körs nu? Kör helt enkelt följande kommando för att 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

För våra testsystem har SELinux aktiverats och konfigurerats som upprätthållande så att vi kan fortsätta med resten av guiden. Om SELinux är inaktiverat eller tillåtande i ditt system kan du följa stegen nedan för att aktivera det och ändra till verkställande.

  1. Redigera filen /etc/selinux/config för att ändra direktivet till att tillämpa

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

Du måste se till att ovanstående direktiv är inställt på att genomdriva.

  1. Starta om systemet för att tillämpa inställningen

$ omstart

När systemet är online måste vi bekräfta att SELinux har konfigurerats korrekt och att ändringen har skett. Kör följande kommando för att kontrollera, detta är ett annat sätt att kontrollera det förutom det första som jag nämnde tidigare (sestatus).

$ getenforce

Tillämpa

När vi ser ordet "Enforcing" kan vi nu bekräfta att detta är bra att gå. Eftersom vi ska använda en replikuppsättning måste vi se till att SELinux har konfigurerats på alla MongoDB-noder. Jag tror att detta är den viktigaste delen som vi bör täcka innan vi fortsätter med att konfigurera SELinux för MongoDB.

Rekommenderade "ulimit"-inställningar 

I det här exemplet antar vi att MongoDB 4.4 har installerats på 3 noder. Installationen är väldigt enkel och lätt, för att spara tid kommer vi inte att visa dig stegen men här är länken till dokumentationen.

I vissa fall kommer systemets "ulimit" att orsaka några problem om gränserna har ett lågt standardvärde. För att säkerställa att MongoDB körs korrekt rekommenderar vi starkt att du ställer in "ulimit" enligt MongoDB-rekommendationen här. Även om varje distribution kan ha sina unika krav eller inställningar, är det bäst att följa följande "ulimit"-inställningar:

-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

För att ändra "ulimit"-värdet, utfärda helt enkelt följande kommando, till exempel ändra värdet för "-n" (öppna filer):

$ ulimit -n 64000

När alla gränser har ändrats måste  mongod-instansen startas om för att säkerställa att de nya gränsändringarna äger rum:

$ sudo systemctl restart mongod

Konfigurera SELinux

Enligt MongoDB-dokumentationen tillåter den nuvarande SELinux-policyn inte MongoDB-processen att få tillgång till /sys/fs/cgroup, som krävs för att fastställa det tillgängliga minnet på ditt system. Så för vårt fall, där SELinux är i upprätthållande läge, måste följande justering göras.

Tillåt åtkomst till cgroup

Det första steget är att se till att vårt system har "checkpolicy"-paketet installerat:

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

Närnäst måste vi skapa en anpassad policyfil för "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 policyfilen har skapats är de sista stegen att kompilera och ladda den anpassade policymodulen genom att köra dessa tre kommandon:

$ 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

Det sista kommandot bör ta ett tag och när det väl är klart bör MongoDB-processen kunna komma åt rätt filer med SELinux-tillämpningsläget.

Tillåt åtkomst till netstat för FTDC

/proc/net/netstat krävs för Full Time Diagnostic Data Capture (FTDC). FTDC är i korthet en mekanism för att underlätta analys av MongoDB-servern. Datafilerna i FTDC är komprimerade, inte läsbara för människor och ärver samma filåtkomstbehörighet som MongoDB-datafilerna. På grund av detta kan endast användare med åtkomst till FTDC-datafilerna överföra data.

Stegen för att konfigurera den är nästan identiska med den föregående. Det är bara det att den anpassade policyn är annorlunda.

$ 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 sista stegen är att kompilera och ladda den anpassade policyn:

$ 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

Anpassad MongoDB-katalogsökväg

En viktig sak att notera är att om du installerade MongoDB i den anpassade katalogen, måste du också anpassa SELinux-policyn. Stegen skiljer sig något från det föregående men det är inte för komplicerat.

Först måste vi uppdatera SELinux-policyn för att tillåta mongod-tjänsten att använda den nya katalogen, det är värt att notera att vi måste se till att inkludera .* i slutet av katalogen:

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

  • mongod_log_t för loggfilkatalog

  • mongod_var_run_t för pid-filkatalog

Uppdatera sedan SELinux användarpolicy för den nya katalogen:

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

  • mongod_log_t för loggkatalog

  • mongod_var_run_t för pid-filkatalog

Det sista steget är att tillämpa de uppdaterade SELinux-policyerna på katalogen:

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

Eftersom MongoDB använder standardsökvägen för både data och loggfiler kan vi ta en titt på följande exempel på hur man tillämpar det:

För icke-standard MongoDB-datasökväg för /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'

Anpassad MongoDB-port

I vissa situationer använder vissa av MongoDB-installationerna ett annat portnummer än standardnumret som är 27017. I det här specifika fallet måste vi konfigurera SELinux också och kommandot är ganska enkelt :

$ 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

Distribuera MongoDB SELinux aktiverad med ClusterControl

Med ClusterControl har du möjlighet att aktivera SELinux under driftsättningen av din MongoDB-replikuppsättning. Du måste dock fortfarande ändra läget till verkställande eftersom ClusterControl bara ställer in det på tillåtande. För att aktivera det under driftsättning kan du avmarkera "Inaktivera AppArmor/SELinux" enligt skärmdumpen nedan.

Efter det kan du fortsätta och lägga till noderna för din MongoDB-replikuppsättning och starta implementeringen. I ClusterControl använder vi version 4.2 för MongoDB.

När klustret är klart måste vi ändra SELinux till att tillämpa för alla noder och fortsätt med att konfigurera den genom att hänvisa till stegen som vi gick igenom just nu.

Slutsats

Det finns tre lägen av SELinux tillgängliga för alla Linux-system. För SELinux upprätthållande läge finns det några steg som måste följas för att se till att MongoDB körs utan problem. Det är också värt att notera att vissa av "ulimit"-inställningarna måste ändras också för att passa systemkraven och specifikationerna.

Med ClusterControl kan SELinux aktiveras under distributionen, men du måste fortfarande byta till tillämpningsläge och konfigurera policyn efter att replikuppsättningen är klar.

Vi hoppas att det här blogginlägget hjälper dig att konfigurera SELinux för dina MongoDB-servrar


  1. Spara en HASH till Redis på en rails-app

  2. Så här gör du:Aktivera användarautentisering och auktorisering i Apache HBase

  3. Docker-compose , hur som helst för att ange en redis.conf-fil?

  4. Hur man använder aggregrate i mongodb till $match _id