2010-03-08 9 views
9

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 los registros, me preocupa el mutabilidad de los registros de registro una vez almacenados.Colecciones de solo escritura en MongoDB

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") documentado en security topic 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?

+0

Dado que no parece haber una forma de horneado, en realidad he implementado un proxy TCP simple que se encuentra frente a MongoDB y filtra los mensajes enviados al servidor inspeccionando el código de operación: http: // gist.github.com/328486 – rcoder

+0

Gracias por publicar la esencia. La configuración de tu proxy es muy buena y podría ser útil para un proyecto de tipo empresarial en el que pueda estar trabajando prácticamente por lo mismo (pista de auditoría). –

+0

Estaba buscando exactamente lo mismo. En mi humilde opinión, esta es la mayor falla en MongoDB en este momento. –

Respuesta

8

Yo diría que la mejor opción sería la de concluir el acceso a MongoDB en una capa de servicio que hace 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.

+0

Eso es algo de lo que sospechaba. De hecho, estoy imponiendo el acceso de solo lectura al no exponer una conexión sin formato a la base de datos en ningún lugar del código de la aplicación. Eso no nos protege perfectamente de los errores del usuario o las actualizaciones maliciosas, pero creo que resolveremos otra solución duradera de registro de auditoría. – rcoder

0

En MongoDB 1.3.2 o superior se puede añadir un poco de restricción de usuario:

db.addUser("guest", "passwordForGuest", true)

Pero es sólo ahora existentes no mejor. Tal vez se puede añadir un poco de solicitud de función

ver la información en la documentación MongoDB: http://www.mongodb.org/display/DOCS/Security+and+Authentication

+1

Como mencioné en mi pregunta, no estoy buscando agregar un usuario de solo lectura; más bien, quiero agregar un usuario que solo puede * escribir * registros, sin poder modificarlos o eliminarlos después del hecho. – rcoder

1

Para agregar un escriba solo (en el nivel de recopilación) usuario en el MongoDB haga lo siguiente.

decir que quiere tener un usuario que sólo puede escribir (sólo insert) a una cierta colección en una base de datos determinada.

Crear un archivo createuser.js con contenido siguiente:

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 usuario1 con contraseña pass1 y este usuario tiene escribe solo acceso a datab ase's yourdb colección col1.

Un efecto secundario de esto es que se crea el rol nombre de rol.Si tiene un usuario existente que debe tener acceso de escritura a la misma colección, otorgue la función nombre de rol a ese usuario existente.

Siéntase libre de usar y modificar el código provisto arriba :).

Cuestiones relacionadas