本文內(nèi)容屬于個人原創(chuàng),轉(zhuǎn)載務(wù)必注明出處:
? http://www.cnblogs.com/Security-Darren/p/4138945.html
考慮到Keystone社區(qū)逐漸棄用第二版身份API, 而Keystone原有的客戶端keystoneclient將不會在命令行工具上支持Keystone第三版API, 我們有必要了解項目openstackclient及其使用, 這里我們主要探討如何使用openstackclient調(diào)用第三版Keystone身份API.
openstackclient旨在整合現(xiàn)有的各個OpenStack服務(wù)客戶端工具, 提供一個統(tǒng)一的命令行接口, 這個項目處于不斷的完善中, 但目前已發(fā)布的版本對Keystone第三版身份API已經(jīng)有比較好的支持, 這里我們主要介紹該命令行工具如何操作和管理OpenStack系統(tǒng)中與Keystone相關(guān)的內(nèi)容.
OpenStack中涉及到的身份管理概念如下, 這些實體都可以由openstackclient提供的命令行工具進行操作.
*本文僅探討如何使用openstackclient操作OpenStack中的身份實體. 如果想要全面了解項目"python-openstackclient", 請移步 這里 .
?
OpenStack身份管理概念
項目域 (domain): 一組項目.
用戶組 (group): 一組用戶.
項目 (project): 一組虛擬資源的所有者.
角色 (role): 一個幫助實現(xiàn)授權(quán)的策略對象.
用戶 (user): 使用云資源的個體.
令牌 (token): 決定能否訪問的的一段特殊文字.
策略 (policy): 決定授權(quán)與訪問控制的策略.
服務(wù) (service):一個云服務(wù).
端點 (endpoint): 用于訪問一個具體云服務(wù)的URL.
地理域 (region): 一些物理機的組合.
消費者 (consumer): 基于OAuth的被授權(quán)人.
請求令牌 (request token): 臨時的OAuth令牌.
訪問令牌 (access token): 長期的OAuth令牌.
憑證 (credential): 針對于身份提供方的憑證.
身份提供方 (identity provider): 一個提供用戶來源和身份認(rèn)證的機構(gòu).
結(jié)盟協(xié)議 (federation protocol):??
映射 (mapping):
openstackclient的全局選項
(選項后的 "ENV" 表示這個選項可以設(shè)置為系統(tǒng)的環(huán)境變量, 環(huán)境變量的名稱就是將選項前的"--"去除, 所有字母轉(zhuǎn)為大寫并將用于連接的"-"改成下劃線"_", 比如"--os-auth-url"對應(yīng)的環(huán)境變量名為"OS_AUTH_URL")
? | 對應(yīng)的環(huán)境變量 | 默認(rèn)值 | 可選值 | 作用 |
--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 | ? | ? | 設(shè)置登陸的scope為某個poject,僅用project ID就足以唯一確定project |
--os-project-name <auth-project-name> | OS_PROJECT_NAME | ? | ? | 設(shè)置登陸的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 | ? | ? | 設(shè)置登陸的scope為某個domain,僅用domain名就可以唯一確定domain |
--os-domain-id <auth-domain-id> | OS_DOMAIN_ID | ? | ? | 設(shè)置登陸的scope為某個domain,僅用domain ID也可以唯一確定domain |
--os-auth-url <auth-auth-url> | OS_AUTH_URL | ? | ? | 使用用戶名+密碼登陸方式時,通過該選項指定要認(rèn)證的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雖然能夠提供更多更一致的操作,僅僅登陸就需要多個選項進行設(shè)定,如果不能理解每個選項的含義,是無法正確登陸openstack,也無法正常使用的。在Keystone v3 Identity API中,以下概念的命名空間能夠幫助我們理解登陸時各個選項的含義:
1. domain:命名空間是整個keystone,因此一個domain的name和ID都能唯一確定某個domain;
2. user:命名空間是某個domain,因此一個user的name無法唯一確定某個user,必須結(jié)合他所在的domain才行;而user ID卻能唯一確定某個用戶;
3. project:命名空間是某個domain,因此name和ID的作用同user。
?
此外Keystone?v3 Identity API允許用戶選擇某一次登陸時獲取令牌限定的范圍(scope),scope可以是domain, project, trust和沒有;如果用戶登陸時沒有指定scope,那么又視用戶是否具有default_project_id這個屬性,要么用戶此次會話被綁定到默認(rèn)的project,或者此次會話沒有綁定任何scope(unscoped)。
因此回頭查看openstack命令登陸時的選項,關(guān)鍵是通過? --os-auth-type ?選擇自己需要的認(rèn)證方式,比如選擇? v3password ?后,需要提供自己的用戶名和密碼,此時需要明確由于命名空間的原因,僅僅提供自己的用戶名是無法通過Keystone的認(rèn)證的,所以就可能需要? --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文件中設(shè)置的“admin_token”來登陸,獲取系統(tǒng)的最高權(quán)限
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的地址。
另一方面,如果繼續(xù)使用Keystone?v2 Identity API,需要將? --os-identity-api-version ?的值設(shè)置為2,同時? --os-url ?設(shè)為http://127.0.0.1:35357/v2.0,盡管都是作為系統(tǒng)的初始化用戶登陸,但是如果指定的API版本不同,進入到openstackclient交互空間后,可以看到的操作不同,第二版的Keystone API不存在多domain的概念,也無法執(zhí)行一些第三版Keystone API才有的CLI命令。
例如,使用admin_token訪問第三版Keystone API,查看能對role執(zhí)行的操作:
(.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執(zhí)行的操作:
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不能執(zhí)行一些第三版Keystone API的很多功能,而且由于社區(qū)已經(jīng)逐漸棄用第二版Keystone API,我們將關(guān)注第三版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上必須已經(jīng)被授予了某個role,而且這個role具有執(zhí)行一些命令一些權(quán)限,才能執(zhí)行后續(xù)的操作,否則用戶無法在openstackclient的交互空間執(zhí)行命令。
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.?創(chuàng)建一個新的管理domain,作為云服務(wù)提供商所在的domain,其他的domain視為租戶。為了向后兼容,所有使用第二版Keystone API的對象都屬于ID為"default"的domain,第三版Keystone API則沒有這個限制;
3.?在這個管理domain里面添加用戶(組)、角色、項目等,為用戶授予管理員角色(可以綁定到domain、project或group),記錄下這個管理domain的ID;
4. 退出當(dāng)前的會話,修改默認(rèn)的policy.v3cloudsample.json文件,將規(guī)則:
" cloud_admin " : " rule:admin_required and domain_id:REPLACE_ADMIN_DOMAIN_HERE "
?
中"domain_id"后面的值替換成實際創(chuàng)建的管理domain的ID,
5. 修改keystone.conf文件,將policy_file設(shè)置為policy.v3cloudsample.json的路徑,然后重啟Keystone;
6. 使用openstackclient,采用上面例2中將會話scope綁定為domain的方式登陸,然后就可以作為云管理員操作了。注意能夠以綁定到domain的形式進行操作的前提是用戶具有domain級的role,否則即使進入openstackclient的交互空間,也無法執(zhí)行操作;
7. 下面可以從keystone.conf中注釋掉"admin_token",并從keystone-paste.ini文件的Paste pipeline中移除過濾器admin_token_auth,這樣,以后就不能使用初始化系統(tǒng)的“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)相關(guān)操作
創(chuàng)建消費者
consumer create
[
--description <consumer-description>]
?
刪除消費者
consumer delete
<consumer>
?
更新消費者
consumer set [ --description <new-consumer-description> ] <consumer>
?
查看單個消費者明細(xì)
consumer show
<consumer>
?
列出所有消費者
consumer list
二. 憑證(credential)相關(guān)操作
創(chuàng)建憑證
credential create [ --type <type> ] [ --project <project> ] <user> <data>
?
刪除憑證
credential delete <credential- id >
?
更新憑證
credential set [ --user <user> ] [ --type <type> ] [ --data <data> ] [ --project <project> ] <credential- id >
?
查看單個憑證明細(xì)
credential show <credential- id >
?
列出所有憑證 ??
credential list
三. 域(domain)相關(guān)的操作
創(chuàng)建域
domain create [ --description <domain-description> ] [ --enable | -- disable] <domain-name>
?
刪除域
domain delete
<domain>
?
?更新域
domain set [ --name <new-domain-name> ] [ --description <domain-description> ] [ --enable | -- disable] <domain>
?
查看單個域明細(xì)
domain show
<domain>
?
列出所有域
domain list
?
四. 端點(endpoint )相關(guān)的操作
創(chuàng)建端點
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> ?
?
查看單個端點明細(xì)
endpoint show
<endpoint>
?
列出所有端點
endpoint list
?
五. 結(jié)盟協(xié)議(federation protocol )相關(guān)操作
創(chuàng)建結(jié)盟協(xié)議
federation protocol create [ --identity-provider <identity-provider> ] [ --mapping <mapping> ] <name>
?
刪除結(jié)盟協(xié)議
federation protocol delete [ --identity-provider <identity-provider> ] <name>
?
列出所有結(jié)盟協(xié)議
federation protocol list
[
--identity-provider <identity-provider>]
?
更新結(jié)盟協(xié)議
federation protocol set [ --identity-provider <identity-provider> ] [ --mapping <mapping> ] <name>
?
查看單個結(jié)盟協(xié)議明細(xì)
federation protocol show [ --identity-provider <identity-provider> ] <name>
?
列出已結(jié)盟的域
federation domain list
?
列出已結(jié)盟的項目?? ??? ?
federation project list
?
六. 用戶組(group )相關(guān)的操作
為用戶組添加用戶
group add user
<group>
<user>
?
驗證用戶組是否包含某個用戶
group contains user
<group>
<user>
?
創(chuàng)建用戶組
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>
?
查看單個用戶組明細(xì)
group show
<group>
?
七. 身份提供方(identity provider )相關(guān)的操作
創(chuàng)建身份提供方
identity provider create [ --description <description> ] [ --enable | -- disable] <identity-provider- id >
?
刪除身份提供方
identity provider delete <identity-provider- id >
?
更新身份提供方
identity provider set [ --enable | -- disable] <identity-provider- id >
?
查看單個身份提供方明細(xì)
identity provider show <identity-provider- id >
列出所有身份提供方
identity provider list
?
八. 映射(mapping )相關(guān)操作
創(chuàng)建映射
mapping create [ --rules <rules> ] <name>
?
刪除映射
mapping delete
<name>
?
更新映射
mapping set [ --rules <rules> ] <name>
?
查看單個映射明細(xì)
mapping show
<name>
?
列出所有映射
mapping list
?
九. 策略(policy )相關(guān)操作
創(chuàng)建策略
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 >
?
查看單個策略明細(xì)
policy show <policy- id >
?
十. 項目(project )相關(guān)操作
創(chuàng)建項目
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
?
查看單個項目明細(xì)
project show
<project>
?
十一. 物理域(region )相關(guān)操作
創(chuàng)建物理域
region create [ --parent-region <parent-region> ] [ --description <region-description> ] [ --url <region-url> ] <region-id>
?
列出所有物理域
region list
[
--parent-region <parent-region>]
?
刪除某個物理域
region delete
<region-id>
?
查看某個物理域明細(xì)
region show
<region-id>
?
更新物理域
region set [ --parent-region <parent-region> ] [ --description <region-description> ] [ --url <region-url> ] <region>
十二. 角色(role)相關(guān)的操作
創(chuàng)建角色
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>
?
查看單個角色明細(xì)
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
?
十三. 服務(wù)(service )相關(guān)操作
創(chuàng)建服務(wù)
service create [ --name <service-name> ] [ --enable | -- disable] <service-type>
?
刪除服務(wù)
service delete <service>
<service> -- Service to delete (type or ID)
?
列出所有服務(wù)
service list
?
更新服務(wù)
service set [ --type <service-type> ] [ --name <service-name> ] [ --enable | -- disable] <service>
?
查看單個服務(wù)明細(xì)
service show
<service>
?
十四. 用戶(user )相關(guān)操作
創(chuàng)建用戶
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>
?
修改當(dāng)前用戶密碼
user password set
[
--password <password>]
?
查看單個用戶明細(xì)
user show [ --domain <domain> ] <user>
?
十五. oauth相關(guān)操作
授權(quán)請求令牌
request token authorize [ --request-key <request-key> ] [ --role-ids <role-ids>]
?
創(chuàng)建請求令牌 ? ?
request token create [ --consumer-key <request-key> ] [ --consumer-secret <consumer-secret> ] --project- id <project- id >
創(chuàng)建訪問令牌
access token create [ --consumer-key <consumer-key> ] [ --consumer-secret <consumer-secret> ] [ --request-key <request-key> ] [ --request-secret <request-secret> ] [ --verifier <verifier>]
?
簽發(fā)令牌
token issue
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
