Events RBAC via Policy
OpenStack needs to support granular, customizable Role-Based Access Control (RBAC) for ceilometer events. Policy should be dependent on policy.json rather than simply hard-coded. APIImpact SecurityImpact UpgradeImpact Change-Id: Id25d154eac90e14c5501f806e81e04a059f5a836
This commit is contained in:
parent
9d5a57b45e
commit
917d20718b
214
specs/liberty/events-rbac.rst
Normal file
214
specs/liberty/events-rbac.rst
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
==========================================
|
||||||
|
Events RBAC via Policy
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
OpenStack needs to support granular, customizable Role-Based Access Control
|
||||||
|
(RBAC) for ceilometer events. Policy should be dependent on policy.json rather
|
||||||
|
than simply hard-coded.
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/ceilometer/+spec/events-rbac
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
The only RBAC validation for ceilometer’s /events REST API that is in place
|
||||||
|
today is hard-coded logic to restrict requests to admins. This is not granular
|
||||||
|
enough. In a multi-tenant environment, there must be provision to restrict data
|
||||||
|
from events to the scope of the token given on the request (e.g. an admin from
|
||||||
|
one project should not be able to view the events of another project). There
|
||||||
|
should also be a way to allow non-admins access to some events (e.g. events
|
||||||
|
for their resources). This issue was originally raised as a bug [1].
|
||||||
|
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
This blueprint proposes the following changes in the behavior of ceilometer’s
|
||||||
|
/events REST API:
|
||||||
|
|
||||||
|
Add the following rules to ceilometer’s default policy.json:
|
||||||
|
|
||||||
|
“telemetry:events:index”: “role:admin”
|
||||||
|
“telemetry:events:show”: “role:admin”
|
||||||
|
|
||||||
|
Modify the code to uses those checks to determine who is allowed to request a
|
||||||
|
list of events (index) or a specific event (show). This pattern is in line with
|
||||||
|
other OpenStack projects.
|
||||||
|
|
||||||
|
Further modify the code to, if/when those checks pass, filter which events will be returned based on the scope of the token. If the token is for an admin user
|
||||||
|
(determined by checking the special context_is_admin rule from policy.json),
|
||||||
|
only return events corresponding to the project to which the supplied
|
||||||
|
X-Auth-Token is scoped. This is also consistent with other projects. If the
|
||||||
|
token is for a non-admin user, further filter the results to only return
|
||||||
|
events corresponding to the user to which the supplied X-Auth-Token is scoped,
|
||||||
|
as well as the project.
|
||||||
|
|
||||||
|
The events REST API will be processed only if the user passes a project-scoped
|
||||||
|
token. This is required to filter the events based on the project. If the user
|
||||||
|
passes an unscoped or domain-scoped token, a 403 error will be thrown.
|
||||||
|
|
||||||
|
There may be events for which no project/user information is recorded. Most if
|
||||||
|
not all of these should have project/user information, so event-generating code
|
||||||
|
will need to be modified to include that when creating future events. Updating
|
||||||
|
existing events within the database is outside the scope of this spec. Until
|
||||||
|
all events have project/user information, events which lack this data will be
|
||||||
|
returned along with events corresponding to the token’s project, if the token's
|
||||||
|
user is an admin on that project.
|
||||||
|
|
||||||
|
For the first implementation, common name-reserved traits will be used to store
|
||||||
|
project/user information.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
We could use policy.json checks to filter results as well as determine whether
|
||||||
|
the request is allowed. This does not fit with the role and purpose of
|
||||||
|
policy.json, and may also have significant performance implications.
|
||||||
|
|
||||||
|
Storing project/user information in base attributes rather than traits was
|
||||||
|
considered. This may be better long-term, but there has been some debate on the
|
||||||
|
appropriateness of using base attributes if there will be some events that are
|
||||||
|
not scoped to a project/user. Implementing this using traits first will help us
|
||||||
|
determine whether that is a valid case. A switch to base attributes could come
|
||||||
|
later.
|
||||||
|
|
||||||
|
Rather than return both project/user-scoped events and unscoped events in a
|
||||||
|
single response, we could require a separate API call for unscoped events
|
||||||
|
if/when that is what the user desires. E.g. /broadcasts instead of /events. As
|
||||||
|
it is unclear whether we will end up with any events that do not have
|
||||||
|
project/user information, considering this now would be premature.
|
||||||
|
|
||||||
|
We could create another policy check to identify whether a non-admin role
|
||||||
|
should be considered an admin for the purpose of the /events API (and thus able
|
||||||
|
query events for the entire project rather than just for themselves). But since
|
||||||
|
it is expected that events will be split out of ceilometer like meters
|
||||||
|
(gnocchi) and alarms (aodh), that would seem to be a short-term solution.
|
||||||
|
|
||||||
|
We could support domain-scoped tokens to allow domain admins to query events
|
||||||
|
for the entire domain with a single request. This may be needed in the future,
|
||||||
|
but does not appear to be something that must be done as part of this effort.
|
||||||
|
And there could be benefits to waiting for the keystone reseller spec [2]
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None, as long as we stick using traits.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Whereas before this change an admin of any project saw events for EVERY project
|
||||||
|
in the response to a GET /events request, now GET /events will filter out
|
||||||
|
events belonging to projects other than the one in the scope of the request's
|
||||||
|
auth token. This closes a security hole that allowed admins of one project to
|
||||||
|
gain information about another project in which they have no role.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This will greatly enhance security by default. It will also provide a mechanism
|
||||||
|
for operators to customize policy related to events, so operators taking
|
||||||
|
advantage of this capability will need to consider the potential security
|
||||||
|
impacts of their configuration changes.
|
||||||
|
|
||||||
|
Pipeline impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance/Scalability Impacts
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Filtering on project/user may have a slight negative performance impact, though
|
||||||
|
this should be offset by the likely much more substantial performance
|
||||||
|
improvement of returning less data to the caller.
|
||||||
|
|
||||||
|
Allowing events that do not have project/user information via the same API
|
||||||
|
queries will mean making two internal calls (one to get events scoped to the
|
||||||
|
project/user and another to get events not scoped to a project/user) and then
|
||||||
|
merging them. This may have a slight negative performance impact.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Updating from a previous release will need to include moving to a new version
|
||||||
|
of policy.json including the new checks, else those would resolve to the
|
||||||
|
default which is to allow for anyone.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
edmondsw
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
dikonoor
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Check context_is_admin to determine appropriate response filtering
|
||||||
|
* Check policy.json to determine whether the request is allowed
|
||||||
|
* Add project/user to events that are currently lacking those details
|
||||||
|
|
||||||
|
|
||||||
|
Future lifecycle
|
||||||
|
================
|
||||||
|
|
||||||
|
This is essentially a large bug fix, not a feature. As such, all members of the
|
||||||
|
Telemetry program will be expected to keep this from breaking again.
|
||||||
|
|
||||||
|
Several potential future enhancements are discussed under the Alternatives
|
||||||
|
section. It is expected that those would require a separate spec if someone
|
||||||
|
wants to pick up any of them in the future.
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Unit tests should be sufficient.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Developer documentation [3] will be updated to add user_id to the list of
|
||||||
|
default traits, and to explain that non-admins will only be able to view events
|
||||||
|
with their user_id, while admins will only be able to view events with their
|
||||||
|
tenant_id plus events not associated with a project (aka tenant).
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
[1] https://bugs.launchpad.net/ceilometer/+bug/1461767
|
||||||
|
[2] https://github.com/openstack/keystone-specs/blob/master/specs/liberty/reseller.rst
|
||||||
|
[3] http://docs.openstack.org/developer/ceilometer/events.html
|
||||||
|
|
Loading…
Reference in New Issue
Block a user