背景:セキュリティ脆弱性スキャンで Zookeeper に認証が設定されていないことが発覚しました。
環境:OS:CentOS 7、Java:1.8、Zookeeper:3.6
| サーバー1 | 192.168.45.243 |
| サーバー2 | 192.168.44.24 |
| サーバー3 | 192.168.44.117 |
一、Zookeeper クラスターデプロイ
1.1 JDK のインストール
三台のノードそれぞれに JDK パッケージを /opt/java ディレクトリにアップロードし、解压します。
tar -xf jdk-8u77-linux-x64.tar.gz -C /opt/java export JAVA_HOME=/opt/java/jdk1.8.0_77 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar source ~/.bash_profile
Java 環境の確認:
java -version
1.2 Zookeeper クラスタの構築
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.0/apache-zookeeper-3.6.0-bin.tar.gz tar -xf apache-zookeeper-3.6.0-bin.tar.gz mv apache-zookeeper-3.6.0-bin zookeeper mkdir /opt/zookeeper/data touch /opt/zookeeper/data/myid
サーバー1、サーバー2、サーバー3それぞれに以下の myid 値を設定します。
サーバー1:1
サーバー2:2
サーバー3:3
設定ファイル zoo.cfg を編集します。
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg vim /opt/zookeeper/conf/zoo.cfg
1.3 ファイアウォールの無効化
ファイアウォールを無効化することで、クラスターステータスの確認時に「*Error contacting service. It is probably not running.*」エラーを回避します。
systemctl stop firewalld systemctl disable firewalld
1.4 Zookeeper の起動
三台のノードそれぞれで Zookeeper を起動します。
/opt/zookeeper/bin/zkServer.sh start
クラスターステータスの確認:
/opt/zookeeper/bin/zkServer.sh status
サーバー3がリーダーとして機能しています。
1.5 Zookeeper の停止
/opt/zookeeper/bin/zkServer.sh stop
1.6 再起動後のリーダー選出確認
再起動後、サーバー2がリーダーとして選出され正常に動作しています。
1.7 Zookeeper クライアントの利用
/opt/zookeeper/bin/zkCli.sh -server 192.168.45.243:2181 /opt/zookeeper/bin/zkCli.sh -server 192.168.44.24
二、Dubbo ノードへの認証機能追加
2.1 Zookeeper クライアントへのログイン
/opt/zookeeper/bin/zkCli.sh -server localhost:2181
2.2 Zookeeper ノードの確認
ls /
Dubbo ノードが存在しない場合は、以下のコマンドでノードを作成します。
create /dubbo
2.3 認証ユーザーとパスワードの設定
addauth digest admin:Admin@2023
2.4 /dubbo ノードへのアクセス許可設定
setAcl /dubbo auth:admin:Admin@2023:rwadc
2.5 Dubbo 設定ファイルの編集
dubbo-config.xml ファイルを編集します。
<dubbo:registry protocol="zookeeper" address="${zookeeper.ip}" username="admin" password="Admin@2023" client="curator"/>