On 29 Sep 2013, at 05:51, Darren Shepherd <darren.s.sheph...@gmail.com> wrote:
> I've noticed there's a rbac branch and things are being committed > there. I didn't see any documentation about the design or anything > (maybe it exists and I looked in the wrong place), so I'm just going > to give you my two cents on authorization systems. Hopefully this > falls in line with what is being implemented, if not, at least we'll > avoid the awkward conversation when its finish when I say the code is > marginally useful and should be rewritten. > > When talking about authorization there's a bunch of terms like > principal, permission, subject, action, policy, etc. I want to focus > on policy. Policy is central to an authorization system. The policy > is the collection of permissions that grant or deny access to some > resource or action for a given subject. RBAC is a really just a means > to generate a policy. Once you know the user, group, roles, and the > permissions of those entities that aggregation of information forms > the policy. You then take that policy and use it determine if the > given resource/action is granted/denied to a particular subject. > > It is really important that policy is a first class object in an > authorization system. This is important to understand because usually > in a big fat enterprise-y company, they really want you to enforce the > policy, but not necessarily maintain it. For example, you'll go to > your fortune 500 company and they'll tell you they need RBAC. So you > go and create an RBAC system. The problem is that the fortune 500 > company probably already has a RBAC system, and its probably AD based. > So when they said they need RBAC, the really meant you need to > enforce RBAC. If you implemented RBAC -> Policy -> Authorization, > your good, if you implemented RBAC - > Authorization, your kinda > screwed. Now you need to create a system to sync the two RBACs. And > keeping data in two places and trying to sync them is never a good > idea. Now if you implemented your system as having a policy as a > first class object, you can just swap your RBAC for theirs and all is > still swell. > > So if I was to implement this, this is how I'd do it. (And if this > sounds a lot like IAM, its because it is. If Amazon got anything > right, it's IAM). And it would be nice to implement a IAM interface, its quite neat actually. > The authenticator should be able to implement > another interface that allows it to supply a Policy object during > authentication. This is logical in that the authentication systems > quite often hold authorization information too. If the authenticator > doesn't implement the interface we fall back to generating the policy > ourself. The policy is then consulted to see if the API command and > the resulting entities are granted/denied. So far none of this has > anything to do with RBAC. So the RBAC is implemented in that default > fallback implemenation that generates the policy. You map the current > user/account to groups and roles and get the policies of those > entities to construct the policy. > > Now for storing the policies I wouldn't do it in a traditional > normalized form. All you need is tables for user/group/role and the > mappings for each. The for user, group, and role you can specify a > policy JSON blob and that gets stored in the database as a mediumtext > field on the user/group/role row. From an API perspective (just like > IAM), you just let people upload the JSON blobs for each. > > So if we do it this way, we can have our own simple RBAC but then be > able to plug into far more complex and powerful authorization systems. > Hopefully that all made sense. > > Darren