The policy .yaml file generated from oslo has the following format:
# Intended scope(s): system
#"identity:update_endpoint_group": "rule:admin_required"
# Delete endpoint group.
# DELETE /v3/OS-EP-FILTER/endpoint_groups/{endpoint_group_id}
# Intended scope(s): system
#"identity:delete_endpoint_group": "rule:admin_required" |
# Intended scope(s): system
#"identity:update_endpoint_group": "rule:admin_required"
# Delete endpoint group.
# DELETE /v3/OS-EP-FILTER/endpoint_groups/{endpoint_group_id}
# Intended scope(s): system
#"identity:delete_endpoint_group": "rule:admin_required"
This is not very useful for anything other than feeding to oslo-policy to enforce. If you want to use these values for anything else, it would be much more useful to have each rule as a dictionary, and all of the rules in a list. Here is a little bit of awk to help out:
#!/usr/bin/awk -f
BEGIN {apilines=0; print("---")}
/#"/ {
if (api == 1){
printf(" ")
}else{
printf("- ")
}
split ($0,array,"\"")
print ("rule:", array[2]);
print (" check:", array[4]);
rule=0
}
/# / {api=1;}
/^$/ {api=0; apilines=0;}
api == 1 && apilines == 0 {print ("- description:" substr($0,2))}
/# GET/ || /# DELETE/ || /# PUT/ || /# POST/ || /# HEAD/ || /# PATCH/ {
print (" " $2 ": " $3)
}
api == 1 { apilines = apilines +1 } |
#!/usr/bin/awk -f
BEGIN {apilines=0; print("---")}
/#"/ {
if (api == 1){
printf(" ")
}else{
printf("- ")
}
split ($0,array,"\"")
print ("rule:", array[2]);
print (" check:", array[4]);
rule=0
}
/# / {api=1;}
/^$/ {api=0; apilines=0;}
api == 1 && apilines == 0 {print ("- description:" substr($0,2))}
/# GET/ || /# DELETE/ || /# PUT/ || /# POST/ || /# HEAD/ || /# PATCH/ {
print (" " $2 ": " $3)
}
api == 1 { apilines = apilines +1 }
I have it saved in mungepolicy.awk. I ran it like this:
cat etc/keystone.policy.yaml.sample | ./mungepolicy.awk > /tmp/keystone.access.yaml |
cat etc/keystone.policy.yaml.sample | ./mungepolicy.awk > /tmp/keystone.access.yaml
And the output looks like this:
---
- rule: admin_required
check: role:admin or is_admin:1
- rule: service_role
check: role:service
- rule: service_or_admin
check: rule:admin_required or rule:service_role
- rule: owner
check: user_id:%(user_id)s
- rule: admin_or_owner
check: rule:admin_required or rule:owner
- rule: token_subject
check: user_id:%(target.token.user_id)s
- rule: admin_or_token_subject
check: rule:admin_required or rule:token_subject
- rule: service_admin_or_token_subject
check: rule:service_or_admin or rule:token_subject
- description: Show application credential details.
GET: /v3/users/{user_id}/application_credentials/{application_credential_id}
HEAD: /v3/users/{user_id}/application_credentials/{application_credential_id}
rule: identity:get_application_credential
check: rule:admin_or_owner
- description: List application credentials for a user.
GET: /v3/users/{user_id}/application_credentials
HEAD: /v3/users/{user_id}/application_credentials
rule: identity:list_application_credentials
check: rule:admin_or_owner |
---
- rule: admin_required
check: role:admin or is_admin:1
- rule: service_role
check: role:service
- rule: service_or_admin
check: rule:admin_required or rule:service_role
- rule: owner
check: user_id:%(user_id)s
- rule: admin_or_owner
check: rule:admin_required or rule:owner
- rule: token_subject
check: user_id:%(target.token.user_id)s
- rule: admin_or_token_subject
check: rule:admin_required or rule:token_subject
- rule: service_admin_or_token_subject
check: rule:service_or_admin or rule:token_subject
- description: Show application credential details.
GET: /v3/users/{user_id}/application_credentials/{application_credential_id}
HEAD: /v3/users/{user_id}/application_credentials/{application_credential_id}
rule: identity:get_application_credential
check: rule:admin_or_owner
- description: List application credentials for a user.
GET: /v3/users/{user_id}/application_credentials
HEAD: /v3/users/{user_id}/application_credentials
rule: identity:list_application_credentials
check: rule:admin_or_owner
Which is valid yaml. It might be a pain to deal with the verbs in separate keys. Ideally, that would be a list, too, but this will work for starters.