“We need a read only role.”
It seems like such a simple requirement. Users have been requesting a read-only role for several years now. Why is it so tough to implement?  Because it calls for modifying access control policy across multiple, disjoint services deployed at innumerable distinct locations.
“We need help in modifying policy to implement our own read only role.”
This one is a little bit more attainable. We should be able to provide better tools to help people customize their policy. What should that look like?
We gathered some information at the last summit, and I am going to try and distill it to a requirements document here.
Table of contents
Definitions
- Verb and Path: the combination of the HTTP verb and the templated sub path that is used by the mapping engines. If I were to use Curl to call https://hostname:5000/v3/users/a0123ab6, the verb would be the implicit GET, and the path would be /v3/users/{user_id}.
- policy key: the key in the policy.json and policy.yaml file that is used to match the python code to the policy. For example, the Keystone GET /v3/user/{user_id} verb and path tests against the policy key identity:get_user.
- API Policy Mapping:Â the mapping from Verb and Path to Policy key.
The tool needs to be run from the installer. While that means Tripleo for my team, it should be a tool that can be enlisted into any of the installers. It should also be able to run for day 2 operations from numerous tools.
It should not be deployed as a standard service, at least not one tied in with the active OpenStack install, as modifying policy is a tricky and potentially destructive and dangerous operation.
Input
Policy files need to be gathered from the various services, but this tool does not need to do that; the variations in how to generate, collect, and distribute policy files are too numerous to solve in a single, focused tool. The collection and distribution fits more into Ansible playbooks than a tool for modifying policy.
External API definitions
End users need to be able to test their policy. While the existing oslo-policy command line can tell whether a token would or would not pass the checks, those are done at the policy key level. All integration is done at the URL level, even if it then passes through libraries or the CLI. The Verb and URL can be retrieved from network tools or debug mode of the CLI, and matched against the tuple of (service,verb,template path) to link back to the policy key, and the thus the policy rule that oslo-policy will enforce. Deducing this mapping must be easy. With this mapping, additional tools can mock a request/response to test whether a given set of auth-data would pass or fail a request. Thus, the tool should accept a simple format for uploading the mappings of Verb and Path to policy key.
Policy.json
Policy files have several implementations. The old Policy.json structure provides the least amount of information. Here is a sample:
"context_is_admin": "role:admin", "default": "role:admin", "add_image": "", "delete_image": "", "get_image": "", "get_images": "", "modify_image": "", "publicize_image": "role:admin", "copy_from": "", |
policy.yaml
The policy in code structure provides the most, including the HTTP Verbs and templated Paths that map to the rules that are the keys in the policy files. The Python code that is used by oslo-policy to generate the sample YAML files uses, but does not expose, all that data. Here is an example:
# This policy only checks if the user has access to the requested # project limits. And this check is performed only after the check # os_compute_api:limits passes # GET /limits # "os_compute_api:os-used-limits": "rule:admin_api" |
A secondary tool should expose all this data as YAML , probably a modification of the oslo-policy CLI. The management tool should be able to consume this format. It should also be able to consume a document that maps the policy keys to the Verb and Path separate from the policy
Upgrades
A new version of an OpenStack service will likely have new APIs. These APIs will not be covered by existing policy. However, if a site has made major efforts into customizing policy in the past, they will not want to lose and redo all of their changes. Thus, it should be possible to upload a new file indicating the over all or just changes to the API mapping from a previous version. If an updated policy-in-code format is available, that file should merge in with the existing policy modifications. The user needs to be able to identify
- Any new APIs that require application of the transformations listed below
- Any changes to base policy that the user has customized and now conflict with the assumptions. The tool user should be able to accept the old version, the new version, or come up with a modified new, manually merged version.
Transformations
End users need to be able to describe the transformations that then need to perform in simple terms. Here are some that have been identified so far:
- ensure that all APIs match against some role
- ensure that APIs that require an role (especially admin) also perform a scope check
- switch the role used for a given operation or set of operations
- standardize the meaning of interim rules such as “owner.”
- Inline an interim rule into the rules that use it
- Extract an interim rule from all the rules that have a common fragment
Implied Roles
The Implied Roles mechanism provides support for policy, The tool should be able to help the tool users to take advantage of implied roles.
- Make use of implied roles to simplify complex matching rules
- Make use of implied roles to provide additional granularity for an API:
- Make it possible to expand implied rules in the policy file based on a data model
Change sets
The operations to transform the rules are complex enough that users will need to be able to role them forward and back, much like a set of changes to a git repository.
User Interface
While the tool should be visible, the majority of the business logic should reside in an API that is callable from other systems. This seems to imply a pattern of REST API + A visible UI toolkit.
The User Interface should make working with large sets of rules possible and convenient. Appropriate information hiding and selection should be coupled with the transformations to select the set of rules to be transformed.
Datastore
The data store for the application should be light enough to run during the install process. For example, SQLite would be preferred over MySQL.
Output
The tool should be able to produce the individual policy files consumed by the APIs.
It is possible to have a deployment where different policy is in place for different endpoints of the same service. The tools should support endpoint specific overrides. However, the main assumption is that these will be small changes from the core service definitions. As such, they should be treated as “service X plus these changes” as opposed to a completely separate set of policy rules.