Alex previously proposed some definitions of terms so we can talk about what Triplesec might do and I, thinking they weren't all that clear, suggested we use definitions from the NIST paper. Alex quite rightly pointed out that my proposal has an uncanny similarity to suggesting putting vaporware into production (those weren't his words) so I'm going to try to come up with proposed definitions that I think are the same as the NIST ones, with a tiny bit of motivating discussion. I'll discuss the problems I see in Alex's definitions in a separate note. I'm also going to leave out discussion of denied permissions or roles which although they are pretty useful make logical analysis of the meaning of a role a lot more complicated. Lets see if we can agree on the positive aspects before we consider these negative ones :-)

So, we have actors who want to do stuff to things, and we want to decide whether to let them. The actors are usually people but might be services or something else: in any case we'll assume we've figured out who they are.

-- Users:  the set of actors who are trying to do stuff.

-- Objects: the set of things the users are trying to do stuff to

-- Operations: the things the users are trying to do to the objects

We start by grouping the things and objects together into permissions: a permission is a set of things you can do to a set of objects. More formally

-- Permissions: the set of subsets of the cross product of Objects and Operations. (one permission is a subset of Objects X Operations)

A simple permission might be one operation on one object, such as "read this file foo.xml" but more complicated permissions do show up such as a javaee web permission "access to urls (in the app) starting with /myContext/ except for /myContext/private/ and /myContext/ forbidden/"

So we could just directly configure a subset of Users X Permissions and declare victory, but that is obviously unmanageable. Instead we group stuff together into roles. On one hand we associate roles and permissions, and on the other hand we associate roles and users.

-- Roles: the set of roles.  (so far they are just names)

So, we associate roles and permissions

-- Role-Permissions the permissions assigned to a role, more formally a subset of Roles X Permissions

-- Role-Users the users assigned to a role, more formally a subset of Roles X Users.

I'm about to make things a little more complicated, but for now lets just say a user in a role gets the permissions assigned to that role. So if a user is in a set of roles, they get the union of the permissions assigned to those roles.

So this is better than no roles at all, but with a lot of users or a lot of permissions, there's still waaaaay too much work to do. So we need hierarchical roles where a role can have children and/or parents. So we figure the roles form a directed acyclic graph which defines a partial ordering on the roles. One very important thing to notice here is that it appears to go in opposite directions for permissions and users. If Role1 is senior to Role2 then Role1 has all the permissions of Role2 (and presumably more) whereas Role2 has all the users of Role1 (and presumably more). In other words, a bigger (in terms of permissions) role has fewer users.

Now for the complicating factor. Just like your bank safe deposit box has 2 keys, one for you and one for the bank, sometimes people want to set up processes where no one person can do it all. This generally seems to be called separation of duty. There are two ways to think about this. One is that if a user ever has the possibility of being in role A (fill out the purchase order) they cannot ever be in role B (approve the purchase order). This is called static separation of duty and is a constraint on the Role-Users assignments. Such a constraint is a set of roles and a number n and means that no user can have n of the roles in the set. For instance {A, B} and 2 for the purchase order example.

So, maybe this is too restrictive and you just want to make sure that the user can't be in the roles at the same time, but if they change which roles are active that would be ok. So we need a concept of a user session which is the roles that are active for a particular user at a particular time.

-- Sessions: a session is the set of roles active for a user now. So, its a subset of the Roles-User association which is all the roles a user could possibly activate.

Now, a dynamic separation of duty constraint is just like the static one but it applies to the Sessions rather than the Role-Users association.

---------------------------------------------------------------------

Extensions:

1. The objects involved in permissions are apt to be really numerous, but they typically come in bunches, namely from application modules or applications. Furthermore, you may want to assign application specific roles and then aggregate them into larger cross-application roles. (for instance this is pretty much necessary for javaee and jacc). So I propose organizing the objects into one or a set of trees which we might call scopes, and associating roles with scopes: a role could only include permissions using objects in the scope (including descendants) and all the junior roles would also be in the scope or descendants.

[ I originally called these applications in my triplesec branch, but this doesn't seem very appropriate. Scope may not be the best term. I don't know how it relates to "scopes" in microsoft AzMan ]

2. Theoretically one should not need denied permissions since you can presumably just take the set theoretic difference of the subsets of Objects X Actions to get a new permission representing granted - denied. However the representation of permissions may make this difficult or impractical so allowing roles to have granted permissions, denied permissions, granted roles, and denied roles seems to make it easier to fine tune the meaning of a larger role. I haven't investigated the exact meaning of this in terms of the set- theoretic model above. It's pretty easy to implement however.


----------------------------------------------------------------------

Comments

1. triplesec (trunk) has a Profile feature that Alex has recently been telling me he doesn't like any more. I don't like the implementation but I think its for the same purpose as the dynamic separation of duty constraints and the session concept. Basically profiles are, to me, statically configured sessions for different jobs; enforcement of separation of duty constraints is left up to the viligance of the administrator setting up the profiles.

2. These definitions are fairly set-theoretic which may not be to everyones taste. Perhaps due to my previous training as a mathematician I find this style a lot clearer than a lot of words. In particular I recognize that the extensions are a lot less clear than the main stuff. Maybe we could add more words and keep everyone happy :-)

3. With the exception of separation of duty constraints this is all implemented in my sandbox triplesec branch. By no means am I suggesting anything particularly good about this, but it is possible to implement and if you want to see a possible ldap schema that will store this info you can look at it. Most likely lots of big improvements can be made. This should definitely not be regarded as anything other than a proof of concept and it has some major practical problems such as not relating to existing external stores of user information.

thanks
david jencks

Reply via email to