Authorization and Authentication With RBAC (Part 2)

DZone 's Guide to

Authorization and Authentication With RBAC (Part 2)

The Role-Based Action Control (RBAC) system in Couchbase is very complex, but this concise blog posts covers some of the most important points.

· Database Zone ·
Free Resource

Authorization and authentication are important to Couchbase. In March, I blogged about some of the new Role-Based Access Control (RBAC) that we are showing in the Couchbase Server 5.0 Developer Builds. This month, I’d like to go into a little more detail now that the April Couchbase Server 5.0 Developer Build is available (make sure to click the Developer tab).

Authentication and Authorization

In past version of Couchbase, buckets were secured by a password. In 5.0, bucket passwords for authorization are gone. You can no longer create a “bucket password” for authorization. Instead, you must create one (or more) users that have varying levels of authorization for that bucket. Notice that there is no “password” field anymore (not even in the Advanced bucket settings):

So now, you no longer have to hand out a password that gives complete access to a bucket. You can fine-tune bucket authorization and give out multiple sets of credentials with varying levels of access. This will help you tighten up security and reduce your exposure.

Note: The administrator user still exists, and has permission to do everything. So I can still run N1QL queries (for instance) on that bucket while logged in as an administrator account. However, this is not the account you should be using from your clients.

Creating an Authorized User

To create a new user, you must be logged in as an administrator (or as a user that has an admin role). Go to the Security tab, and you’ll be able to see a list of users, nd be able to add new ones.

Create a new user by clicking ADD USER. Enter the information for the user. You may want to create a user for a person (i.e. “Matt”), or you may want to create a user for a service (i.e. “MyAspNetApplication”). Make sure to enter a strong password, and then select the appropriate roles for the user you want to create.

For example, let’s create a user “Matt” that only has access to run SELECT queries on the bucket I just created. In Roles, I expand Query Roles, then Query Select, and check the box for mynewbucket, and then Save to finalize the user.

Authorization in Action

When I log out of the administrator account, and log back in as “Matt” I can see that the authorization level I have is severely restricted. Only Dashboard, Servers, Settings, and Query are visible. If I go to Query, I can execute SELECT 1:

If I try something more complex, like SELECT COUNT(1) FROM mynewbucket, I’ll get an error message like:

    "code": 13014,
    "msg": "User does not have credentials to access privilege cluster.bucket[mynewbucket].data.docs!read. Add role Data Reader[mynewbucket] to allow the query to run."

So it looks like I have the correct authentication to log in and I have the correct authorization to execute a SELECT, but I don’t have the correct authorization to actually read the data. I’ll go back in as admin, and add Data Reader authorization.

At this point, when I login with “Matt” SELECT COUNT(1) FROM mynewbucket; will work. If you are following along, try SELECT * FROM mynewbucket;. You’ll get an error message that no index is available. But if you try to CREATE INDEX you’ll need another permission to do that. You get the idea.

New N1QL Functionality

There’s some new N1QL functionality to go along with the new authentication and authorization features.


You can grant and revoke roles with N1QL commands. You need Admin access to do this.

Here’s a quick example of granting SELECT query authorization to a user named “Matt” on a bucket “mynewbucket”:

GRANT ROLE query_select(mynewbucket) TO Matt;

And likewise, you can revoke a role doing something similar:

REVOKE ROLE query_select(mynewbucket) FROM Matt;

Creating Users With REST

There is no way (currently) to create users with N1QL, but you can use the REST API to do this. Full documentation is coming later, but here’s how you can create a user with the REST API:

  • PUT to the /settings/rbac/users/builtin/<username> endpoint.
  • Use admin credentials for this endpoint (i.e. Administrator:password with basic auth).
  • The body should contain:
    • roles=<role1,role2,…,role>.
    • password=<password>.

Below is an example. You can use cURL, PostmanFiddler, or whatever your favorite tool is to make the request.

URL: PUT http://localhost:8091/settings/rbac/users/builtin/restman

Headers: Content-Type: application/x-www-form-urlencoded
Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==

Body: roles=query_select[mynewbucket],query_update[mynewbucket]&password=password

The above assumes that you have an admin user/password of Administrator/password (hence the basic auth token of QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==).

After executing that, you’ll see a new user named “restman” with the two specified permissions.

But Wait, There’s More!

The RBAC system is far too rich to cover in a single blog post, and full documentation is on its way. In the meantime, here are some details that might help you get started with the preview:

  • You may have noticed the all option in the screenshots above. You can give a user roles on a bucket-by-bucket basis, or you can give permission to all buckets (even buckets that haven’t been created yet).
  • I covered FTS permissions in the previous blog post, but there are permissions that cover just about everything: views, bucket administration, backup, monitoring, DCP, indexes, etc.
  • You can’t create buckets with a password anymore. The equivalent is to instead create a user with the name as the bucket, and give it authorization to a role called “Bucket Full Access.” This will be useful for upgrading and transitioning purposes.
authentication, authorization, couchbase, database, rbac, tutorial

Published at DZone with permission of Matthew Groves , DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}