菜单

认证与授权

相关源文件

本文档全面概述了 etcd 的认证和授权系统,该系统实现了基于角色的访问控制 (RBAC),以保护对键值存储的访问。该系统允许管理员创建用户、分配具有特定权限的角色,并强制执行对 etcd 资源的访问控制。

概述

etcd 认证和授权系统由两个主要组件组成:

  1. 认证 - 验证用户身份并生成访问令牌
  2. 授权 - 根据其角色控制已认证用户可以访问的资源

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 时:

  1. 客户端发送用户名和密码进行身份验证
  2. 如果凭据有效,etcd 会返回一个身份验证令牌
  3. 客户端在后续所有请求中都包含此令牌
  4. etcd 在处理每个请求之前都会验证令牌

身份验证令牌通常包含在 gRPC 调用的请求元数据中。

来源

授权系统

基于角色的访问控制

etcd 实现了基于角色的访问控制 (RBAC),其中:

  1. 权限是在键范围上定义的(读取、写入或读写)
  2. 角色是权限的集合
  3. 用户被分配角色

角色管理

角色是独立于用户创建和管理的

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 中的权限由以下几项定义:

  1. 权限类型 - READ(读)、WRITE(写)或 READWRITE(读写)
  2. 键范围 - 一个开始键和一个可选的结束键,用于定义权限适用的键的范围

键范围的特殊选项:

  • 前缀权限 (--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

来源

API 端点

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 网关访问。

来源

安全考量

最佳实践

  1. Root 用户:启用身份验证后,会自动创建一个名为“root”的用户,并具有“root”角色。该用户对 etcd 拥有完全访问权限。请谨慎保管 root 密码。

  2. 权限粒度:遵循最小权限原则设计角色。仅授予每个角色必需的权限。

  3. 键命名空间设计:通过结构化键命名空间来对齐权限边界,以便于管理。

  4. TLS:使用 TLS 进行客户端-服务器和服务器-服务器通信,以保护身份验证令牌和数据。

  5. 令牌管理:身份验证令牌默认不会过期。考虑在应用程序中实现令牌刷新机制。

  6. 定期审计:定期审查用户、角色和权限,确保它们符合当前要求。

通过 TLS 证书进行身份验证

etcd 支持使用 TLS 证书进行客户端身份验证,这可以与基于密码的身份验证一起使用,也可以替代基于密码的身份验证。

使用 TLS 客户端证书时,证书中的通用名称 (CN) 字段将用作用户名,以进行授权检查。

来源

与 etcd 客户端应用程序集成

客户端应用程序通过客户端库(例如 Go 客户端 clientv3)与 etcd 的身份验证系统集成。典型的集成包括:

  1. 身份验证设置
  2. 处理身份验证错误
  3. 令牌管理
  4. 授权失败处理

客户端应用程序应妥善处理身份验证错误,对暂时性故障具有适当的重试逻辑,并对权限问题进行适当的错误报告。

来源

结论

etcd 的身份验证和授权系统提供了安全访问存储数据的灵活而强大的方式。通过实现基于角色的访问控制,并在键范围上进行细粒度的权限控制,它允许管理员强制执行最小权限原则,同时提供应用程序运行所需的访问权限。

有关 etcd 配置的详细信息,包括用于增强安全性的 TLS 设置,请参阅配置