Ceph作為一個分布式存儲系統,支持對象存儲、塊設備和文件系統。為了在網絡傳輸中防止數據被篡改,做到較高程度的安全性,加入了Cephx加密認證協議。其目的是識別身份,加密、驗證傳輸中的數據。
cephx 用於對ceph 保存的數據進行認證訪問和授權,用於對訪問ceph 的請求進行認證和授權檢測,與mon 通信的請求都要經過ceph 認證通過,但是也可以在mon 節點關閉cephx認證,但是關閉認證之后任何訪問都將被允許,因此無法保證數據的安全性。
Client與OSD必須先連接到mon上完成認證,Client才能讀寫數據。
下面為ceph.conf中的cephx的配置:
$vim /etc/ceph/ceph.conf auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx
(1)每個mon 節點都可以對客戶端進行身份認證並分發秘鑰,因此多個mon 節點就不存在單點故障和認證性能瓶頸。
(2)mon 節點會返回用於身份認證的數據結構,其中包含獲取ceph 服務時用到的session key,session key 通過客戶端秘鑰進行加密,秘鑰是在客戶端提前配置好的,/etc/ceph/ceph.client.admin.keyring。
(3)客戶端使用session key 向mon 請求所需要的服務,mon 向客戶端提供一個tiket,用於向實際處理數據的OSD 等服務驗證客戶端身份,MON 和OSD 共享同一個secret,因此OSD會信任所有MON 發放的tiket。
(4)tiket 存在有效期。
注意:
CephX 身份驗證功能僅限制在Ceph 的各組件之間,不能擴展到其他非ceph 組件
Ceph 只負責認證授權,不能解決數據傳輸的加密問題
2、Ceph的訪問流程
無論ceph 客戶端是哪種類型,例如塊設備、對象存儲、文件系統,ceph 都會在存儲池中將所有數據存儲為對象。
ceph 用戶需要擁有存儲池pool訪問權限,才能讀取和寫入數據。
ceph 用戶必須擁有執行權限才能使用ceph 的管理命令。
(1)Client向mon申請一個有權限可以訪問osd的用戶,client和mon共享該用戶權限信息。
(2)同時該用戶也會給mon、mds和osd共享。
(3)Client拿到了授權用戶開始向mon認證。
(4)mon通過認證后,會生成一個隨機並加密的session key發送給Client.
(5)Client收到mon發送過來的session key並解密后,再向mon發起ticket申請請求。
(6)mon將ticket信息發送給client。
(7)Client接受到mon發來的ticke后,下面開始請求數據。
(8)如果Client訪問的是cephfs,client會向mds發送請求;如果Client訪問是塊存儲等設備,則直接向osd發送請求。
用戶是指個人(ceph 管理者)或系統參與者(MON/OSD/MDS)。 通過創建用戶,可以控制用戶或哪個參與者能夠訪問ceph 存儲集群、以及可訪問的存儲池及存儲池中的數據。 ceph 支持多種類型的用戶,但可管理的用戶都屬於client 類型區分用戶類型的原因在於,MON/OSD/MDS 等系統組件特使用cephx 協議,但是它們為非客戶端。
ceph@ceph-deploy:~$ cat /etc/ceph/ceph.client.admin.keyring [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== #admin用戶的加密密鑰 #下面為admin用戶對ceph集群各個組件的管理權限 caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
查看指定用戶信息:
ceph@ceph-deploy:~$ ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.29228 root default -3 0.07794 host ceph-node01 16 hdd 0.01949 osd.16 up 1.00000 1.00000 17 hdd 0.01949 osd.17 up 1.00000 1.00000 18 hdd 0.01949 osd.18 up 1.00000 1.00000 19 hdd 0.01949 osd.19 up 1.00000 1.00000 -5 0.05846 host ceph-node02 4 hdd 0.01949 osd.4 up 1.00000 1.00000 5 hdd 0.01949 osd.5 up 1.00000 1.00000 6 hdd 0.01949 osd.6 up 1.00000 1.00000 -7 0.07794 host ceph-node03 8 hdd 0.01949 osd.8 up 1.00000 1.00000 9 hdd 0.01949 osd.9 up 1.00000 1.00000 10 hdd 0.01949 osd.10 up 1.00000 1.00000 11 hdd 0.01949 osd.11 up 1.00000 1.00000 -9 0.07794 host ceph-node04 12 hdd 0.01949 osd.12 up 1.00000 1.00000 13 hdd 0.01949 osd.13 up 1.00000 1.00000 14 hdd 0.01949 osd.14 up 1.00000 1.00000 15 hdd 0.01949 osd.15 up 1.00000 1.00000 ceph@ceph-deploy:~$ ceph auth get osd.10 [osd.10] key = AQCn3xth8E1QKhAAiNtNqTYia0PKroZrPTKkBw== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" exported keyring for osd.10 #osd.10 用戶類型為osd,id號為10 ceph@ceph-deploy:~$ ceph auth get client.admin [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" exported keyring for client.admin
用戶的授權,只有在授權之后,用戶才可以使用權限范圍內的 MON、OSD、MDS 的功能。
ceph 基於使能/能力(Capabilities,簡稱caps )來描述用戶可針對MON/OSD 或MDS 使用的授權范圍或級別。
通用的語法格式:daemon-type ‘allow caps’ [...]
能力一覽表:
授權階段分2種:訪問授權和能力授權 訪問授權: allow:在守護進程進行訪問設置之前就已經具有特定權限,僅對 MDS 隱含 rw r:向用戶授予讀取權限。訪問監視器(mon)以檢索CRUSH 運行圖時需具有此能力。 w:向用戶授予針對對象的寫入權限。 x:授予用戶調用類方法(包括讀取和寫入)的能力,以及在監視器中執行auth 操作的能力。 *,all:授予用戶對特定守護進程/存儲池的讀取、寫入和執行權限,以及執行管理命令的能力 class-read:授予用戶調用類讀取方法的能力, x 的子集 class-write:授予用戶調用類寫入方法的能力, x 的子集 能力授權: profile osd :授予用戶以某個OSD 身份連接到其他OSD 或監視器的權限。授予OSD 權限,使OSD 能夠處理復制檢測信號流量和狀態報告(獲取OSD 的狀態信息)。 profile mds :授予用戶以某個MDS 身份連接到其他MDS 或監視器的權限。 profile bootstrap-osd:授予用戶引導OSD 的權限(初始化OSD 並將OSD 加入ceph 集群),授權給部署工具,使其在引導OSD 時有權添加密鑰。通常授予部署工具ceph-deploy,讓它們在引導 OSD 時就有增加密鑰的權限了. profile bootstrap-mds:授予用戶引導元數據服務器的權限,授權部署工具權限,使其在引導元數據服務器時有權添加密鑰。 profile bootstrap-rbd:授權用戶引導 RBD 守護進程的能力,同上 profile bootstrap-rbd-mirror:授權用戶引導 rbd-mirror守護進程的能力,同上 profile rbd:授權一個用戶可以操作rbd image的權限 profile rbd-mirror:授權一個用戶可以操作rbd image的權限和獲得osd Mirroring配置秘鑰 profile rbd-read-only:授權一個用戶只讀rbd image的權限
MON 能力:
包括r/w/x 和allow profile cap(ceph 的運行圖) 例如: 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'
用戶管理功能可讓Ceph 集群管理員能夠直接在Ceph 集群中創建、更新和刪除用戶。 在Ceph 集群中創建或刪除用戶時,可能需要將密鑰分發到客戶端,以便將密鑰添加到密鑰環中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一個或者多個用戶認證信息,凡是擁有此文件的節點,將具備訪問ceph 的權限,而且可以使用其中任何一個賬戶的權限,此文件類似於linux 系統的中的/etc/passwd 文件。
1創建用戶的流程
要使用 Cephx,集群的管理員(administrator),也就是 client.admin,需要在集群中創建一個用戶賬號(user account)。要創建用戶賬號,client.admin 需要調用 ceph auth get-or-create 命令。Ceph 用戶驗證子系統會產生一 個用戶名(username)和一個密鑰(secret key),並將它們保存在Ceph monitor 上,再將用戶密鑰返回給client.admin。Ceph 系統管理員需要將用戶名和密碼提供給需要安全地訪問 Ceph 存儲服務的客戶端。
ceph@ceph-deploy:~$ ceph auth list osd.10 key: AQCn3xth8E1QKhAAiNtNqTYia0PKroZrPTKkBw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.11 key: AQC73xthe8HdLhAAPn3Odus1lnVgS33FTKMsOw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.12 key: AQDY3xthEimIJhAAZBtxRVnGk7lQ4ePrQX/IFg== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.13 key: AQDu3xthFw/BAxAA188g6znSfBhVp0KS2rfuDw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.14 key: AQBW4BthbLItCRAAZToVdPYXX3OioYSk7drN2A== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.15 key: AQBJ4Rth1J7yEhAAEBjhszfv+/l8Sn8oC5CIwQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.16 key: AQDUohxhNOYfFhAAvia7vpPfuAHTJkH+Y//a6g== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.17 key: AQD2ohxheYwbNBAAUJeYKzBkG3DdEytc3oJ04g== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.18 key: AQAioxxhX99KKxAApi1oYobuhiNob/Sya1dHZw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.19 key: AQBLoxxhNQU1GxAAr9hDPMy/szq/4fEvkcLucQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.4 key: AQAe3xthhdCRJRAAB/pYzWMaoBImp79bS0FDWg== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.5 key: AQA03xthXTvYJRAAqkRD4AAo7mlYD7C+u5AmpQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.6 key: AQBJ3xthAu98ABAAYjUZPZLY9dc0G+2tyzPHSA== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.8 key: AQB+3xthHQYTABAAVGRxMD3LtfSuCkuasVrLAQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.9 key: AQCS3xthK5WJOBAAXQomcwWHG7wgQe/AZrtcLw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * client.admin key: AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps: [mds] allow * caps: [mgr] allow * caps: [mon] allow * caps: [osd] allow * client.bootstrap-mds key: AQAKyxthbBHbORAARZ9YWc91MsEpI47n4bBiaQ== caps: [mon] allow profile bootstrap-mds client.bootstrap-mgr key: AQAKyxthhCbbORAAAU6l1aSb76vYWU/U8Ow++w== caps: [mon] allow profile bootstrap-mgr client.bootstrap-osd key: AQAKyxthJzrbORAAeoL4+iqegTQqAAhg51yEYg== caps: [mon] allow profile bootstrap-osd client.bootstrap-rbd key: AQAKyxth+EzbORAABONpnXhO6FmRXZmrQTRqaw== caps: [mon] allow profile bootstrap-rbd client.bootstrap-rbd-mirror key: AQAKyxthNF/bORAAuO3Tx8uZOEOelSW1V2U2sQ== caps: [mon] allow profile bootstrap-rbd-mirror client.bootstrap-rgw key: AQAKyxthNHDbORAARVjOD8xlmwg8pRnG/gdr0g== caps: [mon] allow profile bootstrap-rgw mgr.ceph-mgr01 key: AQB50Bthh1XKDxAAigNmg5O8ROcafDZysfJCgg== caps: [mds] allow * caps: [mon] allow profile mgr caps: [osd] allow * mgr.ceph-mgr02 key: AQCuqxxhtqofCRAAJ4HdN+6Bmv2k8zF8REcIjQ== caps: [mds] allow * caps: [mon] allow profile mgr caps: [osd] allow * installed auth entries:
ceph@ceph-deploy:~$ ceph auth list -o /tmp/ceph_user.key
3用戶管理命令
添加一個用戶會創建用戶名(TYPE.ID)、機密密鑰,以及包含在命令中用於創建該用戶的所有能力,用戶可使用其密鑰向Ceph 存儲集群進行身份驗證。用戶的能力授予該用戶在Ceph monitor (mon)、Ceph OSD (osd) 或Ceph 元數據服務器(mds) 上進行讀取、寫入或執行的能力,可以使用以下幾個命令來添加用戶。
3.1創建用戶及獲取用戶信息
3.1.1 ceph auth add
此命令是添加用戶的規范方法。它會創建用戶、生成密鑰,並添加所有指定的能力。
ceph@ceph-deploy:~$ ceph auth add -h auth add <entity> {<caps> [<caps>...]} ceph@ceph-deploy:~$ ceph osd pool ls device_health_metrics myrbd1 #給pool=myrbd1創建一個client的ywx用戶,對mon有r權限,對myrbd1地址池有rwx權限 ceph@ceph-deploy:~$ ceph auth add client.ywx mon 'allow r' osd 'allow rwx pool=myrbd1' added key for client.ywx ceph@ceph-deploy:~$ ceph auth get client.ywx [client.ywx] key = AQAjNCJhFgTkCBAA+Xzg30Mu0F1k7eqGOvEaMw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.ywx
3.1.2 ceph auth get-or-create
#創建kaka用戶 ceph@ceph-deploy:~$ ceph auth get-or-create client.kaka mon 'allow r' osd 'allow rwx pool=myrbd1' [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== ceph@ceph-deploy:~$ ceph auth get client.kaka [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.kaka #再次創建kaka用戶 ceph@ceph-deploy:~$ ceph auth get-or-create client.kaka mon 'allow r' osd 'allow rwx pool=myrbd1' [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== #注意:該命令為沒有創建的用戶,則創建用戶並顯示用戶名(在方括號中)和密鑰的密鑰文;創建的用戶已存在,則直接顯示用戶名(在方括號中)和密鑰的密鑰文。
3.1.3 ceph auth get-or-create-key
ceph@ceph-deploy:~$ ceph auth get-or-create-key client.kaka mon 'allow r' osd 'allow rwx pool=myrbd1' AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== #1、僅僅只顯示用戶密鑰key #2、用戶有key就顯示,沒有key就創建
3.1.4 ceph auth print-key
ceph@ceph-deploy:~$ ceph auth print-key client.kaka AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ==
使用ceph auth caps 命令可以指定用戶以及更改該用戶的能力,設置新能力會完全覆蓋當前的能力,因此要加上之前的用戶已經擁有的能和新的能力,如果看當前能力,可以運行ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式時還需要指定現有能力:
root # 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]']
案例
#查看上面創建的kaka用戶權限 ceph@ceph-deploy:~$ ceph auth get client.kaka [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.kaka #將mon權限改為rw,osd權限改為rw ceph@ceph-deploy:~$ ceph auth caps client.kaka mon 'allow rw' osd 'allow rw pool=myrbd1' updated caps for client.kaka #驗證權限 ceph@ceph-deploy:~$ ceph auth get client.kaka [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== caps mon = "allow rw" caps osd = "allow rw pool=myrbd1" exported keyring for client.kaka
要刪除用戶使用ceph auth del TYPE.ID,其中TYPE 是client、osd、mon 或mds 之一,ID 是用戶名或守護進程的ID。
#刪除kaka用戶 ceph@ceph-deploy:~$ ceph auth del client.kaka updated ceph@ceph-deploy:~$ ceph auth get client.kaka Error ENOENT: failed to find client.kaka in keyring #無kaka用戶
ceph 的秘鑰環是一個保存了secrets、keys、certificates 並且能夠讓客戶端通認證訪問ceph的keyring file(集合文件),一個keyring file 可以保存一個或者多個認證信息,每一個key 都有一個實體名稱加權限,類型為:
{client、mon、mds、osd}.name
當客戶端訪問ceph 集群時,ceph 會使用以下四個密鑰環文件預設置密鑰環設置:
/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring #保存單個用戶的keyring /etc/ceph/cluster.keyring #保存多個用戶的keyring /etc/ceph/keyring #未定義集群名稱的多個用戶的keyring /etc/ceph/keyring.bin #編譯后的二進制文件
密鑰環文件的創建分為:用戶創建--->空的keyring文件創建--->把用戶信息導入keyring文件。
#1、創建一個user1的用戶文件 ceph@ceph-deploy:~$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow rwx pool=myrbd1' [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== ceph@ceph-deploy:~$ ceph auth get client.user1 [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.user1 #2、創建一個名為ceph.client.user1.keyring的空的密鑰環文件 ceph@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user1.keyring creating ceph.client.user1.keyring #是個空文件 ceph@ceph-deploy:~$ file ceph.client.user1.keyring ceph.client.user1.keyring: empty #3、導出user1信息之指定的keyring文件 ceph@ceph-deploy:~$ ceph auth get client.user1 -o ceph.client.user1.keyring exported keyring for client.user1 ceph@ceph-deploy:~$ cat ceph.client.user1.keyring [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1"
6.2從keyring文件恢復刪除的用戶認證信息
#1、刪除client.user1用戶 ceph@ceph-deploy:~$ ceph auth get client.user1 [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.user1 #刪除client.use1 ceph@ceph-deploy:~$ ceph auth del client.user1 updated #驗證client.user1用戶被刪除 ceph@ceph-deploy:~$ ceph auth get client.user1 Error ENOENT: failed to find client.user1 in keyring #2、使用client.user1的keyring恢復用戶client.user1的認證信息 ceph@ceph-deploy:~$ ceph auth import -i ceph.client.user1.keyring imported keyring #client.user1信息被恢復 ceph@ceph-deploy:~$ ceph auth get client.user1 [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.user1
#1、創建一個空的keyring 文件: ceph@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user.keyring creating ceph.client.user.keyring #2、將admin用戶keyring文件內容導入到user的keyring文件 ceph@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring creating ceph.client.user.keyring importing contents of /etc/ceph/ceph.client.admin.keyring into ceph.client.user.keyring #3、驗證ceph.client.user.keyring文件 ceph@ceph-deploy:~$ ceph-authtool -l ./ceph.client.user.keyring [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" #4、再把ceph.client.user1.keyring文件內容信息導入到user的keyrig文件中 ceph@ceph-deploy:~$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user1.keyring importing contents of ./ceph.client.user1.keyring into ./ceph.client.user.keyring #5、驗證ceph.client.user.keyring文件信息 ceph@ceph-deploy:~$ ceph-authtool -l ./ceph.client.user.keyring [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1"