【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的权限管理有任何问题或经验,欢迎在下方留言讨论!

相关推荐
Qdgr_7 分钟前
价值实证:数字化转型标杆案例深度解析
大数据·数据库·人工智能
hanniuniu1311 分钟前
AI时代API挑战加剧,API安全厂商F5护航企业数字未来
人工智能·安全
数据狐(DataFox)18 分钟前
SQL参数化查询:防注入与计划缓存的双重优势
数据库·sql·缓存
zhulangfly19 分钟前
API接口安全-1:身份认证之传统Token VS JWT
安全
Arthurmoo27 分钟前
Linux系统之MySQL数据库基础
linux·数据库·mysql
博观而约取32 分钟前
Django ORM 1. 创建模型(Model)
数据库·python·django
找不到、了2 小时前
MySQL的窗口函数介绍
数据库·mysql
时时三省2 小时前
【时时三省】vectorcast使用教程
安全·安全架构
执笔诉情殇〆2 小时前
springboot集成达梦数据库,取消MySQL数据库,解决问题和冲突
数据库·spring boot·mysql·达梦
galaxylove2 小时前
Gartner发布最新指南:企业要构建防御性强且敏捷的网络安全计划以平衡安全保障与业务运营
网络·安全·web安全