MongoDB : utilisateurs et droits
Par défaut, MongoDB n’exige aucune authentification : l’activer est la première mesure de sécurité. Les exemples créent un administrateur et un utilisateur pour l’application qui utilise la base boutique.
Étape 1 : créer l’administrateur (avant d’activer l’authentification)
Section intitulée « Étape 1 : créer l’administrateur (avant d’activer l’authentification) »Dans mongosh, sur une instance encore sans authentification :
use admindb.createUser({ user: "admin", pwd: passwordPrompt(), roles: [{ role: "root", db: "admin" }]})passwordPrompt() demande le mot de passe de façon interactive : il n’apparaît ni à l’écran ni dans l’historique.
Étape 2 : activer l’authentification
Section intitulée « Étape 2 : activer l’authentification »Dans /etc/mongod.conf :
security: authorization: enabledsudo systemctl restart mongodDésormais, toute connexion doit s’authentifier :
mongosh -u admin --authenticationDatabase adminÉtape 3 : créer un utilisateur pour l’application
Section intitulée « Étape 3 : créer un utilisateur pour l’application »Un utilisateur est rattaché à la base où il est créé (sa base d’authentification).
use boutiquedb.createUser({ user: "app", pwd: passwordPrompt(), roles: [{ role: "readWrite", db: "boutique" }]})db.createUser({ user: "lecture", pwd: passwordPrompt(), roles: [{ role: "read", db: "boutique" }]})Connexion de l’application :
mongosh "mongodb://app@127.0.0.1:27017/boutique?authSource=boutique"Appliquer le principe du moindre privilège : l’application n’a besoin que de readWrite sur sa base, jamais de root.
Rôles intégrés courants
Section intitulée « Rôles intégrés courants »| Rôle | Droits |
|---|---|
read |
Lecture sur une base |
readWrite |
Lecture et écriture sur une base |
dbAdmin |
Administration d’une base (index, statistiques), sans lecture des données |
userAdmin |
Gestion des utilisateurs d’une base |
readAnyDatabase, readWriteAnyDatabase |
Idem sur toutes les bases (créé dans admin) |
userAdminAnyDatabase |
Gestion des utilisateurs de toutes les bases |
clusterMonitor |
Surveillance du serveur (statistiques) |
backup, restore |
Sauvegarde et restauration |
root |
Tous les droits |
Consulter
Section intitulée « Consulter »show usersshow rolesdb.getUsers();db.getUser('app');db.getRoles({ showBuiltinRoles: true });db.runCommand({ connectionStatus: 1 }); // utilisateur courant et ses rôlesModifier et supprimer
Section intitulée « Modifier et supprimer »db.changeUserPassword('app', passwordPrompt());db.grantRolesToUser('app', [{ role: 'dbAdmin', db: 'boutique' }]);db.revokeRolesFromUser('app', [{ role: 'dbAdmin', db: 'boutique' }]);db.updateUser('app', { roles: [{ role: 'readWrite', db: 'boutique' }] });
db.createUser({ user: 'temporaire', pwd: passwordPrompt(), roles: [{ role: 'read', db: 'boutique' }],});db.dropUser('temporaire'); // supprime l'utilisateurRôles personnalisés
Section intitulée « Rôles personnalisés »db.createRole({ role: 'lectureCommandes', privileges: [ { resource: { db: 'boutique', collection: 'commandes' }, actions: ['find'], }, ], roles: [],});db.grantRolesToUser('lecture', [{ role: 'lectureCommandes', db: 'boutique' }]);Accès par le réseau
Section intitulée « Accès par le réseau »Par défaut, MongoDB n’écoute que sur 127.0.0.1. Pour l’ouvrir :
-
Modifier
/etc/mongod.conf:net:port: 27017bindIp: 127.0.0.1,192.168.1.10 -
Vérifier que l’authentification est activée.
-
Redémarrer :
sudo systemctl restart mongod. -
Ouvrir le port uniquement pour le client :
Fenêtre de terminal sudo ufw allow from 192.168.1.20 to any port 27017 proto tcp
Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
Authentication failed |
Mauvais mot de passe ou mauvaise base d’authentification : ajouter --authenticationDatabase boutique |
command find requires authentication |
Se connecter avec -u ; ou l’utilisateur n’a pas le rôle adéquat |
not authorized on boutique to execute command |
Rôle insuffisant : db.grantRolesToUser(...) |
| Impossible de créer le premier utilisateur | Se connecter depuis la machine locale (exception « localhost ») |
Le service ne démarre pas après la modification de mongod.conf |
Indentation YAML incorrecte (espaces, pas de tabulations) : sudo journalctl -u mongod |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Security et Built-In Roles