Usuarios y roles con el mínimo privilegio

TeselaDB

TeselaDB

Equipo de TeselaDB

25 minIntermedio

Crea un rol que lee y escribe en una colección sin poder borrar y dáselo al usuario de una aplicación.

Una aplicación que solo crea y actualiza pedidos no necesita borrarlos ni leer otras colecciones. Con un rol a medida le das solo esas acciones sobre esa colección, así que si su contraseña se filtra, quien la use no puede hacer más de lo que podía hacer la aplicación.

Lo que vas a construir

Un rol ordersWriter con las acciones find, insert y update sobre la colección tienda.pedidos, y un usuario tienda-pedidos que solo tiene ese rol.

Requisitos

  • Un clúster de TeselaDB y mongosh.
  • Un usuario con permiso para crear roles y usuarios, como root.

1. Crea el rol

Cada privilegio une un recurso, aquí una colección, con las acciones permitidas sobre él:

JavaScript
db.getSiblingDB("admin").createRole({
  role: "ordersWriter",
  privileges: [{ resource: { db: "tienda", collection: "pedidos" }, actions: ["find", "insert", "update"] }],
  roles: [],
});

2. Crea el usuario

El usuario solo tiene el rol ordersWriter. passwordPrompt() pide la contraseña sin que quede en el historial de mongosh:

JavaScript
db.getSiblingDB("admin").createUser({ user: "tienda-pedidos", pwd: passwordPrompt(), roles: ["ordersWriter"] });

Probarlo

Conectado como tienda-pedidos, prueba una inserción y un borrado en tienda.pedidos, sabiendo que el rol lleva la acción insert pero ninguna que borre documentos, así que solo puede funcionar la primera de las dos escrituras de abajo:

JavaScript
const tienda = db.getSiblingDB("tienda");
tienda.pedidos.insertOne({ total: 30 });
tienda.pedidos.deleteOne({});

La inserción funciona y el borrado falla con Unauthorized, el mismo error que recibes si intentas leer otra colección de tienda.

Limpiar

Si era una prueba, borra el usuario y el rol conectado como root:

JavaScript
db.getSiblingDB("admin").dropUser("tienda-pedidos");
db.getSiblingDB("admin").dropRole("ordersWriter");

Siguientes pasos