RBAC, keystone and openstack

Setting up roles (based on Diablo/Essex release):

Keystone:
1. create roles with keystone

keystone-manage -c <keystone.conf> role add <role>

2. Assign role to a user

keystone-manage -c <keystone.conf> role grant <role> <user> <tenant>

3. If not using default policy.json file:

nova.conf file should be set with “–policy_file=FILENAME”

4. If using the default /opt/stack/nova/etc/nova/policy.json file:

1. Sample policy.json file
Line #1 {
Line #2 “admin_or_owner”:  [["role:admin"], ["project_id:%(project_id)s"]],
Line #3 “sysadmin_or_owner”: [["role:sysadmin"], ["project_id:%(project_id)s"]],

Line #4 “compute:create”: [["rule:admin_or_owner"]],
Line #5 “compute:create:attach_network”: [["rule:admin_or_owner"]],
Line #6 “compute:create:attach_volume”: [["rule:admin_or_owner"]],

Line #7 “compute:get”: [["rule:admin_or_owner"]],
Line #8 “compute:get_all” :[],
…..
…..
“compute:pause”: [["rule:admin_or_owner"], ["rule:sysadmin_or_owner"]],

Line #40    “network:get_dns_entries_by_name”: []
Line #41 }

Explanation:

The contents of the file are a JSON-encoded hash in the from of:
RULE : MATCH_LIST

The MATCH_LIST can be:

rule:*
role:*
KEY:%(CONTEXT_KEY)s

RULE will be in the form of the following for specific checks.

COMPONENT:ACTION

When a MATCH_LIST for a rule:* is found, it acts as a link to the other rule
to perform checking.

When a MATCH_LIST for a role:* is found, the auth context of the request is
checked and made sure it contains the named role.

When a KEY:%(CONTEXT_KEY)s check is found, the KEY for the checked object
(an instnace model, a network address, a volume, etc) is compared to the
CONTEXT_KEY from the checked context.  The admin_or_owner uses this type
of check for project_id matching between the context and the checked object.

Line #1:

RULE can be a custom name that is referenced by a MATCH_LIST.

“admin_or_owner”:  [["role:admin"], ["project_id:%(project_id)s"]]

“admin_or_owner” is just a RULE name
The rule defines that if the user has admin role OR he is the owner of the project
Note the box separating the role admin and the project id, that shows that it’s OR”

If you want to set a rule saying if the user is a member AND owner of the project
“admin_and_owner”:  [["role:admin", "project_id:%(project_id)s"]],    “admin_and_owner” is the rule name
Note there is no box separation between role member and project id that shows that it’s AND”

Line #4:

“compute:create”: [["rule:admin_or_owner"]],
“compute:create:attach_network”: [["rule:admin_or_owner"]],

This implies that an admin or owner can attach network.

“compute:get_all” :[],    

All users can list instances

5. When users are created through dashboard, they default to a tenant.  So, always a user would be a member of a project.

6. mysql > keystone> users table:

a. If users table has the tenant_id set to “NULL” and if the user has roles set in the keystone, then still would be able to do whatever that role is allowed to do
b. If users table has the tenant_id set to a tenant for eg., 1 or 2…, and if no role or object is set, still the user would be able to do the actions which are set as []
c. There is no concept of project manager by default as we had in bexar.  Owner doesn’t mean that the user is the project manager of the project, it just means that the user is a member of the project.

Posted in Uncategorized | 4 Comments

config_drive for openstack server

config_drive for server is a Nova (Openstack) API extension (from Piston Cloud).  It can be issued as a parameter when creating a server.  It builds a separate partition/volume on the local disk.

Note: As of Jan 20th 2012, there is no nova client support for this.

config_drive takes 2 values. “true” or “image UUID”.

If the value is set to “true”, it builds a 64MB vfat volume and attaches it to the server.
If the value is set to “image-UUID”, it builds a volume from the image and attaches it.

JSON request – config_drive with imageref:

curl -i -X POST -d ‘{“server” : {“config_drive”:”<image_UUID>”, “name” : “<name>”, “imageRef” : “<image_ref>”,”flavorRef”: “<flavor_id>”,”key_name”:”<keypair_name>”}}’ http://<ip&gt;:8774/v2/1/servers -H “Content-Type:application/json” -H “X-Auth-Token: <token>”

JSON request – config_drive with “true”:

curl -i -X POST -d ‘{“server” : {“config_drive”:true, “name” : “<name>”, “imageRef” : “<image_ref>”,”flavorRef”: “<flavor_id>”,”key_name”:”<keypair_name>”}}’ http://<ip&gt;:8774/v2/1/servers -H “Content-Type:application/json” -H “X-Auth-Token: <token>”

To verify from host:

If instance gets launched successfully, on the host, instances directory, you should see a file called “disk.config” created.

“libvirt.xml” under the instances directory (/opt/stack/nova/instances/instance-xxxxx) should contain the following:

<disk type=’file’>
<driver type=’raw’ />
<source file=’/opt/stack/nova/nova/..//instances/instance-xxxxxx/disk.config’ />
<target dev=’vdz’ bus=’virtio’ />
</disk>

To verify from the instance:

drive created eg., /dev/vdx
The drive is not mounted automatically.

Now, it can me mounted.

Posted in Uncategorized | Leave a comment