《中小團隊落地配置中心詳解》文章中我們介紹了如何基於Etcd+Confd構建配置中心,最后提到Etcd的安全問題時說了可以使用賬號密碼認證以達到安全訪問的目的,究竟該如何開啟認證以及怎么設計權限訪問呢?本文將為你詳細解讀
認證說明
- Etcd v2以上的版本才支持權限認證,且僅支持Basic Auth
- Etcd通過用戶(user)-角色(role)-權限的方式來控制訪問,用戶關聯角色,角色擁有權限,從而用戶也就擁有了相應的權限
- Etcd默認沒有啟用認證機制,只要能連接etcd服務就擁有所有的權限,還是非常危險的,另一種安全的訪問方式是開啟ssl,只有使用受信任的證書才能訪問數據
- Etcd開啟Basic Auth之后,默認會啟用兩個角色root和guest,root角色擁有所有權限,guest擁有只讀權限,這兩個角色都不要刪除,否則你可能會遇到意想不到的Bug
- Etcd的權限分為只讀、只寫、可讀寫,可以對etcd的詳細key進行授權,例如:/conf/project/dev/nginx.conf,也可以授權key前綴(目錄),例如:/conf/project/,授權規則應以最小滿足需求為准則
權限設計
權限設計應先考慮我們對權限的需求,從需求出發設計權限
- 需求
- 為了方便后續管理,規定配置中心所有key都應已/conf/開頭
- 需要兩個賬號,一個賬號用在Kerrigan(WebUI)擁有讀取、寫入、修改、刪除key的權限,一個賬號用在confd,只有只讀的權限,能夠讀取配置就可以了
- 設計
- 需求很簡單,我們需要建立兩個賬號,分別對應兩個角色,兩個角色都是對/conf/開頭的Key進行控制,一個讀寫權限,一個只讀權限
- 定義只讀賬號名為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角色
如果你覺得文章對你有幫助,請轉發分享給更多的人。如果你覺得讀的不盡興,推薦閱讀以下文章: