On Sep 7, 2009, at 5:50 PM, Jason Davies wrote:

Hi all,

There have been sporadic discussions about various granularities of authorization. The most simple level to tackle is per-db authorization. What follows is a summary of discussions and ideas so far.

I should point out that this is primarily to flesh out the default authorization modules that address the needs of the majority of users. We probably will have an authorization_handlers settings, analagous to authentication_handlers, allowing custom authorization modules to be used.

I think it would be common for there to be a fairly high initialization cost in loading and preprocessing authorization data for more complex authorization schemes, so you'd want something like the gen_server behavior and message passing on authorization for the generic authorization hook.

2. What types of operations do we need to support? I think the majority of users will only care about being able to make particular databases read-only, read/write, or write-only (not sure about the latter one).


As long as the authorization hooks are generic enough to support content-aware authorization, I'm not particularly concerned with the details of a specific authorization module. My main concern is that the hooks might be designed only to meet the needs of a specific authorization module and would not be able to handle more generic cases.


6. Future work: thisfred suggested that the pattern-matching could be extended to the full URL instead of just the database name. This seems like a simple way to extend authorization. Of course, it's dependent on a particular node's URL mappings (these can be changed in the .ini). This then brings up the question of what the operations should be, it would make the most sense to let them be HTTP verbs, so that one could restrict access to certain URLs to being only GET and HEAD for example. This seems a bit too tied to HTTP for my liking, but I guess CouchDB is very much a RESTful and therefore HTTP-reliant database. Any further ideas would be welcomed.



I'd like to see call outs to authorization in couch_db around any read or write to the underlying store. If the authorization is HTTP request based, then to restrict access to particular piece of info, you need to restrict the document GET, any queries or lists might reveal the info, etc. Then if some later version of CouchDB adds a new http request, previously controlled might be exposed. I do believe it is valuable to be able to restrict particular http request methods, but it isn't sufficient.



On Sep 8, 2009, at 5:41 PM, Adam Kocoloski wrote:

So, after giving this some thought I'm partial to the idea of Access Control Lists. Instead of directly granting privileges on databases in the users DB, we'd store an ordered list in the DB in a special document that would allow|deny requests that match a rule. For instance, if I wanted to make a read-only DB where only I could access the _design documents I could upload a document like

{
   _id: "_authorization",
   _rev: "1-1340514305943",
   _acl: [
{"access":"allow", "role":"kocolosk", "method":"*", "path":"*"}, {"access":"deny", "role":"*", "method":"*", "path":"_design*"} {"access":"allow", "role":"*", "method":"GET", "path":"*"}, {"access":"deny", "role":"*", "method":"*", "path":"*"}
   ]
}

The rules in the ACL array are applied in order, and the first rule to match wins. Here I've assumed that my user has a corresponding role, like a UNIX group.

I explicitly listed the deny rule at the end, but we could make that the default if we wished. CouchDB has historically been pretty open, but sysadmins would probably prefer it if things were secure out-of-the-box. I think the right default setting will become clear during the implementation.


I was thinking that a transliteration of XACML to JSON would be a good approach (http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xacml#XACML20 ).

Reply via email to