本帖最后由 pig2 于 2014-2-9 00:57 编辑
阅读下面可以带着下面问题:
1.从使用角度该如何理解user,Tenants,Roles?
2.user,Tenants,Roles三者之间的关系是什么?
3.那些文件控制着访问权限?
一、基本概念
身份认证服务包括两个主要功能:
用户管理:时时跟踪用户以及用户被赋予了什么权限。
服务编录:提供一份可用服务的目录并可以定位这些服务的API。
1.1 用户管理
Identity用户管理包括三个主要概念:
用户(Users)
租户(Tenants)
角色(Roles)
用户表示拥有用户名,密码,邮箱等帐号信息的自然人。这里给出创建用户名为"alice”的用户:
$ keystone user-create --name=alice --pass=mypassword123 --mail=alice@example.com
租户可以被理解为一个项目,团队或组织。你必须指定一个相应的租户(tenant)才可以申请OpenStack服务,例如你指定以某租户申请Compute服务来查询当前运行的实例列表,则你将收到的是该租户的运行实例列表。这里是创建一个名为"acme”租户的例子:
$ keystone tenant-create --name=acme
注意事项:由于在早期的版本中使用项目术语来表示租户,所以有些命令行工具使用--project_id替代--tenant_id给客户分配一个ID号。
角色代表特定的租户中的用户用户操作权限,可以使用如下命令创建角色:
$ keystone role-create --name=compute-user
译者批注:你可以理解租户为那些使用你云环境的客户,这些客户可以是一个项目组、工作组、公司,这些客户中会建立不同的帐号(用户)及其对应的权限(角色).
Identity服务将用户与租户及角色结合在一起,继续刚才的例子,我们也许希望在acme租户中为alice用户分配compute-user角色。
复制代码
+---------------------------------+----------+------+-------+
|id | enabled | email | name |
+----------------------------------+----------+------+-------+
| 96a6ebba0d4c441887aceaeced892585 | True | ... | alice |
+----------------------------------+----------+------+-------+复制代码
+----------------------------------+------------------+
|id | name |
+----------------------------------+------------------+
| f8dd5a2e4dc64a41b96add562d9a764e | compute-user |
+----------------------------------+------------------+
---------------------------------------------------------------------------------------------------------------------------------------------------
这里详细介绍一下role的基本操作及通过role,操作user。
二、role基本操作
与user,tenant等一样,role的操作也无怪乎创建,更新,删除,列举等:
列举:
# keystone role-list
创建:
# keystone role-create
删除:
# keystonerole-delete
... 等等,由于太过简单,这里不再说明。
三、通过role操作用户
下面着重介绍通过role将一个用户加入到另一个tenant的小魔法。
首先,创建两个tenant, 分别命名为tenant1和tenant2(注意创建tenant,user, role的keystone命令必须有administrator权限,这里对所有administrator操作忽略相关用户/密码/tenant的声明):
# keystone tenant-create --name tenant1 --enabled true
# keystone tenant-create --name tenant2 --enabled true
为tenant1创建用户user1, 为tenant2创建用户user2:
# keystone user-create --name user1 --tenant-id <tenant-id of tenant1> --pass password --enabled true
# keystone user-create --name user2 --tenant-id <tenant-id of tenant2> --pass password --enabled true
先不进行role操作,用user1用户创建一个instance:
# nova --os-username user1--os-password password --os-tenant-name tenant1 boot test --image "cb79a458-169d-413e-89d0-02bcae61569a" --flavor 1
#nova --os_username user1 --os_password password --os_tenant_name tenant1 list
+--------------------------------------+-------+--------+---------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+-------+--------+---------------------------+
| 88bc939b-e29e-44ee-9f09-ec45a93ee6c4 | test | ACTIVE | nova_fixed=192.168.123.65 |
+--------------------------------------+-------+--------+---------------------------+
这时候,用user2用户登录,是无法对user1用户创建的instance进行操作的。
#nova --os_username user2 --os_password password --os_tenant_name tenant2 list
-- <NULL> --
创建role test:
keystone role-create --name test
+----------+----------------------------------+
| Property | Value |
+----------+----------------------------------+
| id | 2493283f09c1475198f2337a47aa398f |
| name | test |
+----------+----------------------------------+
通过role test将user2用户加入到名为tenant1的tenant中:
# keystone user-role-add --user-id 7b32f4fc92704947802d2eca95edff0d --role-id 2493283f09c1475198f2337a47aa398f --tenant-id 0647347fa21d4221b0197cd282465a00
其中7b32f4fc92704947802d2eca95edff0d是user2的id,0647347fa21d4221b0197cd282465a00是tenant1的id。
这样,就把user2用户加入到了tenant1。
#nova --os_username user2 --os_password password --os_tenant_name tenant1 list
+--------------------------------------+-------+--------+---------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+-------+--------+---------------------------+
| 88bc939b-e29e-44ee-9f09-ec45a93ee6c4 | test | ACTIVE | nova_fixed=192.168.123.65 |
+--------------------------------------+-------+--------+---------------------------+
test2用户可以看到tenant1下的instance。
# nova --os_username user2 --os_password password --os_tenant_name tenant1 delete 88bc939b-e29e-44ee-9f09-ec45a93ee6c4
user2用户可以将user1用户创建的instance删除,因为这个instance在tenant1中。当然,对于tenant1内的资源,user2用户也必须用tenant1内的身份去访问,这就是我们在上边的命令中定义--os_tenant_name为tenant1的原因。
--------------------------------------------------------------------------------------------------------------------------------------- 复制代码
+----------------------------------+-------+----------+
| id | name | enabled |
+----------------------------------+-------+----------+
| 2395953419144b67955ac4bab96b8fd2 | acme | True |
+----------------------------------+-------+----------+$ keystone user-role-add \
--user=96a6ebba0d4c441887aceaeced892585 \
--role=f8dd5a2e4dc64a41b96add562d9a764e \
--tenant_id=2395953419144b67955ac4bab96b8fd2 复制代码
tenant详细操作可以参考:openstack之tenant介绍
一个用户可以在不同的租户中被分配不同的角色,例如Alice也可以在Cyberdyne租户中用户admin角色。一个用户也可以在同一个租户中分配多个角色。
/etc/[服务代码名称]/policy.json控制着哪些用户可以拥有什么样的服务,如:/etc/nova/policy.json定义了Compute服务的访问策略,/etc/glance/policy.json定义Image服务的访问策略,以及/etc/keystone/policy.json定义Identity服务的访问策略。
Compute,Identity,Image服务的默认policy.json文件仅识别admin角色:所有的操作无需admin角色即可被租户中拥有任何角色的用户均可以访问。
如果你希望限制用户在Compute服务中所执行的操作,你需要在Identity服务中创建一个角色并修改/etc/nova/policy.json,实现仅提供该角色才可以执行Compute操作。
实例,以下在/etc/nova/policy.json中的配置设定卷创建的操作对用户无任何限制,在租户中的用户用户任何角色均可以创建卷。复制代码
如果你需要仅拥有compute-user角色的用户才可以创建卷,你就需要添加一行”role:compute-user”,具体配置如下:"volume:create": ["role:compute-user"], 复制代码
如我们需要对所有Compute服务的请求均需要指定的角色,你的配置文件应该作类似于如下这样的配置:{
"admin_or_owner": [["role:admin"], ["project_id:%(project_id)s"]],
"default": [["rule:admin_or_owner"]],
"compute:create": ["role":"compute-user"],
"compute:create:attach_network": ["role":"compute-user"],
"compute:create:attach_volume": ["role":"compute-user"],
"compute:get_all": ["role":"compute-user"],
"admin_api": [["role:admin"]],
"compute_extension:accounts": [["rule:admin_api"]],
"compute_extension:admin_actions": [["rule:admin_api"]],
"compute_extension:admin_actions:pause": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:unpause": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:suspend": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:resume": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:lock": [["rule:admin_api"]],
"compute_extension:admin_actions:unlock": [["rule:admin_api"]],
"compute_extension:admin_actions:resetNetwork": [["rule:admin_api"]],
"compute_extension:admin_actions:injectNetworkInfo": [["rule:admin_api"]],
"compute_extension:admin_actions:createBackup": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:migrateLive": [["rule:admin_api"]],
"compute_extension:admin_actions:migrate": [["rule:admin_api"]],
"compute_extension:aggregates": [["rule:admin_api"]],
"compute_extension:certificates": ["role":"compute-user"],
"compute_extension:cloudpipe": [["rule:admin_api"]],
"compute_extension:console_output": ["role":"compute-user"],
"compute_extension:consoles": ["role":"compute-user"],
"compute_extension:createserverext": ["role":"compute-user"],
"compute_extension:deferred_delete": ["role":"compute-user"],
"compute_extension:disk_config": ["role":"compute-user"],
"compute_extension:extended_server_attributes": [["rule:admin_api"]],
"compute_extension:extended_status": ["role":"compute-user"],
"compute_extension:flavorextradata": ["role":"compute-user"],
"compute_extension:flavorextraspecs": ["role":"compute-user"],
"compute_extension:flavormanage": [["rule:admin_api"]],
"compute_extension:floating_ip_dns": ["role":"compute-user"],
"compute_extension:floating_ip_pools": ["role":"compute-user"],
"compute_extension:floating_ips": ["role":"compute-user"],
"compute_extension:hosts": [["rule:admin_api"]],
"compute_extension:keypairs": ["role":"compute-user"],
"compute_extension:multinic": ["role":"compute-user"],
"compute_extension:networks": [["rule:admin_api"]],
"compute_extension:quotas": ["role":"compute-user"],
"compute_extension:rescue": ["role":"compute-user"],
"compute_extension:security_groups": ["role":"compute-user"],
"compute_extension:server_action_list": [["rule:admin_api"]],
"compute_extension:server_diagnostics": [["rule:admin_api"]],
"compute_extension:simple_tenant_usage:show": [["rule:admin_or_owner"]],
"compute_extension:simple_tenant_usage:list": [["rule:admin_api"]],
"compute_extension:users": [["rule:admin_api"]],
"compute_extension:virtual_interfaces": ["role":"compute-user"],
"compute_extension:virtual_storage_arrays": ["role":"compute-user"],
"compute_extension:volumes": ["role":"compute-user"],
"compute_extension:volumetypes": ["role":"compute-user"],
"volume:create": ["role":"compute-user"],
"volume:get_all": ["role":"compute-user"],
"volume:get_volume_metadata": ["role":"compute-user"],
"volume:get_snapshot": ["role":"compute-user"],
"volume:get_all_snapshots": ["role":"compute-user"],
"network:get_all_networks": ["role":"compute-user"],
"network:get_network": ["role":"compute-user"],
"network:delete_network": ["role":"compute-user"],
"network:disassociate_network": ["role":"compute-user"],
"network:get_vifs_by_instance": ["role":"compute-user"],
"network:allocate_for_instance": ["role":"compute-user"],
"network:deallocate_for_instance": ["role":"compute-user"],
"network:validate_networks": ["role":"compute-user"],
"network:get_instance_uuids_by_ip_filter": ["role":"compute-user"],
"network:get_floating_ip": ["role":"compute-user"],
"network:get_floating_ip_pools": ["role":"compute-user"],
"network:get_floating_ip_by_address": ["role":"compute-user"],
"network:get_floating_ips_by_project": ["role":"compute-user"],
"network:get_floating_ips_by_fixed_address": ["role":"compute-user"],
"network:allocate_floating_ip": ["role":"compute-user"],
"network:deallocate_floating_ip": ["role":"compute-user"],
"network:associate_floating_ip": ["role":"compute-user"],
"network:disassociate_floating_ip": ["role":"compute-user"],
"network:get_fixed_ip": ["role":"compute-user"],
"network:add_fixed_ip_to_instance": ["role":"compute-user"],
"network:remove_fixed_ip_from_instance": ["role":"compute-user"],
"network:add_network_to_project": ["role":"compute-user"],
"network:get_instance_nw_info": ["role":"compute-user"],
"network:get_dns_domains": ["role":"compute-user"],
"network:add_dns_entry": ["role":"compute-user"],
"network:modify_dns_entry": ["role":"compute-user"],
"network:delete_dns_entry": ["role":"compute-user"],
"network:get_dns_entries_by_address": ["role":"compute-user"],
"network:get_dns_entries_by_name": ["role":"compute-user"],
"network:create_private_dns_domain": ["role":"compute-user"],
"network:create_public_dns_domain": ["role":"compute-user"],
"network:delete_dns_domain": ["role":"compute-user"]
} 复制代码
1.2 服务管理
服务管理有两个主要的概念:
服务
终端
Identity服务同时维护着一份与各个服务相同的用户(如:Compute服务有一个对应的用户名nova),以及一个名为service的特殊服务租户。
来自群组: openstack技术组