replica - Colecciones de solo escritura en MongoDB
sharding mongodb español (3)
En MongoDB 1.3.2+ puede agregar algunas restricciones en el usuario:
db.addUser("guest", "passwordForGuest", true)
Pero solo existe ahora, no mejor. Tal vez puedas agregar alguna solicitud de función
ver información en la documentación de MongoDB: http://www.mongodb.org/display/DOCS/Security+and+Authentication
Actualmente estoy usando MongoDB para registrar registros de aplicaciones, y aunque estoy bastante contento con el rendimiento y con poder volcar datos estructurados arbitrarios en registros de registro, me preocupa la inestabilidad de los registros de registro una vez almacenados.
En una base de datos tradicional, estructuraría las concesiones para mis tablas de registro de modo que el usuario de la aplicación tuviera los privilegios INSERTAR y SELECCIONAR, pero no ACTUALIZAR o ELIMINAR. Del mismo modo, en CouchDB, podría escribir una función de validación de actualización que rechazó todos los intentos de modificar un documento existente.
Sin embargo, no he podido encontrar una forma de restringir las operaciones en una base de datos o colección MongoDB más allá de los tres niveles de acceso (sin acceso, solo lectura, "modo dios") documentados en el tema de seguridad en la wiki de MongoDB.
¿Alguien más ha implementado MongoDB como una tienda de documentos en un entorno en el que la inmutabilidad (o al menos el seguimiento de cambios) para documentos era un requisito? ¿Qué trucos o técnicas utilizó para asegurarse de que el código de la aplicación mal escrita o maliciosa no pueda modificar o destruir los registros de registro existentes? ¿Debo completar mi registro de MongoDB en una capa de servicio que refuerza la política de solo escritura, o puedo usar alguna combinación de configuración, pirateo de consultas y replicación para garantizar que se mantenga un registro consistente auditable?
Yo diría que la mejor opción sería cerrar el acceso a MongoDB en una capa de servicio que haga cumplir sus contratos específicos. No hacemos mucho en el camino del control de acceso de grano fino porque hay tantos casos diferentes que es difícil resolverlos correctamente. Entonces, en su mayor parte, depende de la capa de aplicación implementar ese tipo de controles.
Para agregar un usuario de solo escritura (en el nivel de colección) al MongoDB haga lo siguiente.
Supongamos que desea tener un usuario que solo pueda escribir ( insertar solo) en una determinada colección en una determinada base de datos.
Crea un archivo createuser.js
con los siguientes contenidos:
function createCollectionWriter(database, username, password, rolename, collection)
{
db.getSiblingDB(database).createUser({
user : username,
pwd : password,
roles : [ ]
});
db.getSiblingDB(database).createRole({
role : rolename,
privileges : [
{
resource : { db : database, "collection" : collection },
actions : [ "insert" ]
}
],
roles : []
});
db.getSiblingDB(database).grantRolesToUser(username, [ rolename ] );
}
Y ejecutar esto desde la línea de comandos
$ mongo --eval="load(''createuser.js''); createCollectionWriter(''yourdb'', ''user1'', ''pass1'', ''rolename'', ''col1'')"
Esto crea un usuario con nombre de usuario user1 con contraseña pass1 y este usuario tiene acceso de solo escritura a la colección yourdb col1 de la base de datos.
Un efecto secundario de esto es que se crea el rol nombre de rol. Si tiene un usuario existente que debería tener acceso de escritura únicamente a la misma colección, otorgue rol rolename a ese usuario existente.
Siéntase libre de usar y modificar el código provisto arriba :).