Salta el contingut

5. DCL en NoSQL

El DCL (Data Control Language) agrupa les operacions relacionades amb la seguretat: controlar qui pot accedir a la base de dades i què pot fer-hi. En MongoDB, això es fa mitjançant usuaris, rols i autenticació.

5.1. Control d'accés en MongoDB

MongoDB disposa d'un sistema de control d'accés basat en rols (Role-Based Access Control, RBAC):

  • Cada usuari pot tindre un o més rols.
  • Cada rol té una sèrie de privilegis (accions permeses) sobre uns recursos (bases de dades, col·leccions, clúster...).
  • Un usuari sense cap rol no pot fer res; un usuari amb el rol root ho pot fer tot.

Com funciona

Quan un usuari es connecta, Mongo autentica la seua identitat i, segons els rols que tinga assignats, li permet o no realitzar cada operació.

5.2. Autenticació

Per defecte, una instal·lació de MongoDB no exigeix autenticació (qualsevol pot connectar-se i fer-ho tot). Per això, en un entorn real cal habilitar-la.

5.2.1. Habilitar l'autenticació

En un servidor mongod:

Bash
mongod --auth

O bé en el fitxer de configuració (mongod.conf):

YAML
security:
  authorization: enabled

En Docker, ja vam crear l'usuari administrador mitjançant les variables d'entorn:

YAML
1
2
3
environment:
  MONGO_INITDB_ROOT_USERNAME: root
  MONGO_INITDB_ROOT_PASSWORD: root_pass

5.2.2. Autenticar-se

Amb mongosh:

Bash
mongosh -u root -p root_pass --authenticationDatabase admin

O una vegada dins de la consola:

JavaScript
db.auth("root", "root_pass");

5.3. Usuaris

Les operacions per gestionar usuaris es fan sobre la base de dades on es defineixen (normalment admin):

5.3.1. Crear un usuari

JavaScript
1
2
3
4
5
db.createUser({
  user: "pep",
  pwd: "contrasenya",
  roles: [ { role: "readWrite", db: "cursos" } ]
});
  • user: nom de l'usuari.
  • pwd: contrasenya.
  • roles: llista de rols amb la base de dades on s'apliquen.

5.3.2. Altres operacions sobre usuaris

  • db.dropUser("pep"): elimina un usuari.
  • db.updateUser("pep", { pwd: "nova_contrasenya" }): modifica un usuari.
  • db.getUser("pep"): mostra la informació d'un usuari.
  • db.getUsers(): mostra tots els usuaris de la base de dades.
  • db.changeUserPassword("pep", "nova"): canvia la contrasenya.

5.4. Rols

5.4.1. Rols integrats

MongoDB inclou una sèrie de rols predefinits:

Rol Descripció
read Llegir documents de la base de dades.
readWrite Llegir i escriure documents.
dbAdmin Tasques administratives de la base de dades (índexs, estadístiques...).
userAdmin Gestionar usuaris i rols de la base de dades.
dbOwner Combina readWrite, dbAdmin i userAdmin.
readAnyDatabase Llegir en qualsevol base de dades.
readWriteAnyDatabase Llegir i escriure en qualsevol base de dades.
userAdminAnyDatabase Gestionar usuaris i rols en qualsevol base de dades.
clusterAdmin Administrar el clúster.
root Accés total (superusuari).

Rols de base de dades vs rols de clúster

  • Els rols de base de dades (read, readWrite, dbAdmin, ...) actuen sobre una base de dades concreta.
  • Els rols de clúster (clusterAdmin, ...) actuen sobre tot el sistema.

5.4.2. Assignar i revocar rols

  • db.grantRolesToUser("pep", [ { role: "dbAdmin", db: "cursos" } ]): afig rols a un usuari.
  • db.revokeRolesFromUser("pep", [ { role: "dbAdmin", db: "cursos" } ]): retira rols a un usuari.

5.4.3. Crear rols personalitzats

També podem crear rols propis amb privilegis específics:

JavaScript
1
2
3
4
5
6
7
db.createRole({
  role: "solsLecturaCursos",
  privileges: [
    { resource: { db: "cursos", collection: "" }, actions: [ "find" ] }
  ],
  roles: []
});

5.5. Exemple pràctic

Suposem que tenim una base de dades cursos i volem:

  1. Crear un usuari professor que puga llegir i escriure a cursos:

    JavaScript
    1
    2
    3
    4
    5
    6
    use admin;
    db.createUser({
      user: "professor",
      pwd: "secreta123",
      roles: [ { role: "readWrite", db: "cursos" } ]
    });
    
  2. Crear un usuari alumne que només puga llegir:

    JavaScript
    1
    2
    3
    4
    5
    db.createUser({
      user: "alumne",
      pwd: "secreta456",
      roles: [ { role: "read", db: "cursos" } ]
    });
    
  3. Autenticar-se com a professor:

    Bash
    mongosh -u professor -p secreta123 --authenticationDatabase admin
    

Atenció

Guarda les contrasenyes de forma segura i no les compartisques. En un entorn real, utilitza sempre autenticació i dona a cada usuari el mínim privilegi necessari per fer la seua feina (principi del mínim privilegi).