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
rootho 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 | |
|---|---|
O bé en el fitxer de configuració (mongod.conf):
En Docker, ja vam crear l'usuari administrador mitjançant les variables d'entorn:
5.2.2. Autenticar-se
Amb mongosh:
| Bash | |
|---|---|
O una vegada dins de la consola:
| JavaScript | |
|---|---|
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 | |
|---|---|
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 | |
|---|---|
5.5. Exemple pràctic
Suposem que tenim una base de dades cursos i volem:
-
Crear un usuari
professorque puga llegir i escriure acursos: -
Crear un usuari
alumneque només puga llegir: -
Autenticar-se com a
professor:Bash
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).