天天看點

分布式服務Dubbo+Zookeeper安全認證

由于之前的服務都是在内網,Zookeeper叢集配置都是走的内網IP,外網不開放相關端口。最近由于業務更新,購置了阿裡雲的服務,需要對外開放Zookeeper服務。

Zookeeper+dubbo,如何設定安全認證?不想讓其他服務連接配接Zookeeper,因為這個Zookeeper伺服器在外網。

查詢官方文檔:

Zookeeper 是 Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支援變更推送,适合作為 Dubbo 服務的注冊中心,工業強度較高,可用于生産環境,并推薦使用。

分布式服務Dubbo+Zookeeper安全認證

流程說明:

服務提供者啟動時: 向 /dubbo/com.foo.BarService/providers 目錄下寫入自己的 URL 位址

服務消費者啟動時: 訂閱 /dubbo/com.foo.BarService/providers 目錄下的提供者 URL 位址。并向 /dubbo/com.foo.BarService/consumers 目錄下寫入自己的 URL 位址

監控中心啟動時: 訂閱 /dubbo/com.foo.BarService 目錄下的所有提供者和消費者 URL 位址

支援以下功能:

當提供者出現斷電等異常停機時,注冊中心能自動删除提供者資訊

當注冊中心重新開機時,能自動恢複注冊資料,以及訂閱請求

當會話過期時,能自動恢複注冊資料,以及訂閱請求

當設定 < dubbo:registry check="false" /> 時,記錄失敗注冊和訂閱請求,背景定時重試

可通過 < dubbo:registry username="admin" password="1234" /> 設定 zookeeper 登入資訊

可通過 < dubbo:registry group="dubbo" /> 設定 zookeeper 的根節點,不設定将使用無根樹

支援 号通配符 < dubbo:reference group="" version="*" />,可訂閱服務的所有分組和所有版本的提供者

官網文檔第五條,明确說明了可以通過username和 password字段設定zookeeper 登入資訊。

以下是registry參數說明:

分布式服務Dubbo+Zookeeper安全認證

但是,如果在Zookeeper上通過digest方式設定ACL,然後在dubbo registry上配置相應的使用者、密碼,服務就注冊不到Zookeeper上了,會報KeeperErrorCode = NoAuth錯誤。

但是查閱ZookeeperRegistry相關源碼并沒有發現相關認證的地方,搜遍全網很少有問類似的問題,這個問題似乎并沒有多少人關注。

傳統的檔案系統中,ACL分為兩個次元,一個是屬組,一個是權限,子目錄/檔案預設繼承父目錄的ACL。而在Zookeeper中,node的ACL是沒有繼承關系的,是獨立控制的。Zookeeper的ACL,可以從三個次元來了解:一是scheme; 二是user; 三是permission,通常表示為

下面從這三個方面分别來介紹:

scheme: scheme對應于采用哪種方案來進行權限管理,zookeeper實作了一個pluggable的ACL方案,可以通過擴充scheme,來擴充ACL的機制。zookeeper-3.4.4預設支援下面幾種scheme:

world: 它下面隻有一個id, 叫anyone, world:anyone代表任何人,zookeeper中對所有人有權限的結點就是屬于world:anyone的

auth: 它不需要id, 隻要是通過authentication的user都有權限(zookeeper支援通過kerberos來進行authencation, 也支援username/password形式的authentication)

digest: 它對應的id為username:BASE64(SHA1(password)),它需要先通過username:password形式的authentication

ip: 它對應的id為客戶機的IP位址,設定的時候可以設定一個ip段,比如ip:192.168.1.0/16, 表示比對前16個bit的IP段

super: 在這種scheme情況下,對應的id擁有超級權限,可以做任何事情(cdrwa)

CREATE(c): 建立權限,可以在在目前node下建立child node

DELETE(d): 删除權限,可以删除目前的node

READ(r): 讀權限,可以擷取目前node的資料,可以list目前node所有的child nodes

WRITE(w): 寫權限,可以向目前node寫資料

ADMIN(a): 管理權限,可以設定目前node的permission

我們可以通過以下指令連接配接用戶端進行操作:

大部分服務大都是部署在内網的,基本很少對外網開放,然而Dubbo的zookeeper使用者權限認證貌似真的不起作用,如果非要對外開放隻能通過iptables或者firewall進行IP Access Control,如果是阿裡雲伺服器的話安全組也是個不錯的選擇。

作者: 小柒

分享是快樂的,也見證了個人成長曆程,文章大多都是工作經驗總結以及平時學習積累,基于自身認知不足之處在所難免,也請大家指正,共同進步。

繼續閱讀