[openstack-dev] [Keystone][Oslo] Policy and Audit

Adam Young ayoung at redhat.com
Wed Jul 9 04:05:36 UTC 2014


Summary of the discussion in #openstack-keystone.



Policy in OpenStack is the mechanism by which Role-Based-Access-Control 
is implemented. Policy is distributed in rules files which are processed 
at the time of a user request. Audit has come to mean the automated 
emission and collection of events used for security review. The two 
processes are related and need a common set of mechanisms to build a 
secure and compliant system.

Why Unified?

The policy enforces authorization decisions. These decisions need to be 
audited.

Assume that both policy and audit are implemented as middleware pipeline 
components. If policy happens before audit, then denied operations would 
not emit audit events.If policy happens after audit, the audit event 
does not know if the request was successful or not.If audit and policy 
are not unified, the audit event does not know what rule was actually 
applied for the authorization decision.
Current Status

Rob Basham,Matt Rutkowski,Brad Topol, and Gordon Chung presented on a 
middleware Auditing implementation at the Atlanta Summit.

Tokens are unpacked by a piece of code called 
keystonemiddleware.auth_token. (actually, its in keystoneclient at the 
moment, but moving)

Auth token middleware today does too much. It unpacks tokens, but it 
also enforces policy on them; if an API pipeline calls into auth_token, 
the absence of a token will trigger the return of a ’401 Unauthorized’.

The first step to handling this is that a specific server can set 
‘delay_auth_decision = True’ in the config file, and then no policy is 
enforced, but the decision is instead deferred until later.

Currently, policy enforcement is performed on a per-project basis. The 
Keystone code that enforces policy starts with a decorator defined here 
in the Icehouse codebase;

http://git.openstack.org/cgit/openstack/keystone/tree/keystone/common/controller.py?h=stable/icehouse#n87 


The Glance code base uses this code;

http://git.openstack.org/cgit/openstack/glance/tree/glance/api/policy.py?h=stable/icehouse 


Nova uses:

http://git.openstack.org/cgit/openstack/nova/tree/nova/policy.py?h=stable/icehouse 


And the other projects are comparable. This has several implications. 
Probably the most significant is that policy implementation can vary 
from project to project, making the administrators life difficult.
Deep object inspection

What is different about Keystone’s implementation? It has to do with the 
ability to inspect objects out of the database before applying policy. 
If a user wants to read, modify, or delete an object, they only provide 
the ID to the remote server. If the server knows what the project ID is 
of the object, it can apply policy. But that information is not in the 
request. So the server needs to find what project owns the object. The 
decorator @controller.protected contains the flag get_member_from_driver 
which fetches the object prior to enforcing the policy.

Nova buries the call to the enforce deeper inside the controller Method.
Path forward
Cleaning up policy implementation

Clean up the keystone server implementation of policy. The creation of 
https://github.com/openstack/keystone/blob/master/keystone/common/authorization.py 
was a start, but the code called from the decorators that knows how to 
deal with the token data in controller.py need to be pulled into 
authorization.py as well.
Move authorization.py into keystonemiddleware
Make the keystone server use the middleware implementation
convert the other projects to use the middleware implementation.
convert the other projects to use “delay_auth_decision” so this can 
eventually be the default.

Audit Middleware

put the audit middleware into Keystone middleware as-is. This lets 
people use audit immediately.
Extract out the logic from the middleware into code that can be called 
from policy enforcement.
Create a config option to control the emission of audit events from 
policy enforcement.
Remove the audit middleware from the API paste config files and enable 
the config option for policy emission of events.

Why not Oslo-policy.

Oslo policy is a general purpose rules engine. Keeping that separate 
from the OpenStack RBAC specific implementation is a good separation of 
concerns. Other parts of OpenStack may have needs for a policy/rules 
enforcement that is completely separate from RBAC. Firewall configs in 
Neutron is the obvious first place.


Note that I wrote this up as a blog post: 
http://adam.younglogic.com/2014/07/audit-belongs-with-policy/



More information about the OpenStack-dev mailing list