You are currently browsing the archives for June, 2006

My RBAC Heresy

§ June 22nd, 2006 § Filed under Identity § 2 Comments

The ANSI RBAC standard is incomplete. There, I’ve said it. The RBAC inquisition can torture me all they want, but I won’t recant. I’m sticking to my heretical view.

ANSI/INCITS 359-2004, originally crafted by NIST, defines the logical construct for role-based access control, and has become holy writ for those of us going down the RBAC path. I recently talked about an additional object not part of the RBAC model, and got pushback from some colleagues because it’s not part of the canonical NIST scripture, so to speak. So let me lay out my case for this heresy.

The RBAC model shows users related to roles, which are related to permissions. At the time of execution, this is all that’s necessary: if the user is a member of a role that provides the appropriate permission, access is granted. But this model is not sufficient for the engineering of roles up-front.

An enterprise has a set of users, each of whom is entitled to a set of permissions. We want to define a set of roles that will aggregate permissions in a way that is useful to the business and reflects the way the business operates. We can start this task by creating a permissions matrix with all users listed down the side, and all permissions listed across the top, and a binary indicator in each cell showing whether this user is entitled to this permission or not.

This is quite a matrix. Besides it’s size, it has a few drawbacks. For role engineering, we don’t care which users have certain permissions, but we do care why certain users have certain permissions. We want to be able to automatically provision/deprovision users to roles based on their identity attributes. User ID or user name are irrelevant, but the profile of the user’s identity attributes, such as job title, job code, location code etc. (assuming they’re an employee) are very relevant.

As I’ve written before, there are two domains to the role engineering problem: a) mapping permissions to roles and b) mapping users to roles. A user-permission matrix may help for the first, but it won’t for the second. And it is more unwieldy than it needs to be even for the first problem domain.

All we really care about for role engineering is defining roles that will cover each unique combination of values for the identity attributes. This set of unique-combination-of-identity-attribute-values represents the provisioning requirements that need to be supported by roles. While “unique-combination-of-identity-attribute-values” does seem to roll right off the tongue, I have been using a different term: job. Granted, this term really only works for internal users, excluding customers, partners or other external users. But at least for internal users, this term is descriptive, and doesn’t require a lot of explanation to the layperson.

We don’t care if 1,000 employees have a single job, or one (at least initially). The job is entitled to a set of permissions for which roles must be defined. In fact, another way to think of the job object is as a unique combination of permissions. (If we have perfect identity data, these two definitions will give us the same result, but in practice we don’t, so they diverge a bit.)

So for the purposes of role engineering, we have a new object: users are related to jobs, which are related to roles, which are related to permissions. Once the roles and the user-to-role mapping rules have been defined, the job object can be bypassed.

So even though I too worship at the altar of the ANSI RBAC standard, I have come to add a new book to the RBAC bible. Just don’t burn me at the stake.

Complexity in Proprietary and Open Source Software

§ June 19th, 2006 § Filed under Open Source Comments Off

I realize this is old news, but I’m afraid its new to me. Sana Security developed these images of the system calls on a Linux/Apache server (top), and of a Windows server (bottom), as they serve up a web image. Richard Stiennon observes that “in its long evolution, Windows has grown so complicated that it is harder to secure.” A couple further thoughts on this phenomenon…

System calls on Linux/Apache serverSystem calls on Windows serverFirst, this complexity not only makes it harder to secure Windows, but to test, debug, modify and integrate with Windows. Of course security is a major concern, but it is not the only downside of complexity in software. Complexity makes everything harder.

But secondly…if this complexity is merely the result of the long evolution of Windows, then we could expect Linux over time to grow just as complex. Of course, no one expects this to happen. Open source development, it seems to me, makes complexity far more difficult to achieve than proprietary development. But far from being a drawback of the open source model, this is one of its strengths.

To allow many developers distributed over the globe to contribute to open source, the software must be simple, with many loosely coupled modules with straightforward interfaces. Complexity reduces the ability of the community to grow and for new contributors to participate without a long learning curve. Complexity is the enemy of open source development.

However, a proprietary development team, all co-located and with a clear chain of command, is much better suited to producing complexity. Simplicity can be sacrificed in the heat of development for the expediency of meeting release dates. In the short run, this is a good thing, but over time it can deteriorate the quality of the software. In the long run, this apparent strength of proprietary development becomes a weakness.

The open source model is too inefficient to develop complex software, and for that we can all be grateful.