參考:https://docs.ceph.com/en/pacific/rados/operations/user-management/
本文檔描述Ceph 客戶端用戶,以及他們使用Ceph 存儲集群的身份驗證和授權。用戶是個人或系統參與者,例如應用程序,它們使用 Ceph 客戶端與 Ceph 存儲集群守護進程進行交互。
當 Ceph 在啟用身份驗證和授權(默認啟用)的情況下運行時,您必須指定用戶名和包含指定用戶密鑰的密鑰環(通常通過命令行)。如果不指定用戶名,Ceph 將使用client.admin默認用戶名。如果您沒有指定密鑰環,Ceph 將通過 Ceph 配置中的keyring設置查找密鑰環。例如,如果您在未指定用戶或密鑰環的情況下執行命令:
ceph health
Ceph 對命令的解釋如下:
ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
或者,您可以使用CEPH_ARGS環境變量來避免重新輸入用戶名和密碼。
背景
無論 Ceph 客戶端的類型(例如,塊設備、對象存儲、文件系統、原生 API 等)如何,Ceph 都將所有數據作為對象存儲在池中。Ceph 用戶必須有權訪問池才能讀取和寫入數據。此外,Ceph 用戶必須具有執行權限才能使用 Ceph 的管理命令。以下概念將幫助您了解 Ceph 用戶管理。
用戶
用戶可以是個人,也可以是系統參與者,例如應用程序。創建用戶允許您控制誰(或什么)可以訪問您的 Ceph 存儲集群、它的池以及池中的數據。
Ceph 有一個type用戶的概念。出於用戶管理的目的,類型將始終為client。 Ceph 以句點 (.) 分隔的形式識別用戶,由用戶類型和用戶 ID 組成:例如, TYPE.ID、client.admin或client.user1。用戶鍵入類型的原因是 Ceph 監視器、OSD 和元數據服務器也使用 Cephx 協議,但它們不是客戶端。區分用戶類型有助於區分客戶端用戶和其他用戶——簡化訪問控制、用戶監控和可追溯性。
有時 Ceph 的用戶類型可能看起來令人困惑,因為 Ceph 命令行允許您根據您的命令行使用情況指定有或沒有類型的用戶。如果指定--user 或 --id,則可以省略類型。所以client.user1可以簡單地輸入為user1。如果指定 --name或-n,則必須指定類型和名稱,例如 client.user1。我們建議盡可能使用類型和名稱作為最佳實踐。
授權(能力)
Ceph 使用術語“能力”(caps)來描述授權經過身份驗證的用戶行使監視器、OSD 和元數據服務器的功能。功能還可以根據應用程序標簽限制對池中的數據、池中的命名空間或一組池的訪問。Ceph 管理用戶在創建或更新用戶時設置用戶的能力。
能力語法遵循以下形式:
{daemon-type} '{cap-spec}[, {cap-spec} ...]'
- 監視器:監視器功能包括r、w、x訪問設置或profile {name}。例如:
mon 'allow {access-spec} [network {network/prefix}]'
mon 'profile {name}'
{access-spec}語法如下:
* | all | [r][w][x]
可選的{network/prefix}是 CIDR 表示法中的標准網絡名稱和前綴長度(例如,10.3.0.0/16)。如果存在,則此功能的使用僅限於從該網絡連接的客戶端。
- OSD: OSD 功能包括r、w、x、class-read、 class-write訪問設置或profile {name}. 此外,OSD 功能還允許設置池和命名空間。
osd 'allow {access-spec} [{match-spec}] [network {network/prefix}]'
osd 'profile {name} [pool={pool-name} [namespace={namespace-name}]] [network {network/prefix}]'
{access-spec}語法是以下之一:
* | all | [r][w][x] [class-read] [class-write]
class {class name} [{method name}]
可選的{match-spec}語法是以下之一:
pool={pool-name} [namespace={namespace-name}] [object_prefix {prefix}]
[namespace={namespace-name}] tag {application} {key}={value}
可選的{network/prefix}是 CIDR 表示法中的標准網絡名稱和前綴長度(例如,10.3.0.0/16)。如果存在,則此功能的使用僅限於從該網絡連接的客戶端。
- Manager Caps: Manager ( ceph-mgr) 功能包括 r、w、x訪問設置或profile {name}。例如:
mgr 'allow {access-spec} [network {network/prefix}]'
mgr 'profile {name} [{key1} {match-type} {value1} ...] [network {network/prefix}]'
還可以為特定命令、內置管理器服務導出的所有命令或特定附加模塊導出的所有命令指定管理器功能。例如:
mgr 'allow command "{command-prefix}" [with {key1} {match-type} {value1} ...] [network {network/prefix}]'
mgr 'allow service {service-name} {access-spec} [network {network/prefix}]'
mgr 'allow module {module-name} [with {key1} {match-type} {value1} ...] {access-spec} [network {network/prefix}]'
{access-spec}語法如下:
* | all | [r][w][x]
{service-name}是以下之一:
mgr | osd | pg | py
{match-type}是以下之一:
= | prefix | regex
- 元數據服務器:對於管理員,請使用allow *. 對於所有其他用戶,例如 CephFS 客戶端,請參閱CephFS 客戶端功能。
Ceph 對象網關守護進程 ( radosgw) 是 Ceph 存儲集群的客戶端,因此它不表示為 Ceph 存儲集群守護進程類型。
池
池是用戶存儲數據的邏輯分區。在 Ceph 部署中,通常會創建一個池作為類似類型數據的邏輯分區。例如,當將 Ceph 部署為 OpenStack 的后端時,典型的部署將具有用於存儲卷、映像、備份和虛擬機的池,以及諸如client.glance 、client.cinder 等用戶的池。
應用標簽
訪問權限可能僅限於由其應用程序元數據定義的特定池。通配符 * 可用於key參數、 value參數或兩者。all是 * 的同義詞。
命名空間
池中的對象可以關聯到命名空間——池中的一組邏輯對象。用戶對池的訪問可以與命名空間相關聯,這樣用戶的讀寫操作僅發生在命名空間內。寫入池中命名空間的對象只能由有權訪問該命名空間的用戶訪問。
命名空間的基本原理是,池可能是一種計算成本高昂的分離數據集的方法,目的是授權單獨的用戶集。例如,一個池的每個 OSD 應該有大約 100 個歸置組。因此,具有 1000 個 OSD 的示例集群將有 100,000 個歸置組用於一個池。每個池將在示例集群中創建另外 100,000 個歸置組。相比之下,將對象寫入命名空間只是將命名空間與對象名稱相關聯,而沒有單獨池的計算開銷。您可以使用命名空間,而不是為一個用戶或一組用戶創建一個單獨的池。注意:目前只能使用librados。
使用該功能可以將訪問限制在特定的 RADOS 名稱空間namespace 。支持有限的名稱空間;如果指定命名空間的最后一個字符是*,則授予對以提供的參數開頭的任何命名空間的訪問權限。
管理用戶
用戶管理功能為 Ceph 存儲集群管理員提供了直接在 Ceph 存儲集群中創建、更新和刪除用戶的能力。
在 Ceph 存儲集群中創建或刪除用戶時,您可能需要將密鑰分發給客戶端,以便將它們添加到密鑰環中。
列出用戶
要列出集群中的用戶,請執行以下命令:
ceph auth ls
Ceph 將列出集群中的所有用戶。例如,在一個兩節點示例集群中,將輸出如下所示的內容:
installed auth entries:
osd.0
key: AQCvCbtToC6MDhAATtuT70Sl+DymPCfDSsyV4w==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQC4CbtTCFJBChAAVq5spj0ff4eHZICxIOVZeA==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQBHCbtT6APDHhAA5W00cBchwkQjh3dkKsyPjw==
caps: [mds] allow
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQBICbtTOK9uGBAAdbe5zcIGHZL3T/u2g6EBww==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
key: AQBHCbtT4GxqORAADE5u7RkpCN/oo4e5W0uBtw==
caps: [mon] allow profile bootstrap-osd
請注意,用戶的TYPE.ID表示法適用於類型為osd.0的用戶,osd其 ID 為0,client.admin類型為用戶, client其 ID 為admin(即默認client.admin用戶)。另請注意,每個條目都有一個key:
您可以使用-o {filename}選項將輸出保存到文件中。
獲取用戶
要檢索特定用戶、密鑰和功能,請執行以下操作:
ceph auth get {TYPE.ID}
例如:
ceph auth get client.admin
您也可以使用-o {filename}選項將輸出保存到文件中。開發人員還可以執行以下操作:
ceph auth export {TYPE.ID}
該命令與 auth get 相同。
添加用戶
添加用戶會創建用戶名(即TYPE.ID)、密鑰以及用於創建用戶的命令中包含的任何功能。
用戶的密鑰使用戶能夠通過 Ceph 存儲集群進行身份驗證。mon用戶的能力授權用戶在 Ceph 監視器 ( )、Ceph OSD ( osd) 或 Ceph 元數據服務器 ( )上讀取、寫入或執行mds。
添加用戶有幾種方法:
-
ceph auth add:此命令是添加用戶的規范方法。它將創建用戶、生成密鑰並添加任何指定的功能。
-
ceph auth get-or-create:此命令通常是創建用戶最方便的方法,因為它返回帶有用戶名(在括號中)和密鑰的密鑰文件格式。如果用戶已經存在,則此命令僅以密鑰文件格式返回用戶名和密鑰。您可以使用-o {filename}選項將輸出保存到文件中。
-
ceph auth get-or-create-key:此命令是創建用戶並僅僅返回用戶密鑰的便捷方式。這對於只需要密鑰的客戶端(例如,libvirt)很有用。如果用戶已經存在,此命令只返回密鑰。您可以使用-o {filename}選項將輸出保存到文件中。
創建客戶端用戶時,您可能會創建一個沒有能力的用戶。沒有能力的用戶除了身份驗證之外毫無用處,因為客戶端無法從監視器中檢索集群映射。但是,如果您希望稍后使用ceph auth caps命令延遲添加功能,則可以創建一個沒有功能的用戶。
一個典型的用戶至少在 Ceph 監視器上具有讀取能力,在 Ceph OSD 上具有讀寫能力。此外,用戶的 OSD 權限通常僅限於訪問特定池。
ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
重要:如果您為用戶提供 OSD 的功能,但您不限制對特定池的訪問,則該用戶將有權訪問集群中的所有池!
修改用戶能力
ceph auth caps命令允許您指定用戶並更改用戶的能力。設置新功能將覆蓋當前功能。要查看當前功能,請運行ceph auth get USERTYPE.USERID。要添加功能,您還應該在使用表單時指定現有功能:
ceph auth caps USERTYPE.USERID {daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]' [{daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]']
例如:
ceph auth get client.john
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
刪除用戶
要刪除用戶,請使用:
ceph auth del {TYPE}.{ID}
其中{TYPE}是client 、osd 、 mon或mds 之一,並且{ID}是守護程序的用戶名或 ID。
打印用戶密鑰
要將用戶的身份驗證密鑰打印到標准輸出,請執行以下命令:
ceph auth print-key {TYPE}.{ID}
其中{TYPE}是client 、osd 、 mon或mds 之一,並且{ID}是守護程序的用戶名或 ID。
當您需要使用用戶密鑰(例如,libvirt)填充客戶端軟件時,打印用戶密鑰很有用。
mount -t ceph serverhost:/ mountpoint -o name=client.user,secret=`ceph auth print-key client.user`
導入用戶
要導入一個或多個用戶,請使用ceph auth import並指定一個密鑰環:
ceph auth import -i /path/to/keyring
例如:
sudo ceph auth import -i /etc/ceph/ceph.keyring
Ceph 存儲集群將添加新用戶、他們的密鑰和他們的能力,並將更新現有用戶、他們的密鑰和他們的能力。
密鑰環管理
當您通過 Ceph 客戶端訪問 Ceph 時,Ceph 客戶端將查找本地密鑰環。Ceph默認使用以下四個密鑰環名稱預設設置keyring,因此您不必在 Ceph 配置文件中設置它們,除非您想覆蓋默認值(不推薦):
/etc/ceph/$cluster.$name.keyring
/etc/ceph/$cluster.keyring
/etc/ceph/keyring
/etc/ceph/keyring.bin
元變量$cluster是您的Ceph 集群名稱,由 Ceph 配置文件的名稱定義(即,ceph.conf表示集群名稱是ceph;因此,ceph.keyring)。元變量$name是用戶類型和用戶 ID(例如,client.admin;因此,ceph.client.admin.keyring)。
創建用戶(例如client.ringo)后,您必須獲取密鑰並將其添加到 Ceph 客戶端上的密鑰環中,以便用戶可以訪問 Ceph 存儲集群。
用戶管理部分詳細介紹了如何在Ceph 存儲集群中直接列出、獲取、添加、修改和刪除用戶。但是,Ceph 還提供了 ceph-authtool 實用程序,允許您從 Ceph 客戶端管理密鑰環。
創建密鑰環
當您使用管理用戶部分中的過程創建用戶時,您需要向 Ceph 客戶端提供用戶密鑰,以便 Ceph 客戶端可以檢索指定用戶的密鑰並通過 Ceph 存儲集群進行身份驗證。Ceph 客戶端訪問密鑰環以查找用戶名並檢索用戶的密鑰。
該ceph-authtool實用程序允許您創建密鑰環。要創建一個空密鑰環,請使用--create-keyring或-C。例如:
ceph-authtool --create-keyring /path/to/keyring
在創建多用戶密鑰環時,我們建議使用集群名稱(例如,$cluster.keyring)作為密鑰環文件名並將其保存在 /etc/ceph目錄中,以便keyring配置默認設置將獲取文件名,而無需您在本地副本中指定它你的 Ceph 配置文件。例如,通過執行以下命令創建ceph.keyring:
sudo ceph-authtool -C /etc/ceph/ceph.keyring
使用單個用戶創建密鑰環時,我們建議使用集群名稱、用戶類型和用戶名並將其保存在/etc/ceph目錄中。例如,對於client.admin用戶,為ceph.client.admin.keyring。
要在 /etc/ceph 中創建密鑰環,您必須這樣做。這意味着該文件將僅對用戶root具有rw權限,這在密鑰環包含管理員密鑰時是合適的。但是,如果您打算將密鑰環用於特定用戶或用戶組,請確保您執行chown或chmod建立適當的密鑰環所有權和訪問權限。
將用戶添加到密鑰環
將 用戶添加到 Ceph 存儲集群時,可以使用獲取用戶過程來檢索用戶、密鑰和功能,並將用戶保存到密鑰環。
當您只想為每個密鑰環使用一個用戶時,帶有-o選項的獲取用戶過程將以密鑰環文件格式保存輸出。例如,要為client.admin用戶創建密鑰環,請執行以下命令:
sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
請注意,我們為單個用戶使用推薦的文件格式。
當您要將用戶導入密鑰環時,可以使用ceph-authtool 指定目標密鑰環和源密鑰環。例如:
sudo ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
創建用戶
Ceph 提供了添加用戶功能,可以直接在 Ceph 存儲集群中創建用戶。但是,您也可以直接在 Ceph 客戶端密鑰環上創建用戶、密鑰和功能。然后,您可以將用戶導入 Ceph 存儲集群。例如:
sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
您還可以創建密鑰環並同時將新用戶添加到密鑰環。例如:
sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
在上述場景中,新用戶client.ringo僅在密鑰環中。要將新用戶添加到 Ceph 存儲集群,您仍必須將新用戶添加到 Ceph 存儲集群。
sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
修改用戶
要修改密鑰環中用戶記錄的能力,請指定密鑰環和用戶,然后是能力。例如:
sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx'
要將用戶更新到 Ceph 存儲集群,您必須將密鑰環中的用戶更新為 Ceph 存儲集群中的用戶條目。
sudo ceph auth import -i /etc/ceph/ceph.keyring
有關從密鑰環更新 Ceph 存儲集群用戶的詳細信息,請參閱導入用戶。
您也可以直接在集群中修改用戶能力,將結果存儲到密鑰環文件中;然后,將密鑰環導入您的主 ceph.keyring 文件。
命令行用法
Ceph 支持以下用戶名和密碼用法:
- --id|--user
描述:Ceph 使用類型和 ID(例如,TYPE.ID或 client.admin,client.user1)來識別用戶。id,name 和 -n 選項使您能夠指定用戶名id的ID 部分(例如,admin、user1、foo等 )。您可以使用 --id 指定用戶並省略類型。例如,要指定用戶 client.foo,請輸入以下內容:
ceph --id foo --keyring /path/to/keyring health
ceph --user foo --keyring /path/to/keyring health
- --name|-n
描述:Ceph 使用類型和 ID(例如,TYPE.ID或 client.admin,client.user1)來識別用戶。--name 和 -n 選項使您能夠指定完全限定的用戶名。您必須為用戶 ID 指定用戶類型(通常為client)。例如:
ceph --name client.foo --keyring /path/to/keyring health
ceph -n client.foo --keyring /path/to/keyring health
- --keyring
描述:包含一個或多個用戶名和密碼的密鑰環的路徑。該--secret選項提供了相同的功能,但它不適用於 --secret用於其他目的的 Ceph RADOS 網關。您可以檢索密鑰環 ceph auth get-or-create 並將其存儲在本地。這是首選方法,因為您可以在不切換密鑰環路徑的情況下切換用戶名。例如:
sudo rbd map --id foo --keyring /path/to/keyring mypool/myimage
限制
該cephx協議相互驗證 Ceph 客戶端和服務器。它不旨在處理人類用戶或代表他們運行的應用程序的身份驗證。如果需要這種效果來處理您的訪問控制需求,您必須有另一種機制,它可能特定於用於訪問 Ceph 對象存儲的前端。這種其他機制的作用是確保只有可接受的用戶和程序才能在 Ceph 允許訪問其對象存儲的機器上運行。
用於驗證 Ceph 客戶端和服務器的密鑰通常存儲在受信任主機中具有適當權限的純文本文件中。
重要:將密鑰存儲在明文文件中存在安全缺陷,但鑒於 Ceph 在后台使用的基本身份驗證方法,它們很難避免。那些設置 Ceph 系統的人應該意識到這些缺點。
特別是,任意用戶機器,尤其是便攜式機器,不應配置為直接與 Ceph 交互,因為這種使用模式需要在不安全的機器上存儲明文身份驗證密鑰。任何偷走該機器或秘密訪問該機器的人都可以獲得允許他們向 Ceph 驗證自己的機器的密鑰。
與其允許可能不安全的機器直接訪問 Ceph 對象存儲,不如要求用戶使用為您的目的提供足夠安全性的方法登錄到您環境中的受信任機器。該受信任的機器將為人類用戶存儲明文 Ceph 密鑰。Ceph 的未來版本可能會更全面地解決這些特定的身份驗證問題。
目前,沒有任何 Ceph 身份驗證協議為傳輸中的消息提供保密性。因此,網絡上的竊聽者可以聽到並理解 Ceph 中客戶端和服務器之間發送的所有數據,即使它無法創建或更改它們。此外,Ceph 不包括在對象存儲中加密用戶數據的選項。當然,用戶可以手動加密並將自己的數據存儲在 Ceph 對象存儲中,但 Ceph 本身不提供執行對象加密的功能。那些在 Ceph 中存儲敏感數據的人應該考慮在將數據提供給 Ceph 系統之前對其進行加密。