K&

基于角色的访问控制

 

概述

 

身份验证是在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会夯住)

 

useretcdctl处理所有的事情具有用户账户做。

可以通过以下方式找到用户列表:

 

可以通过以下方式找到用户列表:

 

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用户。在这种情况下,公用名对用户进行身份验证,并且客户端不需要密码。

posted on 2021-05-11 18:04  K&  阅读(101)  评论(0编辑  收藏  举报