序文
以前のサービスはすべてイントラネットに含まれていたため、Zookeeperクラスター構成はすべてイントラネットIPであり、外部ネットワークは関連するポートを開きませんでした。最近、ビジネスのアップグレードにより、Alibaba Cloudのサービスを購入し、Zookeeperサービスを一般に公開する必要があります。
質問
Zookeeper+Dubbo、セキュリティ認証をセットアップする方法は?このZookeeperサーバーは外部ネットワーク上にあるため、他のサービスがZookeeperに接続したくありません。
公式ドキュメントを照会します:
ZookeeperはApacahe Hadoopのサブプロジェクトです。これは、変化のプッシュをサポートするツリータイプのディレクトリサービスです。 Dubbo Servicesの登録センターとして適しています。産業強度が高く、生産環境で使用できます。使用することをお勧めします。
プロセス説明:
•サービスプロバイダーが起動するとき:/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" />を設定すると、登録とサブスクリプションリクエストの失敗が記録され、背景が再試行されるタイミングが記録されます
•Zookeeperログイン情報は、<dubbo:registry username = "admin" password = "1234" />を介して設定できます。
•Zookeeperのルートノードは、<dubbo:registry Group = "dubbo" />を介して設定できます。設定しない場合は、Rootless Treeを使用します。
• *ワイルドカード文字<dubbo:参照グループ= "" version = "" />をサポートします。
公式ウェブサイトの文書の第5条には、Zookeeperのログイン情報は、ユーザー名とパスワードフィールドを介して設定できることを明確に示しています。
以下はレジストリパラメーターの説明です。
ただし、ZookeeperでDigestを介してACLを設定し、Dubboレジストリで対応するユーザーとパスワードを構成すると、サービスはZookeeperに登録されず、KeeperErrorCode = noAuthエラーを報告します。
ただし、ZookeeperRegistry関連のソースコードを確認したとき、関連する認証は見つかりませんでした。ネットワーク全体で同様の質問をすることはめったにありませんでしたが、この質問には注意が払われていないようです。
ZookeeperのACL
概要
従来のファイルシステムでは、ACLは2つの次元に分割され、1つはグループであり、もう1つは許可です。サブディレクトリ/ファイルは、デフォルトで親ディレクトリのACLを継承します。 Zookeeperでは、NodeのACLには相続関係がなく、独立して制御されています。 ZookeeperのACLは、3つの次元から理解できます。1つはスキームです。 2番目はユーザーです。 3つ目は許可で、通常は次のように表現されています
スキーム:ID:許可
これらの3つの側面から以下が紹介されています。
スキーム:スキームは、アクセス許可を管理するために使用されるスキームに対応します。 Zookeeperは、スキームを拡張することでACLメカニズムを拡張できるプラグ可能なACLスキームを実装します。 Zookeeper-3.4.4は、デフォルトで次のスキームをサポートしています。
World:その下には誰もが呼ばれるIDの下に1つしかありません。
AUTH:認証を通じてユーザーがアクセス許可を持っている限り(ZookeeperがKerberosを介して認証をサポートし、ユーザー名/パスワードの形式で認証をサポートしている限り、IDは必要ありません)
ダイジェスト:対応するIDはユーザー名です:base64(sha1(パスワード))、ユーザー名の形式で認証を渡す必要があります:パスワード
IP:対応するIDは、クライアントのIPアドレスです。設定するときは、IP:192.168.1.0/16などのIPセグメントを設定できます。これは、IPセグメントが最初の16ビットと一致することを意味します。
スーパー:このスキームでは、対応するIDにはスーパーアクセス許可があり、何でも実行できます(CDRWA)
許可:Zookeeperは現在、次の許可をサポートしています。
CREATE(c):許可を作成すると、現在のノードの下にチャイルドノードを作成できます
削除(d):許可を削除して、現在のノードを削除できます
読み取り(r):許可を読む、現在のノードのデータを取得できます。現在のノードのすべての子ノードをリストできます
書き込み(w):書き込み許可、現在のノードにデータを書き込むことができます
admin(a):admin permissions、現在のノードの許可を設定できます
クライアント管理
次のコマンドを介してクライアントに接続できます。
./zkcli.sh
ヘルプ
[ZK:LocalHost:2181(Connected)2] helpzookeeper -Server Host:ポートCMD Args Connect PATH:PORT GET PATH [WATCH] LS PATH [WATCH] SET PATH DATA [バージョン] RMRパスDelquota [-N | -B]パスパスPATH PATH PATH PATH QUIT PrintWatches on | off create [-s] [-e acl path [watch] stat2 getacl path sync path redo cmdno addauthスキームauth delete path [version] setquota -n | -b val path
単純な操作
[ZK:LocalHost:2181(Connected)12] LS /[Dubbo、Test、Zookeeper] [ZK:LocalHost:2181(Connected)13] Create /Itstyle Data IP:192.168.1.190:CDRWCREATED /ITSTYLE [ZK:LocalHost:Connected)14] Getacl /itstyle'ip、'192.168.1.190:cdrw
zkclient操作コード
java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.list; import java.util.map; import org.i0itec.zkclient; import org.apache.zookeeper.zookeeper.zookeper.zookeper.zookeper.zookeeper.zookeeper.zokeeper.zokeeper.zkclient; org.apache.zookeeper.data.id; import org.apache.zookeeper.data.stat; Import org.apache.zookeeper.server.auth.digestauthenticationprovider; public class acl {private static final string zkaddress = "192.168.1.1.190:181" private static final string testnode = "/dubbo"; private static final string readauth = "read-user:123456"; private static final string writeauth = "write-user:123456";プライベート静的最終文字列deleteauth = "delete-user:123456"; private static final string allauth = "super-user:123456";プライベート静的最終文字列adminauth = "admin-user:123456"; private static final String Digest = "Digest"; private static void initnode()nosuchalgorithmexception {zkclient zkclient = new zkclient(zkaddress); system.out.println(digestauthenticationprovider.generatedigest(allauth)); zkclient.addauthinfo(digest、allauth.getBytes()); if(zkclient.exists(testnode)){zkclient.delete(testnode); system.out.println( "node delete succuper!"); } list <ACL> ACLS = new ArrayList <ACL>(); ACLS.ADD(new ACL(Zoodefs.Perms.all、new ID(digest、digestauthenticationprovider.generatedigest(allauth)))); ACLS.ADD(new ACL(Zoodefs.Perms.all、new ID(digest、digestauthenticationprovider.generatedigest(allauth)))); ACLS.ADD(new ACL(Zoodefs.Perms.Read、new ID(digest、digestauthenticationprovider.generatedigest(readauth)))); acls.add(new ACL(Zoodefs.Perms.Write、new ID(digest、digestauthenticationprovider.generatedigest(writeauth))))); acls.add(new ACL(Zoodefs.Perms.Delete、new ID(digest、digestauthenticationprovider.generatedigest(deleteauth)))); acls.add(new ACL(Zoodefs.Perms.Admin、new ID(digest、digestauthenticationprovider.generatedigest(adminauth)))); zkclient.createpersistent(testnode、testnode、acls); system.out.println(zkclient.readdata(testnode)); System.out.println( "ノードが正常に作成されました!"); zkclient.close(); } private static void readtest(){zkclient zkclient = new zkclient(zkaddress); try {system.out.println(zkclient.readdata(testnode)); //認証情報なし、読み取り時にエラーが発生します} catch(例外e){system.err.println(e.getmessage()); } try {zkclient.addauthinfo(digest、adminauth.getBytes()); system.out.println(zkclient.readdata(testnode)); //管理者の許可は読み取り許可と一致せず、読み取り時に読み取りも発生します} catch(例外e){system.err.println(e.getmessage()); } try {zkclient.addauthinfo(digest、readauth.getBytes()); System.out.println(zkclient.readdata(testnode)); //読み取り許可を持つ認証情報のみを正常に読み取ることができます} catch(例外e){system.err.println(e.getmessage()); } zkclient.close(); } private static void writetest(){zkclient zkclient = new zkclient(zkaddress); try {zkclient.writedata(testnode、 "new-data"); //認証情報なしで失敗します} try {zkclient.addauthinfo(digest、writeauth.getBytes()); zkclient.writedata(testnode、 "new-data"); //認証情報を追加した後に通常書く} catch(例外e){system.err.println(e.getmessage()); } try {zkclient.addauthinfo(digest、readauth.getBytes()); system.out.println(zkclient.readdata(testnode)); // read new value vidification} catch(例外e){system.err.println(e.getmessage()); } zkclient.close(); } private static void deletetest(){zkclient zkclient = new zkclient(zkaddress); zkclient.addauthinfo(digest、deleteauth.getBytes()); try {System.out.println(zkclient.readdata(testnode)); zkclient.delete(testnode); system.out.println( "node delete succuper!"); } catch(Exception e){System.err.println(e.getMessage()); } zkclient.close(); } private static void changeAcltest(){zkclient zkclient = new zkclient(zkaddress); //注:zkclient.setaclメソッドは、ソースコードを表示するために見つかります。 ReadDataおよびSETACLメソッドが呼び出されます。 //ノードのACL属性を変更するには、読み取り許可と管理者の両方の許可を必要とする必要があります。 zkclient.addauthinfo(digest、readauth.getBytes()); try {list <ACL> ACLS = new ArrayList <ACL>(); acls.add(new ACL(Zoodefs.Perms.all、new ID(digest、digestauthenticationprovider.generatedigest(adminauth))); zkclient.setacl(testnode、acls); map.entry <list <acl>、stat> aclresult = zkclient.getacl(testnode); System.out.println(aclresult.getKey()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------要約します
ほとんどのサービスはイントラネットに展開されており、外部ネットワークに開かれていることはめったにありません。ただし、DubboのZookeeperユーザー許可認証は機能しないようです。外の世界に開く必要がある場合は、IPTABLEまたはファイアウォールのみを使用してIPアクセス制御を実行できます。 Alibaba Cloudサーバーの場合、セキュリティグループも適しています。
Dubbo+Zookeeperの分散サービスのセキュリティ認証の上記の例は、編集者が共有するコンテンツ全体です。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。