Here is brief outline of the new security and validation stuff.
-Authentication, batteries not included-
Currently CouchDB contains no general authentication modules, but does
allow for plug-in authentication modules via setting in the ini.
The test suite uses a special test authentication module, with
hardcoded names and passwords and simple protocol with everything sent
cleartext. It can serve as an example and starting point for building
real authentication modules, like modules that connect to external
LDAP or Active Directory servers.
Eventually we'll include a built-in authentication module that uses an
internal CouchDB database for user accounts.
The authentication module, upon successful authentication, returns a
user context object that has the user's name and list of roles, and
perhaps more meta information about the user. This context object is
then later used in validation of updates of both design and regular
documents.
The list of roles for a user would be something like ["Engineer",
"Party Planning Committee", "Discussion Moderator"].
-Server and DB Admins-
If the authentication module gives the user the role of "_admin", they
are given server wide admin access. Server admins can create and
delete databases, and set the individual DB admins and update design
documents. (By default, until admin accounts are turned, all users are
admins)
Each database has an DB Admins list. It's a simple list of user names
and roles that are allow administrator access to the database. If a
user's name or a role appear in the DB Admins list, then that user is
a DB Admin. The DB Admins, along with Server Admins, are allowed to
change the DB Admins list, to add or remove admin access for others,
or remove admin access for themselves. Server Admins are automatically
DB Admins. Also, design documents can only be created/updated by admins.
The admin list be should relatively small, it's kept in memory.
I'm thinking the ability to create temp view should be restricted to
admins as well, or at least configurable as such. Currently anyone can
make temp view queries.
-Authorization/Validation-
Each design document can contain a document update validation
function. Like views, these can be in any language. The language is
set at the design document level.
On document update -- either via interactive update or via replication
-- each is run in succession. These validation functions are
responsible for enforcing document constraints or schemas, and to
enforce security.
Validation functions are provided the new document, previous revision
of the document on disk, and the user context. The user context has
the users name and roles.
If the document values don't pass validation, a forbidden exception is
returned If the user isn't allow to update the document, a
unauthorized exception is returned.
This scheme can be used for signature based security (is the update
signed by an authorized user) or user based security (is the user
currently writing the update an authorized user).
This user based example ensures that every document has an authors
field and when updating an existing document, you are an allowed
author, or a moderator:
function(newDocument, previousDocument, userCtx) {
if (!newDocument._deleted && !newDocument.author) {
throw {forbidden, "All documents must have an author specified."}
}
if (previousDocument &&
previousDocument.author != userCtx.name &&
userCtx.roles.indexOf("Discussion Moderator") == -1) {
throw {unauthorized, "You are not the author of this document."}
}
}
The validation works with replication too, all updates, whether
interactive or replicated are validated. But the replication still
needs testing and might be buggy on update failures.
That's all for now. Question and comments please.
-Damien