Entro il 2025, il mondo memorizzerà circa 200 zettabyte di dati. Tali dati verranno archiviati in dispositivi di archiviazione pubblici, privati, locali o cloud, PC, laptop, smartphone e anche dispositivi Internet-of-Things (IoT). Secondo le proiezioni, si prevede che anche il numero di dispositivi connessi a Internet aumenterà fino a quasi 75 miliardi nel 2025. Per alcuni di noi o per persone con un background IT inferiore, quei numeri non sono nulla. Ma per gli appassionati di sicurezza, questo è preoccupante perché sempre più dati sono a rischio.
Nel mondo della tecnologia open source e dei database, la sicurezza è uno degli argomenti importanti. Ogni tanto ci saranno molte nuove invenzioni e sviluppi associati alla sicurezza. Uno di questi è Security-Enhanced Linux o (SELinux) in breve, sviluppato quasi 21 anni fa dalla National Security Agency (NSA) degli Stati Uniti. Anche se questo è stato introdotto tanti anni fa, si è evoluto rapidamente e ampiamente utilizzato come una delle misure di sicurezza per il sistema Linux. Sebbene non sia facile trovare informazioni su come configurarlo con un database, MongoDB ne ha approfittato. In questo post del blog, esamineremo SELinux e come configurarlo nei set di repliche MongoDB.
A tale scopo, utilizzeremo 3 VM CentOS 8 per il nostro ambiente di test e utilizzeremo MongoDB 4.4. Prima di iniziare, approfondiamo un po' SELinux.
Modalità di applicazione, permissiva e disabilitata
Queste sono le tre modalità che SELinux può eseguire in un dato momento. Naturalmente, tutti hanno la propria funzione e scopo in termini di politica di sicurezza. Lo esamineremo uno per uno.
Quando si è in modalità di applicazione, qualsiasi politica configurata verrà applicata al sistema e ogni singolo tentativo di accesso non autorizzato sia da parte di utenti che da processi verrà negato da SELinux. Non solo, anche quelle azioni di accesso negato verranno registrate nei relativi file di registro. Sebbene questa sia la modalità più consigliata, la maggior parte dei sistemi Linux al giorno d'oggi non ha questa modalità abilitata dall'amministratore di sistema a causa di vari motivi come la complessità dello stesso SELinux.
Per la modalità permissiva, possiamo tranquillamente affermare che SELinux è in uno stato semi-abilitato. In questa modalità, nessun criterio verrà applicato da SELinux, allo stesso tempo nessun accesso verrà negato. Nonostante ciò, qualsiasi violazione delle norme viene comunque registrata e registrata nei registri di controllo. Tipicamente, questa modalità viene utilizzata per testare SELinux prima di finalizzarlo e procedere per applicarlo.
Per l'ultima modalità disabilitata, sul sistema non è in esecuzione alcuna sicurezza avanzata. Sai quale modalità SELinux esegue ora il tuo sistema? Basta eseguire il seguente comando per vedere:
$ 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
Per i nostri sistemi di test, SELinux è stato abilitato e configurato come enforcing in modo da poter procedere con il resto della guida. Nel caso in cui SELinux sia disabilitato o permissivo nel tuo sistema, puoi seguire i passaggi seguenti per abilitarlo e passare all'applicazione.
-
Modifica il file /etc/selinux/config per modificare la direttiva in enforcing
vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…
Devi assicurarti che la direttiva sopra sia impostata su enforcing.
-
Riavvia il sistema per applicare l'impostazione
$ riavvia
Una volta che il sistema è online, dobbiamo confermare che SELinux è stato configurato correttamente e che la modifica è avvenuta. Esegui il comando seguente per verificare, questo è un altro modo per verificarlo a parte il primo che ho menzionato prima (sestatus).
$ getenforce
Applicazione
Una volta visualizzata la parola "Enforcing", ora possiamo confermare che è a posto. Poiché utilizzeremo un set di repliche, dobbiamo assicurarci che SELinux sia stato configurato su tutti i nodi MongoDB. Credo che questa sia la parte più importante di cui dovremmo occuparci prima di procedere con la configurazione di SELinux per MongoDB.
Impostazioni "ulimit" consigliate
In questo esempio, assumiamo che MongoDB 4.4 sia stato installato su 3 nodi. L'installazione è molto semplice e facile, per risparmiare tempo non ti mostreremo i passaggi ma ecco il link alla documentazione.
In alcuni casi, "ulimit" del sistema causerà alcuni problemi se i limiti hanno un valore predefinito basso. Per assicurarci che MongoDB funzioni correttamente, consigliamo vivamente di impostare "ulimit" come raccomandato da MongoDB qui. Sebbene ogni distribuzione possa avere i suoi requisiti o impostazioni univoci, è meglio seguire le seguenti impostazioni "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
Per modificare il valore di “ulimit”, è sufficiente impartire il seguente comando, ad esempio modificando il valore di “-n” (file aperti):
$ ulimit -n 64000
Dopo che tutti i limiti sono stati modificati, l'istanza mongod deve essere riavviata per garantire che le nuove modifiche ai limiti avvengano:
$ sudo systemctl restart mongod
Configurazione di SELinux
Secondo la documentazione di MongoDB, l'attuale politica SELinux non consente al processo MongoDB di accedere a /sys/fs/cgroup, che è necessario per determinare la memoria disponibile sul tuo sistema. Quindi, nel nostro caso, in cui SELinux è in modalità di applicazione, è necessario apportare le seguenti modifiche.
Consenti l'accesso a cgroup
Il primo passo è assicurarsi che il nostro sistema abbia installato il pacchetto "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!
Successivamente, dobbiamo creare un file di criteri personalizzato per "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
Dopo aver creato il file della politica, gli ultimi passaggi sono compilare e caricare il modulo della politica personalizzata eseguendo questi tre comandi:
$ 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
L'ultimo comando dovrebbe richiedere un po' di tempo e, una volta terminato, il processo MongoDB dovrebbe essere in grado di accedere ai file corretti con la modalità di applicazione di SELinux.
Consenti accesso a netstat per FTDC
/proc/net/netstat è richiesto per Full Time Diagnostic Data Capture (FTDC). FTDC in breve è un meccanismo per facilitare l'analisi del server MongoDB. I file di dati in FTDC sono compressi, non leggibili ed ereditano la stessa autorizzazione di accesso ai file dei file di dati MongoDB. Per questo motivo, solo gli utenti con accesso ai file di dati FTDC possono trasmettere i dati.
I passaggi per configurarlo sono quasi identici al precedente. È solo che la politica personalizzata è diversa.
$ 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
Gli ultimi passaggi sono compilare e caricare la policy personalizzata:
$ 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
Percorso directory MongoDB personalizzato
Una cosa importante da notare è che se hai installato MongoDB nella directory personalizzata, dovrai personalizzare anche la politica di SELinux. I passaggi sono leggermente diversi dal precedente ma non è troppo complesso.
Per prima cosa, dobbiamo aggiornare la politica di SELinux per consentire al servizio mongod di utilizzare la nuova directory, vale la pena notare che dobbiamo assicurarci di includere .* alla fine della directory:
$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
-
mongod_var_lib_t per la directory dei dati
-
mongod_log_t per la directory dei file di registro
-
mongod_var_run_t per la directory del file pid
Quindi, aggiorna la politica utente di SELinux per la nuova directory:
$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
-
mongod_var_lib_t per la directory dei dati
-
mongod_log_t per la directory dei log
-
mongod_var_run_t per la directory del file pid
L'ultimo passaggio consiste nell'applicare le politiche SELinux aggiornate alla directory:
restorecon -R -v </some/MongoDB/directory>
Poiché MongoDB utilizza il percorso predefinito sia per i dati che per i file di registro, possiamo dare un'occhiata ai seguenti esempi su come applicarlo:
Per il percorso dati MongoDB non predefinito di /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'
Porta MongoDB personalizzata
Per alcune situazioni, alcune installazioni di MongoDB utilizzano un numero di porta diverso da quello predefinito che è 27017. In questo caso particolare, dobbiamo configurare anche SELinux e il comando è piuttosto semplice :
$ 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
Distribuzione di MongoDB SELinux abilitata con ClusterControl
Con ClusterControl, hai la possibilità di abilitare SELinux durante la distribuzione del tuo set di repliche MongoDB. Tuttavia, è comunque necessario modificare la modalità per imporre poiché ClusterControl lo imposta solo su permissivo. Per abilitarlo durante la distribuzione, puoi deselezionare "Disable AppArmor/SELinux" come da screenshot qui sotto.
Dopodiché, puoi continuare e aggiungere i nodi per il tuo set di repliche MongoDB e avviare la distribuzione. In ClusterControl stiamo usando la versione 4.2 per MongoDB.
Una volta che il cluster è pronto, è necessario modificare SELinux in enforcing per tutti i nodi e procedere con la configurazione facendo riferimento ai passaggi che abbiamo eseguito poc'anzi.
Conclusione
Ci sono 3 modalità di SELinux disponibili per qualsiasi sistema Linux. Per la modalità di applicazione di SELinux, ci sono alcuni passaggi che devono essere seguiti per assicurarsi che MongoDB funzioni senza problemi. Vale anche la pena notare che anche alcune delle impostazioni "ulimit" devono essere modificate per soddisfare i requisiti di sistema e le specifiche.
Con ClusterControl, SELinux può essere abilitato durante la distribuzione, tuttavia è comunque necessario passare alla modalità di applicazione e configurare la politica dopo che il set di repliche è pronto.
Ci auguriamo che questo post sul blog ti aiuti a configurare SELinux per i tuoi server MongoDB