概述
身份验证是在 etcd 2.1 中添加的。etcd v3 API 稍微修改了身份验证功能的 API 和用户界面,以更好地适应新的数据模型。本指南旨在帮助用户在 etcd v3 中设置基本身份验证和基于角色的访问控制。
特殊用户和角色
有一个特殊用户:root
一个特殊角色:root
root用户
root必须在激活身份验证之前创建对 etcd 具有完全访问权限的用户。root用户背后的想法是出于管理目的:管理角色和普通用户。该root用户必须具有root角色的作用,并使其改变etcd中任何东西。
root角色
root除了 root 用户之外,该角色还可以授予任何用户。具有该root角色的用户具有全局读写访问权限和更新集群身份验证配置的权限。此外,该root角色授予一般集群维护的权限,包括修改集群成员资格、对存储进行碎片整理和拍摄快照。
使用user子命令
etcdctl的user子命令处理与用户帐户有关的所有事情。
以下命令用于查看用户列表
etcdctl user list
创建用户
etcdctl user add myusername
创建用户时会交互式输入密码
--interactive=false 可以不适用交互式输入密码。使用标准输入,输入密码
--new-user-password也可以用来提供密码
修改用户的密码
etcdctl user passwd myusername
修改密码将提示输入密码。
修改密码时也可以通过--interactive=false,通过标准输入,输入密码。
可以对用户授权角色(grant-role)或者撤销角色(revoke-role)
etcdctl user grant-role myusername foo
etcdctl user revoke-role myusername bar
检查用户设置
etcdctl user get myusername
删除用户
etcdctl user delete myusername
使用role子命令
etcdctl的role子命令处理与特定角色的访问控制有关的所有事情。就像授权个人用户。
查看角色列表
etcdctl role list
新建角色
etcdctl role add myrolename
角色没有密码。只是定义了一组新的访问权限。
角色被授权访问单个key或者一组key。
一组key可以指定其区间,范围为[start-key,end-key),包含start-key、不包含end-key。
可以以读、写或两者兼有的方式授予访问权限,如以下示例所示:
# 授权可读单个key:/foo
etcdctl role grant-permission myrolename read /foo
# 授权读权限前缀为/foo/的key。前缀的意思和范围[/foo/, /foo0)一样
etcdctl role grant-permission myrolename --prefix=true read /foo/
# 授权写权限给key:/foo/bar
etcdctl role grant-permission myrolename write /foo/bar
#授权所有权限给key:范围在[key1, key5)
etcdctl role grant-permission myrolename readwrite key1 key5
# 授权所有权限,给前缀为/pub/的key
etcdctl role grant-permission myrolename --prefix=true readwrite /pub/
查看角色授予的权限
etcdctl role get myrolename
撤销权限,逻辑和授权一样
etcdctl role revoke-permission myrolename /foo/bar
删除角色
etcdctl role delete myrolename
启用身份验证
启用auth的最小步骤如下。管理员可以根据需要在启用身份验证之前或之后设置用户和角色
确保root用户已创建
etcdctl user add root
开启鉴权
etcdctl auth enable
在此之后,etcd将在启用身份验证的情况下运行。
如要禁用身份验证请使用如下命令
etcdctl --user root:rootpassword auth disable
使用etcdctl时身份认证
etcdctl支持和curl命令相似的身份认证标签
etcdctl --user user:password get foo
也可以交互式输入密码
etcdctl --user user get foo
可以通过--password标签输入密码
etcdctl --user user --password password get foo
实践
创建特殊用户和特殊角色
./etcdctl --endpoints=http://127.0.0.1:2379 user add root:etcd
./etcdctl --endpoints=http://127.0.0.1:2379 role add root
./etcdctl --endpoints=http://127.0.0.1:2379 user grant-role root root
./etcdctl --endpoints=http://127.0.0.1:2379 auth enable
查看用户和角色list
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd user list
root
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd role list
root
查看用户设置信息
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd user get root
User: root
Roles: root
查看角色授权信息
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd role get root
Role root
KV Read:
KV Write:
测试用户权限验证
创建测试用户和角色,并授权
./etcdctl --user root:etcd user add testuser
./etcdctl --user root:etcd role add testrole
./etcdctl --user root:etcd user grant-role testuser testrole
查看测试用户设置和角色权限
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd user get testuser
User: testuser
Roles: testrole
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd role get testrole
Role testrole
KV Read:
KV Write:
是可以看到,测试的用户设置,和角色的权限是和root用户和角色相似的。
验证测试角色的权限和root角色的权限是否有所不同?
虽然root角色和testrole角色在授权上都是空的,但是root是特殊角色,而testrole是真的没有任何权限。验证如下:
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd get /apisix-platform/consumers/
/apisix-platform/consumers/
init_dir
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user testuser:testuser get /apisix-platform/consumers/
{"level":"warn","ts":"2021-07-18T02:06:14.654+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-bf0061b7-f840-4563-bd2d-ed8e4a569a48/127.0.0.1:2379","attempt":0,"error":"rpc error: code = PermissionDenied desc = etcdserver: permission denied"}
Error: etcdserver: permission denied
在给testrole用户授权之后,再次尝试。有权限的testrole角色才可以正常查看key。验证如下:
#授权testrole角色可读key:/apisix-platform/consumers/
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd role grant-permission testrole read /apisix-platform/consumers/
Role testrole updated
#查看testrole角色权限
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user root:etcd role get testrole
Role testrole
KV Read:
/apisix-platform/consumers/
KV Write:
#验证
[root@ip-172-24-24-122 etcd-v3.4.14-linux-amd64]# ./etcdctl --user testuser:testuser get /apisix-platform/consumers/
/apisix-platform/consumers/
init_dir