Cette procédure permet d'activer le chiffrement des communications :
Pour éviter une interruption de service, les étapes doivent être suivies dans l'ordre.
Dans les sections qui vont suivre, la valeur du paramètre net.ssl.mode de mongo permet de définir son comportement vis-à-vis des connexions entrantes et des connexions sortantes :
|
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 :
|
Remplacer Organization Inc. par le nom de la société du client ( éventuellement ).
|
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 ) :
|
Pour chaque nœud du cluster, exécuter la commande suivante :
|
Les certificats, émis pour les clients ( daemons ou modules ) qui vont interroger le cluster, doivent répondre aux contraintes suivantes :
|
|
Remplacer node2 et node3 par les noms ou IP des deux autres membres du cluster :
|
Faites une copie de tous les certificats, pour avoir en plus une sauvegarde des certificats. |
Remplacer client1 par le nom ou l'IP du serveur Shinken qui va se connecter 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.
Cette première étape permet de configurer mongod pour accepter les connexions entrantes chiffrées, mais il se connectera toujours aux autres nœuds en clair.
net:
ssl:
mode: allowSSL
PEMKeyFile: /etc/shinken/certs/mongodb/NODEX.pem
CAFile: /etc/shinken/certs/mongodb/ca-cert.pem |
service mongod restart |
| Chaque nœud accepte alors les connexions entrantes en clair ou chiffrées, et il établit ses connexions sortantes en clair. |
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é.
mongo --port 27018 |
db.adminCommand( { setParameter: 1, sslMode: "preferSSL" } ) |
net:
ssl:
mode: preferSSL |
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. |
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.
Cette première étape permet de configurer mongod pour accepter les connexions chiffrées et en clair. Les mongos se connectant toujours en clair pour le moment, nil faut préparer le terrain pour pouvoir les passer en connexions chiffrées.
net:
ssl:
mode: preferSSL
PEMKeyFile: /etc/shinken/certs/mongodb/NODEX.pem
CAFile: /etc/shinken/certs/mongodb/ca-cert.pem |
service mongo-configsrv restart |
| Les mogo-configsrv acceptent alors les connexions entrantes chiffrées ou en clair. |
Maintenant que tous les démons du cluster acceptent les connexions chiffrées, il faut configurer mongos pour établir des connexions chiffrées.
net:
ssl:
mode: preferSSL
PEMKeyFile: /etc/shinken/certs/mongodb/NODEX.pem
CAFile: /etc/shinken/certs/mongodb/ca-cert.pem |
service mongos restart |
| Les mongos acceptent des connexions entrantes chiffrées ou en clair, et ils établissent des connexions sortantes ( vers le cluster ) uniquement chiffrées. |
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.
net: ssl: mode: requireSSL |
service mongo-configsrv restart |
| Les mogo-configsrv n'acceptent alors que les connexions entrantes chiffrées, et ils établissent des connexions sortantes chiffrées. |
Cette dernière étape permet de configurer mongod sur les nœuds du cluster pour n'accepter que des connexions chiffrées.
mongo --port 27018 |
db.adminCommand( { setParameter: 1, sslMode: "requireSSL" } ) |
net:
ssl:
mode: requireSSL |
| Chaque nœud n'accepte que les connexions entrantes chiffrées, et établit des connexions sortantes chiffrées. |
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.
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.
|
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.
Toutefois, comme ce chiffrement ne présente aucun 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. |
Pour pouvoir se connecter à MongoDB en SSL, Shinken doit fournir des certificats acceptés par les mongos. 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 :
|
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 :
rsync -avP /etc/shinken/certs/mongodb/shinken.pem SHINKEN_SERVER:/etc/shinken/certs/mongodb/ |
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 . |
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.
| Paramètres d'uri | Description | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Active SSL/TLS pour les communications avec le mongos. Valeurs possibles :
| ||||||||||||||||||||||||||||||||||||||||||||
| Accepter le certificat SSL de mongos même s’il est invalide, par exemple expiré. Valeurs possibles :
| ||||||||||||||||||||||||||||||||||||||||||||
| Accepter le certificat SSL de mongos même si le nom d’hôte du certificat ne correspond pas à celui du serveur. Valeurs possibles :
| ||||||||||||||||||||||||||||||||||||||||||||
| Chemin vers le fichier de l’autorité de certification ( CA ) utilisé pour vérifier le certificat SSL du mongos. | ||||||||||||||||||||||||||||||||||||||||||||
| Chemin vers le fichier contenant le certificat SSL de Shinken. | ||||||||||||||||||||||||||||||||||||||||||||
| Mot de passe du certificat SSL de Shinken .
| ||||||||||||||||||||||||||||||||||||||||||||
| Chemin vers le fichier CRL ( liste de révocation ) des certificats SSL à rejeter. |
Exemple d'uri qui active le chiffrement SSL :
|
net: ssl: mode: requireSSL |
| Les mongos n'acceptent alors que les connexions entrantes chiffrées, et ils établissent des connexions sortantes chiffrées. |
Il faut dans l'ordre :
éteindre Shinken sur tous les serveurs :
service shinken stop |
Redémarrer tous les mongos :
service mongos restart |
Redémarrer Shinken sur tous les serveurs : :
service shinken start |
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
mongo --ssl --sslCAFile /etc/shinken/certs/mongodb/ca-cert.pem --sslPEMKeyFile /etc/shinken/certs/mongodb/clientX.pem --port 27018 --host serveurY |
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 :
|
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 :