2011-01-19 16 views

Respuesta

22

Sí, CouchDB puede evitar lecturas no autorizadas. Desafortunadamente, es un poco menos directo.

Imagine una aplicación de subasta secreta. Usted hizo una oferta de $ 20 y yo puje $ 10; cada oferta en un documento de sofá. Couch nos permite leer nuestros propios documentos de oferta, pero no otros. Sin embargo,, hay una vista de reducción de mapa que muestra el promedio. Cargué la vista y veo que el promedio es de $ 15, por lo que concluyo que su oferta es de $ 20 y he roto la política de seguridad. La salida de vista puede filtrar parte o la totalidad de la información de un documento. No es factible aplicar la seguridad a nivel de documento. Es por eso que el acceso de lectura está en el nivel de la base de datos.

Lo sé, es una mierda. Pero esa es la única respuesta correcta y escalable.

Esto es parte de la razón por la cual la filosofía de Couch es crear muchas bases de datos — ¡incluso una (o más) por usuario. El permiso de lectura para una base de datos se establece en el valor readers del objeto de la base de datos _security. (Nota, el campo readers was renamed to members en CouchDB tronco, ya que también especifica que se puede escribir en el DB.)

La técnica funciona así:

  1. Crear una base de datos para cada usuario. Retendrá todos los documentos que el usuario pueda leer. Agregue el usuario (o la función del usuario) al objeto _security.
  2. En la base de datos maestra, cree una función de filtro que implemente la política de lectura. (Podría compartir el código con validate_doc_update.)
  3. Replicar de la base de datos maestra a la base de datos del usuario con ?filter=my_filter_function.
  4. Permitir al usuario cargar (o replicar) su base de datos.

Por supuesto, esto es todo por una aplicación de Couch pura, donde los usuarios acceden directamente a Couch. Si tiene una capa intermedia (controlador MVC o solo un proxy HTTP inverso), puede aplicar la política allí, entre el usuario y el sofá. Pero tenga cuidado. Por ejemplo, una función _show o una regla _rewrite podría permitir que un usuario cargue una vista o documento a pesar de su política.

¡Buena suerte!

+0

Gracias! ¿Podrían dar más detalles sobre cómo _show y _rewrite podrían morderme? Además, ¿cómo evito las condiciones de carrera como "dejar de ser amigo de alguien -> subir foto" y estar 100% seguro de que la persona que no tiene amigos nunca podrá ver esa foto? – nornagon

+0

Bueno, supongamos que tiene un proxy inverso que permite/deniega el acceso por documento por usuario en función de la URL. Más tarde, agrega una nueva función usando una función _list y todas las consultas _list son permitidas por el proxy. Un usuario podría descubrir cómo usar la _list para ver los documentos que no debería. Del mismo modo, una regla _rewrite puede proporcionar una forma de ver documentos sin la ruta normal '/ db/doc_id'. Entonces debe estar * muy * seguro de que su proxy no tiene agujeros. – JasonSmith

+2

Su segunda pregunta es más sobre ** revocar ** el acceso de lectura que ** otorgar ** acceso de lectura. Propongo que hagas una pregunta nueva ("Cómo revocar el acceso de lectura en el modelo de seguridad CouchDB"). ¡Voy a intentar una respuesta si puedo! – JasonSmith

Cuestiones relacionadas