Zookeeper系列(三)——Zookeeper的ACL權限控制
theme: smartblue
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第20天,點擊查看活動詳情
概述
通過Zookeeper實現的的分佈式鎖、配置管理等功能,本質上就是操作數據節點Znode,如果不針對Znode做一定的訪問權限控制,那麼很容易被其他人誤刪,引起嚴重的後果。
説到 ACL 權限控制大家應該不會陌生,比如 Linux 系統將對文件的使用者分為三種身份,即 User、Group、Others。使用者對文件擁有讀(read) 寫(write)以及執行(execute)3 種方式的控制權。這種權限控制方式相對比較粗糙,而Zookeeper的ACL權限控制更加強大。
Zookeeper的ACL詳解
Zookeeper的ACL 權限設置通由三部分組成,分別是:權限模式(Scheme)、授權對象(ID)、權限信息(Permission)。最終組成一條例如“scheme:id:permission”格式的 ACL 請求信息。
setAcl /digest_node1 ip:127.0.0.1:crwda
權限模式(Scheme)
通俗的來説,就是採用哪種方式進行權限認證,一共由6中方式。
| 權限模式 | 説明 | | -------- | ----------------------------------------------------------- | | world | 表示任何人都能訪問操作節點 | | auth | 代表已經認證通過的用户(cli中可以通過addauth digest user:pwd 來添加當前上下文中的授權用户) | | digest | 採用用户名密碼的認證方式 | | ip | 使用客户端ip的認證方式 |
授權對象(ID)
授權對象意味着哪些對象有權限,給誰授予權限,不同權限模式下的授權對象都是不一致的。
| 權限模式 | 授權對象 | 例子 | | -------- | ------------------------------------------------------------------------------- | ---------------------------- | | world | 永遠只有一個授權對象,anyone | anyone | | auth | 授權的用户名,cli中可以通過addauth digest user:pwd 來添加當前上下文中的授權用户,如addauth digest alvin:pwd | alvin | | digest | password需要加密處理,格式如username:base64(sha-1(username:password)) | alvin:SDFSDFcfasdfaU= | | ip | 是一個ip地址或者ip地址段 | 10.100.1.10010.100.1.100/170 |
權限信息(Permission)
這裏主要是用來表示授予每個節點什麼權限,控制權限授予的粒度。
| 類型 | ACL簡寫 | 描述 | | ------ | --------- | ---------------- | | read | r | 獲取節點數據並列出其子節點權限 | | write | w | 設置節點數據權限 | | create | c | 創建子節點權限 | | delete | d | 刪除子節點權限(不包含當前節點) | | admin | a | 設置該節點ACL權限的權限 |
- create和delete權限已從write權限中分離出來,以實現更精細的訪問控制
- delete是指對子節點的刪除權限
ACL特點
- Zookeeper的權限控制是基於znode節點的,需要對每個節點設置權限。
- 每個znode支持設置多種權限控制方案和多個權限。
- 子節點不會繼承父節點的權限。客户端無法訪問某個節點,但是可以訪問他的子節點。
ACL相關命令
getAcl getAcl
setAcl setAcl
addauth addauth
Shell命令演示ACL
world權限模式演示
- 創建的節點名默認為world的權限模式,任何人都可以訪問
- 取消節點的查看權限後,無法訪問數據
Auth權限模式演示
- 添加授權用户
addauth digest username:password
- 設置節點ACL
- 查看節點ACL
- 另外啟動一個客户端,讀取節點,發現沒有權限,需要通過addauth命令授權才可以。
digest授權模式實戰
- 設置digest模式的ACL
digest模式需要加密處理,通過下面的命令獲取加密的字符串。
echo -n username:password | openssl dgst -binary -sha1 | openssl base64
複製加密後的字符串,
- 獲取節點數據,發現沒有權限
- 登錄用户,成功獲取節點數據
設置節點多個ACL
可以設置多種acl,用逗號隔開就行,我們以world和ip模式為例。
總結
ZooKeeper 作為分佈式系統協調框架,往往在一個分佈式系統下起到關鍵的作用。尤其是在分佈式鎖、配置管理等應用場景中。如果因為錯誤操作對重要數據節點進行變更或刪除,對整個分佈式系統影響很大,甚至會導致整個分佈式服務不可用。所以當你在設計使用 ZooKeeper 的時候一定要考慮對關鍵節點添加權限控制。
思考一個問題,如果一個客户端對服務器上的一個節點設置了只有它自己才能操作的權限,那麼等這個客户端下線或被刪除後。對其創建的節點要想進行修改應該怎麼做呢?
可以通過super模式來操作刪除節點,可以認為是一種特殊的 Digest 認證。具有 Super 權限的客户端可以對 ZooKeeper 上的任意數據節點進行任意操作。具體參考:https://www.cnblogs.com/mengen/p/10919054.html
參考
https://www.cnblogs.com/qlqwjy/p/10517231.html
https://blog.csdn.net/qq_40837310/article/details/106826963
https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_ZooKeeperAccessControl
- TO BANK解決方案微服務架構的正確姿勢
- Java高性能序列化工具Kryo序列化
- 記一次內存泄漏引發的生產事故
- Zookeeper系列(三)——Zookeeper的ACL權限控制
- 源碼解析最流行的Validator框架——Hibernate Validator
- Zookeeper系列(一)——Zookeeper基礎之數據模型
- 一文帶你深入理解SpringBean生命週期之PostConstruct、PreDestroy詳解
- 一文帶你深入理解SpringBean生命週期之Aware詳解
- 一文吃透Spring Boot擴展之BeanFactoryPostProcessor
- 一文帶你瞭解Java Class的生命週期(類加載過程)