《ZooKeeper官方指南》ZooKeeper 使用 ACL 进行访问控制

原文链接 译者:Thor_liu

ZooKeeper 使用 ACL 进行访问控制

ZooKeeper使用ACL来控制访问其znode(ZooKeeper的数据树的数据节点)。ACL的实现方式非常类似于UNIX文件的访问权限:它采用访问权限位 允许/禁止 对节点的各种操作以及能进行操作的范围。不同于UNIX权限的是,ZooKeeper的节点不局限于 用户(文件的拥有者),组和其他人(其它)这三个标准范围。ZooKeeper不具有znode的拥有者的概念。相反,ACL指定id集以及与之对应的权限。

还要注意的是一条ACL仅针对于一个特定的节点。尤其不适用于子节点。例如,如果/app 只对IP:172.16.16.1可读 而 / APP/status 是对任何人可读的,ACL不是递归的。

ZooKeeper支持可插拔的身份验证方案。 id使用如下形式  scheme:id,其中 scheme 是 id 所对应一个认证方案。例如,IP:172.16.16.1,id为主机的地址 172.16.16.1。

当客户端连接到ZooKeeper验证自己时,ZooKeeper将有关该客户端的所有Id与客户连接关联。客户端试图访问一个节点时,这些ID与该znodes的ACL验证。 ACL是由(scheme:expression, perms)对构成。其中expression的格式指定为scheme。例如,(IP:19.22.0.0/16,READ)表示对所有起始IP为19.22的客户端具有读权限。

ACL 权限

 

ZooKeeper 支持以下权限:

  • CREATE: 能创建子节点
  • READ:能获取节点数据和列出其子节点
  • WRITE: 能设置节点数据
  • DELETE: 能删除子节点
  • ADMIN: 能设置权限

CREATE权限和DELETE权限从WRITE权限中分离出来,是为了获得更好的访问控制。使用CREATE和DELETE权限的场景如下:

你想让A用户能够设置节点数据,但不允许创建或删除子节点。

有CREATE但无DELETE权限:客户端发出一个在父目录下创建节点的请求。你想让所有客户端能够添加,但是只有创建者能够删除。(这类似于文件的APPEND权限)。

内置的 ACL schemes

ZooKeeper有如下内置的schemes

  • world 有个唯一的id, anyone ,代表所有人。
  • auth 不使用任何id,代表任何已认证的用户。
  • digestusername:password 字符串来产生一个MD5串,然后该串被用来作为ACL ID。认证是通过明文发送username:password 来进行的,当用在ACL时,表达式为username:base64 ,base64是password的SHA1摘要的编码。
  • ip 使用客户端的主机IP作为ACL ID 。这个ACL表达式的格式为addr/bits ,此时addr中的有效位与客户端addr中的有效位进行比对。

ZooKeeper C 客户端 API

 

如下的常量是由ZooKeeper C语言库中提供的:

  • const int ZOO_PERM_READ;  //能读节点的值及列出其子节点
  • const int ZOO_PERM_WRITE; //能设置节点的值
  • const int ZOO_PERM_CREATE;  //能创建子节点
  • const int ZOO_PERM_DELETE; // 能删除子节点
  • const int ZOO_PERM_ADMIN;  //能执行set_acl()
  • const int ZOO_PERM_ALL; // 上面所有值的OR
  • struct Id ZOO_ANYONE_ID_UNSAFE; //(‘world’,’anyone’)
  • struct Id ZOO_AUTH_IDS;// (‘auth’,’’)

ZOO_AUTH_IDS 为空时,应被理解成“创建者的Id”

ZooKeeper 客户端有3种标准的ACL:

  • struct ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)
  • struct ACL_vector ZOO_READ_ACL_UNSAFE;// (ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)
  • struct ACL_vector ZOO_CREATOR_ALL_ACL; //(ZOO_PERM_ALL,ZOO_AUTH_IDS)

ZOO_OPEN_ACL_UNSAFE使所有ACL都“开放”了:任何应用程序在节点上可进行任何操作,能创建、列出和删除它的子节点。对任何应用程序,ZOO_READ_ACL_UNSAFE是只读的。CREATE_ALL_ACL赋予了节点的创建者所有的权限,在创建者采用此ACL创建节点之前,已经被服务器所认证(例如,采用 “ digest”方案)。

以下ZooKeeper方法处理ACL:

  • int zoo_add_auth (zhandle_t *zh,const char* scheme,const char* cert, int certLen, void_completion_t completion, const void *data);

The application uses the zoo_add_auth function to authenticate itself to the server. The function can be called multiple times if the application wants to authenticate using different schemes and/or identities.

应用程序使用zoo_add_auth方法来向服务器认证自己,如果想用不同的方案来认证,这个方法可以被调用多次。

  • int zoo_create (zhandle_t *zh, const char *path, const char *value,int valuelen, const struct ACL_vector *acl, int flags,char *realpath, int max_realpath_len);

zoo_create(…)方法创建一个新节点。acl 参数是一个与这个节点关联的ACL列表,父节点权限项的CREATE位已被设(set,即由权限)。

  • int zoo_get_acl (zhandle_t *zh, const char *path,struct ACL_vector *acl, struct Stat *stat);

这个方法返回这个节点的ACL信息。

  • int zoo_set_acl (zhandle_t *zh, const char *path, int version,const struct ACL_vector *acl);

这个方法用新的节点的ACL列表替换老的,这个节点的ADMIN位必须被设置(set,即具有ADMIN权限)。

这有一个使用上面API的例子,采用”foo”方案认证,创建一个“/xyz”的暂态节点,设置其为”只创建“权限。

这是一个非常简单的例子,它的目的是展示如何与ZooKeeper ACL交换。C客户端的实现,参考…/trunk/src/c/src/cli.c .

#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;
}

时间: 2024-11-16 11:27:35

《ZooKeeper官方指南》ZooKeeper 使用 ACL 进行访问控制的相关文章

《ZooKeeper官方指南》一致性保障

一致性保障 ZooKeeper是一个高性能,可扩展的服务.虽然读比写更快,但在设计上,它的读操作和写操作都很快.之所以会出现读比写更快,是因为在某些"读"的情况下,ZooKeeper 可以使用比较旧的数据,这得益于ZooKeeper的一致性保障: 连续一致性 来自客户端的更新请求会按照它们发送的顺序被应用.   原子性 更新要么成功,要么失败--不会出现部分成功的(更新操作)结果 单系统图像 一个客户端将会看到和它连接的服务器相同的服务视图. 可靠性 一旦一个更新被应用了,它(更新)将

动态Proxy与Java ACL用户访问控制机制实现

用户访问控制(Access control )机制总是围绕粗粒度和细粒度两个方面来讨论: 粗粒度控制:可以规定访问整个对象或对象群的某个层,而细粒度控制则总是在方法或属性层进行控制,比如: 允许一个文件为只读是属于粗粒度控制,而允许对这个文件某行有写操作则属于细粒度控制. 一个好的用户控制机制当然既允许粗粒度也允许细粒度控制,在Jive中我们看到是使用Proxy来达到这个目的,但是我们也发现,由于需要对每个类都要进行细粒度控制,所以必然对每个类都要做一个Proxy类,这样带来了很多Proxy类,

RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

在上一篇文章(RHCSA 系列(六))中,我们解释了如何使用 parted 和 ssm 来设置和配置本地系统存储. RHCSA 系列: 配置 ACL 及挂载 NFS/Samba 共享 – Part 7 我们也讨论了如何创建和在系统启动时使用一个密码来挂载加密的卷.另外,我们告诫过你要避免在挂载的文件系统上执行危险的存储管理操作.记住了这点后,现在,我们将回顾在 RHEL 7 中最常使用的文件系统格式,然后将涵盖有关手动或自动挂载.使用和卸载网络文件系统(CIFS 和 NFS)的话题以及在你的操作

Zookeeper之Zookeeper的Client的分析

1)几个重要概念  ZooKeeper:客户端入口 Watcher:客户端注册的callback ZooKeeper.SendThread: IO线程 ZooKeeper.EventThread: 事件处理线程,处理各类消息callback ClientCnxnSocketNIO:继承自ClientCnxnSocket,专门处理IO   2)zookeeper初始化 应用提供watch实例 实例化zookeeper 实例化socket,默认使用ClientCnxnSocketNIO,可通过zoo

Zookeeper之Zookeeper底层客户端架构实现原理(转载)

Zookeeper的Client直接与用户打交道,是我们使用Zookeeper的interface.了解ZK Client的结构和工作原理有利于我们合理的使用ZK,并能在使用中更早的发现问题.本文将在研究源码的技术上讲述ZK Client的工作原理及内部工作机制. 在看完ZK Client的大致架构以后我希望能有一种简单的方式描述ZK Client的基本结构,想来想去我觉得还是图片比较能反映情况,于是我画了这张大致的结构图:   我想既然我画了这张图,就让我们从这张图开始讲起吧. 模块: 我们可

《Apache Zookeeper官方文档》2-综述

原文地址 Zookeeper: 一个分布式应用的分布式协调服务 zookeeper 是一个分布式的,开源的协调服务框架,服务于分布式应用程序. 它暴露了一系列的基础的操作服务,因此分布式应用能够基于这些服务,构建出更高级别的服务,比如同步,配置管理,分组和命名服务. zookeeper设计上易于编码,数据模型构建在我们熟悉的树形结构目录风格的文件系统中. zookeeper运行在java中,同时支持java和C 语言.正确的实现协调服务是公认的难干的差事. 他们及其容易出错,比如资源竞争和死锁.

ZooKeeper管理员指南——部署与管理ZooKeeper

本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要点,围绕ZK的部署和运维两个方面讲一些管理员需要知道的东西.本文并非一个ZK搭建的快速入门,关于这方面,可以查看<ZooKeeper快速搭建>. 1.部署 本章节主要讲述如何部署ZooKeeper,包括以下三部分的内容: 系统环境 集群模式的配置 单机模式的配置 系统环境和集群模式配置这两节内容大

Zookeeper总概

zookeeper是一个开源的分布式协调服务.是典型的分布式数据一致性的解决方案. zookeeper可以保证以下分布式一致性的特性 1. 顺序性:同一客户端发起的事务请求,最终会严格的按照发出顺序应用到zookeeper上 2. 原子性:事务请求的执行结果在集群机器上要么全部成功,要么全部失败,不存在部分成功,部分失败的结果. 3. 单一视图:客户端无论连接到哪个zookeeper服务端,所看到的服务端数据模型都是一致的. 4. 可靠性:一旦服务端成功的应用了一条事务,而且完成了对客户端的响应

Zookeeper 客户端API调用示例(基本使用,增删改查znode数据,监听znode,其它案例,其它网络参考资料)

9.1 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话 它提供以下几类主要方法  : 功能 描述 create 在本地目录树中创建一个节点 delete 删除一个节点 exists 测试本地是否存在目标节点 get/set data 从目标节点上读取 / 写数据 get/set ACL 获取 / 设置目标节点访问控制列表信息 get children 检索一个子节点上的列表 sync 等待要被传送的数据