分散式儲存系統之Ceph叢集CephX認證和授權

2022-10-07 15:00:28

  前文我們瞭解了Ceph叢集儲存池操作相關話題,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/16743611.html;今天我們來聊一聊在ceph上認證和授權的相關話題;

  我們知道ceph作為一個分散式儲存系統,使用者想要在其上面儲存資料,首先得通過認證以後,才能正常使用ceph;那麼對於ceph來講,它是怎麼認證使用者的呢?除了認證,我們知道不是所有使用者都能在ceph上建立儲存池,刪除儲存池等;這也意味著每個使用者都有一定的許可權,在自己的許可權範圍內操作,ceph才算得上是一個安全的儲存系統;那麼ceph的認證和授權到底是怎麼做的呢?

  CephX認證機制

  Ceph使用cephx協定對使用者端進行身份認證,其過程大致是這樣的;每個mon都可以對使用者端進行身份驗證並分發金鑰;這意味著認證靠mon節點完成,不會存在單點和效能瓶頸;mon會返回用於身份驗證的資料結構,其中包含獲取Ceph服務時用到的session key;所謂session key就是使用者端用來向mon請求所需服務的憑證;session key是通過使用者端的金鑰進行加密傳輸;當mon收到使用者端認證請求後,首先生成session key,然後用使用者端的金鑰加密session key,然後傳送給使用者端,使用者端用自己的金鑰將其解密,拿到session key;使用者端有了session key以後,它就可以用這個session key向mon請求服務,mon收到使用者端的請求(攜帶session key),此時mon會向用戶端提供一個ticket(入場卷,票據)然後用session key加密後傳送給使用者端;隨後使用者端用session key解密,拿著這個憑證到對應osd完成認證;

  以上過程,我們需要注意,使用者端的金鑰是通過mon節點在建立使用者帳號時就會生成,所以mon節點有對應使用者端的金鑰,所以通過使用者端的金鑰加密,使用者端可以用自己的金鑰解密;其次mon節點生成的session key 是有記錄的,所以對於不同使用者端來說,都有不同的記錄;並且該session key是有時間限制的;過期即便是對應使用者端,也沒法正常使用;所以使用者端拿著對應session key向mon請求服務,對應mon都是認可的,所以mon會發放ticket;最後我們要知道,MON和OSD都是共用使用者端的金鑰和session key,以及mon發放的ticket,所以使用者端拿著mon發放的ticket,對應osd是認可的;這也意味著不管是那個mon節點發放的ticket,對應所有mon節點和osd都是知道的;簡單講就是叢集元件之間共用同一個secret;

  CephX身份驗證MDS和OSD

  提示:簡要過程是使用者端請求建立使用者,mon建立使用者並返回與共用金鑰給使用者端;使用者端向mon發起認證,認證成功,mon會返回一個session key;在規定時效範圍內,使用者端拿著session key向mon請求ticket,mon生成ticket並用對應session加密,使用者端收到對應mon返回的資料用session key解密,拿到ticket;隨後使用者端拿著對應當ticket去mds或者osd進行資料存取操作,對應元件會被認證通過,因為mon和mds、osd之間都是共用secret;

  這裡需要注意,CephX身份驗正功能僅限制Ceph的各元件之間,它不能擴充套件到其它非Ceph元件;其次它並不解決資料傳輸加密的問題;什麼意思呢?我們知道ceph的使用者端介面有rbd、cephfs和radosgw;對於ceph來講,它並不關心什麼樣的使用者端通過rbd、cephfs、radosgw介面量存取資料;它只關心rbd、cephfs、radosgw這些使用者端介面程式能夠正常認證通過;簡單講就是資料最後「一公里」它不負責,至於用rbd、cephfs、radosgw這些介面的使用者端是誰,怎麼傳輸資料它管不著;

  認證與授權相關術語

  無論Ceph使用者端是何型別,Ceph都會在儲存池中將所有資料儲存為物件;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:讀取許可權,存取MON以檢索CRUSH時依賴此使能;

  w:物件寫入許可權;
  x:呼叫類方法(讀取和寫入)的能力,以及在MON上執行auth操作的能力;
  class-read:x能力的子集,授予使用者呼叫類讀取方法的能力;
  class-write:x的子集,授予使用者呼叫類寫入方法的能力;
  *:授予使用者對特定守護行程/儲存池的讀取、寫入和執行許可權,以及執行管理命令的能力;

  profile osd:授予使用者以某個OSD身份連線到其他OSD或監視器的許可權,授予OSD許可權,使OSD能夠處理複製檢測訊號流量和狀態報告;

  profile mds: 授予使用者以某個MDS身份連線到其他MDS或監視器的許可權;

  profile bootstrap-osd: 授予使用者引導OSD的許可權,授權給部署工具,使其在引導OSD時有權新增金鑰;

  profile bootstrap-mds:授予使用者引導後設資料伺服器的許可權,授權給部署工具,使其在引導後設資料伺服器時有權新增金鑰;

  Ceph使用者管理

  Ceph叢集管理員能夠直接在Ceph叢集中建立、更新和刪除使用者;建立使用者時,可能需要將金鑰分發到使用者端,以便將金鑰新增到金鑰環;所謂金鑰環,我們就可以理解為存放金鑰的一個檔案,該檔案可以同時存放一個或多個使用者的金鑰資訊;有點類似我們生活中的鑰匙環,我們可以在上面掛一個或多個鑰匙;

  列出使用者命令:ceph auth list

[root@ceph-admin ~]# ceph auth list
installed auth entries:

mds.ceph-mon02
        key: AQDT1y9jaMUZDRAA79b3XSXqBbXUlNsT0RLeiw==
        caps: [mds] allow
        caps: [mon] allow profile mds
        caps: [osd] allow rwx
osd.0
        key: AQD3+i1j5IJQCxAAOjQdvckg8TskXu7c4MbPAA==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.1
        key: AQAo7C1j+dEDEBAAAA47bD+nZQZuV4kJjnqACA==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.2
        key: AQA77C1j5ot+DhAAJ+Y1KwgI2zsxRHmTUkfing==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.3
        key: AQBM7C1jdIuHEhAAYBA9gzC4J+kZUxkMzhjq4g==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.4
        key: AQBq7C1jZrNZKhAAK+TvnPgK0jAWIwz0PYFT/g==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.5
        key: AQB57C1jVcczERAAxJ3iqvKS/2kfE4HlFQHIWQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.6
        key: AQCP7C1jB80KGhAA9iXzAg+9ANWjgPb2ZdWdhw==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.7
        key: AQCe7C1jbx4rNxAANOB3PPLxRXi/st1UYiTWqQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.8
        key: AQCz7C1jUGzQIhAAj6aTVM6rNsTO3Lp08rePzg==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.9
        key: AQDA7C1jwXTrEBAATszxwOKepUHzZ5WKwIMu7w==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
client.admin
        key: AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps: [mds] allow *
        caps: [mgr] allow *
        caps: [mon] allow *
        caps: [osd] allow *
client.bootstrap-mds
        key: AQB94C1jRPwjJhAAZsfgne6whasyCmSCgefocw==
        caps: [mon] allow profile bootstrap-mds
client.bootstrap-mgr
        key: AQB94C1jvQQkJhAA9y2LmEvBTG0Mjew8k0ecdw==
        caps: [mon] allow profile bootstrap-mgr
client.bootstrap-osd
        key: AQB94C1jDg4kJhAAhQPCebi6JfF9HZo4q39WGA==
        caps: [mon] allow profile bootstrap-osd
client.bootstrap-rbd
        key: AQB94C1jkxYkJhAAEUjId8hdDCA67PX+SQXAYw==
        caps: [mon] allow profile bootstrap-rbd
client.bootstrap-rgw
        key: AQB94C1jPx4kJhAAXIwArGEkQ76tQG1NnJ0Wmw==
        caps: [mon] allow profile bootstrap-rgw
client.rgw.ceph-mon01
        key: AQD0zS9jI7e4BRAA7fvC/02D6j2YoGHZwveQCQ==
        caps: [mon] allow rw
        caps: [osd] allow rwx
mgr.ceph-mgr01
        key: AQDi5S1jgpYLHRAAWHJeiwwD86AVg0YzUOPCmQ==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *
mgr.ceph-mgr02
        key: AQDk5S1jY6tkBhAAXPIK4N+bia3W6IoqlJRehw==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *
mgr.ceph-mon01
        key: AQDD9C1ja0vhOBAAnUkp5RcLBkZl8qfb4qXXLw==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *
[root@ceph-admin ~]# 

  提示:該命令是列出叢集上所有使用者資訊,即非人為使用者和普通使用者;也可以是ceph auth ls命令來列出所有使用者資訊;

  檢索特定使用者命令格式:ceph auth get TYPE.ID或者ceph auth export TYPE.ID

[root@ceph-admin ~]# ceph auth get client.admin
exported keyring for client.admin
[client.admin]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
[root@ceph-admin ~]# ceph auth export client.admin
export auth(auid = 18446744073709551615 key=AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA== with 4 caps)
[client.admin]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
[root@ceph-admin ~]# 

  提示:如果我們需要將上述資訊匯出到檔案,可以使用-o來指定檔案,或者輸出重定向到方式;

[root@ceph-admin ~]# ceph auth get client.admin -o client.admin.keyring
exported keyring for client.admin
[root@ceph-admin ~]# ls
ceph-deploy-ceph.log  client.admin.keyring
[root@ceph-admin ~]# cat client.admin.keyring
[client.admin]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
[root@ceph-admin ~]# ceph auth export client.admin > client.admin.cluster.keyring
export auth(auid = 18446744073709551615 key=AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA== with 4 caps)
[root@ceph-admin ~]# ls
ceph-deploy-ceph.log  client.admin.cluster.keyring  client.admin.keyring
[root@ceph-admin ~]# cat client.admin.cluster.keyring
[client.admin]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
[root@ceph-admin ~]# 

  新增使用者命令格式:auth add <entity> {<caps> [<caps>...]}

[root@ceph-admin ~]# ceph auth add client.testuser mon 'allow r' osd 'allow rw'
added key for client.testuser
[root@ceph-admin ~]# ceph auth get client.testuser
exported keyring for client.testuser
[client.testuser]
        key = AQAoaThjCJLsBhAA8gwl/UQkjjSF+DwB6oB/wg==
        caps mon = "allow r"
        caps osd = "allow rw"
[root@ceph-admin ~]# 

  提示:ceph add 是新增使用者的規範方法,它能夠建立使用者、生成金鑰並新增指定的caps;這裡需要注意我指定的使用者是有type.id組成,一般普通使用者都是client型別,後面的ID就是使用者名稱稱;

  ceph auth get-or-create:簡便方法,建立使用者並返回金鑰檔案格式的金鑰資訊,或者在使用者存在時返回使用者名稱及金鑰檔案格式的金鑰資訊;

[root@ceph-admin ~]# ceph auth get-or-create client.testuser mon 'allow *' osd 'allow rw pool=rbdpool'
Error EINVAL: key for client.testuser exists but cap mon does not match
[root@ceph-admin ~]# ceph auth get-or-create client.testuser mon 'allow r' osd 'allow rw'       [client.testuser]
        key = AQAoaThjCJLsBhAA8gwl/UQkjjSF+DwB6oB/wg==
[root@ceph-admin ~]# ceph auth get-or-create client.tom mon 'allow *' osd 'allow rw pool=rbdpool'
[client.tom]
        key = AQBcajhj8INfChAAKKFCESxmbHFJqAwiRE4ufg==
[root@ceph-admin ~]#  ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQBcajhj8INfChAAKKFCESxmbHFJqAwiRE4ufg==
        caps mon = "allow *"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]#

  提示:使用ceph auth get-or-create命令新增使用者,如果使用者存在,但授權不匹配,它會提示我們使用者存在,但是許可權不匹配;如果使用者存在,許可權資訊也都匹配,則返回對應使用者的key;如果使用者不存在,則建立對應用並返回使用者的key;

  ceph auth get-or-create-key:簡便方法,建立使用者並返回金鑰資訊,或者在使用者存在時返回金鑰資訊;

[root@ceph-admin ~]# ceph auth get-or-create-key client.testuser mon 'allow r' osd 'allow *' 
Error EINVAL: key for client.testuser exists but cap osd does not match
[root@ceph-admin ~]# ceph auth get-or-create-key client.testuser mon 'allow r' osd 'allow rw'
AQAoaThjCJLsBhAA8gwl/UQkjjSF+DwB6oB/wg==
[root@ceph-admin ~]# ceph auth get-or-create-key client.jerry mon 'allow r' osd 'allow rw'        
AQDDazhjLbMTIhAADsXyBkPS079vU7dqGs2E+A==
[root@ceph-admin ~]# ceph auth get client.jerry
exported keyring for client.jerry
[client.jerry]
        key = AQDDazhjLbMTIhAADsXyBkPS079vU7dqGs2E+A==
        caps mon = "allow r"
        caps osd = "allow rw"
[root@ceph-admin ~]# 

  提示:該命令和上面的get-or-create類似,都是使用者存在,如果許可權匹配則返回對應使用者的key,如果不匹配則告訴我們使用者存在,但許可權不匹配;如果不存在則建立,並返回對應使用者的key;不同的是返回key的格式不同;get-or-create是返回keyring檔案中的格式;而get-or-create-key則返回key的值,沒有key = ;

  注意:典型的使用者至少對 Ceph monitor 具有讀取功能,並對 Ceph OSD 具有讀取和寫入功能;另外,使用者的 OSD 許可權通常應該限制為只能存取特定的儲存池,否則,他將具有存取叢集中所有儲存池的許可權;

  列出使用者的金鑰格式 命令:ceph auth print-key TYPE.ID

[root@ceph-admin ~]# ceph auth print-key client.jerry
AQDDazhjLbMTIhAADsXyBkPS079vU7dqGs2E+A==[root@ceph-admin ~]# 

  匯入使用者命令:ceph auth import

[root@ceph-admin ~]# ll
total 16
-rw-r--r-- 1 root root 1568 Sep 25 11:40 ceph-deploy-ceph.log
-rw-r--r-- 1 root root  151 Oct  2 00:14 client.admin.cluster.keyring
-rw-r--r-- 1 root root  151 Oct  2 00:14 client.admin.keyring
-rw-r--r-- 1 root root  164 Oct  2 00:43 client.test.keyring
[root@ceph-admin ~]# cat client.test.keyring 
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# ceph auth get client.test
Error ENOENT: failed to find client.test in keyring
[root@ceph-admin ~]# ceph auth import -i client.test.keyring
imported keyring
[root@ceph-admin ~]# ceph auth get client.test              
exported keyring for client.test
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# 

  提示:從keyring檔案匯入使用者需要用到-i選項來指定對應匯入的keyring檔案;

  修改使用者caps命令:ceph auth caps TYPE.ID daemon 'allow [r|w|x|*|...] [pool=pool-name] [namespace=namespace-name]' ...

[root@ceph-admin ~]# ceph auth get client.test
exported keyring for client.test
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# ceph auth caps client.test mds 'allow rw' mgr 'allow r' mon 'allow rw'   
updated caps for client.test
[root@ceph-admin ~]# ceph auth get client.test
exported keyring for client.test
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow rw"
        caps mgr = "allow r"
        caps mon = "allow rw"
[root@ceph-admin ~]# ceph auth caps client.test mds 'allow rw' mgr 'allow r' mon 'allow rw' osd 'allow rw pool=rbdpool'
updated caps for client.test
[root@ceph-admin ~]# ceph auth get client.test
exported keyring for client.test
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow rw"
        caps mgr = "allow r"
        caps mon = "allow rw"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# 

  提示:該命令會覆蓋使用者現有許可權因此建立事先使用ceph auth get TYPE.ID命令檢視使用者的caps;若是為新增caps,則需要先指定現有的caps;若為刪除某些許可權,則對應許可權不指定即可;

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

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

  Keyring

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

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

  cluster-name是為叢集名稱,user-name是為使用者標識(TYPE.ID), client.admin使用者的在名為ceph的叢集上的金鑰環檔名為ceph.client.admin.keyring;

  管理keyring

  建立keyring命令:ceph-authtool --create-keyring /path/to/kerying

[root@ceph-admin ~]# ceph-authtool --create-keyring ./client.abc.keyring
creating ./client.abc.keyring
[root@ceph-admin ~]# cat ./client.abc.keyring
[root@ceph-admin ~]# 

  提示:建立keyring檔案,裡面沒有任何內容,我們需要用ceph auth add 新增使用者,然後通過ceph auth get或export命令將對應使用者資訊匯入到對應keyring檔案即可;這裡說一下keyring檔案的命名規則,keyring檔案一般應該儲存於/etc/ceph目錄中,以便使用者端能自動查詢;建立包含多個使用者的keyring檔案時,應該使用cluster-name.keyring作為檔名;建立僅包含單個使用者的kerying檔案時,應該使用cluster-name.user-name.keyring作為檔名;這個是規範的keyring命名方式;

  將使用者的keyring合併至一個統一的keyring檔案中命令:ceph-authtool /etc/ceph/cluster-name.keyring --import-key /etc/ceph/cluster-name.user-name.keyring

[root@ceph-admin ~]# ll
total 16
-rw-r--r-- 1 root root 1568 Sep 25 11:40 ceph-deploy-ceph.log
-rw------- 1 root root    0 Oct  2 00:57 client.abc.keyring
-rw-r--r-- 1 root root  151 Oct  2 00:14 client.admin.cluster.keyring
-rw-r--r-- 1 root root  151 Oct  2 00:14 client.admin.keyring
-rw-r--r-- 1 root root  164 Oct  2 00:43 client.test.keyring
[root@ceph-admin ~]# cat client.test.keyring                                    
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# ceph-authtool ./client.test.keyring --import-keyring ./client.admin.keyring  
importing contents of ./client.admin.keyring into ./client.test.keyring
[root@ceph-admin ~]# cat client.test.keyring   
[client.admin]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"
[client.test]
        key = AQB94C1jTO8jJhAAY4Zhy40wduyIONnRqxtkEA==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# 

  使用ceph-authtool命令管理使用者

  ceph-authtool命令可直接建立使用者、授予caps並建立keyring

  命令使用幫助

[root@ceph-admin ~]# ceph-authtool -h
usage: ceph-authtool keyringfile [OPTIONS]...
where the options are:
  -l, --list                    will list all keys and capabilities present in
                                the keyring
  -p, --print-key               will print an encoded key for the specified
                                entityname. This is suitable for the
                                'mount -o secret=..' argument
  -C, --create-keyring          will create a new keyring, overwriting any
                                existing keyringfile
  -g, --gen-key                 will generate a new secret key for the
                                specified entityname
  --gen-print-key               will generate a new secret key without set it
                                to the keyringfile, prints the secret to stdout
  --import-keyring FILE         will import the content of a given keyring
                                into the keyringfile
  -n NAME, --name NAME          specify entityname to operate on
  -u AUID, --set-uid AUID       sets the auid (authenticated user id) for the
                                specified entityname
  -a BASE64, --add-key BASE64   will add an encoded key to the keyring
  --cap SUBSYSTEM CAPABILITY    will set the capability for given subsystem
  --caps CAPSFILE               will set all of capabilities associated with a
                                given key, for all subsystems
  --mode MODE                   will set the desired file mode to the keyring
                                e.g: '0644', defaults to '0600'
[root@ceph-admin ~]# 

  提示:-l或--list表示列出所有使用者資訊;-p表示列印對應使用者的key資訊,-C表示keyring檔案,-g表示給指定使用者生成key;-n用於指定使用者名稱稱;--cap 用於指定許可權資訊;--mode用於指定keyring檔案的許可權資訊,預設是0600,即只有root或對應宿主擁有讀寫許可權;

[root@ceph-admin ~]# ceph-authtool -C client.usera.keyring  -n client.usera --gen-key --cap mon 'allow r' --cap osd 'allow rw pool=rbdpool'
creating client.usera.keyring
[root@ceph-admin ~]# ll
total 20
-rw-r--r-- 1 root root 1568 Sep 25 11:40 ceph-deploy-ceph.log
-rw------- 1 root root    0 Oct  2 00:57 client.abc.keyring
-rw-r--r-- 1 root root  151 Oct  2 00:14 client.admin.cluster.keyring
-rw-r--r-- 1 root root  151 Oct  2 00:14 client.admin.keyring
-rw-r--r-- 1 root root  315 Oct  2 01:03 client.test.keyring
-rw------- 1 root root  121 Oct  2 01:25 client.usera.keyring
[root@ceph-admin ~]# ceph auth get client.usera
Error ENOENT: failed to find client.usera in keyring
[root@ceph-admin ~]# cat client.usera.keyring 
[client.usera]
        key = AQAIeDhjTnmLGhAAWgL3GqtJsPwmOD6CPbJO8Q==
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# 

  提示:使用這種方式新增使用者,對應資訊之存在於keyring檔案中,並沒有存在ceph叢集,我們還需要將對應keyring檔案中的使用者資訊匯入到叢集上;

[root@ceph-admin ~]# ceph auth add client.usera -i client.usera.keyring 
added key for client.usera
[root@ceph-admin ~]# ceph auth get client.usera
exported keyring for client.usera
[client.usera]
        key = AQAIeDhjTnmLGhAAWgL3GqtJsPwmOD6CPbJO8Q==
        caps mon = "allow r"
        caps osd = "allow rw pool=rbdpool"
[root@ceph-admin ~]# 

  提示:上述命令等同ceph auth import;