SW Engineering/Hadoop

Zookeeper 접근제한(Access Control List)

SungWookKang 2020. 5. 11. 12:42
반응형

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