设为首页 收藏本站
查看: 1547|回复: 0

[经验分享] zookeeper Acl设置权限

[复制链接]

尚未签到

发表于 2019-1-8 06:36:18 | 显示全部楼层 |阅读模式
  默认zookeeper无权限认证功能, 修改些代码实现认证
  zookeeper包括四个内置的scheme,包括world,auth,digest,ip,默认为world,权限相当于任何人可操作。我们现在要做的是加入一种认证方式,使用digest这种username:password方式比较适合我们。 但是zookeeper带的zkCli.sh在设置Acl时,如果scheme为digest密码采用明文会有问题
  经过研究发现digest的密码生成方式是Sha1摘要的base64形式,所以我们可以用其它语言生成密码摘要然后操作。
  在cli下使用getAcl查看权限, 使用setAcl为/加权限,操作有权限的节点要先使用
  [zk: localhost:2181(CONNECTED) 21] setAcl /pomelo digest:pomelo:zOL5mkauOP5kV9xnATsWSNNqEdw=:cdrwa
  cZxid = 0x271
  ctime = Thu Jul 18 18:54:57 CST 2013
  mZxid = 0x271
  mtime = Thu Jul 18 18:54:57 CST 2013
  pZxid = 0x272
  cversion = 1
  dataVersion = 0
  aclVersion = 1
  ephemeralOwner = 0x0
  dataLength = 6
  numChildren = 1
  [zk: localhost:2181(CONNECTED) 22] getAcl /pomelo
  'digest,'pomelo:zOL5mkauOP5kV9xnATsWSNNqEdw=
  : cdrwa
  [zk: localhost:2181(CONNECTED) 23] getAcl /
  'world,'anyone
  : cdrwa
  [zk: localhost:2181(CONNECTED) 25] ls /pomelo
  Authentication is not valid : /pomelo
  [zk: localhost:2181(CONNECTED) 26] addauth digest pomelo:pomelo
  [zk: localhost:2181(CONNECTED) 27] ls /pomelo
  [master]
  [zk: localhost:2181(CONNECTED) 28]
  修改pomelo app.js配置, 如果配置setACL: true在连接时会自动为path下的节点设置密码。如果要访问的节点原来有权限的话可以设置为setACL: false
  app.enable('masterHA');
  app.set('masterHAConfig',
  {
  server : '127.0.0.1:2181',
  path : '/pomelo/master',
  setACL: true,
  username : 'pomelo',
  password : 'pomelo'
  });
  修改/pomelo/lib/master/zookeeper.js
  var logger = require('pomelo-logger').getLogger(__filename);
  var crypto = require('crypto');
  var zookeeperClient = null;
  function getClient(app) {
  if (!zookeeperClient) {
  zookeeperClient = new Zookeeper(app);
  }
  return zookeeperClient;
  }
  function Zookeeper(app, opts) {
  this.app = app;
  var config = app.get('masterHAConfig');
  var timeout = config.timeout || 5000;
  this.hosts = config.server || '127.0.0.1:2181';
  this.path = config.path || '/pomelo/master';
  this.username = config.username || 'pomelo';
  this.password = config.password || 'pomelo';
  this.setACL = config.setACL;
  this.lockPath = this.path + '/lock';
  this.nodePath = this.lockPath + '/' + this.app.serverId + '-';
  this.version = null;
  this.onDataSet = false;
  this.authentication = this.username + ':' + this.password;
  var shaDigest = crypto.createHash('sha1').update(this.authentication).digest('base64');
  this.acls = [
  new zookeeper.ACL(
  zookeeper.Permission.ALL,
  new zookeeper.Id('digest', this.username+':'+shaDigest)
  )
  ];
  this.client = zookeeper.createClient(this.hosts, {sessionTimeout: timeout});
  var self = this;
  this.client.once('connected', function () {
  if(self.setACL) {
  self.client.addAuthInfo('digest', new Buffer(self.authentication));
  self.client.setACL(self.path, self.acls, -1, function (error, stat) {
  if (error) {
  console.log('Failed to set ACL: %s.', error);
  return;
  }
  console.log('ACL is set to: %j', self.acls);
  });
  }
  watchNode(self.client, self.path, onMasterUpdate.bind(self));
  });
  this.client.connect();
  }
  关于 ACL
  Zookeeper的ACL,可以从三个维度来理解:一是scheme; 二是user; 三是permission,通常表示为scheme:id:permissions
  授权方式:
  1. scheme: scheme对应于采用哪种方案来进行权限管理,zookeeper实现了一个pluggable的ACL方案,可以通过扩展scheme,来扩展ACL的机制。zookeeper缺省支持下面几种scheme:
  2.
  auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
  3.
  digest: 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
  4.
  ip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
  5.
  super: 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa
  6.
  world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的: cdrwa
  每个ACL 都会有一个权限列表
  r表示"read",w表示"write",c表示"create",d表示"delete",a表示"admin"
  Zookeeper 权限定义:
权限描述备注CREATE有创建子节点的权限READ有读取节点数据和子节点列表的权限WRITE有修改节点数据的权限无创建和删除子节点的权限DELETE有删除子节点的权限ADMIN有设置节点权限的权限  ZooKeeper 四字命令    功能描述
  conf    输出相关服务配置的详细信息。

  cons    列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。包括“接受 / 发送”的包数量、会话>  dump    列出未经处理的会话和临时节点。
  envi    输出关于服务环境的详细信息(区别于 conf 命令)。
  reqs    列出未经处理的请求
  ruok    测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
  stat    输出关于性能和连接的客户端的列表。
  wchs    列出服务器 watch 的详细信息。
  wchc    通过 session 列出服务器 watch 的详细信息,它的输出是一个与watch 相关的会话的列表。wchp    通过路径列出服务器 watch 的详细信息。它输出一个与 session相关的路径。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-660484-1-1.html 上篇帖子: zookeeper 入门 下篇帖子: zookeeper-13002242
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表