I look forward to the proposal. Based on your short comments and the artifacts I've seen so, I'll warn you that I'll probably disagree strongly with the implement
Darren > On Sep 29, 2013, at 12:04 PM, Min Chen <min.c...@citrix.com> wrote: > > RBAC branch was created by Prachi and me to do some quick prototype on rbac > feature we are going to propose in the community soon. Since it is not ready > yet, we haven't proposed and published FS on the ML. > > In this prototype, we have group, accout, role, permission as our first class > object. Unlike Amazon, cloudstack ACL is mainly done at Account level, so our > Group will be a collection of accounts instead of users. Different from > Darren suggested here, we didn't extract a separate Policy object to > Group several permissions to a policy, because we didn't see a big benefit to > store collections of permissions as a Json policy object compared to storing > each individual permission into a permission table. Another reason why we > store individual permission in db table is to facilitate implementing > row-level permission filter for list Apis, where we have created DB views to > determine entities to be returned. With a separate permission table, we can > potentially join that table in db view for row filtering in read operation. > In terms of integrating with third-party RBAC system, I don't see a big > difference between re-creating policy object using cloudstack defined Json > format and asking them to define those permissions through cloudstack > provided permission grant Apis. > > Thanks > -min > > Sent from my iPhone > >> On Sep 28, 2013, at 8:51 PM, "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). 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