【ETCD】【实操篇(十六)】基于角色的访问控制:ETCD 安全管理指南

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-proxygRPC-gateway一起使用,因为这两者会终止TLS连接,并导致客户端证书的CN无法正确传递。

6. 密码强度要求

虽然ETCD没有强制要求特定的密码长度,但为了保证系统安全,建议管理员自行实施密码强度策略。可以使用TLS公共名称进行身份验证,或者创建不使用密码的用户,以减少密码相关的安全风险。

小结

通过ETCD的身份验证和基于角色的访问控制(RBAC),管理员可以精细地管理ETCD集群的访问权限。无论是为用户分配不同的角色,还是对角色进行权限控制,RBAC都提供了强大的功能,确保了ETCD集群的数据安全。在实际生产环境中,建议启用身份验证并配置适当的角色和权限,以减少潜在的安全风险。

如果你对ETCD的权限管理有任何问题或经验,欢迎在下方留言讨论!

相关推荐
m0_7482552612 分钟前
前端安全——敏感信息泄露
前端·安全
网络安全Jack13 分钟前
什么是网络安全等级保护?
网络·安全·web安全
ROCKY_81743 分钟前
Mysql复习(二)
数据库·mysql·oracle
Dovir多多1 小时前
Python数据处理——re库与pydantic的使用总结与实战,处理采集到的思科ASA防火墙设备信息
网络·python·计算机网络·安全·网络安全·数据分析
Clockwiseee3 小时前
RCE常见姿势
安全·web安全·网络安全
denglei.3 小时前
在Nginx部署Web应用,如何保障后端API的安全
nginx·安全
问道飞鱼3 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
HaiFan.3 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
水根LP493 小时前
linux系统上SQLPLUS的重“大”发现
数据库·oracle
途途途途4 小时前
精选9个自动化任务的Python脚本精选
数据库·python·自动化