Zookeeper 접근제한(Access Control List)
· Version : Zookeeper
주키퍼의 패스와 노드에 대한 권한 관리는 상속되지 않는다. 이 뜻은 부모 노드와 자식 노드가 있을때, 부모의 노드의 권한 속성이 자식 노드로 권한 상속이 발생하지 않다는 것이다. 그리고 아무런 설정을 하지 않으면 누구나 접근이 가능하다.
접근권한은 [schema:id, permission] 같은 형태로 설정한다. Schema는 인증방법을 정의하고, id는 인증을 허용할 값을 정의, permission에는 처리할 수 있는 기능을 정의한다.
ex) 특정IP를 가진 클라이언트에 읽기(read) 권한 부여 : ip:192.168.0.1, READ
· CREATE : 자식 노드를 생성할 수 있는 권한
· READ : 데이터를 읽거나 자식노드를 조회할 수 있는 권한
· WRITE : 데이터를 수정할 수 있는 권한
· DELETE : 자식 노드를 삭제 할 수 있는 권한
· ADMIN : 권한을 설정할 수 있는 권한
접근제한에서 사용할 수 있는 스키마 목록은 아래와 같다.
· world : 모든 사용자가 접근 가능한 스키마
· auth : 접근 권한을 설정하기 위한 스키마 (실제 클라이언트에서 사용할 경우는 거의 없음)
· digest : “사용자명 : 패스워드” 방식으로 접근권한을 설정하기 위한 스키마
· host : 호스트명을 이용해 접근 권한을 설정하기 위한 스키마
· ip : 클라이언트 IP를 이용해 접근 권한을 설정하기 위한 스키마 (IP값은 addr/bits 형태의 비트마스크 사용 가능)
ACL 목록 생성시 동일한 퍼미션에 대해 다른 Id 객체가 있으면 마지막에 설정한 Id 객체의 설정만 반영된다.
아래 코드는Zookeeper ACL과 상호 작용하는 방법을 C로 만든 예제이다.
#include <string.h> #include <errno.h>
#include "zookeeper.h"
static zhandle_t *zh;
/** * In this example this method gets the cert for your * environment -- you must provide */ char *foo_get_cert_once(char* id) { return 0; }
/** Watcher function -- empty for this example, not something you should * do in real code */ void watcher(zhandle_t *zzh, int type, int state, const char *path, void *watcherCtx) {}
int main(int argc, char argv) { char buffer[512]; char p[2048]; char *cert=0; char appId[64];
strcpy(appId, "example.foo_test"); cert = foo_get_cert_once(appId); if(cert!=0) { fprintf(stderr, "Certificate for appid [%s] is [%s]\n",appId,cert); strncpy(p,cert, sizeof(p)-1); free(cert); } else { fprintf(stderr, "Certificate for appid [%s] not found\n",appId); strcpy(p, "dummy"); }
zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);
zh = zookeeper_init("localhost:3181", watcher, 10000, 0, 0, 0); if (!zh) { return errno; } if(zoo_add_auth(zh,"foo",p,strlen(p),0,0)!=ZOK) return 2;
struct ACL CREATE_ONLY_ACL[] = {{ZOO_PERM_CREATE, ZOO_AUTH_IDS}}; struct ACL_vector CREATE_ONLY = {1, CREATE_ONLY_ACL}; int rc = zoo_create(zh,"/xyz","value", 5, &CREATE_ONLY, ZOO_EPHEMERAL, buffer, sizeof(buffer)-1);
/** this operation will fail with a ZNOAUTH error */ int buflen= sizeof(buffer); struct Stat stat; rc = zoo_get(zh, "/xyz", 0, buffer, &buflen, &stat); if (rc) { fprintf(stderr, "Error %d for %s\n", rc, __LINE__); }
zookeeper_close(zh); return 0; } |
[참고자료]
· ZooKeeper ACL Permissions : https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_ACLPermissions
2020-05-10 / Sungwook Kang / http://sungwookkang.com
Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, 주키퍼, Zookeeper, 분산 코디네이션
'SW Engineering > Hadoop' 카테고리의 다른 글
ZooKeeper 리더선출과 데이터 ACID 정책 (0) | 2020.05.14 |
---|---|
Zookeeper 세션(Session) (0) | 2020.05.13 |
ZooKeeper Stat Structure (0) | 2020.05.08 |
ZooKeeper 시간 동기화와 네임스페이스 z노드 (0) | 2020.05.07 |
Zookeeper 소개 (0) | 2020.05.06 |