一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - OpenStack Mitaka 版本中的 domain 和 admin詳解

OpenStack Mitaka 版本中的 domain 和 admin詳解

2021-01-16 17:16SammyLiu 服務器知識

這篇文章主要介紹了OpenStack Mitaka 版本中的 domain 和 admin詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

openstack 的 keystone v3 中引入了 domain 的概念。引入這個概念后,關于 admin 這個role 的定義就變得復雜了起來。

本文測試環境是社區 mitaka 版本。

1. domain,project,user,role,token 的概念和關系

1.1 概況

簡單來說,

  • domain - 表示 project 和 user 的集合,在公有云或者私有云中常常表示一個客戶
  • group - 一個domain 中的部分用戶的集合
  • project - it基礎設施資源的集合,比如虛機,卷,鏡像等
  • role - 角色,表示一個 user 對一個 project resource 的權限
  • token - 一個 user 對于某個目標(project 或者 domain)的一個有限時間段內的身份令牌

它們之間的關系用一個不完整的圖來表示:

OpenStack Mitaka 版本中的 domain 和 admin詳解

說明:

  1. domain 可以認為是 project,user,group 的 namespace。 一個 domain 內,這些元素的名稱不可以重復,但是在兩個不同的domain內,它們的名稱可以重復。因此,在確定這些元素時,需要同時使用它們的名稱和它們的 domain 的 id 或者 name。

  2. group 是一個 domain 部分 user 的集合,其目的是為了方便分配 role。給一個 group 分配 role,結果會給 group 內的所有 users 分配這個 role。

  3. role 是全局(global)的,因此在一個 keystone 管轄范圍內其名稱必須唯一。role 的名稱沒有意義,其意義在于 policy.json 文件根據 role 的名稱所指定的允許進行的操作。

  4. 簡單地,role 可以只有 admin 和 member 兩個,前者表示管理員,后者表示普通用戶。但是,結合 domain 和 project 的限定,admin 可以分為 cloud admin,domain admin 和 project admin。

  5. policy.json 文件中定義了 role 對某種類型的資源所能進行的操作,比如允許 cloud admin 創建 domain,允許所有用戶創建卷等

  6. project 是資源的集合,其中有一類特殊的project 是 admin project。通過指定 admin_project_domain_name 和 admin_project_name 來確定一個 admin project,然后該project 中的 admin 用戶即是 cloud admin。

  7. token 具有 scope 的概念,分為 unscoped token,domain-scoped token 和 project-scoped token。下文有說明。

1.2 token scope 和 scoped token

官方文檔在這里,我這里寫的只是我的理解。

token 是針對不同 scope 認證狀態,這里的 scope 是指 project 和 domain,因此一共有三種 scoped token:

  1. project-scoped token:針對一個 project 的 token,它包含 service catalog, a set of roles, 和那個 project 的詳細信息

  2. domain-scoped token:針對一個 domain  的 token,它具有有限的使用場景,只用于 domain 層面的操作。與 project-scoped 相比,它只具有優先的 sevice catalog

  3. unscoped token:當既不指定 project 也不指定 domain 為 scope ,同時 user 也沒有 default project 時獲得的 token,這是一種特殊的token。

下文有獲取不同類型 token 的方法的描述。

2. 各種 admin

admin 是一種特別的 role。下面分兩種情況討論。

2.1 使用默認 policy.json 時候的 admin 的權限

2.1.1 identity 資源的 admin 權限

對 identiy 項目中的大多數資源的操作都需要 admin 權限,比如:

?
1
2
3
4
5
"identity:get_user": "rule:admin_required",
"identity:list_users": "rule:admin_required",
"identity:create_user": "rule:admin_required",
"identity:update_user": "rule:admin_required",
"identity:delete_user": "rule:admin_required",

也就是說,以  user 為例,如果一個用戶沒有 admin 角色,那么他將不能對 user 做任何操作。而 policy.json 文件中對 admin 的約束非常簡單:

?
1
"admin_required": "role:admin or is_admin:1",

也就是說,滿足兩個條件中的一個,它就是 administrator:

  1. 他擁有 'admin' 這個 role,而這里的 ‘admin' 是寫死的,因為默認就是使用這個名字,當然你可以修改它,比如創建一個 cloud_admin role,然后修改這里為 role:cloud_admin,其效果是一樣的。

  2. is_admin:1:這個只是在項目啟動后才使用,其判斷條件是操作使用的token 和 keystone.conf 中的 admin_token 相同。

從 policy.json 文件可以看出來,只要賦予一個用戶 admin 角色,那么他就是 administrator 了,可以操作 openstack cloud 內的所有資源。

2.1.2 openstack 基礎設施資源的權限控制

以 cinder 為例,它也使用 policy.json 文件進行 role 的 policy 控制,它區分了 admin,project owner 和普通 user 的權限:

?
1
2
3
4
5
6
7
8
9
10
"context_is_admin": "role:admin",
"admin_or_owner": "is_admin:true or project_id:%(project_id)s",
"default": "rule:admin_or_owner",
"admin_api": "is_admin:true",
 
"volume:create": "",
"volume:delete": "rule:admin_or_owner",
"volume:get": "rule:admin_or_owner",
"volume:get_all": "rule:admin_or_owner",
"volume:get_volume_metadata": "rule:admin_or_owner",

可見:

  1. 創建 volume:不限特定權限,只要是 user 角色就行

  2. 刪除 volume,獲取所有volumes:需要 admin 或者 project owner 權限,owner 是指用戶 token 的 project id 和被刪除 volume 的 project id 相同(也就是說對于一個 project 中的兩個普通用戶 user1 和 user2,user2 可以刪除 user1 創建的 volume,但是不可以刪除)

2.2 使用 policy.v3cloudsample.json 時候的 admin 的權限

 從上面 2.1.1 可以看出,使用默認 policy.json 文件時的 admin 權限控制非常粗,不能支持 keystone v3 api 中引入的域的概念。因此,社區提供了支持多域的 policy.v3cloudsample.json 文件。

2.2.1 identity 中的 admin

?
1
2
3
4
5
6
7
8
"admin_required": "role:admin",
"cloud_admin": "role:admin and (token.is_admin_project:true or domain_id:2b871f5dba704f74923ac01b4fcd7205)",
"service_role": "role:service",
"service_or_admin": "rule:admin_required or rule:service_role",
"owner" : "user_id:%(user_id)s or user_id:%(target.token.user_id)s",
"admin_or_owner": "(rule:admin_required and domain_id:%(target.token.user.domain.id)s) or rule:owner",
"admin_and_matching_domain_id": "rule:admin_required and domain_id:%(domain_id)s",
"service_admin_or_owner": "rule:service_or_admin or rule:owner",

它定義了幾種 admin:

cloud admin (cloud_admin):必須擁有 admin role;其 token 在 admin project 內 或者在指定的 domain 內。cloud admin 的主要職責是

  1. 創建 domains

  2. 為每個 domain 創建 domain admin

domain admin:必須擁有 admin role;token 的 domain id 必須和被操作資源(包括user,project 等) 的 domain id 相同。其主要職責包括

  1.  在該 domain 內創建 projects

  2. 在該 domain 內創建 users

  3. 分配 project 的權限給 user,包括 admin 和 user,前者就是 project admin,后者是 project user

只有 cloud admin 擁有的一些權限:

  1. region 的增刪改

  2. service 的增刪改

  3. endpoint 的增刪改

  4. domain 的列表,增刪改

  5. role 增刪改

只有 domain admin 擁有的一些權限(當然這些權限 cloud admin 都擁有):

  1. 獲取特定 domain 的信息

  2. 列表 projects,以及增刪改

  3. 列表 users 和 groups

  4. user 增刪改

2.2.2 示例規則說明

?
1
2
3
4
5
6
7
"admin_required": "role:admin",
 
"identity:create_project": "rule:admin_required and domain_id:%(project.domain_id)s",
 
"identity:get_project": "rule:admin_required and domain_id:%(target.project.domain_id)s",
 
"identity:list_projects": "rule:admin_required and domain_id:%(domain_id)s",

先來看create_project,首先要求 admin角色,需要注意的是and的后半句 domain_id:%(project.domain_id)s,這條規則的意思就是 create_project 時,使用的token的 domain_id 必須等于project所在的domain的domain_id。

也就是如下場景:

1.為usera在domaina的范圍內賦予admin的權限

2.usera指定domaina作為scope,申請一個domaina scope的tokena

3.usera使用tokena,去創建project,創建project時domain_id參數必須為domaina的id

4.創建project成功

這里有幾個關鍵點需要注意:

  1. 首先usera在domaina內必須要有admin權限,這樣才能滿足rule:admin_required

  2. 其次,token需要是一個domain scope的token,這樣token中才會有domain_id

  3. 再次,創建project的時候,domain_id參數必須等于domaina的id,這樣才能滿足domain_id:%(project.domain_id)s。

這樣一條規則的意義在于,可以限制只有在domaina內有權限的用戶才能在domaina創建project。

get_project 比較好理解,就是查詢的project的 domain_id 必須和token的 domain_id 相同,也就是只能查詢 token 所在范圍內的project。

list_project 是查詢出所有的project,但是會根據token的domain_id過濾,然后剩下所有和token的domain_id相同的project。

keystone 增加了 domain 這樣一個概念之后,其實也就把 keystone 本身的資源 user、project、group 按照 domain 給做了一個劃分,可以做到在 domain 范圍內的對于user、project和group的管理。

3. 多域(multi-domain)的相關操作

3.1 啟用多域 policy.json

1. keystone 使用普通的 policy.json 文件,使用 admin 用戶,創建 admin_domain domain,cloud_admin user 并授予其 admin role

?
1
2
3
openstack domain create admin_domain
openstack user create --domain admin_domain --password 1111 --description "cloud admin" cloud_admin
openstack role add --domain admin_domain --user cloud_admin admin

2. 使用 policy.v3cloudsample.json

使用 policy.v3cloudsample.json 覆蓋 /etc/keystone/policy.json,并做如下修改(藍色部分為上一步說創建的 admin_domain 的 id):

 

復制代碼 代碼如下:

"cloud_admin": "role:admin and (token.is_admin_project:true or domain_id:2b871f5dba704f74923ac01b4fcd7205)"

 

3. 重啟 keystone service

3.2 操作

1. 獲取 cloud_admin 用戶 scoped domain 'admin_domain' token

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cloud_admin_token=$(\
curl http://localhost:5000/v3/auth/tokens \
  -s \
  -i \
  -h "content-type: application/json" \
  -d '
{
  "auth": {
    "identity": {
      "methods": [
        "password"
      ],
      "password": {
        "user": {
          "domain": {
            "name": "admin_domain"
          },
          "name": "cloud_admin",
          "password": "password"
        }
      }
    },
    "scope": {
      "domain": {
        "name": "admin_domain"
      }
    }
  }
}' | grep ^x-subject-token: | awk '{print $2}' )

注意 keystone token 分為兩大類:domain-scoped token 和 project-scoped token,各自需要使用不同的 scope 目標:

?
1
2
3
4
5
6
--os-domain-name <auth-domain-name> | --os-domain-id <auth-domain-id>
   domain-level authorization scope (name or id)
 
--os-project-name   <auth-project-name>   |    --os-project-id
<auth-project-id>
   project-level authentication scope (name or id)

其中 domain-scoped token 用于操作 domain 范圍內的資源,包括 projects 和 users;project-scoped token 用于操作 project 范圍的資源??梢院唵蔚卣J為,前者適合于 cloud admin 和 domain admin;后者合適于 project admin 和 標準 user。

2. 創建域 dom1

?
1
2
3
4
5
6
7
8
9
10
11
12
id_dom1=$(\
curl http://localhost:5000/v3/domains \
  -s \
  -h "x-auth-token: $cloud_admin_token" \
  -h "content-type: application/json" \
  -d '
{
  "domain": {
    "enabled": true,
    "name": "dom1"
  }
}' | jq .domain.id | tr -d '"')

3. 在 dom1 中創建第一個用戶 adm1

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
id_adm1=$(\
curl http://localhost:5000/v3/users \
  -s \
  -h "x-auth-token: $cloud_admin_token" \
  -h "content-type: application/json" \
  -d "
{
  \"user\": {
    \"description\": \"administrator of domain dom1\",
    \"domain_id\": \"$id_dom1\",
    \"enabled\": true,
    \"name\": \"adm1\",
    \"password\": \"password\"
  }
}" | jq .user.id | tr -d '"')

4. 賦予用戶 adm1 'admin' role

?
1
2
3
4
5
curl -x put http://localhost:5000/v3/domains/${id_dom1}/users/${id_adm1}/roles/${admin_role_id} \
  -s \
  -i \
  -h "x-auth-token: $cloud_admin_token" \
  -h "content-type: application/json"

5. 獲取 adm1 在 dom1 中的 token,同樣是domain-scoped 的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
adm1_token=$(\
curl http://localhost:5000/v3/auth/tokens \
  -s \
  -i \
  -h "content-type: application/json" \
  -d '
{
  "auth": {
    "identity": {
      "methods": [
        "password"
      ],
      "password": {
        "user": {
          "domain": {
            "name": "dom1"
          },
          "name": "adm1",
          "password": "password"
        }
      }
    },
    "scope": {
      "domain": {
        "name": "dom1"
      }
    }
  }
}' | grep ^x-subject-token: | awk '{print $2}' )

6. 在 dom1 中創建 prj1

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
id_prj1=$(\
curl http://localhost:5000/v3/projects \
  -s \
  -h "x-auth-token: $adm1_token" \
  -h "content-type: application/json" \
  -d "
{
  \"project\": {
    \"enabled\": true,
    \"domain_id\": \"$id_dom1\",
    \"name\": \"prj1\"
  }\
}" | jq .project.id | tr -d '"' )
 
echo "id of prj1: $id_prj1"

7. 在 dom1 中創建標準用戶 usr1

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
id_usr1=$(\
curl http://localhost:5000/v3/users \
  -s \
  -h "x-auth-token: $adm1_token" \
  -h "content-type: application/json" \
  -d "
{
  \"user\": {
    \"default_project_id\": \"$id_prj1\",
    \"description\": \"just a user of dom1\",
    \"domain_id\": \"$id_dom1\",
    \"enabled\": true,
    \"name\": \"usr1\",
    \"password\": \"password\"
  }
}" | jq .user.id | tr -d '"' )
 
echo "id of user usr1: $id_usr1"

8. 賦予 usr1 member 權限

?
1
2
3
4
5
6
7
8
9
10
11
member_role_id=$(\
curl http://localhost:5000/v3/roles?name=member \
  -s \
  -h "x-auth-token: $adm1_token" \
| jq .roles[0].id | tr -d '"' )
 
curl -x put http://localhost:5000/v3/projects/${id_prj1}/users/${id_usr1}/roles/${member_role_id} \
  -s \
  -i \
  -h "x-auth-token: $adm1_token" \
  -h "content-type: application/json"

3.3 使用 openstack cli 操作

經過測試,獲得如下結果:

1. 使用 cloud_admin 用戶在 openstack cli 操作都正常

2. 使用 domain admin 用戶 adm1 用戶在 openstack cli 中不正常

從 openstac cli 文檔上看,可以通過下面的方法獲取不同 scoped token:

  1. --os-domain-name:同 rest api 中 的 scope/domain/name,獲取 domain-scoped token

  2. --os-project-name:同 rest api 中的 scope/project/name,獲取 project-scoped token

?
1
2
3
4
--os-domain-name <auth-domain-name> | --os-domain-id <auth-domain-id>
domain-level authorization scope (name or id)
--os-project-name <auth-project-name> | --os-project-id <auth-project-id>
project-level authentication scope (name or id)

但是實際測試中,使用 --os-domain-name 無法獲取期望的 domain-scoped token:

?
1
2
root@controller:/home/sammy# openstack --os-domain-name dom1 --os-username adm1 --os-password password --os-user-domain-name dom1 user list
you are not authorized to perform the requested action: identity:list_users (http 403) (request-id: req-ea4b10-0a35-4d88-907f-bab181544f40)

調試發現,此時的token 自帶有 project_id,而不帶有 domain_id。還需要進一步確認是否是個 bug。

一個 workaround 是,對于這種 domain admin 用戶,需要首選獲取 domain scoped token,然后通過 curl 操作,比如要獲取 domain 內的project 列表:

?
1
2
root@controller:/home/sammy# curl -sx get -h "x-auth-token:$adm1_token" http://mysqlserver:5000/v3/projects?domain_id=db7de29b35dd450284dc99bc0a6474ca
{"links": {"self": "http://mysqlserver:5000/v3/projects?domain_id=db7de29b35dd450284dc99bc0a6474ca", "previous": null, "next": null}, "projects": [{"is_domain": false, "description": "", "links": {"self": "http://mysqlserver:5000/v3/projects/7ff06beb0045405f8bebcda166f47f04"}, "enabled": true, "id": "7ff06beb0045405f8bebcda166f47f04", "parent_id": "db7de29b35dd450284dc99bc0a6474ca", "domain_id": "db7de29b35dd450284dc99bc0a6474ca", "name": "prj1"}

 3. 從結果看, mitaka 版本的 openstack cli 對多域的支持情況如下:

  1. 支持 cloud admin,這是通過 admin domain 的方式來實現的

  2. 支持 project owner,通過 project-scoped token

  3. 支持普通 user,通過 project-scoped token

  4. 不支持 domain admin,因為無法獲取 domain-scoped token

3.4 horizon 對多域的支持

3.4.1 準備工作

1. 修改 /etc/openstack-dashboard/local_settings.py 文件:

?
1
2
3
4
5
6
7
8
9
10
openstack_api_versions = {
  "data-processing": 1.1,
  "identity": 3,
  "volume": 2,
  "compute": 2,
}
 
# set this to true if running on multi-domain model. when this is enabled, it
# will require user to enter the domain name in addition to username for login.
openstack_keystone_multidomain_support = true

2. 將 keystone 使用的支持多域的 policy.json 文件拷貝到目錄/etc/openstack-dashboard/keystone_policy.json,然后修改文件local_settings.py:

?
1
2
3
policy_files = {
  'identity': 'keystone_policy.json'
}

3. 重啟 horizon 服務,此時可以使用 domain 和 username,password 登錄

4. 簡單測試了一下,發現還是有不少問題。

比如 cloud admin dashboard 中只能出來它所在的domain,而不能出來所有的 domains:

OpenStack Mitaka 版本中的 domain 和 admin詳解

以domain admin 登錄,直接報錯:

OpenStack Mitaka 版本中的 domain 和 admin詳解

以普通用戶登錄,還能顯示 admin/system 面板。 

備注:keystone v3 中的概念較多,涉及的面較廣,本文只是說明了一部分,甚至不是很準確。接下來會根據需要持續更新。

原文鏈接:http://www.cnblogs.com/sammyliu/p/5955984.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产高清久久 | 欧美视频一区二区专区 | 俄罗斯引擎首页进入 | 亚洲国产剧情中文视频在线 | 精品视频日本 | 亚洲精品视频导航 | 搡60一70岁的老女人小说 | 欧美一级欧美三级在线 | 午夜性爽视频男人的天堂在线 | 亚洲国产视频一区 | 美女黄a | 欧美一级专区免费大片 | 亚洲乱码一二三四区国产 | 欧美亚洲第一区 | 91久| 免费一级片在线观看 | 调教全程肉动画片在线观看 | 问一问免费咨询 | 99久热只有精品视频免费观看17 | 欧美精品成人a多人在线观看 | 午夜亚洲国产 | 波多野结衣在线观看中文字幕 | 亚洲国产欧美在线成人aaaa | 青青青在线免费 | 青草视频免费观看 | 久草热8精品视频在线观看 久草草在线视视频 | 好姑娘在线观看完整版免费 | 精品免费国产一区二区三区 | 成人无高清96免费 | 亚洲国产天堂久久综合网站 | 91se精品免费观看 | 国产精品视频一区二区三区w | 福利一区在线观看 | 三极片在线观看 | 99综合网| 欧美视频一区二区三区四区 | 加勒比福利 | 国产欧美日韩综合二区三区 | 单亲乱l仑在线观看免费观看 | 五月天综合久久 | 国产精品久久久久久久久久久久 |