[keycloak-dev] modeling map role fine grain permissions

Bill Burke bburke at redhat.com
Mon Apr 3 10:58:21 EDT 2017


Here's how I am going to model role mapping with fine grain permissions 
in Authz service.  The goal of this is to be able to limit or expand on 
who can map specific roles.  While we want to have a default that any 
admin that has the "manage-users" role can map a role, we also want to 
be able to do things like saying that an admin can map a specific role 
if they belong to a group instead.

DEFAULT PERMISSIONS

* "permit all" policy.  Just grants it.

* "Default Role Mapping Policy" Policy.  This is an aggregate policy 
that includes the "permit all" policy.

* "map-role" scope

* "Roles" resource.  Associated scope is "map-role"

* "Default Role Mapping Permission" - scope permission that binds 
"Roles" resource and "map-role" scope.  The associated policy will be 
"Default Role Mapping Policy".


* "manage-users" scope

* "Users" resource.  Associated scope is "manage-users"

* "manage-users" policy that checks that "manage-users" role is present

* "Default Manage Users Policy".  This is an aggregate policy that 
includes the "manage-users" policy.

* "Default Manage Users Permission".  scope permission that binds 
"Users" resource and "manage-users" scope.  The associated policy will 
be "Default Manage Users Policy".


The above defines the default policy for mapping all roles.  In the 
admin console "Roles" section, there will be a "Default Admin 
Permissions" tab.  Here the user will be able to modify the "Default 
Role Mapping Permission".  The will be able to create and add new 
policies for this permission.  They will not be able to create any other 
permission.  In the "Users" section of the admin console, there will be 
a "Default Admin Permissions" tab.  Here the admin will be able to 
modify the "Default Manage Users Permission"

FINE GRAIN PERMISSION

For more fine grain permissions, there will be a resource created per 
role on demand.  The admin will go to the role's console page and there 
will be a "Admin Permissions" tab.  The admin will say they want to add 
a fine grain permission for that role and this will trigger these actions:

* A resource will be created specifically for that role with an 
associated scope of "map-role"

* A scope permission will be created for that role resource and the 
"map-role" scope.  The "Default Role Mapping Policy" will be added 
automatically to this permission.

THere will also be a "Admin Permissions" tab for each Group.  The admin 
will say they want to add a fine grain permission for that group and 
this will trigger these actions:

* A resource will be created specifically for that group with an 
associated scope of "manage-users"

* A scope permission will be created for that group resource and the 
"manage-users" scope.  The "Default Manage User Policy" will be added 
automatically to this permission.

EVALUATION

When evaluating whether or not a role is allowed to be mapped by a 
particular admin, this will be the algorithm:

1. If there is a resource for that specific role, evaluate that the 
admin can use the "map-role" scope with that role's resource

2. If there is not a resource for that specific role, then evaluate that 
teh admin can use the "map-role" scope with the "Roles" resource.

3. Evaluate if the admin can perform the "manage-users" scope on the 
"Users" resource.

4. If Step #3 fails, then for each group see if the admin has the 
"manage-users" scope for that group.

DEFAULT PERMISSIONS FOR ADMIN ROLES

By default, each admin role in the system "manage-users", 
"manage-realm", etc... will have a resource ad scope permission created 
for it as articulated above.  The scope permission will be UNANIMOUS and 
will also associate a role policy of that role in addition to the 
"Default Role Mapping Policy".  This additional role policy is basically 
saying "Admins with 'manage-users' role and the admin must have this 
role mapping as well".  So, somebody with 'manage-users' role can't map 
'manage-realm' unless they have that role themselves.

MORE FINE GRAIN PERMISSIONS

We also want to solve the case of allowing an admin to be able to map 
specific roles for members of a specific group.  To do this we'll add 
another policy type called "Has Permission".  Here you'll be able to 
link a permission to a policy.  So, to solve the use case for specific 
roles for members of a specific group, we can edit the "map-role" 
permission for a specific role and add a "Has Permission" that links to 
the permission that the admin has "manage-users" scope for a specific 
group.  Hope I'm making sense on this one.




More information about the keycloak-dev mailing list