Aller au contenu

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 admin
db.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.

Dans /etc/mongod.conf :

security:
authorization: enabled
Fenêtre de terminal
sudo systemctl restart mongod

Désormais, toute connexion doit s’authentifier :

Fenêtre de terminal
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 boutique
db.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 :

Fenêtre de terminal
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ô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
show users
show roles
db.getUsers();
db.getUser('app');
db.getRoles({ showBuiltinRoles: true });
db.runCommand({ connectionStatus: 1 }); // utilisateur courant et ses rôles
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'utilisateur
db.createRole({
role: 'lectureCommandes',
privileges: [
{
resource: { db: 'boutique', collection: 'commandes' },
actions: ['find'],
},
],
roles: [],
});
db.grantRolesToUser('lecture', [{ role: 'lectureCommandes', db: 'boutique' }]);

Par défaut, MongoDB n’écoute que sur 127.0.0.1. Pour l’ouvrir :

  1. Modifier /etc/mongod.conf :

    net:
    port: 27017
    bindIp: 127.0.0.1,192.168.1.10
  2. Vérifier que l’authentification est activée.

  3. Redémarrer : sudo systemctl restart mongod.

  4. 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
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