zookeeper ACL(Action Control List) 설정
Action Control List (ACL) – ACL은 기본적으로 z 노드에 액세스하기위한 인증 메커니즘입니다.
모든 znode 읽기 및 쓰기 조작을 제어합니다.
ACL Permissions
ZooKeeper에서의 권한은 unix-like 파일시스템의 권한과 크게 다를 것은 없다.
특정 권한들에 대해 allow flag가 있어서 이것이 어떻게 설정되는가에 따라서 해당 권한을 실행시킬 수 있는지가 결정된다.
ZooKeeper에서 설정할 수 있는 ACL의 종류는 아래의 5가지이다.
- CREATE : 해당 znode의 자식 node를 만들 수 있는 권한.
- READ : 해당 znode에서 data를 읽고 와 그 자식들의 목록을 읽을 수 있는 권한.
- WRITE : 해당 znode에 값을 쓸 수 있는 권한.
- DELETE : 해당 znode의 자식들을 지울 수 있는 권한.
- ADMIN : 해당 znode에 권한을 설정할 수 있는 권한.
unix-like file system과 다른 부분이 2가지 있다.
첫 번째는 보통의 file system에는 없는 CREATE와 DELETE라는 권한이 존재하여 자식 node를 생성하고 삭제할 수 있는 권한이 있다는 것이다.
unix-like file system에서 directory는 실제로는 자기 자식의 list를 가지고 있는 file이다.
그래서 자식을 만들고 지우는 것은 부모 directory에 내용을 변경하는 것이고, 부모 directory에 쓰기 권한이 있는지가 자식을 만들고 지우는 권한이 된다.
하지만 ZooKeeper에서는 모든 znode가 directory이기도 하고, file이기도 해서 자기 자신에 대한 쓰기 권한과 자식 node에 대한 생성/삭제 권한을 같이 쓸 수 없다.
Schemes
ZooKeeper는 unix-like 시스템과 다르게 각 znode에 user/group/others라는 개념이 존재하지 않는다.
대신 scheme이라는 것을 이용하여 권한을 구분하게 되어 있다.
built in으로 제공되는 설정할 수 있는 scheme은 아래와 같이 4가지가 있다.
- WORLD
- AUTH
- DIGEST
- HOST
- IP
DIGEST는 username과 password를 보내서 이를 이용하여 만든 MD5 hash값이 같은 요청에 대해서만 처리하는 것이고, IP는 해당 IP에서의 요청만을 처리하도록 하는 것이다.
Stat
- czxid : znode를 생성한 트랜잭션의 id
- mzxid : znode를 마지막으로 수정 트랜잭션의 id
- ctime : znode가 생성됐을 때의 시스템 시간
- mtime : znode가 마지막으로 변경되었을 때의 시스템 시간
- version : znode가 변경된 횟수
- cversion : znode의 자식 node를 수정한 횟수
- aversion : ACL 정책을 수정한 횟수
- ephemeralOwner : 임시 노드인지에 대한 flag
- dataLength : data의 길이
- numChildren : 자식 node의 수
Scheme ACL 살펴보기
WORLD Scheme명령 구문은 다음과 같습니다.
setAcl /znode world:anyone:crdwa
[zk: localhost:2181(CONNECTED) 3] setAcl /znode world:anyone:crdwa cZxid = 0x18600000003 ctime = Tue Aug 06 09:20:54 GMT+09:00 2019 mZxid = 0x18600000003 mtime = Tue Aug 06 09:20:54 GMT+09:00 2019 pZxid = 0x18600000003 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 7 numChildren = 0
AUTH Scheme 명령 구문은 다음과 같습니다.
인증 사용자를 추가 후 ACL 설정을 할 수 있습니다.
addauth digest [username]:[password]
인증 사용자를 추가후 znode에 ACL을 설정합니다.
setAcl /znode auth:[username]:[password]:crdwa
아래와같이 설정합니다.
[zk: localhost:2181(CONNECTED) 7] addauth digest user1:pwd1 [zk: localhost:2181(CONNECTED) 8] setAcl /authznode auth:user1:pwd1:crdwa cZxid = 0x18600000005 ctime = Tue Aug 06 09:24:05 GMT+09:00 2019 mZxid = 0x18600000005 mtime = Tue Aug 06 09:24:05 GMT+09:00 2019 pZxid = 0x18600000005 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 7 numChildren = 0 [zk: localhost:2181(CONNECTED) 9] getAcl /authznode 'digest,'user1:a9l5yfb9zl8WCXjVmi5/XOC0Ep4= : cdrwa
DIGEST Scheme 명령 구문은 다음과 같습니다.
setAcl /[node_name] digest:[usename]:[password]:crdwa
[zk: localhost:2181(CONNECTED) 11] setAcl /digznode digest:user1:pwd1:crdwa cZxid = 0x18600000007 ctime = Tue Aug 06 09:33:08 GMT+09:00 2019 mZxid = 0x18600000007 mtime = Tue Aug 06 09:33:08 GMT+09:00 2019 pZxid = 0x18600000007 cversion = 0 dataVersion = 0 aclVersion = 1 ephemeralOwner = 0x0 dataLength = 7 numChildren = 0 [zk: localhost:2181(CONNECTED) 12] getAcl /digznode 'digest,'user1:pwd1 : cdrwa
HOST Scheme 명령 구문은 다음과 같습니다.
setAcl /[node_name] host:[hostname]:crdwa
IP Scheme 명령 구문은 다음과 같습니다.
setAcl /[node_name] ip:[IPv4Address]:crdwa