zookeeperに対応するacl権限を設定する


ZookeeperはACLを使ってZnodeにアクセスすることを制御して、ACLの実現はUNIXの実現と非常に似ています。それらの操作は許可されています。それらの操作は禁止されています。ただし、標準のUNIX権限とは異なり、Znodeはユーザ(user、つまりファイルの所有者)、グループ(group)、その他(world)を制限していません。Zookeeprは所有者の概念がない。
各ZNodeのACLは独立しており、サブノードは親ノードのACLを継承しない。例えば、Znode/appはipに対して172.16.16.1読み取り専用の権限しかないのに対し、/app/statusはworldで読み取り可能であれば、誰でも取得できる/app/status。したがって、Zookeeperには権限が引き継がれていません。Znodeの権限はそれぞれ独立して存在します。
Zookeeperは挿抜可能な権限認証方案をサポートし、三つの次元に分けます。scheme、user、permission。scheme:idとして一般的に表されていますが、Schemeはどのような方法でアクセス制御を行うかを表しています。Idはユーザーを表しています。Permissionはどのような権限があるかを表しています。この三つの次元について説明します。
Zoo Keeperは次のようなパーミッションをサポートします。
  ・CREATE:サブノードを作成できます。
  ・READ:当該ノードのデータを取得しても良いし、当該ノードの全てのサブノードを読み出すこともできます。
  ・WRITE:このノードにデータを書き込むことができます。
  ・DELETE:サブノードを削除することができます。
   ・ADMIN:このノードに権限を設定することができます。
簡単に言えば、zookeeperのこの5つの操作権限は、CREATE、READ、WRITE、DELETE、ADMIN、つまり、増加、削除、修正、調査、管理権限であり、これらの5つの権限は簡単にcrwdaと書きます。
注:この5つの権限のうち、deleteはサブノードに対する削除権限を指し、他の4つの権限は自身のノードに対する操作権限を指します。
内蔵ACL Schemes:
world:ただ一つのid:anyone、world:anyoneは誰でもアクセス権限があると表しています。Zookeeperは誰でも権限があるノードをworld:anyoneに帰属します。
auth:idは不要です。authを通過するuserにはすべて権限があります。
digest:ACLのIDとしてユーザー名/パスワードで検証します。
ip:ACLのIDとしてクライアントのIPアドレスを使用して設定すると、ip:192.168.1.0/16などのipセグメントを設定できます。前の16 bitに合致するIPセグメントを表します。
sasl:saslの対応するidは、sasl authenticationユーザのID、zookeeper-34.4のsasl authenticationを通じて、kersosによって実現されたもので、つまりユーザはケロロ認証を通過してこそ、権限のあるnodeにアクセスできるということです。
自己定義のSchemeを実現する必要があれば、org.apache.zookeeper.server.auth.Authentication Providerインターフェースを実現することができます。
例:

    @Test
	public void testAclServer() {
		List<ACL> acls = new ArrayList<ACL>(2);
		try {
			Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("fish:fishpw"));
			ACL acl1 = new ACL(ZooDefs.Perms.WRITE, id1);
			Id id2 = new Id("digest", DigestAuthenticationProvider.generateDigest("qsd:qsdpw"));
			ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);
			acls.add(acl1);
			acls.add(acl2);
			//         
			// Id world = new Id("world", "anyone");
			// ACL worldAcl = new ACL(ZooDefs.Perms.READ, world);
			// acls.add(worldAcl);
			// 10.0.2.76   IP
			// Id id3 = new Id("ip", "10.0.2.76");
			// ACL acl3 = new ACL(ZooDefs.Perms.WRITE, id3);
			// acls.add(acl3);
		} catch (NoSuchAlgorithmException e1) {
			e1.printStackTrace();
		}
		ZooKeeper zk = null;
		try {
			zk = new ZooKeeper("10.0.1.75:2181,10.0.1.76:2181,10.0.1.77:2181", 300000, new Watcher() {
				//           
				public void process(WatchedEvent event) {
					System.out.println("     " + event.getType() + "  !");
				}
			});
			if (zk.exists("/test", true) == null) {
				System.out.println(zk.create("/test", "ACL  ".getBytes(), acls, CreateMode.PERSISTENT));
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (KeeperException e1) {
			e1.printStackTrace();
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
	}
	@Test
	public void testAclClient() {
		try {
			ZooKeeper zk = new ZooKeeper("10.0.1.75:2181,10.0.1.76:2181,10.0.1.77:2181", 300000, new Watcher() {
				//           
				public void process(WatchedEvent event) {
					System.out.println("     " + event.getType() + "  !");
				}
			});
			//      
			zk.addAuthInfo("digest", "fish:fishpw".getBytes());
			//      
			zk.addAuthInfo("digest", "qsd:qsdpw".getBytes());
			System.out.println(new String(zk.getData("/test", null, null)));
			zk.setData("/test", "I change!".getBytes(), -1);
		} catch (KeeperException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 締め括りをつける
以上が本論文では、zookeeperに対応するacl権限を設定するすべての内容についてです。何か質問がありましたら、メッセージを残してください。編集者はすぐに皆さんに返事します。ここでも皆さんのサポートに感謝します。