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, 분산 코디네이션

+ Recent posts