`
ZeaLoVe
  • 浏览: 89909 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

etcd v2权限机制

    博客分类:
  • etcd
 
阅读更多

 权限系统概念

https://github.com/coreos/etcd/blob/master/Documentation/v2/authentication.md etcd权限-官方文档
etcd 2.X以前是不带权限的,2.X以上的版本才支持权限
etcd通过设置用户-角色关联,角色和权限关联,通过设置这些信息,使得指定的用户对某些目录拥有指定的权限。
etcd默认不启用权限机制,需要手动启用。
拥有一个个特殊的用户 root,拥有两个特殊的角色root和guest,root用户必须在启用权限系统前创建

角色 role

对于root角色的权限是不能被修改的,root角色拥有所有系统权限,是系统管理员。
guest角色则被认为是所有'''不带账号的请求'''的默认角色,其权限可以在任何时候被修改,一旦权限策略上线,默认其拥有只读权限(否则你上权限就没意义了)。
其他角色可以通过root 用户去申请,并绑定到相应的用户下,则可以保护系统的安全,防止误删除和越权删除key的发生

用户 user
默认的root用户拥有所有权限
其他用户可以通过root用户去创建
用户拥有哪些权限需要通过赋予指定的角色去获取权限,一个用户可以有多个角色

权限
角色可以设置权限,权限分为读、写、读写,权限的基础是etcd的key,一般普通用户只对某些key的目录拥有写权限,读权限不做限制。

权限接入需要的API改造
数据接口的调用一切如故,只是需要输入用户和密码的
在申请到用户并拿到密码后,根据不同的文档调用
etcd仅支持  '''Basic Auth''' 的认证方式
请求增加header Authorization ; 内容为 "Basic "+base64encode("user:password")
有提供SDK的语言,一般支持在配置里指定用户密码类似go sdk,没有实现的,参考python实现改造一下。

shell
curl 中使用 -u user:password 


python

import base64
 
def basic_auth(name,passwd):
     return "Basic %s"%(base64.encodestring('%s:%s'%(name,passwd)))
 
value={}
value['laji']='laji'
value['value']="u value"
data = urllib.urlencode(value)
length = len(data)+2 
req = urllib2.Request(url,data)
auth = basic_auth('u user','u password')
req.add_header('Authorization',auth)
req.add_header('Content-Length',length)
resp = urllib2.urlopen(req)


urllib库会把 Authorization 头放在最后一个,这个头又有一个换行符号,打乱了整个数据的截取。可能导致value传了但变成空,才有了以上如此怪异的纠正方法。。
requests库会有类似的问题,根据具体的抓包分析来解决。。

go api 
使用 官方的go sdk

cfg := client.Config{
    Endpoints: []string{"http://XXX.XX.XXX.XX:2379"},
    Transport: client.DefaultTransport,
    // set timeout per request to fail fast when the target endpoint is unavailable
    HeaderTimeoutPerRequest: time.Second,
    Username:                "XXX",
    Password:                "XXX",
}

config中增加用户名和密码

相关实现参考
https://segmentfault.com/a/1190000004362731 HTTP Basic Auth 小实验
http://smalltalllong.iteye.com/blog/912046 java实现basic auth

权限系统上线步骤   #号表示你用来调用etcdctl的相关内容
#user add root 创建root账号
#auth enable 启动权限
#user add userName 创建账户
#role add roleName 创建角色
#role grant roleName -path 'XXX' -{write|read|readwrite} 为角色设置权限
#user grant userName -roles roleName,roleName2,... 为账户赋予指定的角色
#完成写权限需求的项目的改造工作
#role revoke guest -path '*' -write 修改guest角色的权限为只读

申请账号流程
#提供 账号名和密码 
#提供 需要访问的目录路径或者具体的key的路径
#申请成功后,在项目中加入账号密码访问
操作使用/usr/bin/etcdctl -u root:密码 * * *
管理员执行命令步骤,以test用户申请权限为例(权限路径 /test/*):
#role add rTest
#role grant rTest-path '*' -read
#role grant rTest-path '/test/*' -write
#role get rTest(查看该赋予的权限是否都正确,通常保留*的读权限,仅保留指定目录的写权限)
#user add test(给句提供的账号密码创建用户)
#user grant test -roles rTest用户和角色绑定
#user get test查看绑定的结果

如果用户已经有了,只是要新增某些目录的权限(比如为test增加test2目录的权限):
#role add rTest2
#role grant rTest2-path '*' -read
#role grant rTest2-path '/test2/*' -write
#role get rTest2
#user grant test -roles rTest2
#user get test  查看绑定的结果

其他操作流程

#修改密码 user passwd myusername
#删除用户 user remove myusername
#删除角色 role remove myrolename

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics