本文档全面概述了 etcd 的认证和授权系统,该系统实现了基于角色的访问控制 (RBAC),以保护对键值存储的访问。该系统允许管理员创建用户、分配具有特定权限的角色,并强制执行对 etcd 资源的访问控制。
etcd 认证和授权系统由两个主要组件组成:
etcd 身份验证系统必须显式启用后才能生效。禁用时,所有请求都将被允许,无需进行身份验证。
来源
在使用身份验证之前,必须在集群中启用它。启用后,所有对 etcd 的请求都需要身份验证凭据。
启用或禁用身份验证:
# Enable auth
etcdctl auth enable
# Disable auth
etcdctl auth disable
# Check auth status
etcdctl auth status
来源
etcd 身份验证系统管理用户的操作包括:
etcdctl CLI 提供了用户管理命令。
# Add a new user
etcdctl user add myuser
# Delete a user
etcdctl user delete myuser
# Change password
etcdctl user passwd myuser
# List all users
etcdctl user list
# Grant a role to user
etcdctl user grant-role myuser myrole
# Revoke a role from user
etcdctl user revoke-role myuser myrole
来源
当客户端想在启用身份验证的情况下访问 etcd 时:
身份验证令牌通常包含在 gRPC 调用的请求元数据中。
来源
etcd 实现了基于角色的访问控制 (RBAC),其中:
角色是独立于用户创建和管理的
etcdctl CLI 提供了角色管理命令。
# Add a new role
etcdctl role add myrole
# Delete a role
etcdctl role delete myrole
# List all roles
etcdctl role list
# Get role details
etcdctl role get myrole
来源
etcd 中的权限由以下几项定义:
键范围的特殊选项:
--prefix) - 应用于具有特定前缀的所有键--from-key) - 应用于大于或等于特定键的所有键etcdctl CLI 提供了权限管理命令。
# Grant read permission on a key
etcdctl role grant-permission myrole read /foo
# Grant read-write permission on a prefix
etcdctl role grant-permission --prefix myrole readwrite /foo
# Revoke permission
etcdctl role revoke-permission myrole /foo
来源
etcd 提供了一套全面的 gRPC API 端点,用于身份验证和授权管理。
| 类别 | 端点 | 描述 |
|---|---|---|
| 认证状态 | /v3/auth/enable | 启用认证 |
/v3/auth/disable | 禁用身份验证 | |
/v3/auth/status | 检查身份验证状态 | |
/v3/auth/authenticate | 验证用户并获取令牌 | |
| 用户管理 | /v3/auth/user/add | 添加新用户 |
/v3/auth/user/delete | 删除用户 | |
/v3/auth/user/get | 获取用户信息 | |
/v3/auth/user/list | 列出所有用户 | |
/v3/auth/user/changepw | 更改用户密码 | |
/v3/auth/user/grant | 向用户授予角色 | |
/v3/auth/user/revoke | 从用户撤销角色 | |
| 角色管理 | /v3/auth/role/add | 添加新角色 |
/v3/auth/role/delete | 删除角色 | |
/v3/auth/role/get | 获取角色信息 | |
/v3/auth/role/list | 列出所有角色 | |
/v3/auth/role/grant | 向角色授予权限 | |
/v3/auth/role/revoke | 从角色撤销权限 |
这些端点可以通过 gRPC API 或 RESTful API 网关访问。
来源
Root 用户:启用身份验证后,会自动创建一个名为“root”的用户,并具有“root”角色。该用户对 etcd 拥有完全访问权限。请谨慎保管 root 密码。
权限粒度:遵循最小权限原则设计角色。仅授予每个角色必需的权限。
键命名空间设计:通过结构化键命名空间来对齐权限边界,以便于管理。
TLS:使用 TLS 进行客户端-服务器和服务器-服务器通信,以保护身份验证令牌和数据。
令牌管理:身份验证令牌默认不会过期。考虑在应用程序中实现令牌刷新机制。
定期审计:定期审查用户、角色和权限,确保它们符合当前要求。
etcd 支持使用 TLS 证书进行客户端身份验证,这可以与基于密码的身份验证一起使用,也可以替代基于密码的身份验证。
使用 TLS 客户端证书时,证书中的通用名称 (CN) 字段将用作用户名,以进行授权检查。
来源
客户端应用程序通过客户端库(例如 Go 客户端 clientv3)与 etcd 的身份验证系统集成。典型的集成包括:
客户端应用程序应妥善处理身份验证错误,对暂时性故障具有适当的重试逻辑,并对权限问题进行适当的错误报告。
来源
etcd 的身份验证和授权系统提供了安全访问存储数据的灵活而强大的方式。通过实现基于角色的访问控制,并在键范围上进行细粒度的权限控制,它允许管理员强制执行最小权限原则,同时提供应用程序运行所需的访问权限。
有关 etcd 配置的详细信息,包括用于增强安全性的 TLS 设置,请参阅配置。