跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Enterprise Storage 7 文件 / 操作和管理指南 / 設定叢集 / 使用 cephx 進行驗證
適用範圍 SUSE Enterprise Storage 7

30 使用 cephx 進行驗證

為了識別用戶端並防禦中間人攻擊,Ceph 提供了 cephx 驗證系統。在此環境中,用戶端表示人類使用者 (例如 admin 使用者) 或 Ceph 相關的服務/精靈 (例如 OSD、監控程式或物件閘道)。

注意
注意

cephx 通訊協定不會處理 TLS/SSL 之類的傳輸中資料加密。

30.1 驗證架構

cephx 使用共用機密金鑰進行驗證,這表示用戶端和 Ceph 監控程式都有用戶端機密金鑰的副本。驗證通訊協定可讓雙方互相證明各自擁有金鑰的副本,且無需真正透露金鑰。這樣就實現了雙向驗證,即,叢集可確定使用者擁有機密金鑰,而使用者亦可確定叢集擁有機密金鑰的副本。

Ceph 的一項重要延展性功能就是不需要透過集中式介面即可與 Ceph 物件儲存互動。這表示 Ceph 用戶端可直接與 OSD 互動。為了保護資料,Ceph 提供了 cephx 驗證系統來對 Ceph 用戶端進行驗證。

每個監控程式都可對用戶端進行驗證並分發金鑰,因此,在使用 cephx 時,不會出現單一故障點或瓶頸。監控程式會傳回驗證資料結構,其中包含獲取 Ceph 服務時要用到的工作階段金鑰。此工作階段金鑰自身已使用用戶端的永久機密金鑰進行了加密,因此,只有用戶端才能向 Ceph 監控程式要求服務。然後,用戶端會使用工作階段金鑰向監控程式要求所需的服務,監控程式會為用戶端提供一個票證,用於向實際處理資料的 OSD 驗證用戶端。Ceph 監控程式和 OSD 共用一個機密,因此,用戶端可使用監控程式提供的票證向叢集中的任何 OSD 或中繼資料伺服器表明身分。cephx 票證有過期時間,因此,攻擊者無法使用已過期的票證或以不當方式獲取的工作階段金鑰。

若要使用 cephx,管理員必須先設定用戶端/使用者。在下圖中,client.admin 使用者從指令行呼叫 ceph auth get-or-create-key 來產生使用者名稱和機密金鑰。Ceph 的 auth 子系統會產生該使用者名稱和金鑰,在監控程式中儲存一個副本,並將該使用者的機密傳回給 client.admin 使用者。這表示用戶端和監控程式共用一個機密金鑰。

cephx 基本驗證
圖 30.1︰ cephx 基本驗證

若要在監控程式中進行驗證,用戶端需將使用者名稱傳遞給監控程式。監控程式會產生一個工作階段金鑰,並使用與該使用者名稱關聯的機密金鑰來加密該工作階段金鑰,然後將加密的票證傳回給用戶端。之後,用戶端會使用共用的機密金鑰解密資料,以擷取工作階段金鑰。工作階段金鑰可識別目前工作階段的使用者。然後,用戶端會要求與該使用者相關、由工作階段金鑰簽署的票證。監控程式會產生一個票證,以使用者的機密金鑰對其加密,然後將其傳回給用戶端。用戶端解密該票證,並使用它來簽署傳至整個叢集中的 OSD 和中繼資料伺服器的要求。

cephx 驗證
圖 30.2︰ cephx 驗證

cephx 通訊協定會對用戶端機器與 Ceph 伺服器之間進行的通訊進行驗證。完成初始驗證後,將使用監控程式、OSD 和中繼資料伺服器可透過共用機密進行驗證的票證,來簽署用戶端與伺服器之間傳送的每條訊息。

cephx 驗證 - MDS 和 OSD
圖 30.3︰ cephx 驗證 - MDS 和 OSD
重要
重要

這種驗證提供的保護僅限於 Ceph 用戶端與 Ceph 叢集主機之間,驗證不會延伸到 Ceph 用戶端以外。如果使用者從遠端主機存取 Ceph 用戶端,則不會對使用者主機與用戶端主機之間的連接套用 Ceph 驗證。

30.2 主要管理

本節介紹 Ceph 用戶端使用者,以及如何在 Ceph 儲存叢集中對其進行驗證和授權。使用者是指使用 Ceph 用戶端來與 Ceph 儲存叢集精靈互動的個人或系統參與者 (例如應用程式)。

Ceph 在啟用驗證和授權 (預設啟用) 的情況下執行時,您必須指定一個使用者名稱,以及包含所指定使用者的機密金鑰的金鑰圈 (通常透過指令行指定)。如果您未指定使用者名稱,Ceph 將使用 client.admin 做為預設使用者名稱。如果您未指定金鑰圈,Ceph 將透過 Ceph 組態檔案中的金鑰圈設定來尋找金鑰圈。例如,如果您在未指定使用者名稱或金鑰圈的情況下執行 ceph health 指令,Ceph 將依如下所示解釋該指令:

cephuser@adm > ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health

或者,您可以使用 CEPH_ARGS 環境變數來避免重複輸入使用者名稱和機密。

30.2.1 背景資訊

無論 Ceph 用戶端是何類型 (例如,區塊裝置、物件儲存、檔案系統、原生 API),Ceph 都會在中將所有資料儲存為物件。Ceph 使用者需要擁有池存取權才能讀取和寫入資料。此外,Ceph 使用者必須擁有執行權限才能使用 Ceph 的管理指令。以下概念可協助您理解 Ceph 使用者管理。

30.2.1.1 使用者

使用者是指個人或系統參與者 (例如應用程式)。透過建立使用者,您可以控制誰 (或哪個參與者) 能夠存取您的 Ceph 儲存叢集、其池及池中的資料。

Ceph 使用多種類型的使用者。進行使用者管理時,將一律使用 client 類型。Ceph 透過句點 (.)分隔格式來識別使用者,該格式由使用者類型和使用者 ID 組成。例如,TYPE.IDclient.adminclient.user1。區分使用者類型的原因在於,Ceph 監控程式、OSD 和中繼資料伺服器也使用 cephx 通訊協定,但它們並非用戶端。區分使用者類型有助於將用戶端使用者與其他使用者區分開來,從而簡化存取控制、使用者監控和追溯性。

有時,Ceph 的使用者類型可能會令人混淆,因為依據指令行用法的不同,Ceph 指令行允許您指定具有類型的使用者或不具有類型的使用者。如果您指定 --user--id,則可以省略類型。因此,可將 client.user1 簡單地輸入為 user1。如果您指定的是 --name-n,則必須指定類型和名稱,例如 client.user1。做為最佳實務,我們建議儘可能使用類型和名稱。

注意
注意

Ceph 儲存叢集使用者與 Ceph 物件儲存使用者或 Ceph 檔案系統使用者均不同。Ceph 物件閘道使用 Ceph 儲存叢集使用者在閘道精靈與儲存叢集之間通訊,但閘道有自己的使用者管理功能來管理最終使用者。Ceph 檔案系統使用 POSIX 語意。與其關聯的使用者空間和 Ceph 儲存叢集使用者不同。

30.2.1.2 授權和能力

Ceph 使用「能力」(caps) 術語來描述對已驗證的使用者進行授權,允許其運用監控程式、OSD 和中繼資料伺服器的功能。功能還可限制對池或池名稱空間內的資料的存取。Ceph 管理使用者可在建立或更新使用者時設定使用者的能力。

能力語法的格式如下:

daemon-type 'allow capability' [...]

下面是每個服務類型的能力清單:

監控程式能力

包括 rwxallow profile cap

mon 'allow rwx'
mon 'allow profile osd'
OSD 能力

包括 rwxclass-readclass-writeprofile osd。此外,使用 OSD 能力還能進行池和名稱空間設定。

osd 'allow capability' [pool=poolname] [namespace=namespace-name]
MDS 能力

只需要 allow,或留為空白。

mds 'allow'

以下各項描述了每個能力:

allow

需先於精靈的存取設定指定。僅對 MDS 表示 rw

r

向使用者授予讀取權限。存取監控程式以擷取 CRUSH 地圖時需具有此能力。

w

向使用者授予對物件的寫入權限。

x

授予使用者呼叫類別方法 (包括讀取和寫入) 的能力,以及在監控程式中執行 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

授予使用者將中繼資料伺服器開機的權限。授權給部署工具,使其在將中繼資料伺服器開機時有權新增金鑰。

30.2.1.3

池是指使用者在其中儲存資料的邏輯分割區。在 Ceph 部署中,常見的做法是為相似類型的資料建立一個池做為邏輯分割區。例如,將 Ceph 部署為 OpenStack 的後端時,一般的部署方式是為磁碟區、影像、備份和虛擬機器以及使用者 (如 client.glanceclient.cinder) 建立相應的池。

30.2.2 管理使用者

使用者管理功能可讓 Ceph 叢集管理員能夠直接在 Ceph 叢集中建立、更新和刪除使用者。

在 Ceph 叢集中建立或刪除使用者時,可能需要將金鑰分發到用戶端,以便可將金鑰新增至金鑰圈。請參閱第 30.2.3 節 「管理金鑰圈」,以獲得詳細資料。

30.2.2.1 列出使用者

若要列出叢集中的使用者,請執行以下指令:

cephuser@adm > ceph auth list

Ceph 將列出您叢集中的所有使用者。例如,在包含兩個節點的叢集中,ceph auth list 輸出類似下方所示:

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 表示法

請注意,針對使用者採用 TYPE.ID 表示法,例如,osd.0 指定 osd 類型的使用者,其 ID 為 0client.adminclient 類型的使用者,其 ID 為 admin。另請注意,每個項目都包含一個 key: value 項目,以及一或多個 caps: 項目。

您可以將 -o filename 選項和 ceph auth list 結合使用,以將輸出儲存到某個檔案。

30.2.2.2 獲取有關使用者的資訊

若要擷取特定的使用者、金鑰和能力,請執行以下指令:

cephuser@adm > ceph auth get TYPE.ID

例如:

cephuser@adm > ceph auth get client.admin
exported keyring for client.admin
[client.admin]
	key = AQA19uZUqIwkHxAAFuUwvq0eJD4S173oFRxe0g==
	caps mds = "allow"
	caps mon = "allow *"
 caps osd = "allow *"

開發人員也可以執行以下指令:

cephuser@adm > ceph auth export TYPE.ID

auth export 指令與 auth get 相同,不過它還會列印內部驗證 ID。

30.2.2.3 新增使用者

新增使用者會建立使用者名稱 (TYPE.ID)、機密金鑰,以及包含在指令中用於建立該使用者的所有能力。

使用者可使用其金鑰向 Ceph 儲存叢集進行驗證。使用者的能力授予該使用者在 Ceph 監控程式 (mon)、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 權限通常限制為只能存取特定的池。

cephuser@adm > ceph auth add client.john mon 'allow r' osd \
 'allow rw pool=liverpool'
cephuser@adm > ceph auth get-or-create client.paul mon 'allow r' osd \
 'allow rw pool=liverpool'
cephuser@adm > ceph auth get-or-create client.george mon 'allow r' osd \
 'allow rw pool=liverpool' -o george.keyring
cephuser@adm > ceph auth get-or-create-key client.ringo mon 'allow r' osd \
 'allow rw pool=liverpool' -o ringo.key
重要
重要

如果您為某個使用者提供了對 OSD 的能力,但限制只能存取特定池,則該使用者將有權存取叢集中的所有池。

30.2.2.4 修改使用者能力

使用 ceph auth caps 指令可以指定使用者以及變更該使用者的能力。設定新能力會覆寫目前的能力。若要檢視目前的能力,請執行 ceph auth get USERTYPEUSERID。若要新增能力,使用以下格式時還需要指定現有能力:

cephuser@adm > 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]']

例如:

cephuser@adm > ceph auth get client.john
cephuser@adm > ceph auth caps client.john mon 'allow r' osd 'allow rw pool=prague'
cephuser@adm > ceph auth caps client.paul mon 'allow rw' osd 'allow r pool=prague'
cephuser@adm > ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'

若要移除某個能力,可重設該能力。如果希望使用者無權存取以前設定的特定精靈,請指定一個空白字串:

cephuser@adm > ceph auth caps client.ringo mon ' ' osd ' '

30.2.2.5 刪除使用者

若要刪除使用者,請使用 ceph auth del

cephuser@adm > ceph auth del TYPE.ID

其中,TYPEclientosdmonmds 之一,ID 是使用者名稱或精靈的 ID。

如果您建立了僅對不再存在的池具有權限的使用者,則應該考慮也刪除那些使用者。

30.2.2.6 列印使用者的金鑰

若要將使用者的驗證金鑰列印到標準輸出,請執行以下指令:

cephuser@adm > ceph auth print-key TYPE.ID

其中,TYPEclientosdmonmds 之一,ID 是使用者名稱或精靈的 ID。

當您需要在用戶端軟體 (例如 libvirt) 中填入某個使用者的金鑰時,列印使用者的金鑰非常實用,如以下範例所示:

root # mount -t ceph host:/ mount_point \
-o name=client.user,secret=`ceph auth print-key client.user`

30.2.2.7 輸入使用者

若要輸入一或多個使用者,請使用 ceph auth import 並指定金鑰圈:

cephuser@adm > ceph auth import -i /etc/ceph/ceph.keyring
注意
注意

Ceph 儲存叢集將新增新使用者及其金鑰和能力,並更新現有使用者及其金鑰和能力。

30.2.3 管理金鑰圈

當您透過 Ceph 用戶端存取 Ceph 時,該用戶端會尋找本地金鑰圈。依預設,Ceph 會使用以下四個金鑰圈名稱預先指定金鑰圈設定,因此,除非您要覆寫預設值,否則無需在 Ceph 組態檔案中設定這些名稱:

/etc/ceph/cluster.name.keyring
/etc/ceph/cluster.keyring
/etc/ceph/keyring
/etc/ceph/keyring.bin

cluster 元變數是依 Ceph 組態檔案名稱定義的 Ceph 叢集名稱。ceph.conf 表示叢集名稱為 ceph,因此金鑰圈名稱為 ceph.keyringname 元變數是使用者類型和使用者 ID (例如 client.admin),因此金鑰圈名稱為 ceph.client.admin.keyring

建立使用者 (例如 client.ringo) 之後,必須獲取金鑰並將其新增至 Ceph 用戶端上的金鑰圈,以使該使用者能夠存取 Ceph 儲存叢集。

第 30.2 節 「主要管理」詳細介紹了如何直接在 Ceph 儲存叢集中列出、獲取、新增、修改和刪除使用者。不過,Ceph 還提供了 ceph-authtool 公用程式,可讓您從 Ceph 用戶端管理金鑰圈。

30.2.3.1 建立金鑰圈

當您依照第 30.2 節 「主要管理」中的程序建立使用者時,需要向 Ceph 用戶端提供使用者金鑰,以使用戶端能擷取指定使用者的金鑰,並向 Ceph 儲存叢集驗證身分。Ceph 用戶端將存取金鑰圈,以查閱使用者名稱並擷取使用者的金鑰:

cephuser@adm > ceph-authtool --create-keyring /path/to/keyring

建立包含多個使用者的金鑰圈時,我們建議使用叢集名稱 (例如 cluster.keyring) 做為金鑰圈檔案名稱,並將其儲存在 /etc/ceph 目錄中,如此,您無需在 Ceph 組態檔案的本地副本中指定檔案名稱,金鑰圈組態預設設定就會選取正確的檔案名稱。例如,可執行以下指令來建立 ceph.keyring

cephuser@adm > ceph-authtool -C /etc/ceph/ceph.keyring

建立包含單個使用者的金鑰圈時,我們建議使用叢集名稱、使用者類型和使用者名稱,並將其儲存在 /etc/ceph 目錄中。例如,為 client.admin 使用者建立 ceph.client.admin.keyring

30.2.3.2 將使用者新增至金鑰圈

將某個使用者新增至 Ceph 儲存叢集時 (請參閱第 30.2.2.3 節 「新增使用者」),您可以擷取該使用者、金鑰和能力,並將該使用者儲存到金鑰圈。

如果您只想對每個金鑰圈使用一個使用者,可以將 -o 選項與 ceph auth get 指令結合使用,以金鑰圈檔案格式儲存輸出。例如,若要為 client.admin 使用者建立金鑰圈,請執行以下指令:

cephuser@adm > ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring

若要將使用者輸入到金鑰圈,可以使用 ceph-authtool 來指定目的地金鑰圈和來源金鑰圈:

cephuser@adm > ceph-authtool /etc/ceph/ceph.keyring \
  --import-keyring /etc/ceph/ceph.client.admin.keyring
重要
重要

如果您的金鑰圈遭入侵,請從 /etc/ceph 目錄中刪除您的金鑰,並使用第 30.2.3.1 節 「建立金鑰圈」中的相同說明重新建立新金鑰。

30.2.3.3 建立使用者

Ceph 提供 ceph auth add 指令用於直接在 Ceph 儲存叢集中建立使用者。不過,您也可以直接在 Ceph 用戶端金鑰圈中建立使用者、金鑰和能力。然後,可將使用者輸入到 Ceph 儲存叢集:

cephuser@adm > ceph-authtool -n client.ringo --cap osd 'allow rwx' \
  --cap mon 'allow rwx' /etc/ceph/ceph.keyring

您也可以在建立金鑰圈的同時將新使用者新增至該金鑰圈:

cephuser@adm > ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo \
  --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key

在前面的方案中,新使用者 client.ringo 僅存放在金鑰圈中。若要將該新使用者新增至 Ceph 儲存叢集,您仍必須手動新增:

cephuser@adm > ceph auth add client.ringo -i /etc/ceph/ceph.keyring

30.2.3.4 修改使用者

若要修改金鑰圈中某條使用者記錄的能力,請指定該金鑰圈和使用者,然後指定能力:

cephuser@adm > ceph-authtool /etc/ceph/ceph.keyring -n client.ringo \
  --cap osd 'allow rwx' --cap mon 'allow rwx'

若要在 Ceph 叢集環境中更新已修改的使用者,必須將金鑰圈中的變更輸入到 Ceph 叢集中的使用者項目:

cephuser@adm > ceph auth import -i /etc/ceph/ceph.keyring

請參閱第 30.2.2.7 節 「輸入使用者」,瞭解有關根據金鑰圈更新 Ceph 儲存叢集使用者的詳細資料。

30.2.4 指令行用法

ceph 指令支援以下與使用者名稱和機密操作相關的選項:

--id--user

Ceph 使用類型和 ID (TYPE.ID,例如 client.adminclient.user1) 來識別使用者。使用 idname-n 選項可以指定使用者名稱的 ID 部分 (例如 adminuser1)。您可以使用 --id 指定使用者,並省略類型。例如,若要指定使用者 client.foo,請輸入以下指令:

cephuser@adm > ceph --id foo --keyring /path/to/keyring health
cephuser@adm > ceph --user foo --keyring /path/to/keyring health
--name-n

Ceph 使用類型和 ID (TYPE.ID,例如 client.adminclient.user1) 來識別使用者。使用 --name-n 選項可以指定完整的使用者名稱。您必須指定使用者類型 (一般為 client) 和使用者 ID:

cephuser@adm > ceph --name client.foo --keyring /path/to/keyring health
cephuser@adm > ceph -n client.foo --keyring /path/to/keyring health
--keyring

包含一或多個使用者名稱和機密的金鑰圈路徑。--secret 選項提供相同的功能,但它不適用於物件閘道,該閘道將 --secret 用於其他目的。您可以使用 ceph auth get-or-create 來擷取金鑰圈並將其儲存在本地。這是慣用的方法,因為您無需切換金鑰圈路徑就能切換使用者名稱:

cephuser@adm > rbd map --id foo --keyring /path/to/keyring mypool/myimage