1. 程式人生 > >記錄Zookeeper被玩壞後的60分鐘

記錄Zookeeper被玩壞後的60分鐘

楔子

前段時間在研究Zookeeper配置統一管理系統的時候,意外把開發環境的Zookeeper的許可權搞壞了,導致了所有服務都無法把資訊上傳至Zookeeper。由於公司的所有人都共用一套開發環境,如果此時有人需要更新服務,那麼勢必會造成服務無法正常啟動。Zookeeper的許可權修復火速開始了。

正文

首先先看一下正常狀態的Zookeeper許可權設定

[zk: localhost:2181(CONNECTED) 10] ls /
[zookeeper, config]
[zk: localhost:2181(CONNECTED) 11] getAcl /config
'world
,'anyone : r 'ip,'192.168.0.106 : cdrwa [zk: localhost:2181(CONNECTED) 12]

根節點下有兩個節點一個zookeeper和config,config的訪問許可權對於192.168.0.106下使用者有Zookeeper的完全訪問許可權,而從其他機器進行訪問就只有只讀許可權了。

由於實驗用的Zookeeper配置管理系統並不是放置在192.168.0.106機器下,所以我就對config節點的訪問許可權進行了修改,但是中途出現了錯誤導致config的許可權變成了對所有訪問者都只有只讀許可權(如下所示),這就造成了嚴重的問題,該套環境上的其他同事都無法對config節點下的所有資料進行修改。

[zk: 192.168.0.106(CONNECTED) 3] getAcl /config
'world,'anyone
: r
[zk: 192.168.0.106(CONNECTED) 4]

本著自己弄壞的,自己的修的原則,下面開始了Zookeeper許可權修復的旅程。

進過了一番的折騰,發現只有使用Zookeeper的超級管理員使用者才能對節點許可權進行修復。其實Zookeeper的超級使用者也是為了在發生這種情況下,最後的拯救措施(瞎猜的)。

1. 獲取Zookeeper的超級管理員許可權

首先我們需要先想好Zookeeper的超級管理員登入賬號和密碼,這裡我們設定為super:superman

,這裡是明文,往Zookeeper中設定的時候密碼需要寫成密文,這時我們就需要藉助org.apache.zookeeper.server.auth.DigestAuthenticationProvider來計算密碼的密文

String m = DigestAuthenticationProvider.generateDigest("super:superman");
System.out.println(m);

輸出為super:SQe25qcxXpeEUnoR1zBktlwk6jA=

下面我們開始設定Zookeeper的超級管理員,在zkServer.sh中找到以下內容

nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \

然後在後面追加以下內容

"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:SQe25qcxXpeEUnoR1zBktlwk6jA="

然後就合併成以下形式


nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:SQe25qcxXpeEUnoR1zBktlwk6jA="\  
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &  

最後重啟Zookeeper,登入超級管理員

[zk: localhost:2181(CONNECTED) 3] addauth digest super:superman
[zk: localhost:2181(CONNECTED) 4]

這個時候就能隨意的修改節點的許可權

2. Zookeeper的許可權管理

下面我們來講講Zookeeper的許可權管理

2.1 Zookeeper支援的許可權型別

  • CREATE: 你可以建立子節點。
  • READ: 你可以獲取節點資料以及當前節點的子節點列表。
  • WRITE: 你可以為節點設定資料。
  • DELETE: 你可以刪除子節點。
  • ADMIN: 可以為節點設定許可權。

2.2 Zookeeper支援的許可權設定模式(Scheme)

這裡所有的許可權設定格式都遵循scheme:id:permission

以下為所有的scheme列表

  • world:代表所有使用者,該模式下id這裡為一個該固定值,anyone
  • digest:該模式下,id為user:pwd,這裡的pwd為編碼過後的值
  • auth:該模式下,id為user,表示只有指定使用者具有訪問許可權
  • host:該模式下,id為主機名,其中需要注意的是host可以只是主機名的字尾,例如id=corp.com可以匹配 host1.corp.comhost2.corp.com 主機名的機器,而主機名為 host1.store.com 的機器是無法匹配的
  • ip:該模式與host的模式類似,只不過這裡的ip就是ip地址

2.3 單許可權模式設定

2.3.1 world模式
[zk: 192.168.0.111(CONNECTED) 9] create /config/world null
Created /config/world
[zk: 192.168.0.111(CONNECTED) 10] setAcl /config/world world:anyone:r
[zk: 192.168.0.111(CONNECTED) 12] getAcl /config/world
'world,'anyone
: r
[zk: 192.168.0.111(CONNECTED) 13]

我們在config節點下建立一個world節點,然後為其設定許可權為對於所有人都只有只讀許可權

2.3.2 digest模式
[zk: 192.168.0.111(CONNECTED) 6] create /config/digest null
Created /config/digest
[zk: 192.168.0.111(CONNECTED) 14] setAcl /config/digest digest:user:6DY5WhzOfGsWQ1XFuIyzxkpwdPo=:cdwra
[zk: 192.168.0.111(CONNECTED) 15] getAcl /config/digest
'digest,'user:6DY5WhzOfGsWQ1XFuIyzxkpwdPo=
: cdrwa
[zk: 192.168.0.111(CONNECTED) 2] addauth digest user:123456
[zk: 192.168.0.111(CONNECTED) 3] get /config/digest
null

我們在config節點下建立一個digest節點,然後為其設定許可權為只有使用賬號密碼為user:123456的使用者才有完全的訪問許可權

2.3.3 auth模式
[zk: 192.168.0.111(CONNECTED) 7] create /config/auth null
Created /config/auth
[zk: 192.168.0.111(CONNECTED) 8] addauth digest user:123456
[zk: 192.168.0.111(CONNECTED) 9] setAcl /config/auth auth:user:cdwra
[zk: 192.168.0.111(CONNECTED) 10] getAcl /config/auth
'digest,'user:6DY5WhzOfGsWQ1XFuIyzxkpwdPo=
: cdrwa
[zk: 192.168.0.111(CONNECTED) 11]

我們在config節點下建立一個digest節點,然後新增一個賬號和密碼為user:123456的認證使用者,然後對該使用者新增操作許可權。這個時候我們通過getAcl檢視/config/auth節點的控制權限與上面的/config/digest一模一樣,因此使用auth模式與digest模式的效果是完全一樣的。

2.3.4 ip模式
[zk: 192.168.0.111(CONNECTED) 9] create /config/ip null
Created /config/ip
[zk: 192.168.0.111(CONNECTED) 10] setAcl /config/ip ip:192.168.0.106:cdwra
[zk: 192.168.0.111(CONNECTED) 12] getAcl /config/ip
'ip,'192.168.0.106
: cdrwa
[zk: 192.168.0.111(CONNECTED) 13]

我們在config節點下建立一個ip節點,然後為其設定許可權為只有ip地址為192.168.0.106的使用者才有完全的訪問許可權

2.3.5 host模式
[zk: 192.168.0.111(CONNECTED) 9] create /config/host null
Created /config/host
[zk: 192.168.0.111(CONNECTED) 10] setAcl /config/host host:corp.com:cdwra
[zk: 192.168.0.111(CONNECTED) 12] getAcl /config/host
'host,'corp.com
: cdrwa
[zk: 192.168.0.111(CONNECTED) 13]

我們在config節點下建立一個host節點,然後為其設定許可權為只有主機名為corp.com的使用者才有完全的訪問許可權

2.4 組合許可權模式設定

如果我們需要對Zookeeper的節點進行復雜的許可權設定,例如一開始我們在正文所看到的許可權設定

[zk: localhost:2181(CONNECTED) 11] getAcl /config
'world,'anyone
: r
'ip,'192.168.0.106
: cdrwa

要實現這樣的設定需要執行以下命令

[zk: 192.168.0.111(CONNECTED) 10] setAcl /config world:anyone:r,ip:192.168.0.106:cdrwa

多種許可權設定以逗號分隔開,如果還需要允許以賬號密碼user:123456登入的使用者也擁有config節點的完全訪問許可權則如下設定

[zk: 192.168.0.111(CONNECTED) 12] setAcl /config world:anyone:r,ip:192.168.0.106:cdrwa,digest:user:6DY5WhzOfGsWQ1XFuIyzxkpwdPo=:cdwra

2.5 節點訪問許可權的繼承性

最後我們來講一下Zookeeper節點的許可權是否具有繼承性。其實Zookeeper的Acl準確的來說只是一種訪問控制,並不是完整的許可權管理。由於Acl控制節點並沒有遞迴機制,這就導致了子節點的訪問控制無法繼承父節點的訪問空。下面讓我們通過一個簡單的例子來感受一下。

我們現在在config節點下再建立一個noAcl節點,兩個節點的訪問控制分別如下:

[zk: 192.168.0.111(CONNECTED) 4] getAcl /config
'digest,'user:6DY5WhzOfGsWQ1XFuIyzxkpwdPo=
: cdrwa
[zk: 192.168.0.111(CONNECTED) 5] getAcl /config/noAcl
'world,'anyone
: cdrwa
[zk: 192.168.0.111(CONNECTED) 6]

我們現在不使用user使用者登入,這時候檢視config節點的內容和config下的子節點

[zk: 192.168.0.111(CONNECTED) 6] get /config
Authentication is not valid : /config
[zk: 192.168.0.111(CONNECTED) 7] ls /config
Authentication is not valid : /config
[zk: 192.168.0.111(CONNECTED) 8]

均顯示沒有許可權操作config節點,但是我們現在檢視一下noAcl節點的內容

[zk: 192.168.0.111(CONNECTED) 8] get /config/noAcl
hello

這個時候我們可以很清楚的檢視noAcl節點裡面的內容,如果我們需要保護noAcl節點的話,只能對其單獨設定訪問控制。這個時候大家可能會對Zookeeper的訪問設定抱有一定的質疑。其實我們沒有必要將這種缺陷擴大化。首先Zookeeper中主要放置的都是一些與業務無關的系統配置資訊,其次是對於系統外部使用者而言,如果get不到config節點下的子節點列表,那麼就何談獲取子節點的內容了。如果真的子節點內的資訊比較關鍵,那麼單獨為其進行訪問控制又何嘗不可。

至此本文的所有內容到此結束。現在做一下下期預告,簡要的介紹一下zkCli的使用說明。

歡迎關注微信公眾號,在這裡可以提前看到下一期文章哦~

mark

相關推薦

記錄Zookeeper60分鐘

楔子 前段時間在研究Zookeeper配置統一管理系統的時候,意外把開發環境的Zookeeper的許可權搞壞了,導致了所有服務都無法把資訊上傳至Zookeeper。由於公司的所有人都共用一套開發環境,如果此時有人需要更新服務,那麼勢必會造成服務無法正常啟動。Z

那些曾經勵誌過我們的話都了。

發的 老板 做的 故事 態度 痛苦 out 石頭 普通人 1、又一天過去了。今天過得怎麽樣,夢想是不是更遠了? 2、只要是石頭,到哪裏都不會發光的。 3、我有位家境一般的朋友,一直覺得如果自己有錢一定會更幸福。後來他媽做嬰幼教育發財了。快十年後我見他,問:現在你倒

的博客園】之canvas裝飾博客園側邊欄

ctx tail lang num radi sid 應用 ack 火狐 最近抽空學了學canvas,然後用canvas做了個小球運動的demo,大致的效果如下: 雖然網上已經有很多這樣的demo,但是還是想根據自己的思路來寫一個,下面先跟大家講解一下源代

的innerHTML、innerText、textContent和value屬性

一、前言                                 由於innerText並非W3C標準屬性,因此我們無法在FireFox中使用它,一般情況下我們可以使用textContent來代替,但它兩者是否就能完全等同呢?在坑爹的表單元素(如inpu

的C程式控制臺視窗

嗯?聽說你在Windows系統上C語言程式?那你對控制檯視窗瞭解多少? Linux、Mac 的Shell以後有時間再玩…. 聽說你會寫Helloworld程式,我猜一定是這個樣子的: #include<stdio.h> int main

的題目——A+B Problem

普通方法: C++: #include<iostream> using namespace std; int a,b; int main(){ cin>>a>

曹工說面試題:一個執行緒協同問題,解法繁多,都要了,趁著沒,一起

# 前言 最近兩個月寫文章很少,因為自己學習狀態也不是很好,我看了下,上一篇文章,都是一個月前了。 不知道大家有沒有感覺,小學初中讀的一些書,看的一些文章,到現在都印象深刻,反倒是高中學的知識,高考後就慢慢消散,直到遺忘。 我想說的是,記得初中學過魯迅的《藤野先生》,裡面有一段話,大意是:久了不聯絡,有

記錄thinkPHP5.0掛馬的處理

ray baidu -c 文件 nbsp all noop 控制器 框架 一、thinkPHP5.0爆出getshell漏洞 http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&

GIF:進球2分鐘染紅,拉斐爾故意將球踢向對手罰下_虎撲中國足球新聞

logfile 恒大 mage all art load images imp 聯賽 GIF:進球後2分鐘染紅,拉斐爾故意將球踢向對手被罰下_虎撲中國足球新聞

Vue.js——60分鐘快速入門

attribute 否則 style屬性 快速 基於 oid creat get rac Vue.js是當下很火的一個JavaScript MVVM庫,它是以數據驅動和組件化的思想構建的。相比於Angular.js,Vue.js提供了更加簡潔、更易於理解的API,使得我們能

讓我們把KBEngine吧!如何定制我們自己的C++函數(一)

data ase erro glob alt ins sin 程序 all 為什麽不更新kbe warring的代碼解讀了,因為在我看來那個demo講完了實體就沒東西可講了,如果專心的看官方文檔和PPT的話demo的代碼後面沒任何難點了已經,單純的復制黏貼代碼實在太過無聊。

回收站清空怎麽才能恢復數據 回收站清空恢復

回收站作為電腦上的必備軟件,深受人們喜愛,因為它可以放置人們暫時不用的軟件或是一些文件,當再次需要的時候,再去回收站中將它還原出來。要是我們不小心將回收站清空了,我們可以借助互盾回收站清空恢復軟件,找回回收站中的文件。 第一步:搜索“互盾回收站清空恢復軟件”,將軟件下載安裝至電腦上,運行該軟件,

實現發送短信驗證碼60秒倒計時

led () var class button jquery 計時 重新發送 jquery實現 方法一:js實現發送短信驗證碼後60秒倒計時 1、input[type=‘button’]按鈕 js方法實現 <!DOCTYPE html><html>&

勝敗有憑---項目領導肯定感言

使用 一個人 移動端 內容 接口 發的 找工作 滿足 項目   最近在做一個移動端的項目時,因為在限定時間裏,超預期完成任務,被領導叫到辦公室裏坐談鼓勵,也由此想總結一下這個項目為何能順利的超預期完成,以便以後的項目借鑒。   在這裏先講兩個小故事:   小故事1:說一

Linux虛擬機的glibc卸載,無法進入系統的解決方法

play xxxxxx spl mnt 強制 volume 本地 glibc nload 1. 用Linux啟動光盤或u盤引導系統,進入控制臺界面 2. 掛載glibc被卸載的硬盤,假定在/dev/sda2. 如果是LVM2的文件系統, 需要找到邏輯卷的名稱並激活;普通情

Vue.js——60分鐘webpack項目模板快速入門

int oss 文件 次數 mon 即使 sed val 來講 概述 browserify是一個 CommonJS風格的模塊管理和打包工具,上一篇我們簡單地介紹了Vue.js官方基於browserify構築的一套開發模板。webpack提供了和browserify類似的功能

Vue.js——vue-router 60分鐘快速入門

ges 內部使用 note eight 開始 href for ram 加載 概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。傳

【PyTorch深度學習60分鐘快速入門 】Part1:PyTorch是什麽?

修改 .com org -c .cn ndarray 兩種 ble 我們 0x00 PyTorch是什麽? PyTorch是一個基於Python的科學計算工具包,它主要面向兩種場景: 用於替代NumPy,可以使用GPU的計算力 一種深度學習研究平臺,可以提供最大的靈活

買進最佳時間:開盤15分鐘與閉市前15分鐘

新經濟 收盤價 高中 做出 期貨 間歇性 如果 利好 條件 這個時間段一般都會大漲大跌。  一、買進最佳時間:開盤後15分鐘與閉市前15分鐘。開盤前,主力經過研究國際國內最新經濟信息和國外期貨、股市的運行情況,將對大勢有一個綜合判斷,然後做出所運作股票的計劃,若看好大勢則借