etcd-3.3.11 权限

本文介绍了etcd的权限管理机制,etcd 2.X以上版本支持权限,默认不启用需手动开启。通过设置用户 - 角色 - 权限关联保障安全,有root和guest特殊角色。还说明了权限接入的API改造、不同语言实现方式,以及申请账号、管理员操作、修改密码等操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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 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

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值