sql >> Database >  >> NoSQL >> MongoDB

Hoe SELinux te configureren voor MongoDB Replica Sets

Tegen 2025 zal de wereld ongeveer 200 zettabytes aan gegevens opslaan. Die gegevens worden opgeslagen in openbare, privé-, on-premises of cloudopslag, pc's, laptops, smartphones en ook Internet-of-Things (IoT) -apparaten. Verwacht wordt dat het aantal apparaten met internetverbinding in 2025 naar verwachting ook zal toenemen tot bijna 75 miljard. Voor sommigen van ons of mensen met een minder IT-achtergrond zijn die cijfers niets. Maar voor beveiligingsenthousiastelingen is dit zorgwekkend omdat steeds meer gegevens gevaar lopen.

In de wereld van open-sourcetechnologie en databases is beveiliging een van de belangrijke onderwerpen. Zo nu en dan zullen er veel nieuwe uitvindingen en ontwikkelingen zijn op het gebied van veiligheid. Een daarvan is Security-Enhanced Linux of kortweg SELinux, dat bijna 21 jaar geleden werd ontwikkeld door de National Security Agency (NSA) van de Verenigde Staten. Hoewel dit zoveel jaren geleden is geïntroduceerd, is het snel geëvolueerd en wordt het veelvuldig gebruikt als een van de beveiligingsmaatregelen voor het Linux-systeem. Hoewel het vrij niet eenvoudig is om informatie te vinden over het configureren met een database, heeft MongoDB hiervan geprofiteerd. In deze blogpost zullen we SELinux doornemen en hoe we het kunnen configureren in MongoDB-replicasets.

Voor dit doel gaan we 3 CentOS 8 VM's gebruiken voor onze testomgeving en MongoDB 4.4 gebruiken. Laten we, voordat we beginnen, wat dieper in SELinux duiken.

Afdwingende, toegestane en uitgeschakelde modus

Dit zijn de drie modi die SELinux op elk willekeurig moment kan draaien. Uiteraard hebben ze allemaal hun eigen functie en doel in het kader van het veiligheidsbeleid. We zullen het één voor één doornemen.

In de afdwingende modus wordt elk geconfigureerd beleid op het systeem afgedwongen en wordt elke ongeoorloofde toegangspoging door zowel gebruikers als processen geweigerd door SELinux. Niet alleen dat, die toegang geweigerde acties zullen ook worden vastgelegd in de gerelateerde logbestanden. Hoewel dit de meest aanbevolen modus is, hebben de meeste Linux-systemen tegenwoordig deze modus niet ingeschakeld door de systeembeheerder vanwege verschillende redenen, zoals de complexiteit van de SELinux zelf.

Voor de permissieve modus kunnen we gerust zeggen dat SELinux zich in een semi-enabled staat bevindt. In deze modus wordt er geen beleid toegepast door SELinux, tegelijkertijd zal er geen toegang worden geweigerd. Desondanks wordt elke beleidsschending nog steeds geregistreerd en vastgelegd in de auditlogboeken. Gewoonlijk wordt deze modus gebruikt om SELinux te testen voordat het wordt voltooid en uitgevoerd.

Voor de laatste modus die is uitgeschakeld, is er geen verbeterde beveiliging op het systeem actief. Weet je welke SELinux-modus je systeem nu draait? Voer gewoon de volgende opdracht uit om te zien:

$ 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

Voor onze testsystemen is SELinux ingeschakeld en geconfigureerd als afdwingend, zodat we door konden gaan met de rest van de handleiding. In het geval dat SELinux is uitgeschakeld of toelaatbaar is in uw systeem, kunt u de onderstaande stappen volgen om het in te schakelen en over te gaan naar afdwingen.

  1. Bewerk /etc/selinux/config-bestand om de instructie te wijzigen in afdwingen

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

Je moet ervoor zorgen dat de bovenstaande instructie is ingesteld op afdwingen.

  1. Start het systeem opnieuw op om de instelling toe te passen

$ opnieuw opstarten

Zodra het systeem online is, moeten we bevestigen dat SELinux correct is geconfigureerd en dat de wijziging heeft plaatsgevonden. Voer de volgende opdracht uit om te controleren, dit is een andere manier om het te controleren, afgezien van de eerste die ik eerder noemde (sestatus).

$ getenforce

Afdwingen

Zodra we het woord 'Afdwingen' zien, kunnen we nu bevestigen dat dit goed is om te gaan. Aangezien we een replicaset gaan gebruiken, moeten we ervoor zorgen dat de SELinux is geconfigureerd op alle MongoDB-knooppunten. Ik geloof dat dit het belangrijkste onderdeel is dat we moeten behandelen voordat we verder gaan met het configureren van SELinux voor MongoDB.

Aanbevolen 'ulimit'-instellingen 

In dit voorbeeld gaan we ervan uit dat MongoDB 4.4 op 3 nodes is geïnstalleerd. De installatie is heel eenvoudig en gemakkelijk, om tijd te besparen gaan we je de stappen niet laten zien, maar hier is de link naar de documentatie.

In sommige gevallen zal "ulimit" van het systeem enkele problemen veroorzaken als de limieten een lage standaardwaarde hebben. Om ervoor te zorgen dat MongoDB correct werkt, raden we u ten zeerste aan om de "ulimit" in te stellen volgens de MongoDB-aanbeveling hier. Hoewel elke implementatie zijn unieke vereisten of instellingen kan hebben, kunt u het beste de volgende "ulimit" -instellingen volgen:

-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

Om de "ulimit"-waarde te wijzigen, geeft u eenvoudig de volgende opdracht op, bijvoorbeeld de waarde voor "-n" (open bestanden):

$ ulimit -n 64000

Nadat alle limieten zijn gewijzigd, moet de mongod-instantie opnieuw worden gestart om ervoor te zorgen dat de nieuwe limietwijzigingen plaatsvinden:

$ sudo systemctl restart mongod

SELinux configureren

Volgens de MongoDB-documentatie staat het huidige SELinux-beleid niet toe dat het MongoDB-proces toegang krijgt tot /sys/fs/cgroup, wat nodig is om het beschikbare geheugen op uw systeem te bepalen. Dus voor ons geval, waarin SELinux zich in de afdwingende modus bevindt, moet de volgende aanpassing worden gemaakt.

Toegang tot cgroup toestaan

De eerste stap is ervoor te zorgen dat op ons systeem het pakket "checkpolicy" is geïnstalleerd:

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

Vervolgens moeten we een aangepast beleidsbestand maken voor "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

Nadat het beleidsbestand is gemaakt, zijn de laatste stappen het compileren en laden van de aangepaste beleidsmodule door deze drie opdrachten uit te voeren:

$ 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

Het laatste commando zou even moeten duren en als het klaar is, zou het MongoDB-proces in staat moeten zijn om toegang te krijgen tot de juiste bestanden met de SELinux-afdwingingsmodus.

Toegang tot netstat voor FTDC toestaan

/proc/net/netstat is vereist voor Full Time Diagnostic Data Capture (FTDC). FTDC is in het kort een mechanisme om de analyse van de MongoDB-server te vergemakkelijken. De gegevensbestanden in FTDC zijn gecomprimeerd, niet leesbaar voor mensen en erven dezelfde toegangsrechten voor bestanden als de MongoDB-gegevensbestanden. Hierdoor kunnen alleen gebruikers met toegang tot de FTDC-gegevensbestanden de gegevens verzenden.

De stappen om het te configureren zijn bijna identiek aan de vorige. Het aangepaste beleid is alleen anders.

$ 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 laatste stappen zijn het compileren en laden van het aangepaste beleid:

$ 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

Aangepast MongoDB-mappad

Een belangrijk ding om op te merken is dat als je MongoDB in de aangepaste map hebt geïnstalleerd, je ook het SELinux-beleid moet aanpassen. De stappen zijn iets anders dan de vorige, maar het is niet te ingewikkeld.

Eerst moeten we het SELinux-beleid bijwerken om de mongod-service de nieuwe directory te laten gebruiken, het is de moeite waard om op te merken dat we ervoor moeten zorgen dat de .* aan het einde van de directory wordt toegevoegd:

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

  • mongod_log_t voor logbestandmap

  • mongod_var_run_t voor pid-bestandsmap

Update dan het SELinux gebruikersbeleid voor de nieuwe map:

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

  • mongod_log_t voor log-directory

  • mongod_var_run_t voor pid-bestandsmap

De laatste stap is het toepassen van de bijgewerkte SELinux-policies op de directory:

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

Aangezien MongoDB het standaardpad gebruikt voor zowel gegevens- als logbestanden, kunnen we de volgende voorbeelden bekijken om dit toe te passen:

Voor niet-standaard MongoDB-gegevenspad van /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'

Aangepaste MongoDB-poort

Voor sommige situaties gebruiken sommige MongoDB-installaties een ander poortnummer dan het standaardnummer dat 27017 is. In dit specifieke geval moeten we SELinux ook configureren en het commando is vrij eenvoudig :

$ 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 inschakelen met ClusterControl

Met ClusterControl heeft u de mogelijkheid om SELinux in te schakelen tijdens de implementatie van uw MongoDB-replicaset. U moet de modus echter nog steeds wijzigen in afdwingen, aangezien ClusterControl deze alleen op permissief instelt. Om het tijdens de implementatie in te schakelen, kunt u "AppArmor/SELinux uitschakelen" uitschakelen zoals in de onderstaande schermafbeelding.

Daarna kunt u doorgaan en de knooppunten voor uw MongoDB-replicaset toevoegen en start de implementatie. In ClusterControl gebruiken we versie 4.2 voor MongoDB.

Zodra het cluster gereed is, moeten we de SELinux wijzigen in afdwingen voor alle knooppunten en ga verder met het configureren ervan door te verwijzen naar de stappen die we zojuist hebben doorlopen.

Conclusie

Er zijn 3 modi van SELinux beschikbaar voor elk Linux-systeem. Voor de SELinux-afdwingende modus zijn er een paar stappen die moeten worden gevolgd om ervoor te zorgen dat MongoDB probleemloos werkt. Het is ook vermeldenswaard dat sommige van de "ulimit" -instellingen ook moeten worden gewijzigd om te voldoen aan de systeemvereisten en specificaties.

Met ClusterControl kan SELinux worden ingeschakeld tijdens de implementatie, maar u moet nog steeds overschakelen naar de afdwingende modus en het beleid configureren nadat de replicaset gereed is.

We hopen dat deze blogpost je zal helpen bij het opzetten van SELinux voor je MongoDB-servers


  1. Redis gepijplijnde uitvoeringsvolgorde

  2. Schema's plannen en beheren in MongoDB (ook al is het schemaloos)

  3. Procedure:gebruikersauthenticatie en autorisatie inschakelen in Apache HBase

  4. phpMyAdmin gelijk aan MySQL voor Redis?