本文內容屬於個人原創,轉載務必注明出處:
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