Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Make by tools (01.00.01) - action=clean_macro_parameter
Scroll Ignore
scroll-html
scroll-viewporttrue
scroll-pdftrue
scroll-officetrue
scroll-chmtrue
scroll-htmlfalse
scroll-docbooktrue
scroll-eclipsehelptrue
scroll-epubtruefalse
Panel
titleSommaire

Table of Contents
stylenone

Introduction

Cette procédure permet d'activer le chiffrement des communications :

  • entre les membres du cluster,
  • entre les clients (  Shinken ) et le cluster.


Pour éviter une interruption de service, les étapes doivent être suivies dans l'ordre.


Info

Dans les sections qui vont suivre, la valeur du paramètre net.ssl.mode de mongo ( https://www.mongodb.com/docs/v3.0/reference/configuration-options/#net.ssl.mode ) permet de définir son comportement vis-à-vis des connexions entrantes et des connexions sortantes :

Valeur de net.ssl.modeConnexions entrantes acceptéesConnexions sortantes établies
disablednon chiffréesnon chiffrées
allowSSL non chiffrées et chiffréesnon chiffrées
preferSSL non chiffrées et chiffréeschiffrées
requireSSL chiffréeschiffrées

Générer les certificats SSL

On utilise la version d'OpenSSL livrée par Shinken pour créer les certificats.

Sur un des nœuds du cluster, on se place dans un dossier qui va stocker tous nos certificats :

Scroll Title
title
Code Block
languagetext
themeEmacs
mkdir /etc/shinken/certs/mongodb
cd /etc/shinken/certs/mongodb

Création des certificats de l'autorité de certification

Remplacer Organization Inc. par le nom de la société du client ( éventuellement ).

Scroll Title
title
Code Block
languagetext
themeEmacs
/opt/shinken/openssl/bin/openssl genrsa 2048 > ca-key.pem 
/opt/shinken/openssl/bin/openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem -subj "/C=FR/L=Paris/O=Organization Inc./OU=Shinken MongoDB CA/CN=Shinken MongoDB CA"

Création des certificats pour les

noeuds

nœuds du cluster

Info

Les certificats émis pour les membres du cluster doivent répondre aux contraintes suivantes ( https://www.mongodb.com/docs/v3.0/tutorial/configure-x509-member-authentication/#x509-member-certificate ) :

  • Ils doivent tous être émis par la même autorité de certification ( ex: le certificat créé dans la section précédente ).
  • Parmi les attributs suivants des certificats, l'un d'entre eux doit forcément être non vide, et ils doivent avoir une valeur identique pour tous les certificats :
    • O  ( Organization ),
    • OU  ( Organizational Unit ),
    • DC  ( Domain Components ).


Pour chaque nœud du cluster, exécuter la commande suivante :

  • en remplaçant server1 par le nom de chaque nœud tel que définis dans la configuration du cluster.
  • en remplaçant Organization Inc. par la valeur utilisée pour le certificat de l'autorité de certification ci-dessus.

Scroll Title
title
Code Block
languagetext
themeEmacs
/opt/shinken/openssl/bin/openssl req -newkey rsa:2048 -nodes -days 365000 -keyout server1-key.pem -out server1-req.pem -subj "/C=FR/L=Paris/O=Organization Inc./OU=Shinken MongoDB Cluster/CN=server1"
/opt/shinken/openssl/bin/openssl x509 -req -days 365000 -set_serial "0x`openssl rand -hex 8`" -in server1-req.pem -out server1-cert.pem -CA ca-cert.pem -CAkey ca-key.pem
cat server1-key.pem server1-cert.pem > server1.pem

Création des certificats pour les clients ( serveurs Shinken utilisant mongos )

Info

Les certificats, émis pour les clients ( daemons ou modules ) qui vont interroger le cluster, doivent répondre aux contraintes suivantes (https ://www.mongodb.com/docs/v3.0/core/security-x.509/#std-label-client-x509-certificates-requirements ) :

  • Ils doivent tous être émis par la même autorité de certification que celle du cluster ( ex: le certificat créé dans la section ci dessus ).
  • Chaque client doit avoir son propre certificat.
  • parmi les attributs suivants des certificats, l'un d'entre eux doit avoir une valeur différente de celles utilisées pour le cluster :
    • O   ( Organization ),
    • OU   ( Organizational Unit ),
    • DC   ( Domain Components ).


  • Pour chaque serveur Shinken qui va se connecter au cluster via mongos, exécuter la commande suivante :
    • En remplaçant client1 par le nom du serveur Shinken, tel qu'il est connu par le serveur DNS,
    • En remplaçant Organization Inc. par la valeur utilisée pour le certificat de l'autorité de certification ci-dessus.

Scroll Title
title
Code Block
languagetext
themeEmacs
/opt/shinken/openssl/bin/openssl req -newkey rsa:2048 -nodes -days 365000 -keyout client1-key.pem -out client1-req.pem -subj "/C=FR/L=Paris/O=Organization Inc./OU=Shinken MongoDB Client/CN=client1"
/opt/shinken/openssl/bin/openssl x509 -req -days 365000 -set_serial "0x`openssl rand -hex 8`" -in client1-req.pem -out client1-cert.pem -CA ca-cert.pem -CAkey ca-key.pem
cat client1-key.pem client1-cert.pem > client1.pem

Déployer les certificats sur les noeuds du cluster

Remplacer node2 et node3 par les noms ou IP des deux autres membres du cluster :

Scroll Title
title
Code Block
languagetext
themeEmacs
rsync -avP --delete /etc/shinken/certs/mongodb/ node2:/etc/shinken/certs/mongodb/
rsync -avP --delete /etc/shinken/certs/mongodb/ node3:/etc/shinken/certs/mongodb/
Info

Faites une copie de tous les certificats, pour avoir en plus une sauvegarde des certificats.

Déployer les certificats sur les clients ( serveurs Shinken utilisant mongos )

Remplacer client1 par le nom ou l'IP du serveur Shinken qui va se connecter au cluster :

Scroll Title
title
Code Block
languagetext
themeEmacs
rsync -avP /etc/shinken/certs/mongodb/ca-cert.pem /etc/shinken/certs/mongodb/client1.pem client1:/etc/shinken/certs/mongodb/

Activer le chiffrement sur le cluster

Autoriser le chiffrement des connexions au cluster

Pour éviter une coupure de service, intervenir sur chaque nœud du cluster, l'un après l'autre. L'arrêt d'un seul nœud sera transparent pour la production.

Sur cette Cette première étape , nous allons configurer permet de configurer mongod pour accepter les connexions entrantes chiffrées, mais il se connectera toujours aux autres nœuds en clair.


  • Sur chaque nœud du cluster, éditer /etc/mongod.conf pour ajouter cet extrait à la configuration, en remplaçant NODEX par le nom de chaque nœud :

Code Block
languagetext
themeEmacs
title/etc/mongod.conf
net:
  ssl:
    mode: allowSSL
    PEMKeyFile: /etc/shinken/certs/mongodb/NODEX.pem
    CAFile: /etc/shinken/certs/mongodb/ca-cert.pem
  • puis appliquer le changement :

Code Block
languagetext
themeEmacs
service mongod restart
Info
Chaque nœud accepte alors les connexions entrantes en clair ou chiffrées, et il établit ses connexions sortantes en clair.

Activer le chiffrement des connexions entre les membres du cluster

Nous allons Il faut maintenant configurer mongod pour lui dire d'établir ses connexions vers les autres membres du cluster avec le chiffrement. Les connexions entrantes sont toujours acceptées en clair et en chiffré.

  • Sur chaque nœud du cluster, lancer un shell mongo vers les mongod :

Code Block
languagetext
themeEmacs
mongo --port 27018
  • puis exécuter la commande suivante :

Code Block
languagejs
themeConfluence
db.adminCommand( { setParameter: 1, sslMode: "preferSSL" } )
  • pour rendre la modification permanente, remplacer allowSSL  par preferSSL dans /etc/mongod.conf , inutile de redémarrer mongod, la configuration étant déjà appliquée :

Code Block
languagetext
themeEmacs
net:
  ssl:
    mode: preferSSL 
Info

Chaque nœud accepte alors les connexions entrantes en clair ou chiffrées, et établit des connexions sortantes chiffrées.

À ce stade, les connexions du cluster sont chiffrées.

Autoriser le chiffrement des connexions aux mongo-configsrv

Pour éviter une coupure de service, intervenir sur chaque nœud du cluster, l'un après l'autre. L'arrêt d'un seul nœud sera transparent pour la production.

Sur cette Cette première étape , nous allons configurer permet de configurer mongod pour accepter les connexions chiffrées et en clair. Les mongos se connectant toujours en clair pour le moment, nous préparons le nil faut préparer le terrain pour pouvoir les passer en connexions chiffrées.

  • Sur chaque nœud du cluster, éditer /etc/mongo-configsrv.conf pour ajouter cet extrait à la configuration, en remplaçant NODEX par le nom de chaque nœud :

Code Block
languagetext
themeEmacs
title/etc/mongo-configsrv.conf
net:
  ssl:
    mode: preferSSL
    PEMKeyFile: /etc/shinken/certs/mongodb/NODEX.pem
    CAFile: /etc/shinken/certs/mongodb/ca-cert.pem
  • puis appliquer le changement :

Code Block
languagetext
themeEmacs
service mongo-configsrv restart
Info
Les mogomongo-configsrv acceptent alors les connexions entrantes chiffrées ou en clair.

Activer le chiffrement depuis les mongos ( clients Shinken )

Maintenant que tous les démons du cluster acceptent les connexions chiffrées, nous allons configurer il faut configurer mongos pour établir des connexions chiffrées.

  • Sur chaque nœud du cluster et sur chaque serveur Shinken se connectant au cluster, éditer le fichier /etc/mongos.conf pour ajouter cet extrait à la configuration, en remplaçant NODEX par le nom du serveur où est faite l'édition :

Code Block
languagetext
themeEmacs
title/etc/mongos.conf
net:
  ssl:
    mode: preferSSL
    PEMKeyFile: /etc/shinken/certs/mongodb/NODEX.pem
    CAFile: /etc/shinken/certs/mongodb/ca-cert.pem
  • puis appliquer le changement :

Code Block
languagetext
themeEmacs
service mongos restart
Info
Les mongos acceptent des connexions entrantes chiffrées ou en clair, et ils établissent des connexions sortantes ( vers le cluster ) uniquement chiffrées.

Forcer le chiffrement des connexions aux mongo-configsrv

Une fois les mongos configurés pour utiliser le chiffrement, on peut bloquer les connexions entrantes en clair sur les mongo-configsrv.

Pour éviter une coupure de service, intervenir sur chaque noeud du cluster, l'un après l'autre. L'arrêt d'un seul noeud sera transparent pour la production.

  • Sur chaque noeud du cluster, éditer /etc/mongo-configsrv.conf pour remplacer preferSSL  par requireSSL 
Code Block
languagetext
themeEmacs
title/etc/mongo-configsrv.conf
net:
  ssl:
    mode: requireSSL
  • puis appliquer le changement
Code Block
languagetext
themeEmacs
service mongo-configsrv restart
Info
Les mogomongo-configsrv n'acceptent alors que les connexions entrantes chiffrées, et ils établissent des connexions sortantes chiffrées.

Forcer le chiffrement des connexions au cluster

Dernière étape, nous allons configurer Cette dernière étape permet de configurer mongod sur les nœuds du cluster pour n'accepter que des connexions chiffrées.

  • Sur chaque nœud du cluster, lancer un shell mongo :

Code Block
languagetext
themeEmacs
mongo --port 27018
  • puis exécuter la commande suivante :

Code Block
languagejs
themeConfluence
db.adminCommand( { setParameter: 1, sslMode: "requireSSL" } )
  • pour rendre la modification permanente, remplacer preferSSL  par requireSSL dans /etc/mongod.conf , inutile de redémarrer mongod , la configuration étant déjà appliquée

Code Block
languagetext
themeEmacs
title/etc/mongod.conf
net:
  ssl:
    mode: requireSSL
Info
Chaque noeud nœud n'accepte que les connexions entrantes chiffrées, et établit des connexions sortantes chiffrées.
Chiffrer les

La connexions de Shinken au cluster

Connexion de Shinken au cluster sur la boucle locale ( 127.0.0.1 )

Shinken se connectant à mongos via la boucle locale ( 127.0.0.1 ), et mongos chiffrant ses communications vers le cluster, il n'y a rien à faire.

Les connexions de Shinken à mongos peuvent rester en clair. Le chiffrement n'aurait aucune valeur ajoutée, en plus de nécessiter un supplément de ressources CPU.

Warning

Pour ne pas se retrouver avec un mongos qui relaie des requêtes provenant de partout, le mettre en écoute uniquement sur la boucle locale.

Code Block
languagetext
themeEmacs
title/etc/mongos.conf
net:
  bindIp: 127.0.0.1

Si pour une contrainte interne, vous avez besoin de chiffrer la connexion sur la boucle locale ( NON RECOMMANDÉ )

Les étapes suivantes décrivent Les étapes suivantes décrivent comment activer le chiffrement SSL pour les connexions entre Shinken et les instances locales de mongos.

Cette opération entraînera nécessairement une indisponibilité de Shinken le temps de redémarrer celui-ci ainsi que les processus mongos.


Warning

Toutefois, comme ce chiffrement ne présenteaucun réel gain de sécurité — les communications se faisant au sein d’une même machine — et qu’il entraîne une surcharge en ressources ainsi qu’une complexité accrue, Shinken déconseille fortement l’activation du SSL dans ce contexte.

Création des certificats pour Shinken et déploiement des certificats sur les serveurs

Info

Pour pouvoir se connecter à MongoDB en SSL, Shinken doit fournir des certificats acceptés par les mongos.

Les certificats, émis pour les communications entre Shinken et les mongosr, doivent répondre aux contraintes suivantes ( https://www.mongodb.com/docs/v3.0/core/security-x.509/#std-label-client-x509-certificates-requirements ) :

  • Ils doivent tous être émis par la même autorité de certification que celle du cluster ( ex: le certificat créé dans la section ci dessus ).
  • Chaque client doit avoir son propre certificat.
  • parmi les attributs suivants des certificats, l'un d'entre eux doit avoir une valeur différente de celles utilisées pour le cluster :
    • O  ( Organization ),
    • OU  ( Organizational Unit ),
    • DC  ( Domain Components ).
Pour chaque serveur Shinken qui va se connecter au cluster via mongos, exécuter la commande suivante :

  Son certificat doit donc être émis par la même autorité de certification que celle utilisée pour les certificats de MongoDB.


Sur le serveur avec le certificat d'autorité, exécuter les commandes suivantes : 

  • Remplacer le champ subjectAltName par la liste des serveurs hébergeant au moins un des démons Shinken suivants : Synchronizer, Broker ou Scheduler ( dans le cas de la retention MongoDB ).
    • Pour ajouter une IP : "IP:IP_DU_SERVEUR"
    • Pour ajouter un nom DNS : "DNS:NOM_DU_SERVEUR"


Scroll Title
title
  • En remplaçant client1 par le nom du serveur Shinken, tel qu'il est connu par le serveur DNS,
  • En remplaçant Organization Inc. par la valeur utilisée pour le certificat de l'autorité de certification ci-dessus.
    Code Block
    languagetext
    themeEmacs
    /opt/shinken/openssl/bin/openssl req -newkey rsa:2048 -nodes -
    days 365000 -
    keyout 
    client1
    shinken-key.pem -out 
    client1
    shinken-req.pem -subj "/C=FR/L=Paris
    /O=Organization Inc./OU=Shinken MongoDB Client/CN=client1"
    " -addext 'subjectAltName = DNS:shinken-node1, IP:shinken-node2' 
    /opt/shinken/openssl/bin/openssl x509 -req -days 365000 -set_serial "0x`openssl rand -hex 8`
    " -in client1-req.pem -out client1-cert.pem -CA ca-cert.pem -CAkey ca-key.pem cat client1-key.pem client1-cert.pem > client1.pem
    " -in shinken-req.pem -out shinken-cert.pem -CA ca-cert.pem -CAkey ca-key.pem
    
    cat shinken-key.pem shinken-cert.pem > shinken.pem

    Ensuite, il est nécessaire de déployer le certificat sur toutes les machines hébergeant au moins un des démons Shinken suivants : Synchronizer, Broker ou Scheduler ( dans le cas de la retention MongoDB ).


    Dans la commande suivante, adapter la valeur de SHINKEN_SERVER :  

    Code Block
    languagetext
    themeEmacs
    rsync -avP /etc/shinken/certs/mongodb/shinken.pem SHINKEN_SERVER:/etc/shinken/certs/mongodb/
    Info

    L’ajout d’un nouveau serveur Shinken avec un Synchronizer, Broker ou Scheduler nécessitera de régénérer le certificat en y incluant ce serveur dans la liste subjectAltName .

    Activer le chiffrement SSL dans Shinken

    Pour activer le chiffrement SSL dans Shinken, il faut préciser les paramètres de connexion dans le paramètre de l'uri de Mongo. 


    • Tous les composants de Shinken qui se connectent à MongoDB doivent voir leur configuration modifiée sur le serveur de l'Arbiter.



    • Dans le cas de l'utilisation de l'outil tiers Grafana, il faut aussi modifier sur la ou les machines avec un carbon-cache le fichier de configuration /opt/graphite/conf/mongodb.conf  ( voir la page Grafana - v8.3.2 ) ;



    Paramètre
    Paramètres d'uriDescription
    No Format
    tls

    Active SSL/TLS pour les communications avec le mongos.

    Valeurs possibles : 

    • true
    • false
    No Format
    tlsAllowInvalidCertificates

    Accepter le certificat SSL de mongos même s’il est invalide, par exemple expiré.

    Valeurs possibles : 

    • true
    • false
    No Format
    tlsAllowInvalidHostnames

    Accepter le certificat SSL de mongos même si le nom d’hôte du certificat ne correspond pas à celui du serveur.

    Valeurs possibles : 

    • true
    • false
    No Format
    tlsCAFile

    Chemin vers le fichier de l’autorité de certification (  CA   ) utilisé pour vérifier le certificat SSL du mongos. 

    No Format
    tlsCertificateKeyFile

    Chemin vers le fichier contenant le certificat SSL de Shinken.

    No Format
    tlsCertificateKeyFilePassword

    Mot de passe du certificat SSL de Shinken .

    Warning
    titleAvertissement

    Le mot de passe est utilisé en paramètre d'URL. Si il contient des caractères interdits dans une URL, ils devront être échappés ( URL encodés ).

    caractère interdit:
    /?#[]@!$&'()*+,;=%(espace)remplacement%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%25%20  ou  +

    Pour plus d'information https://developer.mozilla.org/fr/docs/Glossary/percent-encoding et rfc3986

    Exemple: pour le mot de passe  ch@nge_me  il faudra mettre ch%40nge_me

    No Format
    tlsCRLFile
    Chemin vers le fichier CRL ( liste de révocation ) des certificats SSL à rejeter.
    /?#[]@!$&'()*+,;=%(espace)
    remplacement%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%25%20  ou  +

    Pour plus d'information https://developer.mozilla.org/fr/docs/Glossary/percent-encoding et rfc3986

    Exemple: pour le mot de passe  ch@nge_me  il faudra mettre ch%40nge_me

    No Format
    tlsCRLFile

    Chemin vers le fichier CRL (  liste de révocation  ) des certificats SSL à rejeter.

    Exemple d'uri qui active le chiffrement SSL : 

    Scroll Title
    title
    Code Block
    languagetext
    themeEmacs
    mongodb_uri=mongodb://localhost:27017/?safe=false&tls=true&tlsCertificateKeyFile=/etc/shinken/certs/mongodb/shinken.pem&tlsCAFile=/etc/shinken/certs/mongodb/ca-cert.pem

    Forcer le chiffrement des connexions aux mongos


    • Sur chaque serveur disposant du mongos, éditer /etc/mongos.conf  pour remplacer preferSSL  par requireSSL 


    Code Block
    languagetext
    themeEmacs
    title/etc/mongo-configsrv.conf
    net:
      ssl:
        mode: requireSSL
    • puis appliquer le changement
    Code Block
    languagetext
    themeEmacs
    service mongo-configsrv restart
    Info
    Les mogos n'acceptent alors que les connexions entrantes chiffrées, et ils établissent des connexions sortantes chiffrées.

    Redemarrage des mongos et de Shinken pour prendre en compte les modifications

    Info
    Les mongos n'acceptent alors que les connexions entrantes chiffrées, et ils établissent des connexions sortantes chiffrées.

    Redémarrage des mongos et de Shinken pour prendre en compte les modifications

    Il faut dans l'ordre :


    • éteindre Shinken sur tous les serveurs :

      Excerpt Include
      Démarrage/Arrêt/Statut des démons ( Ligne de commande )
      Démarrage/Arrêt/Statut des démons ( Ligne de commande )
      pageDefaultLink[destination=Optional[PageResourceIdentifier[spaceKey=<null>,title=Démarrage/Arrêt/Statut des démons ( Ligne de commande )]],body=Optional.empty,tooltip=Optional.empty,anchor=Optional.empty,target=Optional.empty]
      nopaneltrue

    Il faut dans l'ordre :

    • éteindre Shinken sur tous les serveurs :

      Code Block
      languagetext
      themeEmacs
      service shinken stop
    • Redémarrer tous les mongos : 

      Code Block
      languagetext
      themeEmacs
      service mongos restart
    • Redémarrer Shinken sur tous les serveurs : : 

      Code Block
      languagetext
      themeEmacs
      service shinken start

      Excerpt Include
      Manipulation des démons Shinken ( Ligne de commande )
      Manipulation des démons Shinken ( Ligne de commande )
      pageDefaultLink[destination=Optional[PageResourceIdentifier[spaceKey=<null>,title=Manipulation des démons Shinken ( Ligne de commande )]],body=Optional.empty,tooltip=Optional.empty,anchor=Optional.empty,target=Optional.empty]
      nopaneltrue

    Utilisation du client mongo en ligne de commande

    Si un mongos est présent sur la machine locale, il suffit de se connecter normalement en clair au mongos.

    Depuis une machine clientX , pour établir une connexion chiffrée vers un mongod sur serveurY , voici la ligne de commande à utiliser

    Code Block
    languagetext
    themeEmacs
    mongo --ssl --sslCAFile /etc/shinken/certs/mongodb/ca-cert.pem --sslPEMKeyFile /etc/shinken/certs/mongodb/clientX.pem --port 27018 --host serveurY
    Info

    Pour les connexions locales, il ne faut pas utiliser localhost ou 127.0.0.1  comme paramètre de --host, mais le nom du serveur tel qu'il est défini dans le certificat.

    Exemple depuis la machine serveurY :

    Scroll Title
    title
    Code Block
    languagetext
    themeEmacs
    mongo --ssl --sslCAFile /etc/shinken/certs/mongodb/ca-cert.pem --sslPEMKeyFile /etc/shinken/certs/mongodb/serveurY.pem --port 27018 --host serveurY

    Supervision du cluster MongoDB en SSL

    Shinken recommande de superviser le cluster MongoDB créé lors de la mise en place de la haute disponibilité pour la base de données de Shinken :