本文内容属于个人原创,转载务必注明出处:
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 \
--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 \
> --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 \
--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 \
--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 \
--os-auth-type v3password \
--os-username darren \
--os-password \
--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
使用openstackclient调用Keystone v3 API的更多相关文章
-
OpenStack Keystone v3 API新特性
原连接 http://blog.chinaunix.net/uid-21335514-id-3497996.html keystone的v3 API与v2.0相比有很大的不同,从API的请求格式到re ...
-
OpenStack IdentityService Keystone V3 API Curl实战
v3 API Examples Using Curl <Tokens> 1,Default scope 获取token Get an token with default scope (m ...
-
Keystone V3 API Examples
There are few things more useful than a set of examples when starting to work with a new API. Here a ...
-
[转]OpenStack Keystone V3
Keystone V3 Keystone 中主要涉及到如下几个概念:User.Tenant.Role.Token.下面对这几个概念进行简要说明. User:顾名思义就是使用服务的用户,可以是人.服务或 ...
-
OpenStack Keystone V3 简介
Keystone V3 简介 Keystone 中主要涉及到如下几个概念:User.Tenant.Role.Token.下面对这几个概念进行简要说明. User:顾名思义就是使用服务的用户,可以是人. ...
-
在Keystone V3基础上改进的分布式认证体系
目标 使用java实现keystone v3相关功能与概念: api client authentication service discovery distributed multi-tenant ...
-
C#调用百度地图 api
转 http://blog.csdn.net/kkkkkxiaofei/article/details/8663377 这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不 ...
-
[转]Setting Keystone v3 domains
http://www.florentflament.com/blog/setting-keystone-v3-domains.html The Openstack Identity v3 API, p ...
-
C#调用百度地图API经验分享(四)
这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不能直接复制就运行.在实现之前肯定要加载地图,先放一个webbroser控件,然后如下: private void Form ...
随机推荐
-
用hexdump获取event的输出信息
当我们在调试输入设备时,如:键盘,触摸屏 会使用到hexdump工具.其内容如下: 1. 键盘: # cat /dev/input/event0 | hexdump 0000000 f6a6 4e15 ...
-
Vijos1056 图形面积
描述 桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积. 格式 输入格式 输入第一行为一个数N(1≤N≤100),表示矩形的数量.下面N行,每行四个整数,分别表 ...
-
50个实用的jQuery代码段让你成为更好的Web前端工程师
本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助 ...
-
网络流(最大流) POJ 1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8628 Accepted: 3636 ...
-
ferror,clearerr和EOF含义
1.我们并不是实时操纵文件,也不是实时生效,它依赖于缓冲区.非缓冲模式编程与常规区别,就是实时与不实时的区别. 2.//fgetc fputc, fgets fputs, fgetwc fputwc, ...
-
lr-web services协议
1.web services协议简介 web services协议是建立可交互操作的分布式应用程序的新平台,它通过一系列标准和协议来保证程序之间的动态链接,其中最基本的协议包括soap,wsdl,ud ...
-
java基础题刷题中的知识点复习
将变量转换为字符串方法:(String)待转对象..toString().String.valueOf(待转对象) 对字符串进行操作的方法,使用StringBuffer和StringBuilder定义 ...
-
页面倒计时跳转页面效果,js倒计时效果
页面倒计时跳转页面效果,js倒计时效果 >>>>>>>>>>>>>>>>>>>> ...
-
linux下redis的最佳实践(Master-Slave)
本文演示了redis在同一台linux上的安装及运行多个实例,并演示了主从复制,以及如何进行主从的切换. 1. 下载 $ wget http://download.redis.io/releases/ ...
-
FW 执行Git命令时出现各种 SSL certificate problem 的解决办法
比如我在windows下用Git clone gitURL 就提示 SSL certificate problem: self signed certificate 这种问题,在windows下出现 ...