使用openstackclient调用Keystone v3 API
本文内容属于个人原创,转载务必注明出处:
http://www.cnblogs.com/Security-Darren/p/4138945.html
考虑到Keystone社区逐渐弃用第二版身份API, 而Keystone原有的客户端keystoneclient将不会在命令行工具上支持Keystone第三版API, 我们有必要了解项目openstackclient及其使用, 这里我们主要探讨如何使用openstackclient调用第三版Keystone身份API.
openstackclient旨在整合现有的各个OpenStack服务客户端工具, 提供一个统一的命令行接口, 这个项目处于不断的完善中, 但目前已发布的版本对Keystone第三版身份API已经有比较好的支持, 这里我们主要介绍该命令行工具如何操作和管理OpenStack系统中与Keystone相关的内容.
OpenStack中涉及到的身份管理概念如下, 这些实体都可以由openstackclient提供的命令行工具进行操作.
*本文仅探讨如何使用openstackclient操作OpenStack中的身份实体. 如果想要全面了解项目"python-openstackclient", 请移步这里.
OpenStack身份管理概念
项目域 (domain): 一组项目.
用户组 (group): 一组用户.
项目 (project): 一组虚拟资源的所有者.
角色 (role): 一个帮助实现授权的策略对象.
用户 (user): 使用云资源的个体.
令牌 (token): 决定能否访问的的一段特殊文字.
策略 (policy): 决定授权与访问控制的策略.
服务 (service):一个云服务.
端点 (endpoint): 用于访问一个具体云服务的URL.
地理域 (region): 一些物理机的组合.
消费者 (consumer): 基于OAuth的被授权人.
请求令牌 (request token): 临时的OAuth令牌.
访问令牌 (access token): 长期的OAuth令牌.
凭证 (credential): 针对于身份提供方的凭证.
身份提供方 (identity provider): 一个提供用户来源和身份认证的机构.
结盟协议 (federation protocol):
映射 (mapping):
openstackclient的全局选项(选项后的 "ENV" 表示这个选项可以设置为系统的环境变量, 环境变量的名称就是将选项前的"--"去除, 所有字母转为大写并将用于连接的"-"改成下划线"_", 比如"--os-auth-url"对应的环境变量名为"OS_AUTH_URL")
对应的环境变量 | 默认值 | 可选值 | 作用 | |
--version | ||||
-h, --help | ||||
--debug | ||||
--quiet, -q | ||||
--verbose | ||||
--log-file <file-name> | ||||
--os-cloud <cloud-config-name> | Env: OS_CLOUD | |||
--os-region-name <region> | Env: OS_REGION_NAME | |||
--os-cacert <file> | ||||
--verify | ||||
--insecure | ||||
--os-default-domain <auth-domain> | OS_DEFAULT_DOMAIN | |||
--timing | ||||
--os-compute-api-version <compute-api-version> | OS_COMPUTE_API_VERSION | 2 | ||
--os-network-api-version <network-api-version> | OS_NETWORK_API_VERSION | 2 | ||
--os-image-api-version <image-api-version> | OS_IMAGE_API_VERSION | 1 | ||
--os-volume-api-version <volume-api-version> | OS_VOLUME_API_VERSION | 1 | ||
--os-identity-api-version <identity-api-version> | OS_IDENTITY_API_VERSION | 2 | ||
--os-object-api-version <object-api-version> | OS_OBJECT_API_VERSION | 1 | ||
--os-auth-type <auth-type> | OS_AUTH_TYPE |
v2token, v2password, v3password, v3scopedsaml, v3unscopedadfs, token, v3token, password, v3unscopedsaml, osc_password, token_endpoint |
||
--os-user-id <auth-user-id> | OS_USER_ID | 登陆用户ID,仅用用户ID足以唯一确定用户 | ||
--os-username <auth-username> | OS_USERNAME | 登陆用户名,仅用用户名无法唯一确定用户 | ||
--os-user-domain-name <auth-user-domain-name> | OS_USER_DOMAIN_NAME | 限定用户所在的domain | ||
--os-user-domain-id <auth-user-domain-id> | OS_USER_DOMAIN_ID | 限定用户所在的domain | ||
--os-password <auth-password> | OS_PASSWORD | 用户的登陆密码 | ||
--os-project-id <auth-project-id> | OS_PROJECT_ID | 设置登陆的scope为某个poject,仅用project ID就足以唯一确定project | ||
--os-project-name <auth-project-name> | OS_PROJECT_NAME | 设置登陆的scope为某个poject,仅用project名无法唯一确定project | ||
--os-project-domain-name <auth-project-domain-name> | OS_PROJECT_DOMAIN_NAME | 限定project所在的domain | ||
--os-project-domain-id <auth-project-domain-id> | OS_PROJECT_DOMAIN_ID | 限定project所在的domain | ||
--os-domain-name <auth-domain-name> | OS_DOMAIN_NAME | 设置登陆的scope为某个domain,仅用domain名就可以唯一确定domain | ||
--os-domain-id <auth-domain-id> | OS_DOMAIN_ID | 设置登陆的scope为某个domain,仅用domain ID也可以唯一确定domain | ||
--os-auth-url <auth-auth-url> | OS_AUTH_URL | 使用用户名+密码登陆方式时,通过该选项指定要认证的Keystone端点 | ||
--os-token <auth-token> | OS_TOKEN | |||
--os-url <auth-url> | OS_URL | |||
--os-endpoint <auth-endpoint> | OS_ENDPOINT | |||
--os-identity-provider-url <auth-identity-provider-url> | OS_IDENTITY_PROVIDER_URL | |||
--os-service-provider-endpoint <auth-service-provider-endpoint> | OS_SERVICE_PROVIDER_ENDPOINT | |||
--os-identity-provider <auth-identity-provider> | OS_IDENTITY_PROVIDER | |||
--os-trust-id <auth-trust-id> | OS_TRUST_ID |
使用openstackclient虽然能够提供更多更一致的操作,仅仅登陆就需要多个选项进行设定,如果不能理解每个选项的含义,是无法正确登陆openstack,也无法正常使用的。在Keystone v3 Identity API中,以下概念的命名空间能够帮助我们理解登陆时各个选项的含义:
1. domain:命名空间是整个keystone,因此一个domain的name和ID都能唯一确定某个domain;
2. user:命名空间是某个domain,因此一个user的name无法唯一确定某个user,必须结合他所在的domain才行;而user ID却能唯一确定某个用户;
3. project:命名空间是某个domain,因此name和ID的作用同user。
此外Keystone v3 Identity API允许用户选择某一次登陆时获取令牌限定的范围(scope),scope可以是domain, project, trust和没有;如果用户登陆时没有指定scope,那么又视用户是否具有default_project_id这个属性,要么用户此次会话被绑定到默认的project,或者此次会话没有绑定任何scope(unscoped)。
因此回头查看openstack命令登陆时的选项,关键是通过 --os-auth-type 选择自己需要的认证方式,比如选择 v3password 后,需要提供自己的用户名和密码,此时需要明确由于命名空间的原因,仅仅提供自己的用户名是无法通过Keystone的认证的,所以就可能需要 --os-user-domain-id 或 --os-user-domain-name 来唯一地告诉Keystone自己到底是哪个用户。
然后就是确定自己这次会话要确定的scope,可以是domain, 也可以是project,需要通过 --os-project-id 、 --os-project-name 或者 --os-domain-name 、 --os-domain-id 来告诉Keystone此次会话要绑定的scope。这时又要注意,由于project的命名空间是某个domain,因此如果使用 --os-project-name 来确定scope,那么还要通过 --os-project-domain-name或 --os-project-domain-id 来唯一确定这个project。
下面给出几个使用openstackclient登陆openstack的例子,
1. 使用keystone.conf文件中设置的“admin_token”来登陆,获取系统的最高权限
openstack \ --os-identity-api-version 3 \ --os-auth-type token_endpoint \ --os-token ADMIN \ --os-url http://127.0.0.1:35357/v3
注意这次会话将使用的是Keystone v3 Identity API,可见keystone.conf的“admin_token”便于初始化Keystone,有趣的是,尽管 --os-auth-type 选择的是“token_endpoint”,却不能使用 --os-endpoint 来指定Keystone的地址。
另一方面,如果继续使用Keystone v2 Identity API,需要将 --os-identity-api-version 的值设置为2,同时 --os-url 设为http://127.0.0.1:35357/v2.0,尽管都是作为系统的初始化用户登陆,但是如果指定的API版本不同,进入到openstackclient交互空间后,可以看到的操作不同,第二版的Keystone API不存在多domain的概念,也无法执行一些第三版Keystone API才有的CLI命令。
例如,使用admin_token访问第三版Keystone API,查看能对role执行的操作:
(.venv)root@os-VirtualBox:/opt/keystone# openstack \ > --os-identity-api-version 3 \ > --os-auth-type token_endpoint \ > --os-token ADMIN \ > --os-url http://127.0.0.1:35357/v3 (openstack) help role Command "role" matches: role remove role create role delete role add role list role assignment list role set role show
类似地,使用admin_token访问第二版Keystone API,同样查看能对role执行的操作:
openstack \ --os-identity-api-version 2 \ --os-auth-type token_endpoint \ --os-token ADMIN \ --os-url http://127.0.0.1:35357/v2.0 (openstack) help role Command "role" matches: role remove role create role delete role list role add role show
类似地,可以看到,第二版Keystone API不能执行一些第三版Keystone API的很多功能,而且由于社区已经逐渐弃用第二版Keystone API,我们将关注第三版Keystone API的功能。
2. 使用用户名+密码登陆,scope限定为某个domain
openstack \ --os-identity-api-version 3 \ --os-auth-type v3password \ --os-username darren \ --os-password 123456 \ --os-user-domain-id default \ --os-domain-id default \ --os-auth-url http://127.0.0.1:5000/v3
scope限定为某个domain时,用户在该domain上必须已经被授予了某个role,而且这个role具有执行一些命令一些权限,才能执行后续的操作,否则用户无法在openstackclient的交互空间执行命令。
3. 使用用户名+密码登陆,scope限定为某个project
openstack \ --os-identity-api-version 3 \ --os-auth-type v3password \ --os-username darren \ --os-password 123465 \ --os-user-domain-id default \ --os-project-name darren \ --os-project-domain-id default \ --os-auth-url http://127.0.0.1:5000/v3
使用openstackclient初始化Keystone
使用openstackclient的一个问题是如何初始化整个Keystone,我们可以通过:
1. 采用上面例1中的admin_token方式登陆,完成下面2、 3的初始化;
2. 创建一个新的管理domain,作为云服务提供商所在的domain,其他的domain视为租户。为了向后兼容,所有使用第二版Keystone API的对象都属于ID为"default"的domain,第三版Keystone API则没有这个限制;
3. 在这个管理domain里面添加用户(组)、角色、项目等,为用户授予管理员角色(可以绑定到domain、project或group),记录下这个管理domain的ID;
4. 退出当前的会话,修改默认的policy.v3cloudsample.json文件,将规则:
"cloud_admin": "rule:admin_required and domain_id:REPLACE_ADMIN_DOMAIN_HERE"
中"domain_id"后面的值替换成实际创建的管理domain的ID,
5. 修改keystone.conf文件,将policy_file设置为policy.v3cloudsample.json的路径,然后重启Keystone;
6. 使用openstackclient,采用上面例2中将会话scope绑定为domain的方式登陆,然后就可以作为云管理员操作了。注意能够以绑定到domain的形式进行操作的前提是用户具有domain级的role,否则即使进入openstackclient的交互空间,也无法执行操作;
7. 下面可以从keystone.conf中注释掉"admin_token",并从keystone-paste.ini文件的Paste pipeline中移除过滤器admin_token_auth,这样,以后就不能使用初始化系统的“admin_token”登陆了:
[pipeline:api_v3] pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension endpoint_policy_extension service_v3
改为
[pipeline:api_v3] pipeline = sizelimit url_normalize request_id build_auth_context token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension endpoint_policy_extension service_v3
openstackclient Keystone v3 API--基于1.1.0版openstackclient
概念 | 操作 | 功能 |
access token | create | oauth1 |
catalog | list, show | |
consumer | create, list, set, delete, show | oauth1 |
credential | create, list, set, delete, show | |
domain | create, list, set, delete, show | |
endpoint | create, list, set, delete, show | |
federation project | list | federation |
federation domain | list | federation |
federation protocol | create, list, set, delete, show | federation |
group |
create, list, set, delete, show add user, remove user, contains user |
|
identity provider | create, list, set, delete, show | federation |
mapping | create, list, set, delete, show | |
policy | create, list, set, delete, show | |
project | create, list, set, delete, show | |
region | create, list, set, delete, show | |
request token | authorize, create | oauth1 |
role | create, list, set, delete, show, add, remove | |
role assignment | list | |
service | create, list, set, delete, show | |
token | issue | |
trust | create, list, delete, show | |
user password | set | |
user | create, list, set, delete, show |
一. 消费者(consumer)相关操作
创建消费者
consumer create
[--description <consumer-description>]
删除消费者
consumer delete
<consumer>
更新消费者
consumer set [--description <new-consumer-description>] <consumer>
查看单个消费者明细
consumer show
<consumer>
列出所有消费者
consumer list
二. 凭证(credential)相关操作
创建凭证
credential create [--type <type>] [--project <project>] <user> <data>
删除凭证
credential delete <credential-id>
更新凭证
credential set [--user <user>] [--type <type>] [--data <data>] [--project <project>] <credential-id>
查看单个凭证明细
credential show <credential-id>
列出所有凭证
credential list
三. 域(domain)相关的操作
创建域
domain create [--description <domain-description>] [--enable | --disable] <domain-name>
删除域
domain delete
<domain>
更新域
domain set [--name <new-domain-name>] [--description <domain-description>] [--enable | --disable] <domain>
查看单个域明细
domain show
<domain>
列出所有域
domain list
四. 端点(endpoint )相关的操作
创建端点
endpoint create [--region <region>] [--enable | --disable] <service> <interface> <url>
删除断点
endpoint delete
<endpoint>
更新端点
endpoint set [--interface <interface>] [--url <url>] [--service <service>] [--region <region>] [--enable | --disable] <endpoint>
查看单个端点明细
endpoint show
<endpoint>
列出所有端点
endpoint list
五. 结盟协议(federation protocol )相关操作
创建结盟协议
federation protocol create [--identity-provider <identity-provider>] [--mapping <mapping>] <name>
删除结盟协议
federation protocol delete [--identity-provider <identity-provider>] <name>
列出所有结盟协议
federation protocol list
[--identity-provider <identity-provider>]
更新结盟协议
federation protocol set [--identity-provider <identity-provider>] [--mapping <mapping>] <name>
查看单个结盟协议明细
federation protocol show [--identity-provider <identity-provider>] <name>
列出已结盟的域
federation domain list
列出已结盟的项目
federation project list
六. 用户组(group )相关的操作
为用户组添加用户
group add user
<group>
<user>
验证用户组是否包含某个用户
group contains user
<group>
<user>
创建用户组
group create [--domain <group-domain>] <group-name>
删除用户组
group delete
[--domain <domain>]
<group> [<group> ...]
列出所有用户组
group list [--domain <domain>] [--user <user>]
从用户组种删除用户
group remove user
<group>
<user>
更新用户组
group set [--name <new-group-name>] [--domain <group-domain>] [--description <group-description>] <group>
查看单个用户组明细
group show
<group>
七. 身份提供方(identity provider )相关的操作
创建身份提供方
identity provider create [--description <description>] [--enable | --disable] <identity-provider-id>
删除身份提供方
identity provider delete <identity-provider-id>
更新身份提供方
identity provider set [--enable | --disable] <identity-provider-id>
查看单个身份提供方明细
identity provider show <identity-provider-id>
列出所有身份提供方
identity provider list
八. 映射(mapping )相关操作
创建映射
mapping create [--rules <rules>] <name>
删除映射
mapping delete
<name>
更新映射
mapping set [--rules <rules>] <name>
查看单个映射明细
mapping show
<name>
列出所有映射
mapping list
九. 策略(policy )相关操作
创建策略
policy create [--type <policy-type>] <blob-file>
删除策略
policy delete <policy-id>
列出所有策略
policy list
[--include-blob]
更新策略
policy set [--type <policy-type>] [--blob-file <blob_file>] <policy-id>
查看单个策略明细
policy show <policy-id>
十. 项目(project )相关操作
创建项目
project create [--domain <project-domain>] [--description <project-description>] [--enable | --disable] [--property <key=value>] <project-name>
删除项目
project delete
<project>
列出所有项目
project list [--long] [--domain <project-domain>]
更新项目
project set [--name <new-project-name>] [--domain <project-domain>] [--description <project-description>] [--enable | --disable] [--property <key=value>] <project>
列出所有项目
project usage list
查看单个项目明细
project show
<project>
十一. 物理域(region )相关操作
创建物理域
region create [--parent-region <parent-region>] [--description <region-description>] [--url <region-url>] <region-id>
列出所有物理域
region list
[--parent-region <parent-region>]
删除某个物理域
region delete
<region-id>
查看某个物理域明细
region show
<region-id>
更新物理域
region set [--parent-region <parent-region>] [--description <region-description>] [--url <region-url>] <region>
十二. 角色(role)相关的操作
创建角色
role create
<role-name>
删除角色
role delete
<role> [<role> ...]
列出所有角色
role list [--domain <domain> | --project <project>] [--user <user> | --group <group>]
更新角色
role set [--name <new-role-name>] <role>
查看单个角色明细
role show
<role>
授予用户角色
role add
[--user <user> | --group <group>]
[--domain <domain> | --project <project>]
<role>
撤销用户角色
role remove
[--domain <domain> | --project <project>]
[--user <user> | --group <group>]
<role>
列出所有角色授予记录
role assignment list [--effective] [--role <role>] [--user <user> | --group <group>] [--domain <domain> | --project <project>]
其中
--effective 只返回 effective role assignments
十三. 服务(service )相关操作
创建服务
service create [--name <service-name>] [--enable | --disable] <service-type>
删除服务
service delete <service>
<service> -- Service to delete (type or ID)
列出所有服务
service list
更新服务
service set [--type <service-type>] [--name <service-name>] [--enable | --disable] <service>
查看单个服务明细
service show
<service>
十四. 用户(user )相关操作
创建用户
user create [--password <user-password>] [--project <project>] [--domain <domain>] [--enable | --disable] <user-name>
删除用户
user delete
[--domain <domain>]
<user> [<user> ...]
列出所有用户
user list [--domain <domain>] [--group <group> | --project <project>] [--long]
更新用户
user set [--name <new-user-name>] [--password <user-password>] [--password-prompt] [--email <user-email>] [--domain <domain>] [--project <project>] [--description <description>] [--enable | --disable] <user>
修改当前用户密码
user password set
[--password <password>]
查看单个用户明细
user show [--domain <domain>] <user>
十五. oauth相关操作
授权请求令牌
request token authorize [--request-key <request-key>] [--role-ids <role-ids>]
创建请求令牌
request token create [--consumer-key <request-key>] [--consumer-secret <consumer-secret>] --project-id <project-id>
创建访问令牌
access token create [--consumer-key <consumer-key>] [--consumer-secret <consumer-secret>] [--request-key <request-key>] [--request-secret <request-secret>] [--verifier <verifier>]
签发令牌
token issue