ETCD是一个高可用的分布式键值存储系统,广泛应用于Kubernetes等大规模容器化平台的配置和服务发现。为了保障ETCD集群中的数据安全,ETCD提供了基于角色的访问控制(RBAC)功能。本文将详细介绍如何在ETCD v3中配置和管理基于角色的访问控制(RBAC),帮助用户在确保系统安全的同时,灵活管理用户权限。
目录
什么是ETCD的基于角色的访问控制?
ETCD的基于角色的访问控制(RBAC)是指通过设置不同的用户角色和权限,来管理ETCD集群中对数据的访问。通过RBAC,管理员可以为不同的用户分配不同的权限,确保只有授权的用户能够访问或修改ETCD中的数据。RBAC为ETCD集群提供了精细的权限控制,是提升ETCD安全性的关键功能。
ETCD v3的身份验证与RBAC
在ETCD v3中,身份验证功能被引入,允许为集群配置基本的用户认证和角色权限控制。ETCD v3对原有身份验证功能的API和用户界面进行了调整,使其更加符合新的数据模型,提升了安全性和灵活性。
1. 特殊用户与角色
ETCD中有两个特殊的用户和角色:
- 用户 root:root用户拥有ETCD集群的完全访问权限,主要用于集群管理。
- 角色 root:root角色赋予用户全局读写访问权限,并允许用户修改集群的身份验证配置。
这些特殊用户和角色的设计目的在于提供高权限的管理能力,使得管理员能够灵活管理集群中的其他用户和角色。
2. 创建和管理用户
etcdctl
工具提供了完整的用户管理功能,可以用来创建、删除、修改用户密码等操作。管理员可以通过etcdctl user
子命令来执行这些任务。
创建用户
bash
$ etcdctl user add myusername
创建新用户时,系统会提示你输入新密码。如果你想通过标准输入提供密码,可以使用--interactive=false
选项。
删除用户
bash
$ etcdctl user delete myusername
管理用户角色
用户可以拥有一个或多个角色,通过角色来管理其权限。管理员可以为用户授予或撤销角色:
bash
$ etcdctl user grant-role myusername foo
$ etcdctl user revoke-role myusername bar
修改用户密码
修改用户密码时,会提示输入新密码:
bash
$ etcdctl user passwd myusername
3. 创建和管理角色
etcdctl
同样提供了角色管理功能。角色是ETCD访问控制的核心,角色定义了一组特定的权限,可以授予单个或多个用户。
创建角色
bash
$ etcdctl role add myrolename
授予角色权限
角色的权限可以是对单个键或一系列键的读写操作。权限可以是读权限、写权限或两者同时授予。可以通过etcdctl role
命令为角色授予权限。
例如,授予角色对某个键的读权限:
bash
$ etcdctl role grant-permission myrolename read /foo
授予角色对一组键的读写权限:
bash
$ etcdctl role grant-permission myrolename readwrite /key1 /key5
查看角色的权限
可以通过etcdctl role get
命令查看角色的权限设置:
bash
$ etcdctl role get myrolename
撤销角色权限
撤销权限的操作与授予权限的操作类似:
bash
$ etcdctl role revoke-permission myrolename /foo/bar
删除角色
删除角色时,所有与该角色相关联的权限会一并移除:
bash
$ etcdctl role delete myrolename
4. 启用身份验证和RBAC
启用身份验证后,ETCD集群会要求用户在每次访问时提供身份验证信息。管理员需要确保在启用身份验证之前,至少创建一个root
用户。
启用身份验证
创建root
用户后,可以通过以下命令启用身份验证:
bash
etcdctl --endpoints=${ENDPOINTS} role add root
etcdctl --endpoints=${ENDPOINTS} role get root
etcdctl --endpoints=${ENDPOINTS} user add root
etcdctl --endpoints=${ENDPOINTS} user grant-role root root
etcdctl --endpoints=${ENDPOINTS} user get root
etcdctl --endpoints=${ENDPOINTS} role add role0
etcdctl --endpoints=${ENDPOINTS} role grant-permission role0 readwrite foo
etcdctl --endpoints=${ENDPOINTS} user add user0
etcdctl --endpoints=${ENDPOINTS} user grant-role user0 role0
etcdctl --endpoints=${ENDPOINTS} auth enable
# now all client requests go through auth
etcdctl --endpoints=${ENDPOINTS} --user=user0:123 put foo bar
# permission denied, user name is empty because the request does not issue an authentication request
etcdctl --endpoints=${ENDPOINTS} get foo
# user0 can read the key foo
etcdctl --endpoints=${ENDPOINTS} --user=user0:123 get foo
# permission denied, user name is empty because the request does not issue an authentication request
etcdctl --endpoints=${ENDPOINTS} --user=user0:123 get foo1
此时,ETCD集群会要求所有用户进行身份验证。如果需要禁用身份验证,可以使用以下命令:
bash
$ etcdctl --user root:rootpw auth disable
5. 使用TLS进行身份验证
ETCD还支持基于TLS证书的身份验证。如果启用了--client-cert-auth=true
,客户端的TLS证书中的公共名称(CN)将用于身份验证。此时,客户端无需提供用户名和密码。
请注意,TLS身份验证不能与gRPC-proxy
和gRPC-gateway
一起使用,因为这两者会终止TLS连接,并导致客户端证书的CN无法正确传递。
6. 密码强度要求
虽然ETCD没有强制要求特定的密码长度,但为了保证系统安全,建议管理员自行实施密码强度策略。可以使用TLS公共名称进行身份验证,或者创建不使用密码的用户,以减少密码相关的安全风险。
小结
通过ETCD的身份验证和基于角色的访问控制(RBAC),管理员可以精细地管理ETCD集群的访问权限。无论是为用户分配不同的角色,还是对角色进行权限控制,RBAC都提供了强大的功能,确保了ETCD集群的数据安全。在实际生产环境中,建议启用身份验证并配置适当的角色和权限,以减少潜在的安全风险。
如果你对ETCD的权限管理有任何问题或经验,欢迎在下方留言讨论!