基于角色的访问控制
概述
身份验证是在etcd 2.1中添加的。etcd v3 API略微修改了身份验证功能的API和用户界面,以更好地适应新的数据模型。本指南旨在帮助用户在etcd v3中设置基本身份验证和基于角色的访问控制。
特殊用户和角色
有一个特殊用户,root
和一个特殊角色root
。
用户 root
root
在激活身份验证之前,必须创建对etcd具有完全访问权限的用户。root
用户背后的想法是出于管理目的:管理角色和普通用户。该root
用户必须具有root
的作用,并使其改变任何东西在ETCD里面。(就是etcd的超级管理员,在开启角色认证前必须建立好root)
角色 root
root
可以将角色授予根用户之外的任何用户。具有该root
角色的用户既具有全局读写访问权限,又具有更新集群的身份验证配置的权限。此外,该root
角色还授予常规集群维护的特权,包括修改集群成员资格,对存储进行碎片整理以及拍摄快照。
与用户合作(记得如果endpoints不指定是127.0.0.1,如果你的listen-client-urls没有指定http://127.0.0.1:2379会夯住)
在user
为etcdctl
处理所有的事情具有用户账户做。
可以通过以下方式找到用户列表:
可以通过以下方式找到用户列表:
etcdctl user list --endpoints="https://172.28.17.85:2379"
创建角色
etcdctl role add root --endpoints="https://172.28.17.85:2379"
创建用户就像(root位置可以替换为其他用户)
etcdctl user add root --endpoints="https://172.28.17.85:2379"
创建新用户将提示您输入新密码。--interactive=false
给出选项后,可以从标准输入中提供密码。
可以通过以下方式为用户授予和撤消角色:
etcdctl user add test2 --endpoints="https://172.28.17.85:2379" --interactive=false
test123@
User test2 created
[root@master ~]# etcdctl ${ep} user grant-role test test --user="root" --password="Root123."
Role test is granted to user test
#作role权限赋予user
etcdctl user grant-role username rolename
#收回user的role权限
etcdctl user revoke-role username rolename
可以使用以下命令检查用户的设置:
[root@master ~]# etcdctl ${ep} role get test --user="root" --password="Root123."
Role test
KV Read:
KV Write:
[root@master ~]# etcdctl ${ep} --user="test" --password="test123." user get test
User: test
Roles: test
[root@master ~]# etcdctl ${ep} --user="test" --password="test123." user get root
{"level":"warn","ts":"2021-05-24T16:34:20.692+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-ce8c4070-4be8-4759-a0c6-67e156dbf98c/172.21.130.169:2379","attempt":0,"error":"rpc error: code = PermissionDenied desc = etcdserver: permission denied"}
Error: etcdserver: permission denied
[root@master ~]# etcdctl ${ep} --user="root" --password="Root123." user get root
User: root
Roles: root
[root@master ~]# etcdctl ${ep} --user="root" --password="Root123." user get test
User: test
Roles: test
[root@master ~]#
用户密码可以通过
etcdctl user passwd test1 --endpoints="https://172.28.17.85:2379"
Password of test1:
Type password of test1 again for confirmation:
Password updated
etcdctl user passwd username
更改密码将再次提示您输入新密码。--interactive=false
给出选项后,可以从标准输入中提供密码。
删除具有以下内容的帐户:
[root@master ~]# etcdctl ${ep} role del test --user="root" --password="Root123."
Role test deleted
[root@master ~]#
etcdctl user delete username
与角色一起工作
该role
子命令etcdctl
具有对特定角色的访问控制做处理所有的事情,因为被授予个人用户。
列出角色:
etcdctl role list
[root@master ~]# etcdctl ${ep} --user="root" --password="Root123." role list
root
test
[root@master ~]# etcdctl ${ep} --user="test" --password="test123." role list
{"level":"warn","ts":"2021-05-24T16:36:13.157+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-bc869110-bd46-4429-b89c-64ae95ae3b03/172.21.130.169:2379","attempt":0,"error":"rpc error: code = PermissionDenied desc = etcdserver: permission denied"}
Error: etcdserver: permission denied
[root@master ~]#
使用以下方法创建一个新角色:
[root@master ~]# etcdctl ${ep} role add test --user="root" --password="Root123."
Role test created
[root@master ~]#
etcdctl role add rolename
角色没有密码;它仅定义了一组新的访问权限。
授予角色访问单个密钥或一系列密钥的权限。(就是key不知道goolge这翻译啥情况不过key也确实可以翻译为密钥)
范围可以指定为间隔[开始键,结束键],其中开始键应按字母顺序在词汇上小于结束键。
可以将访问权限授予读取,写入或同时授予两者,如以下示例所示:
# Give read access to a key /foo
#key就是/foo
$ etcdctl role grant-permission rolename read /foo
# Give read access to keys with a prefix /foo/. The prefix is equal to the range [/foo/, /foo0)
#这个很好理解就是以/foo/开头的key
$ etcdctl role grant-permission rolename --prefix=true read /foo/
# Give write-only access to the key at /foo/bar
$ etcdctl role grant-permission rolename write /foo/bar
# Give full access to keys in a range of [key1, key5)
$ etcdctl role grant-permission rolename readwrite key1 key5
[root@master ~]# etcdctl ${ep} role grant-permission test readwrite a z --user="root" --password="Root123."
# Give full access to keys with a prefix /pub/
$ etcdctl role grant-permission rolename --prefix=true readwrite /pub/
要查看授予的权限,我们可以随时查看该角色:
[root@master ~]# etcdctl ${ep} --user="test" --password="test123." role get test
Role test
KV Read:
[/b, /c) (prefix /b)
/c
[a, z)
[a/a, a/b) (prefix a/a)
goo
KV Write:
[/b, /c) (prefix /b)
/c
[a, z)
[a/a, a/b) (prefix a/a)
goo
[root@master ~]#
etcdctl role get rolename
撤消权限是按照相同的逻辑方式完成的:
[root@master ~]# etcdctl ${ep} role revoke-permission test --prefix=true /pub/ --user="root" --password="Root123."
Permission of range [/pub/, /pub0) is revoked from role test
[root@master ~]# etcdctl ${ep} role revoke-permission test /c/d --user="root" --password="Root123."
Permission of key /c/d is revoked from role test
[root@master ~]#
etcdctl role revoke-permission rolename /foo/bar
就像完全删除一个角色一样:
etcdctl role delete rolename
启用身份验证
启用身份验证的最少步骤如下。管理员可以根据喜好在启用身份验证之前或之后设置用户和角色。
确保已创建root用户:
etcdctl user add root
Password of root:
启用身份验证:
etcdctl auth enable
此后,etcd在启用身份验证的情况下运行。要出于任何原因禁用它,请使用reciprocal命令:
etcdctl --user root:rootpw auth disable
使用etcdctl
认证
etcdctl
支持与curl
身份验证类似的标志。
etcdctl --user user:password get foo
可以从提示符处获取密码:
etcdctl --user user get foo
否则,所有etcdctl
命令均保持不变。用户和角色仍然可以创建和修改,但是需要具有root角色的用户进行身份验证。
使用TLS通用名称
如果使用选项启动etcd服务器--client-cert-auth=true
,则客户端的TLS证书中的“通用名称(CN)”字段将用作etcd用户。在这种情况下,公用名对用户进行身份验证,并且客户端不需要密码。