MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment configurer SELinux pour les ensembles de répliques MongoDB

D'ici 2025, le monde stockera environ 200 zettaoctets de données. Ces données seront stockées dans un stockage public, privé, sur site ou dans le cloud, des PC, des ordinateurs portables, des smartphones et également des appareils Internet des objets (IoT). Selon les projections, le nombre d'appareils connectés à Internet devrait également augmenter pour atteindre près de 75 milliards en 2025. Pour certains d'entre nous ou des personnes ayant moins d'expérience en informatique, ces chiffres ne sont rien. Mais pour les passionnés de sécurité, cela est inquiétant car de plus en plus de données sont menacées.

Dans le monde de la technologie open source et des bases de données, la sécurité est l'un des sujets importants. De temps en temps, il y aura beaucoup de nouvelles inventions et de développements liés à la sécurité. L'un d'eux est Security-Enhanced Linux ou (SELinux) en abrégé, qui a été développé il y a près de 21 ans par la National Security Agency (NSA) des États-Unis. Même si cela a été introduit il y a tant d'années, il a évolué rapidement et a été largement utilisé comme l'une des mesures de sécurité pour le système Linux. Bien qu'il ne soit pas facile de trouver des informations sur la façon de le configurer avec une base de données, MongoDB en a profité. Dans cet article de blog, nous passerons en revue SELinux et comment le configurer dans les jeux de réplicas MongoDB.

A cet effet, nous allons utiliser 3 VM CentOS 8 pour notre environnement de test et utiliser MongoDB 4.4. Avant de commencer, plongeons un peu plus dans SELinux.

Mode forcé, permissif et désactivé

Ce sont les trois modes que SELinux peut exécuter à tout moment. Bien sûr, chacun d'entre eux a sa propre fonction et son propre objectif en termes de politique de sécurité. Nous allons les parcourir un par un.

En mode d'application, toute politique configurée sera appliquée sur le système et chaque tentative d'accès non autorisé à la fois par des utilisateurs ou des processus est refusée par SELinux. De plus, ces actions d'accès refusé seront également enregistrées dans les fichiers journaux associés. Bien qu'il s'agisse du mode le plus recommandé, la plupart des systèmes Linux de nos jours n'ont pas ce mode activé par l'administrateur système pour diverses raisons telles que la complexité de SELinux lui-même.

Pour le mode permissif, nous pouvons dire en toute sécurité que SELinux est dans un état semi-activé. Dans ce mode, aucune politique ne sera appliquée par SELinux, en même temps aucun accès ne sera refusé. Malgré cela, toute violation de politique est toujours enregistrée et consignée dans les journaux d'audit. Généralement, ce mode est utilisé pour tester SELinux avant de le finaliser et de procéder à son application.

Pour le dernier mode désactivé, aucune sécurité renforcée n'est en cours d'exécution sur le système. Savez-vous quel mode SELinux votre système exécute maintenant ? Exécutez simplement la commande suivante pour voir :

$ 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

Pour nos systèmes de test, SELinux a été activé et configuré comme application afin que nous puissions continuer avec le reste du guide. Si SELinux est désactivé ou permissif dans votre système, vous pouvez suivre les étapes ci-dessous pour l'activer et passer à l'application.

  1. Modifiez le fichier /etc/selinux/config pour changer la directive en enforcing

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

Vous devez vous assurer que la directive ci-dessus est définie sur l'application.

  1. Redémarrez le système pour appliquer le paramètre

$ reboot

Une fois le système en ligne, nous devons confirmer que SELinux a été configuré correctement et que le changement a eu lieu. Exécutez la commande suivante pour vérifier, c'est une autre façon de le vérifier en dehors de la première que j'ai mentionnée plus tôt (sestatus).

$ getenforce

Application

Une fois que nous voyons le mot "Enforcer", nous pouvons maintenant confirmer que c'est bon. Puisque nous allons utiliser un jeu de répliques, nous devons nous assurer que SELinux a été configuré sur tous les nœuds MongoDB. Je pense que c'est la partie la plus importante que nous devrions couvrir avant de procéder à la configuration de SELinux pour MongoDB.

Paramètres "ulimit" recommandés 

Dans cet exemple, nous supposons que MongoDB 4.4 a été installé sur 3 nœuds. L'installation est très simple et facile, pour gagner du temps nous n'allons pas vous montrer les étapes mais voici le lien vers la documentation.

Dans certains cas, "ulimit" du système causera quelques problèmes si les limites ont une valeur par défaut basse. Afin de vous assurer que MongoDB fonctionne correctement, nous vous recommandons fortement de définir le "ulimit" conformément à la recommandation MongoDB ici. Bien que chaque déploiement puisse avoir ses exigences ou paramètres uniques, il est préférable de suivre les paramètres "ulimit" suivants :

-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

Pour modifier la valeur "ulimit", exécutez simplement la commande suivante, par exemple, en modifiant la valeur de "-n" (fichiers ouverts) :

$ ulimit -n 64000

Une fois toutes les limites modifiées, l'instance mongod doit être redémarrée pour s'assurer que les nouvelles modifications de limite ont lieu :

$ sudo systemctl restart mongod

Configurer SELinux

Selon la documentation MongoDB, la politique SELinux actuelle n'autorise pas le processus MongoDB à accéder à /sys/fs/cgroup, qui est nécessaire pour déterminer la mémoire disponible sur votre système. Donc, pour notre cas, dans lequel SELinux est en mode d'application, l'ajustement suivant doit être effectué.

Autoriser l'accès au cgroup

La première étape consiste à s'assurer que le package "checkpolicy" est installé sur notre système :

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

Ensuite, nous devons créer un fichier de stratégie personnalisé pour "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

Une fois le fichier de stratégie créé, les dernières étapes consistent à compiler et à charger le module de stratégie personnalisé en exécutant ces trois commandes :

$ 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

La dernière commande devrait prendre un certain temps et une fois terminée, le processus MongoDB devrait pouvoir accéder aux fichiers corrects avec le mode d'application SELinux.

Autoriser l'accès à netstat pour FTDC

/proc/net/netstat est requis pour la capture de données de diagnostic à temps plein (FTDC). FTDC en bref est un mécanisme pour faciliter l'analyse du serveur MongoDB. Les fichiers de données dans FTDC sont compressés, non lisibles par l'homme et héritent de la même autorisation d'accès aux fichiers que les fichiers de données MongoDB. Pour cette raison, seuls les utilisateurs ayant accès aux fichiers de données FTDC peuvent transmettre les données.

Les étapes pour le configurer sont presque identiques à la précédente. C'est juste que la politique personnalisée est différente.

$ 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

Les dernières étapes consistent à compiler et à charger la stratégie personnalisée :

$ 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

Chemin d'accès au répertoire MongoDB personnalisé

Une chose importante à noter est que si vous avez installé MongoDB dans le répertoire personnalisé, vous devrez également personnaliser la politique SELinux. Les étapes sont légèrement différentes de la précédente mais ce n'est pas trop complexe.

Tout d'abord, nous devons mettre à jour la politique SELinux pour permettre au service mongod d'utiliser le nouveau répertoire, il convient de noter que nous devons nous assurer d'inclure le .* à la fin du répertoire :

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t pour le répertoire de données

  • mongod_log_t pour le répertoire des fichiers journaux

  • mongod_var_run_t pour le répertoire de fichiers pid

Ensuite, mettez à jour la politique d'utilisation de SELinux pour le nouveau répertoire :

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t pour le répertoire de données

  • mongod_log_t pour le répertoire des journaux

  • mongod_var_run_t pour le répertoire de fichiers pid

La dernière étape consiste à appliquer les politiques SELinux mises à jour au répertoire :

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

Étant donné que MongoDB utilise le chemin par défaut pour les données et les fichiers journaux, nous pouvons jeter un œil aux exemples suivants sur la façon de l'appliquer :

Pour le chemin de données MongoDB non par défaut de /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'

Port MongoDB personnalisé

Dans certaines situations, certaines des installations de MongoDB utilisent un numéro de port différent de celui par défaut qui est 27017. Dans ce cas particulier, nous devons également configurer SELinux et la commande est assez simple :

$ 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

Déploiement de MongoDB SELinux activé avec ClusterControl

Avec ClusterControl, vous avez la possibilité d'activer SELinux lors du déploiement de votre jeu de répliques MongoDB. Cependant, vous devez toujours changer le mode en application puisque ClusterControl ne le définit que sur permissif. Pour l'activer pendant le déploiement, vous pouvez décocher "Désactiver AppArmor/SELinux" comme indiqué sur la capture d'écran ci-dessous.

Après cela, vous pouvez continuer et ajouter les nœuds pour votre jeu de répliques MongoDB et lancez le déploiement. Dans ClusterControl, nous utilisons la version 4.2 pour MongoDB.

Une fois que le cluster est prêt, nous devons changer le SELinux pour appliquer pour tous les nœuds et procédez à sa configuration en vous référant aux étapes que nous avons parcourues tout à l'heure.

Conclusion

Il existe 3 modes de SELinux disponibles pour tout système Linux. Pour le mode d'application SELinux, quelques étapes doivent être suivies afin de s'assurer que MongoDB fonctionne sans aucun problème. Il convient également de noter que certains des paramètres "ulimit" doivent également être modifiés pour répondre aux exigences du système ainsi qu'aux spécifications.

Avec ClusterControl, SELinux peut être activé pendant le déploiement, mais vous devez toujours passer en mode d'application et configurer la politique une fois que le jeu de répliques est prêt.

Nous espérons que cet article de blog vous aidera à configurer SELinux pour vos serveurs MongoDB