1. 程式人生 > >Etcd安全配置之Basic Auth認證

Etcd安全配置之Basic Auth認證

《中小團隊落地配置中心詳解》文章中我們介紹瞭如何基於Etcd+Confd構建配置中心,最後提到Etcd的安全問題時說了可以使用賬號密碼認證以達到安全訪問的目的,究竟該如何開啟認證以及怎麼設計許可權訪問呢?本文將為你詳細解讀

認證說明

  1. Etcd v2以上的版本才支援許可權認證,且僅支援Basic Auth
  2. Etcd通過使用者(user)-角色(role)-許可權的方式來控制訪問,使用者關聯角色,角色擁有許可權,從而使用者也就擁有了相應的許可權
  3. Etcd預設沒有啟用認證機制,只要能連線etcd服務就擁有所有的許可權,還是非常危險的,另一種安全的訪問方式是開啟ssl,只有使用受信任的證書才能訪問資料
  4. Etcd開啟Basic Auth之後,預設會啟用兩個角色root和guest,root角色擁有所有許可權,guest擁有隻讀許可權,這兩個角色都不要刪除,否則你可能會遇到意想不到的Bug
  5. Etcd的許可權分為只讀、只寫、可讀寫,可以對etcd的詳細key進行授權,例如:/conf/project/dev/nginx.conf,也可以授權key字首(目錄),例如:/conf/project/,授權規則應以最小滿足需求為準則

許可權設計

許可權設計應先考慮我們對許可權的需求,從需求出發設計許可權

  • 需求
  1. 為了方便後續管理,規定配置中心所有key都應已/conf/開頭
  2. 需要兩個賬號,一個賬號用在Kerrigan(WebUI)擁有讀取、寫入、修改、刪除key的許可權,一個賬號用在confd,只有只讀的許可權,能夠讀取配置就可以了
  • 設計
  1. 需求很簡單,我們需要建立兩個賬號,分別對應兩個角色,兩個角色都是對/conf/開頭的Key進行控制,一個讀寫許可權,一個只讀許可權
  2. 定義只讀賬號名為readx,只讀角色名為readConf,定義讀寫許可權賬號名為authz,讀寫許可權為rootConf,可操作的key都為/conf/開頭

詳細步驟

1.新增root使用者

# etcdctl user add root
New password: 12345
User root created

2.建立root賬號後,root預設有root角色,對所有KV有讀寫許可權

# etcdctl user get root
User: root
Roles:  root

# etcdctl role get root
Role: root
KV Read:
    /*
KV Write:
    /*

3.開啟auth認證

# etcdctl auth enable
Authentication Enabled

開啟許可權認證後預設會多一個guest的角色
# etcdctl --username root:12345 role list
guest
root

4.新增非root賬號,一個authz的賬號,一個readx的賬號

# etcdctl --username root:12345 user add authz
New password: 
User authz created

# etcdctl --username root:12345 user add readx
New password: 
User readx created

5.新增角色,一個rootConf的角色,一個readConf的角色

# etcdctl --username root:12345 role add rootConf
Role rootConf created

# etcdctl --username root:12345 role add readConf
Role readConf created

6.為角色授權,readConf角色對/conf有隻讀許可權,rootConf角色對/conf有讀寫許可權

# etcdctl --username root:12345 role grant --read --path /conf/* readConf
Role readConf updated

# etcdctl --username root:12345 role grant --readwrite --path /conf/* rootConf
Role rootConf updated

7.給使用者分配角色,authz賬號分配rootConf角色,readx賬號分配readConf角色

# etcdctl --username root:12345 user grant --roles rootConf authz
User authz updated

# etcdctl --username root:12345 user grant --roles readConf readx
User readx updated

8.檢視使用者所擁有的角色

# etcdctl --username root:12345 user get authz
User: authz
Roles:  rootConf

# etcdctl --username root:12345 user get readx
User: readx
Roles:  readConf

這樣readx賬號就對/conf下的所有檔案有了只讀許可權,authz對/conf下的所有檔案有了讀寫許可權

常用命令

有一些命令上邊沒有介紹到,會用得到的如下:

1.關閉認證

# etcdctl --username root:12345 auth disable

2.刪除使用者

# etcdctl --username root:12345 user remove userx

3.使用者撤銷角色

# etcdctl --username root:12345 user revoke rolex

4.修改使用者密碼

# etcdctl --username root:12345 user passwd

同時還有刪除角色、撤銷角色許可權可參看上邊使用者相關操作

踩坑記錄

在開啟認證後發現系統預設給添加了guest角色,覺得guest角色沒用就給刪除了,於是再連線etcd叢集時就報如下錯誤:

報錯:The request requires user authentication (Insufficient credentials)

解決:重新新增guest角色

長按關注公眾號檢視更多原創文章

如果你覺得文章對你有幫助,請轉發分享給更多的人。如果你覺得讀的不盡興,推薦閱讀以下文章: