Document revision: 0.6 - 01/16/2004
http://asg.web.cmu.edu/isam/proj/aac
org.acs.asg.project.aac
This project attempts to address the problem where applications are more and more being required to follow a central authorization policy. Traditionally, this has required that applications be modified whenever a policy changes. This project will provide an alternative to this problem.
This goal of this project is not to design a generic authorization system that will be used for every authorization check an application may make. Instead, you can think of this system as a doorman: it will do some very coarse grained checks. The application will likely still do some form of internal authorizations for most operations.
From the application point of view, all that will need to be done to use this system is make an authenticated LDAP query.
The system that will first use this infrastructure is Andrew For Life (http://asg.web.cmu.edu/isam/proj/afl). Specific details on how applications are to be changed will be discussed on that project page.
We expect to use this system for at least the next few years. This system does not preclude a more advanced authorization system from being deployed in the future. We needed a solution for the short run and the existing systems were not mature enough and too heavy weight for immediate deployment.
The following provides an implementation independent overview of what we are trying to achieve.
We define the following terms in order to avoid any confusion based on pre-assumptions.
The basic data flow, building upon the definitions above, is shown in the following diagram:
The identities from the enterprise directory gets transformed by the central policy into a list of people entitled to the resource. The white list adds people not in the entitlement list; the black list removes people from the merged list. At the end, we have the final authorization which the application queries.
Parviz alternate view:
We continue with the model of having a directory with all the information in it. However, we will continue to have non-users use application specific CNAMEs. This gives us the flexibility of having different machines with different representations of the directory in the future. This way applications may not need to change anything in order to use the new servers.
We use 'Oracle' to refer to our current database. If it makes you feel better, please replace 'Oracle' with 'directory SQL database' any time you see the string Oracle in this document.
There is the general issue of when should authorization be done against the Account that one authenticated with vs.. the Person that the account is associated with.
In some instances, using the Person is a convenience for the user. For example, if someone wants to change their benefits, then it may not matter if they are using their Andrew ID or their CS ID or their ECE ID. Ideally, you'd want to accept the authentication from any source you trust.
On the other hand, if an account has been granted elevated privilege in a domain, you want to ensure that the user authenticated with that account and not an account from a different domain. This way, you don't grant administrators in the other domain elevated access.
Whether to use the Person or the Account is very application specific. We will try to provide as specific guidance as possible in section 3.0.
The LDAP query an application would make is:
server: ldap-authz.andrew.cmu.edu
searchbase: cn=name_of_authorization_group,ou=Authz,dc=cmu,dc=edu
scope: BASE
filter: member=GUID
attrs: none
Search will return 0 or 1 entries.
If the search result returns 1 entry then the user is granted final authorization. If the search result returns no entries, then the user is denied final authorization.
The primary scope of the authorization is to provide a doorman function. This means that we expect the bulk of the clients will be using this to determine whether or not the given user will be allowed to access the service in general. Service specific authorization (i.e. filesystem, bboard ACLs) will likely be done independently by the application.
It is also likely that a service will be able to use this, along with the current trigger mechanism, to provision or expunge a user, if needed, from their service. Please refer to section 3.2.3 for details.
If an application can take advantage of the system to do more than these functions, we encourage the application to pursue this path. We believe that moving authorization out of a application is the way of the future. Please be sure to talk with the Architecture Group about these plans.
We will infringe on the MACE URN space with the expectation that the system may be more generalized.
The prefix will be urn:mace:cmu.edu:andrew:. Whatever follows after andrew can be selected by the application.
More guidance on naming is found in section 3.2.3.
Some services may require setup (provisioning) before first use and those services may also require cleanup (expunging) when no further use is expected.
We expect the application to be notified via the existing trigger delivery system. Since that is unauthenticated, the application will need to do a lookup to validate the authenticity of the request.
Given the boolean nature of the current query and the fact that only the final authorization is visible via LDAP to the application, the application can not just use the final authorization. The application does not know if the user is not entitled or if the user is black listed. As such, a separate authorization group needs to be created to indicate whether or not the user should be provisioned.
An example of this would be the following:
cn=UnixAccount,ou=Authz,dc=cmu,dc=edu cn=UnixAccountLogin,ou=Authz,dc=cmu,dc=edu
The first group is to allow one to test for whether or not the given account should be provisioned or expunged. The second test is to determine whether or not the user has access to the provisioned service.
It makes no sense for UnixAccountLogin to be true while UnixAccount is false. Rather than work in complicated logic to link the two, we know that the two will have the same entitlement if the same central policy is applied.
TODO: maybe this argues for exposing the whitelist+entitlement as an app can look at that for provisioning/expunging?
A web interface will create a set of central policies. These policies will then be applied to each authorization group.
The web interface will provide a list of "building blocks" that the enterprise directory provides and allow one to create a central policy by joining these blocks with and and or operations.
The central policy will be given an identifier that can be applied to multiple authorization groups. This allows the same policy to be consistently applied to multiple authorization groups.
It is likely we will provide an initial set of central policies.
TODO: If we change the semantic meaning of a central policy, how do we know if the authorization group wants this change or wants to have the old semantics?
what is in the group? account/person. App should know but how does the trigger know how to populate the group? Probably will not allow an authorization group to have a mix of accounts and people.
TODO
There will be a debugging web page that will allow you to peer into the inner workings of the system in addition to the various logs. This page will expand out the central policy and thereby be able to show exactly which test was failed and why the user does not appear in the final authorization.
TODO:
How we got here:
The authz center proposal (referenced below) implements the authorization attributes as LDAP attributes associated with a user. One of the biggest drawbacks with this approach is to add additional authorization attributes, a schema change is required. With the OpenLDAP implementation that we are currently running requires a server restart for it to occur.
Another proposal was to use eduPersonEntitlement (referenced below). In this manner, the authorization attributes would just be values in the eduPersonEntitlement field. This solved the problem of schema changes but introduced a couple of issues:
The use of the groups mechanism described above allow us to restrict read-access to the authorization attribute and does not require schema changes and therefore server restarts for new authorization attributes to be added.
With only one list, we'd run into the following problem:
The problem comes in the last step. The lack of the user in the group could be either (a) the user was not previously entitled or (b) the user is blacklisted. Thus, we need another list.
Related Systems:
"Source" documents:
0.6 - wcw - 01/16/2004 - deprecate document 0.5 - wcw - 06/25/2003 - filling more things in 0.4 - wcw - 06/25/2003 - finished adamson merge 0.3 - wcw - 06/24/2003 - some html cleanup; started merge from adamson 0.2 - wcw - 06/24/2003 - added some comments/questions/corrections from tgd 0.1 - wcw - 06/19/2003 - Initial draft
Added by wcw:
Added by ???: