etcd-api,V2版本:
https://github.com/etcd-io/etcd/blob/master/Documentation/v2/authentication.md官方文档
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
|
urllib库会把 Authorization 头放在最后一个,这个头又有一个换行符号,打乱了整个数据的截取。可能导致value传了但变成空,才有了以上如此怪异的纠正方法。。
requests库会有类似的问题,根据具体的抓包分析来解决。。
go api
使用 官方的go sdk
|
config中增加用户名和密码
相关实现参考
https://segmentfault.com/a/1190000004362731 HTTP Basic Auth 小实验
http://smalltalllong.iteye.com/blog/912046 java实现basic auth
etcdctl get key:默认走的是guest的角色的权限,guset默认对/* 有rw权限
系统默认两个角色: root / guest。
不能修改root角色的权限。但是可以修改guset角色的权限,线下不用修改guest的权限(默认和root角色同权限),但是线上一定要修改guset角色的权限.基本就是去除了 /* 的rw权限
默认没有用户,首先创建root用户,默认就是root角色。
#etcdctl user add root 创建root账号,默认root角色
#etcdctl auth enable 启动权限
#etcdctl user add userName 创建账户
#etcdctl role add roleName 创建角色
#etcdctl role grant roleName -path 'XXX' -{write|read|readwrite} 为角色设置权限
#etcdctl user grant userName -roles roleName,roleName2,... 为账户赋予指定的角色
#完成写权限需求的项目的改造工作
#etcdctl role revoke guest -path '*' -write 修改guest角色的权限为只读
申请账号流程
#提供 账号名和密码
#提供 需要访问的目录路径或者具体的key的路径
#申请成功后,在项目中加入账号密码访问
操作使用/usr/bin/etcdctl -u root:密码 * * *
管理员执行命令步骤,以test用户申请权限为例(权限路径 /test/*):
#etcdctl role add rTest
#etcdctl role grant rTest-path '*' -read
#etcdctl role grant rTest-path '/test/*' -write
#etcdctl role get rTest(查看该赋予的权限是否都正确,通常保留*的读权限,仅保留指定目录的写权限)
#etcdctl user add test(给句提供的账号密码创建用户)
#etcdctl user grant test -roles rTest用户和角色绑定
#etcdctl user get test查看绑定的结果
如果用户已经有了,只是要新增某些目录的权限(比如为test增加test2目录的权限):
#etcdctl role add rTest2
#etcdctl role grant rTest2-path '*' -read
#etcdctl role grant rTest2-path '/test2/*' -write
#etcdctl role get rTest2
#etcdctl user grant test -roles rTest2
#etcdctl user get test 查看绑定的结果
其他操作流程
#修改密码 etcdctl user passwd myusername
#删除用户etcdctl user remove myusername
#删除角色 etcdctl role remove myrolename
不同用户下面的key无法访问,
key或路径或key所在的路径(最小权限原则)和角色在一起,再给角色添加权限,最后把角色分配给用户。此时访问key的值需要提供对应的用户名和密码了
http://www.likecs.com/show-32235.html
https://zealove.iteye.com/blog/2369199