Ceph配置與認證授權

FuShudi發表於2024-05-25

目錄
  • Ceph配置與認證授權
    • 1. 為什麼現在不採用修改配置檔案的方式了呢?
    • 2. Ceph元變數
      • 3. 使用命令列修改配置
      • 3.1 全部修改(使用服務名)
      • 3.2 部分修改(修改程序)
      • 3.3 臨時生效
      • 3.4 配置項
      • 3.5 老版本提供的配置檔案
    • 3. Ceph網路
      • 3.1 對現有叢集加入cluster network
    • 4. Cephx(認證授權)
      • 4.1 認證流程
      • 4.2 Cephx中的使用者
        • 4.2.1 檢視使用者列表
      • 4.3 使用者建立
        • 4.3.1 建立使用者
        • 4.3.2 刪除使用者
    • 5. 使用者授權
      • 5.1 建立使用者並授權
      • 5.2 修改使用者許可權

Ceph配置與認證授權

Ceph的配置瞭解即可,因為Ceph目前的配置很多都能自動的去調整,而且最佳化的不錯,正常情況下我們不去需要去修改,但是我們得知道怎麼去改。

目前我們使用的版本的配置檔案裡面內容是非常少的

[root@ceph01 ceph]# cat /etc/ceph/ceph.conf 
# minimal ceph.conf for dc6d1544-17ef-11ef-9393-000c297dea16
[global]
	fsid = dc6d1544-17ef-11ef-9393-000c297dea16
	mon_host = [v2:192.168.101.10:3300/0,v1:192.168.101.10:6789/0] [v2:192.168.101.20:3300/0,v1:192.168.101.20:6789/0] [v2:192.168.101.30:3300/0,v1:192.168.101.30:6789/0]

在以前的版本里面是非常多的

Ceph叢集配置的來源

  • 編譯時設定的值
  • mon叢集的集中配置資料庫
  • 儲存在本地的配置檔案
  • 環境變數
  • 命令列輸入
  • 管理員配置的臨時生效的配置

1. 為什麼現在不採用修改配置檔案的方式了呢?

因為如果你要修改osd的配置項的話,你改完配置檔案之後需要把配置檔案分發到所有的osd節點,並且重啟osd程序這個配置才會生效,很麻煩。但是現在採用命令列的方式去修改的話是立即生效並且不用每個節點都執行的。這種方式取代了修改配置檔案。

2. Ceph元變數

  • $cluster:叢集名稱,多用於相同硬體上執行多個叢集的場景
  • $type:服務或程序的型別,如mds,osd,mon等
  • $id:服務或客戶端ID,如osd.0 ,osd為$type的值, 0為$id的值
  • $host:服務所在主機的名稱
  • $name:$type+$id
  • $pid:服務的程序ID

可以使用**ceph orch ps **來檢視

[root@ceph01 ceph]# ceph orch ps
NAME                  HOST    PORTS        STATUS        REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID  
alertmanager.ceph01   ceph01  *:9093,9094  running (2d)     7m ago   3d    50.0M        -  0.23.0   ba2b418f427c  f549d23bce6e  
crash.ceph01          ceph01               running (2d)     7m ago   3d    17.1M        -  16.2.13  e08a45948779  0785e13fe4ee  
crash.ceph02          ceph02               running (2d)     2s ago   3d    20.1M        -  16.2.13  e08a45948779  11dc05748956  
crash.ceph03          ceph03               running (2d)     8m ago   3d    29.1M        -  16.2.13  e08a45948779  8a19421c0fe1  
grafana.ceph01        ceph01  *:3000       running (2d)     7m ago   3d     149M        -  8.3.5    dad864ee21e9  6c72c1cfe9e2  
mgr.ceph01.luyssm     ceph01  *:9283       running (2d)     7m ago   3d     527M        -  16.2.13  e08a45948779  bb97a49842cd  

3. 使用命令列修改配置

3.1 全部修改(使用服務名)

當我們指定的是某個服務的時候,他會修改這個服務的所有程序配置

[root@ceph01 ceph]# ceph config set osd debug_osd 20
[root@ceph01 ceph]# ceph config show osd.0 debug_osd
20/20
[root@ceph01 ceph]# ceph config show osd.1 debug_osd
20/20
[root@ceph01 ceph]# ceph config show osd.2 debug_osd
20/20

我們可以看到,不管是osd幾,都被修改成了20,那我們只想修改一個呢?

3.2 部分修改(修改程序)

修改osd.1 為10,其他的還是20

[root@ceph01 ceph]# ceph config show osd.1 debug_osd
10/10
[root@ceph01 ceph]# ceph config show osd.2 debug_osd
20/20

這樣就修改了osd.1這個程序的配置為10,其他的一樣還是20

3.3 臨時生效

使用命令列去修改大部分配置都是立即生效並且是永久生效的,但還有一些配置是他要求你必須重啟程序才會生效的,這種配置我們就可以使用臨時生效來代替,臨時生效會立即生效。所以我們可以先設定永久生效,然後再設定一個臨時生效,那麼就可以避免立即重啟程序。

[root@ceph01 ceph]# ceph tell osd.3 config set debug_osd 5
{
    "success": ""
}
[root@ceph01 ceph]# ceph config show osd.3 debug_osd
5/5

3.4 配置項

Ceph的配置項非常的多,我們可以去過濾

[root@ceph01 ceph]# ceph config ls |wc -l
2068

總共是有2068個配置項

[root@ceph01 ceph]# ceph config ls |grep mon_allow
mon_allow_pool_delete
mon_allow_pool_size_one
[root@ceph01 ~]# ceph config show osd.1 |grep debug_osd
debug_osd             10/10                                                                                                                                                        mon

我們可以透過grep來過濾出我們想要的配置

3.5 老版本提供的配置檔案

老版本提供的配置檔案也是存在的,現在被放到了/usr/share/doc/ceph/sample.ceph.conf,想看可以開啟看看

3. Ceph網路

客戶端來連線ceph的時候,無論是讀還寫寫資料,走的都是一張網路卡,這樣會導致頻寬過大,並且一個pg寫入資料之後其他pg也需要同步。所以Ceph推薦每個主機有2張網路卡,一張是 public network 用來接受使用者的讀寫請求,另一張網路卡為cluster network 用來叢集內部同步備份資料,當然,ceph並沒有對網路卡做強制要求,只有一張網路卡的話也是沒有問題的。

3.1 對現有叢集加入cluster network

每個節點網路卡的IP地址自行配置

[root@ceph01 ~]# ceph config set mon public_network 10.104.0.0/16
[root@ceph01 ~]# ceph config set mon cluster_network 192.168.101.0/24
[root@ceph01 ~]# ceph config get mon public_network
10.104.0.0/16
[root@ceph01 ~]# ceph config get mon cluster_network
192.168.101.0/24

4. Cephx(認證授權)

我們之前使用rados命令手動上傳檔案到儲存池內,但是這只是做個測試用的,ceph的功能肯定是對外提供服務,既然是對外提供服務那麼就不可能是每個人來了我都給他分配儲存,所以這時候就需要用到認證,授權,ceph採用的這種認證方式就是cephx

4.1 認證流程

    1. 客戶端攜帶使用者名稱,cephx金鑰向mon發起連線,mon收到這個請求之後驗證使用者的身份,身份認證透過之後返回一個session key(令牌)給客戶端,同時mon將這個session key(令牌)通告給其他的服務
    1. 客戶端收到session key之後進行解密,並向mon申請一個ticket(票據),mon產生ticket返回給客戶端

    注意:ticket是有有效期的,過期之後流程得重新來一遍,並且mon返回的ticket是使用金鑰加密的,防止ticket洩露,客戶端拿到之後使用自己的金鑰就可以將ticket解密了

    1. 客戶端之後的每次請求就都是使用ticket進行(ticket在有效期內),因為客戶端,mon,osd,mds都擁有由mon產生的令牌,所以他們都可以認證這個ticket是否合法

4.2 Cephx中的使用者

  • Cephx協議對使用者的格式有嚴格的要求,必須使用$type.$id的格式

  • Cephx協議將使用者分為兩類

    • 客戶端:使用者客戶端訪問,$type永久設定為client,如client.admin、client.cinder
    • 服務程序:不止使用者需要找mon認證,服務也是需要的,服務的$type為對應的元件名稱,如 osd.0 、mgr.ceph01.xxxx

4.2.1 檢視使用者列表

[root@ceph01 ~]# ceph auth ls
osd.0
	key: AQASi01msk5MJRAAJNFrw1pvhHP3cxhb8eRIWg==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.1
	key: AQAri01m0J6QNxAAWIW7gAX8mZ39vh4g6w+e5Q==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.2
	key: AQCKi01m7V6TOxAA/dEuaEUIi8TfgHm2nmg2TA==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.3
	key: AQBmjE1mRcgVGhAAjeehuD7EUEE9bSacnfQ+kw==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
	……………………
  • key:這裡的面顯示key就是他的金鑰
  • caps:這個就是他的授權資訊,授權部分會說

4.3 使用者建立

  • 建立使用者有3種方式

      1. ceph auth add

        • 如果使用者不存在,則建立使用者並新增對應許可權

        • 如果使用者存在,且指定的許可權與當前許可權一致,則不進行任何修改且沒有輸出

        • 如果使用者存在,且指定的許可權與當前許可權不一致,則提示

      2. ceph auth get-or-create

        • 當使用者不存在,則建立使用者、新增許可權並返回使用者和keyring
        • 當使用者存在,且指定的許可權和當前許可權一致,則不做任何修改,並返回使用者和key
        • 如果使用者存在,且指定的許可權和當前的許可權不一致,則保持許可權不變,並返回報錯資訊
      3. ceph auth get-or-create-key

        • 當使用者不存在,則建立使用者、新增並返回使用者和keyring
        • 當使用者存在,且指定的許可權和當前的許可權一致,則不做修改,並返回key
        • 如果使用者存在,且指定的許可權和當前的許可權不一致,則保持許可權不變,並返回報錯資訊

4.3.1 建立使用者

[root@ceph01 ~]# ceph auth get-or-create client.test
[client.test]
	key = AQAbw1FmmuEAHhAAI6YeGmQV0RUTsCXme/O3+Q==
[root@ceph01 ~]# ceph auth ls|grep test -A1
installed auth entries:
client.test
	key: AQAbw1FmmuEAHhAAI6YeGmQV0RUTsCXme/O3+Q==

這裡顯示的跟其他使用者不一樣,因為我們只建立了使用者,並沒有給他任何許可權,所以這裡只顯示他的金鑰

如果要將檔案儲存到本地的話,檔名需要注意一下命名規範:$cluster.client.$id.keyring

如果test使用者的檔名就應該是 ceph.client.test.keyring

4.3.2 刪除使用者

[root@ceph01 ~]# ceph auth rm  client.test
updated
[root@ceph01 ~]# ceph auth ls|grep test -A1
installed auth entries:

現在使用者已經被刪掉了

5. 使用者授權

剛剛使用者的建立和刪除已經可以了,但是現在建立出來的使用者是沒有任何許可權的,所以我們需要授權

在ceph中沒有拒絕 這個許可權,只有允許,意思就是隻要沒有給許可權,那麼就是沒有許可權

許可權 說明
allow 為程序設定許可權
r 為使用者設定可讀許可權
w 為使用者設定可訪問物件許可權
x 使使用者能夠呼叫類方法(既讀和寫)以及在mon上執行認證操作
* 全部許可權
profile osd (僅限mon) 允許使用者以osd的身份連線其他osd或者mon,用於osd心跳和狀態報告
profile bootstrap-osd (僅限mon) 允許使用者引導osd,用於cephadm或ceph-volume工具
profile mds (僅限mon) 允許使用者以mds的身份連線其他mds或mon
profile bootstrap-mds (僅限mon) 允許使用者引導mds
profile rbd (mgr,mon,osd) 允許使用者使用塊裝置
profile rbd-read-only 賦予使用者對塊裝置只讀許可權

下面這些profile 開頭的這些都屬於x許可權裡的一種

借用Linux老師的一句話來總結授權:

什麼樣的使用者有什麼樣的許可權,對什麼樣的服務做什麼樣的操作

5.1 建立使用者並授權

  1. 需求:建立使用者test,使其可以檢視叢集狀態,並對資源池test_pool有讀寫許可權
[root@ceph01 ~]# ceph auth get-or-create client.test mon 'allow r' osd 'allow rw pool=test_pool' 
[client.test]
	key = AQAlzFFm+6QnMRAA3lNgtJzN+/GByVWXfXhvrA==
[root@ceph01 ~]# ceph auth get client.test
[client.test]
	key = AQAlzFFm+6QnMRAA3lNgtJzN+/GByVWXfXhvrA==
	caps mon = "allow r"
	caps osd = "allow rw pool=test_pool"
[root@ceph01 ~]# ceph auth get client.test > ./ceph.client.test.keyring

# 使用這個使用者訪問叢集
[root@ceph01 ~]# ceph osd pool ls --name client.test --keyring ./ceph.client.test.keyringdevice_health_metrics
test_pool
test02
# 上傳檔案
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test_pool put keyring ./ceph.client.test.keyring 
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test_pool ls
keyring

# 嘗試上傳到許可權之外的pool
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test02 put keyring ./ceph.client.test.keyring 
error putting test02/keyring: (1) Operation not permitted

現在test這個使用者就僅僅只能對test_pool這個資源池上傳檔案,對其他的資源池上傳檔案就會報錯操作沒有許可權

  1. 需求:要求再建立一個超級管理員 root
[root@ceph01 ~]# ceph auth get-or-create client.root mon 'allow *' mgr 'allow *' osd 'allow *' mds 'allow *'
[client.root]
	key = AQCNzlFmeeC6DhAAvmSyiuYXg/qiOp4qCKnZLQ==
[root@ceph01 ~]# ceph auth ls |grep -A5 root
installed auth entries:

client.root
	key: AQCNzlFmeeC6DhAAvmSyiuYXg/qiOp4qCKnZLQ==
	caps: [mds] allow *
	caps: [mgr] allow *
	caps: [mon] allow *
	caps: [osd] allow *
# 將檔案匯出並使用
[root@ceph01 ~]# ceph health detail --name client.root --keyring ./ceph.client.root.keyring
HEALTH_OK
  1. 建立一個使用者test01,要求:
    1. 使用者能夠對test儲存池進行讀寫
    2. 使用者對test01儲存池只讀
    3. 使用者能夠使用檔案系統
[root@ceph01 ~]# ceph auth get-or-create client.test01 mon 'allow r' osd 'allow rw pool=test, allow r pool=test01 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data' mds 'allow r'
[client.test01]
	key = AQCP0lFm2HNDAxAA+lJ9p8EYuAT6OQQabNuyYA==
[root@ceph01 ~]# ceph auth get client.test01
[client.test01]
	key = AQCP0lFm2HNDAxAA+lJ9p8EYuAT6OQQabNuyYA==
	caps mds = "allow r"
	caps mon = "allow r"
	caps osd = "allow rw pool=test, allow r pool=test01 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data"
exported keyring for client.test01

這裡的osd裡面有2個之前沒見過的池,這兩個就是檔案系統,因為你要使用這個檔案系統,就必須對這兩個池有許可權

5.2 修改使用者許可權

當許可權給錯了,或者後期需要修改許可權時,並不需要刪除使用者

# 去掉剛剛建立的test01使用者的mds許可權,以及檔案系統的許可權
[root@ceph01 ~]# ceph auth caps client.test01 mon 'allow r' osd 'allow rw pool=test, allow r pool=test01'
updated caps for client.test01

注意,許可權是沒有刪除的,所謂的修改許可權只不過就是將你需要的許可權重新再給一遍

相關文章