1. 程式人生 > 其它 >5.Ceph 基礎篇 - 認證

5.Ceph 基礎篇 - 認證

文章轉載自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485272&idx=1&sn=4b27c357411be40cf901c431010aeac2&chksm=e9fdd2acde8a5bbaf8950bd5eacc1b6444c8ed7269b3932fcbaf244ee1718f022f552303cdf3&scene=178&cur_album_id=1600845417376776197#rd

Ceph 認證概念及原理

官方地址:http://docs.ceph.org.cn/man/8/ceph-authtool/

Mon 程序還需要負責另外的一個功能:認證;

包括Ceph 客戶端到Ceph 叢集資料,是非常重要的,我們不允許非授權訪問,任何客戶端,接入Rados Cluster 儲存池之前 ,都需要提供使用者名稱和密碼進行認證;Mon 還負責維護整個叢集的使用者名稱和密碼等;

各個元件如OSD 連線到 ceph mon ,其實也需要認證,認證使用的協議叫CephX,Ceph mon 負責維護認證資訊並進行認證;任何元件間進行訪問,都需要進行認證,所以如果客戶端量很大的話,mon有可能成為瓶徑,這也是mon多個的原因,由於mon 本身是無狀態的,所以在認證的時候 ,每個節點都可以進行認證;

CephX 認證機制

Ceph 使用CephX協議對客戶端進行身份認證,叢集中每一個 Monitor 節點都可以接受客戶端請求,並對客戶端進行身份驗證,所以不存在單點故障和效能瓶頸;CephX 僅用於 Ceph 叢集中的各元件,而不能用於非 Ceph 元件,它並不解決資料傳輸加密問題,但也可以提高訪問控制安全性問題。

CephX認證授權流程

Ceph 客戶端與 Mon 之間在建立時,存在一對域共享金鑰;

  1. 客戶端向 Monitor 發出請求時,Monitor 會返回用於驗證使用者身份的資料結構,其中包含獲取 Ceph 服務時用到的臨時 Session key,這個是加密的;

  2. 客戶端拿到這個臨時加密的 Session key後,客戶端通過金鑰進行解密 Seesion key;(其實這裡雙方提前有一個域共享金鑰,只有有了它之後,才可以對臨時 Session key 進行解密)

  3. 然後客戶端使用解密的 Session key 向 mon 請求所需要的服務,比如OSD,然後 mon 給出一個令牌 ticket ,並且 mon 還需要檢查這個 Session key 的合法性;並且 mon 提供一個 ticket需要使用Session key 對ticket進行對稱加密,然後傳送給客戶端,客戶端也具有這個Session key,所以他可以解密出ticket;

  4. 客戶端然後通過tocket 去訪問對應的服務,這裡以OSD為例,去訪問OSD服務;

注意session key與 ticket 都會有過期時間的,就算使用者拿到了 session key與ticket,過一段時間後就失效了,這裡大家可以看到,客戶端與ceph 元件服務並沒有一直使用域共享金鑰進行通訊;域共享金鑰,只有在客戶端與 Monitor 在共享 Session key的時候使用到;我們還可以發現域共享金鑰並沒有在網際網路上面進行傳輸;

CephX 身份驗證功能僅限制Ceph的各元件之間,它不能擴充套件到其它非Ceph元件,它並不解決資料傳輸加密的問題;

使用者

使用者通常指定個人或某個應用,個人就是指現實中的人,比如管理員,而應用就是指客戶端或Ceph叢集中的某個元件,通過使用者可以控制誰可以如何訪問Ceph叢集中的哪塊資料。Ceph支援多種型別的使用者,但可管理的使用者都屬於Client型別;

區分使用者型別的原因在於,Mon、OSD和MDS等系統元件也使用cephX協議,但它們非為客戶端,通過點號來分隔使用者型別和使用者名稱,格式為TYPE.ID, 如:Client.admin。

授權和使能

Ceph 基於“使能(caps)”來描述使用者可針對Mon、OSD或MDS使用的許可權範圍或級別;

通用格式:daemon-type 'allow caps' [....]

Mon 使能,包括r,w,x和allow profile cap,例如:mon 'allow rwx',或者 mon 'allow profile osd' 等;

OSD 使能,包括r、w、 x、class-read、class-write或profile osd ,此外,OSD使能還允許進行儲存池和名稱空間裝置;

MDS使能,只需要allow,或留空;

allow:對mds表示rw的意思,其它的表示“允許”;

r:讀取;

w:寫入;

x:同時擁有讀取和寫入,相當於可以呼叫類方法,並且可以在monitor上面執行auth操作;

class-read:可以讀取類方法,x的子集;

class-wirte:可以呼叫類方法,x的子集;

*:這個比較特殊,代表指定物件的所有許可權;

profile osd表示授予使用者以某個osd身份連線到其它OSD或者Monitor的許可權,授予OSD許可權,使OSD能夠處理複製檢測訊號流量和狀態報告;
profile mds 授予使用者以某個MDS身份連線到其他MDS或監視器的許可權;
profile bootstrap-osd 表示授予使用者引導OSD的許可權,授權給部署工具,使其在引導OSD時有權新增金鑰;
profile bootstrap-mds 授予使用者引導元資料伺服器的許可權,授權給部署工具,使其在引導元資料伺服器時有權新增金鑰;

Ceph 許可權實踐

使用者管理

Ceph 叢集管理員能夠直接在 Ceph 叢集中建立、更新和刪除使用者、建立使用者時,可能需要將金鑰分發到客戶端,以便將金鑰新增到金鑰環;

列出使用者:ceph auth list 列出所有金鑰環中的使用者資訊

[root@ceph-node01 ~]# ceph auth list

mds.ceph-node01
  key: AQAONJBf5MqMHRAA25uTtY1wEKJfLifU1iAxTg==
  caps: [mds] allow
  caps: [mon] allow profile mds
  caps: [osd] allow rwx
mds.ceph-node02
  key: AQAaNJBfB1iSFhAAmJTccxnngl403EA+WUfTJA==
  caps: [mds] allow
  caps: [mon] allow profile mds
  caps: [osd] allow rwx
mds.ceph-node03
  key: AQAbNJBfU2NKHRAAnFMAnIwX4WbvekrYYpB1Tg==
  caps: [mds] allow
  caps: [mon] allow profile mds
...

installed auth entries:

[root@ceph-node01 ~]#

使用者標識:Type.ID,因此,mds.ceph-node01表示mds型別的使用者,使用者ID為ceph-node01

檢索特定使用者:ceph auth get mds.ceph-node01。

[root@ceph-node01 ~]# ceph auth get mgr.ceph-node01
[mgr.ceph-node01]
        key = AQBs8TJiq5rkAxAAGBfKoIO9VSFBeFxa9D0KbQ==
        caps mds = "allow *"
        caps mon = "allow profile mgr"
        caps osd = "allow *"
exported keyring for mgr.ceph-node01

新增使用者:ceph auth add

[root@ceph-node01 ~]# ceph auth add client.testuser mon 'allow r' osd 'allow rw pool=rbdpool'
added key for client.testuser
[root@ceph-node01 ~]# ceph auth get client.testuser
exported keyring for client.testuser
[client.testuser]
  key = AQCgjbJfBQ3MDRAAHLxRUNjMIcLGWut58xt+1g==
  caps mon = "allow r"
  caps osd = "allow rw pool=rbdpool"
[root@ceph-node01 ~]#

ceph auth add:,它能夠建立使用者、生成金鑰並新增指定的 caps 使能;
ceph auth get-or-create:簡便方法,建立使用者並返回金鑰檔案格式的金鑰資訊,或者在使用者存 在時返回使用者名稱及金鑰檔案格式的金鑰資訊;
ceph auth get-or-create-key:簡便方法,建立使用者並返回金鑰資訊,或者在使用者存在時返回金鑰資訊;

[root@ceph-node01 ceph-deploy]# ceph auth get-or-create client.kube mon 'allow r' osd 'allow * pool=kube'
[client.kube]
  key = AQAIkbJfsZ+pBBAA2a19ZBFQ7cYEKGWZGl+C/w==
[root@ceph-node01 ceph-deploy]# ceph auth get client.kube
exported keyring for client.kube
[client.kube]
  key = AQAIkbJfsZ+pBBAA2a19ZBFQ7cYEKGWZGl+C/w==
  caps mon = "allow r"
  caps osd = "allow * pool=kube"
[root@ceph-node01 ceph-deploy]#

修改使用者使能

注意它會覆蓋使用者現有的caps,可以先檢視下使用者caps,然後再進行設定;

[root@ceph-node01 ~]# ceph auth caps client.testuser mon 'allow rwx' osd "allow rw pool=rbdpool"
updated caps for client.testuser
[root@ceph-node01 ~]# ceph auth get client.testuser
exported keyring for client.testuser
[client.testuser]
  key = AQCgjbJfBQ3MDRAAHLxRUNjMIcLGWut58xt+1g==
  caps mon = "allow rwx"
  caps osd = "allow rw pool=rbdpool"
[root@ceph-node01 ~]#

刪除使用者:ceph auth del TYPE.ID

[root@ceph-node01 ~]# ceph auth del client.testuser
updated
[root@ceph-node01 ~]# ceph auth get client.testuser
Error ENOENT: failed to find client.testuser in keyring
[root@ceph-node01 ~]#

匯入使用者:ceph auth import 金鑰環檔案

金鑰環

金鑰環是一個集合,它包括儲存金鑰,密碼,key,證書等,並將把其提供給應用程式的元件集合,金鑰環檔案儲存一個或多個Ceph身份驗證金鑰以及使用者使能,每個鍵都與一個實體名稱相關聯,形式為{client,mon,mds,osd}.ID,並且 Ceph 也提供了一個非常底層的命令工具集:ceph-authtool,它可以建立、檢視和修改金鑰環檔案;

訪問Ceph 叢集時,客戶端會於本地查詢金鑰環,預設情況下,Ceph 會使用以下四個金鑰環名稱預設金鑰環;

/etc/ceph/cluster-name.user-name.keyring:儲存單個使用者的keyring
/etc/ceph/cluster.keyring:儲存多個使用者的keyring
/etc/ceph/keyring
/etc/ceph/keyring.bin

將使用者新增至金鑰環

[root@ceph-node01 ceph-deploy]# ceph auth get client.kube -o ./ceph.client.kube.keyring
exported keyring for client.kube
[root@ceph-node01 ceph-deploy]# ls -l ceph.client.kube.keyring
-rw-r--r-- 1 root root 116 11月 16 09:49 ceph.client.kube.keyring
[root@ceph-node01 ceph-deploy]# cat ceph.client.kube.keyring
[client.kube]
  key = AQAIkbJfsZ+pBBAA2a19ZBFQ7cYEKGWZGl+C/w==
  caps mon = "allow r"
  caps osd = "allow * pool=kube"
[root@ceph-node01 ceph-deploy]#

建立keyring金鑰環

[root@ceph-node01 ceph-deploy]# ceph-authtool --create-keyring cluster.keyring
creating cluster.keyring
[root@ceph-node01 ceph-deploy]# cat cluster.keyring
[root@ceph-node01 ceph-deploy]# ceph-authtool cluster.keyring --import-keyring ./ceph.client.kube.keyring
importing contents of ./ceph.client.kube.keyring into cluster.keyring
[root@ceph-node01 ceph-deploy]# cat cluster.keyring
[client.kube]
  key = AQAIkbJfsZ+pBBAA2a19ZBFQ7cYEKGWZGl+C/w==
  caps mon = "allow r"
  caps osd = "allow * pool=kube"
[root@ceph-node01 ceph-deploy]#

把已有金鑰檔案合併到一個統一金鑰環

[root@ceph-node01 ceph-deploy]# ceph-authtool cluster.keyring --import-keyring ./ceph.client.admin.keyring
importing contents of ./ceph.client.admin.keyring into cluster.keyring
[root@ceph-node01 ceph-deploy]# cat cluster.keyring
[client.admin]
  key = AQA2M3NfHRWaLhAAcyHxQ5NSG01/+Zlz4yH9pQ==
  caps mds = "allow *"
  caps mgr = "allow *"
  caps mon = "allow *"
  caps osd = "allow *"
[client.kube]
  key = AQAIkbJfsZ+pBBAA2a19ZBFQ7cYEKGWZGl+C/w==
  caps mon = "allow r"
  caps osd = "allow * pool=kube"
[root@ceph-node01 ceph-deploy]#

官方檢視金鑰環檔案

[root@ceph-node01 ceph-deploy]# ceph-authtool -l cluster.keyring
[client.admin]
  key = AQA2M3NfHRWaLhAAcyHxQ5NSG01/+Zlz4yH9pQ==
  caps mds = "allow *"
  caps mgr = "allow *"
  caps mon = "allow *"
  caps osd = "allow *"
[client.kube]
  key = AQAIkbJfsZ+pBBAA2a19ZBFQ7cYEKGWZGl+C/w==
  caps mon = "allow r"
  caps osd = "allow * pool=kube"
[root@ceph-node01 ceph-deploy]#

Ceph 認證貫穿 Ceph 所有元件,並且非常重要,主要包括使用者建立的使用者定格規則、使能、金鑰環等。