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
基本驗證 #若要在監控程式中進行驗證,用戶端需將使用者名稱傳遞給監控程式。監控程式會產生一個工作階段金鑰,並使用與該使用者名稱關聯的機密金鑰來加密該工作階段金鑰,然後將加密的票證傳回給用戶端。之後,用戶端會使用共用的機密金鑰解密資料,以擷取工作階段金鑰。工作階段金鑰可識別目前工作階段的使用者。然後,用戶端會要求與該使用者相關、由工作階段金鑰簽署的票證。監控程式會產生一個票證,以使用者的機密金鑰對其加密,然後將其傳回給用戶端。用戶端解密該票證,並使用它來簽署傳至整個叢集中的 OSD 和中繼資料伺服器的要求。
cephx
驗證 #
cephx
通訊協定會對用戶端機器與 Ceph
伺服器之間進行的通訊進行驗證。完成初始驗證後,將使用監控程式、OSD
和中繼資料伺服器可透過共用機密進行驗證的票證,來簽署用戶端與伺服器之間傳送的每條訊息。
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.ID
、client.admin
或
client.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' [...]
下面是每個服務類型的能力清單:
- 監控程式能力
包括
r
、w
、x
和allow profile cap
。mon 'allow rwx' mon 'allow profile osd'
- OSD 能力
包括
r
、w
、x
、class-read
、class-write
和profile 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.glance
或
client.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
表示法,例如,osd.0
指定
osd
類型的使用者,其 ID 為
0
。client.admin
是
client
類型的使用者,其 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.keyringcephuser@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
USERTYPE。USERID
。若要新增能力,使用以下格式時還需要指定現有能力:
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.johncephuser@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
其中,TYPE 是
client
、osd
、mon
或
mds
之一,ID 是使用者名稱或精靈的 ID。
如果您建立了僅對不再存在的池具有權限的使用者,則應該考慮也刪除那些使用者。
30.2.2.6 列印使用者的金鑰 #
若要將使用者的驗證金鑰列印到標準輸出,請執行以下指令:
cephuser@adm >
ceph auth print-key TYPE.ID
其中,TYPE 是
client
、osd
、mon
或
mds
之一,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.keyring
。name
元變數是使用者類型和使用者 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.admin
或client.user1
) 來識別使用者。使用id
、name
和-n
選項可以指定使用者名稱的 ID 部分 (例如admin
或user1
)。您可以使用 --id 指定使用者,並省略類型。例如,若要指定使用者 client.foo,請輸入以下指令:cephuser@adm >
ceph --id foo --keyring /path/to/keyring healthcephuser@adm >
ceph --user foo --keyring /path/to/keyring health--name
或-n
Ceph 使用類型和 ID (TYPE.ID,例如
client.admin
或client.user1
) 來識別使用者。使用--name
和-n
選項可以指定完整的使用者名稱。您必須指定使用者類型 (一般為client
) 和使用者 ID:cephuser@adm >
ceph --name client.foo --keyring /path/to/keyring healthcephuser@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