Pour garantir que seules les instances de Shinken puissent accéder aux données de la base, il est possible d'activer l'authentification par mot de passe au niveau de la base de données.
Cette procédure suppose de partir d'un Cluster MongoDB ( voir la page Haute disponibilité de la base MongoDB (mise en place d'un cluster) ) sans qu'aucun utilisateur n'ait été encore crée.
Les étapes du protocole sont les suivantes :
Créer l'utilisateur dans la base MongoDB.
Configurer Shinken pour s'authentifier avec l'utilisateur auprès de MongoDB.
Redémarrer le cluster MongoDB et Shinken pour activer l'authentification.
On commence par créer l'utilisateur dans Mongo qui sera utilisé pour s'authentifier.
L'utilisateur doit être créé deux fois :
Cette étape est à réaliser une unique fois sur un seul des mongos. L'utilisateur crée sera automatiquement diffusé sur les autres mongos et les mongo-configsrv. |
Se connecter au shell mongo d'un des mongos du cluster.
mongo --port 27017 |
Adapter le port de la commande au port du mongos ( si nécessaire ).
Depuis le shell MongoDB, exécuter les deux commandes suivantes :
use admin |
db.createUser(
{ user : 'YOUR_USER',
pwd : 'YOUR_PASSWORD',
roles : [ { role : 'root', db : 'admin' } ]
}
) |
Adapter le nom d'utilisateur ( YOUR_USER ) et le mot de passe ( YOUR_PASSWORD ) dans la commande.
Il ne faut pas modifier les champs role et db. Pour que Shinken fonctionne correctement, l'utilisateur doit disposer de privilèges avancés sur l'ensemble des bases de données, ce qui impose la valeur de ces deux paramètres. |
Exemple :
mongos> db.createUser(
... { user : 'shinken',
... pwd : 'shinken',
... roles : [ { role : 'root', db : 'admin' } ]
... }
... )
Successfully added user: {
"user" : "shinken",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
} |
Cette étape est à réaliser une unique fois sur le mongod primaire. L'utilisateur crée sera automatiquement diffusé sur les autres mongod du cluster. |
Se connecter au shell mongo du mongod primaire.
mongo --port 27018 |
Adapter le port de la commande au port du mongod ( si nécessaire ).
Depuis le shell MongoDB, exécuter les deux commandes suivantes :
use admin |
db.createUser(
{ user : 'YOUR_USER',
pwd : 'YOUR_PASSWORD',
roles : [ { role : 'root', db : 'admin' } ]
}
) |
Adapter le nom d'utilisateur ( YOUR_USER ) et le mot de passe ( YOUR_PASSWORD ) dans la commande. U tiliser les mêmes identifiants que lors de la création de l'utilisateur dans le mongos.
Il ne faut pas modifier les champs role et db. |
Il est désormais possible de s'authentifier lors de la connexion à MongoDB.
Les identifiants peuvent être spécifiés directement dans la commande de lancement du shell Mongo :
mongo --username YOUR_USER --password YOUR_PASSWORD --authenticationDatabase admin |
Si le champ --password est laissé vide, un prompt s'affiche pour demander le mot de passe, évitant ainsi d'exposer celui-ci en clair. |
Il est également possible de fournir les identifiants une fois connecté dans le shell Mongo :
use admin
db.auth('YOUR_USER', 'YOUR_PASSWORD') |
La commande db.auth n'est pas sauvegardée dans l'historique des commandes du shell Mongo, ce qui évite d'exposer le mot de passe. |
Lorsque l'authentification par mot de passe sera activée dans MongoDB, seules les connexions avec des identifiants valides seront acceptées.
Pour changer le mot de passe de l'utilisateur créé , il faut se connecter au shell mongo avec les identifiants actuels , puis exécuter les deux commandes suivantes :
use admin |
db.changeUserPassword('YOUR_USER', 'NEW_PASSWORD') |
Lancer les commandes suivantes pour générer la clé partagée :
mkdir /srv/mongodb/ /opt/shinken/openssl/bin/openssl rand -base64 741 > /srv/mongodb/mongodb-keyfile |
Les commandes suivantes permettent d'accorder les bons droits au fichier :
chmod 600 /srv/mongodb/mongodb-keyfile chown mongod:mongod /srv/mongodb/mongodb-keyfile |
Les commandes suivantes permettent d'accorder le bon contexte selinux au fichier :
semanage fcontext -a -t mongod_var_lib_t /srv/mongodb/mongodb-keyfile restorecon -v /srv/mongodb/mongodb-keyfile |
Il faut ensuite déployer la clé sur tous les serveurs avec un mongos, mongod, ou mongo-configsrv :
rsync -avPAX /srv/mongodb/ node:/srv/mongodb/ |
Remplacer node par les noms des différents serveurs où tournent les processus mongod, mongos ou mongo-configsrv.
Lorsque l'authentification est activée sur un cluster, chaque nœud doit fournir des identifiants pour s'authentifier auprès des autres nœuds, ce qui correspond à l'authentification interne.
Pour activer l'authentification dans un cluster, il est nécessaire d'activer l'authentification individuellement sur chaque nœud :
Ensuite, pour tous les processus mongod, mongos et mongo-configsrv, ajoutez le champ suivant dans leurs fichiers de configuration respectifs ( /etc/mongo-configsrv.conf, /etc/mongod.conf, /etc/mongos.conf )
security: keyFile: /srv/mongodb/mongodb-keyfile |
Il est désormais possible de déclarer l'utilisateur et le mot de passe à utiliser pour que Shinken s'authentifie à la base.
Une fois que l'authentification par mot de passe est activée, il faut de fournir les identifiants aux commandes Shinken qui se connectent à la base. L'aide des commandes permet de savoir si une commande se connecte à MongoDB.
Si l'option --mongo-password est utilisée, le mot de passe risque d'être visible dans l'historique des commandes ( via la commande history par exemple ).
|
Pour appliquer l'activation de l'authentification, il faut redémarrer les démons de mongo et Shinken sur tous les serveurs .
Il faut éteindre dans l'ordre :
service shinken stop |
service mongod stop |
service mongo-configsrv stop |
service mongos stop |
Ensuite, il faut redémarrer dans l'ordre suivant :
service mongod start |
service mongo-configsrv start |
service mongos start |
ensuite les démons Shinken :
service shinken start |
L'authentification est désormais activée.
Si Grafana est utilisé pour afficher les métriques, il faut aussi redémarrer apache sur les serveurs avec un carbon-cache :
service httpd restart |
L'activation de l'authentification par mot de passe sur MongoDB n'est pas automatiquement prise en compte par la supervision.