9.3 授权 (Authorization) Elasticsearch 安全领域:深入理解授权 (Authorization) 在 Elasticsearch 安全体系中,授权 (Authorization) 是继身份验证 (Authentication) 之后至关重要的环节。身份验证负责确认用户的身份,而授权则决定了经过身份验证的用户可以执行哪些操作,访问哪些资源。有效的授权机制是构建安全可靠 Elasticsearch 集群的基石,它能够防止未经授权的数据访问和操作,保护数据的机密性和完整性。
在 Elasticsearch 安全体系中,授权 (Authorization) 是继身份验证 (Authentication) 之后至关重要的环节。身份验证负责确认用户的身份,而授权则决定了经过身份验证的用户可以执行哪些操作,访问哪些资源。有效的授权机制是构建安全可靠 Elasticsearch 集群的基石,它能够防止未经授权的数据访问和操作,保护数据的机密性和完整性。
授权的核心目标是实施 最小权限原则 (Principle of Least Privilege),即只授予用户完成其工作所需的最小权限,避免过度授权带来的安全风险。在 Elasticsearch 中,授权主要围绕以下几个核心概念展开:
用户 (Users): 代表需要访问 Elasticsearch 集群的实体,可以是人、应用程序或服务。用户首先需要通过身份验证 (Authentication) 确认身份。
角色 (Roles): 角色的本质是一组权限的集合。通过将角色分配给用户,可以批量管理用户的权限,简化权限管理工作。
权限 (Privileges): 权限定义了用户可以执行的具体操作。在 Elasticsearch 中,权限可以细分为集群权限、索引权限和应用权限等。
安全域 (Security Realms): 安全域是用于身份验证和授权的模块化组件。不同的安全域可以采用不同的身份验证和授权机制,例如本地安全域 (Native Realm)、LDAP 安全域、Active Directory 安全域等。
授权的过程可以简单概括为:
用户发起请求: 用户向 Elasticsearch 集群发起操作请求。
身份验证 (Authentication): Elasticsearch 安全域验证用户的身份。
授权 (Authorization): Elasticsearch 检查用户的角色和权限,判断用户是否有权执行请求的操作。
访问控制: 根据授权结果,允许或拒绝用户的请求。
Elasticsearch 的授权机制主要基于 角色-基于访问控制 (Role-Based Access Control, RBAC) 模型。RBAC 模型通过将权限与角色关联,然后将角色分配给用户,实现了灵活且易于管理的权限控制。
图 1: Elasticsearch 授权 RBAC 模型
如图 1 所示,用户通过角色获得权限,而权限则决定了用户可以访问和操作的 Elasticsearch 资源。
Elasticsearch 授权的核心组件包括:
角色定义 (Role Definition): 定义角色包含哪些权限。角色定义通常以 YAML 格式存储在 Elasticsearch 的配置目录中,也可以通过 API 进行动态管理。
角色映射 (Role Mapping): 将角色与用户或用户组关联起来。角色映射可以将角色映射到本地用户、LDAP 用户、Active Directory 用户等。
权限检查 (Privilege Check): 当用户发起请求时,Elasticsearch 会根据用户的角色和请求的操作类型,检查用户是否拥有相应的权限。
角色定义是授权机制的基础,它决定了角色所包含的具体权限。角色定义主要包括以下几个方面:
集群权限 (Cluster Privileges): 控制对整个 Elasticsearch 集群的操作权限,例如:
all: 拥有所有集群操作权限。
monitor: 监控集群状态和指标。
manage: 管理集群设置、节点和索引模板等。
manage_security: 管理安全配置,例如用户、角色和安全域等。
索引权限 (Index Privileges): 控制对特定索引或索引模式的操作权限,例如:
all: 拥有对索引的所有操作权限。
read: 读取索引数据。
write: 写入索引数据。
index: 创建索引。
delete: 删除索引。
manage: 管理索引设置和映射等。
应用权限 (Application Privileges): 控制对特定应用的操作权限,例如 Kibana 的空间 (Spaces) 访问权限。
运行为用户 (Run As User): 允许用户以其他用户的身份执行操作。
元数据 (Metadata): 角色的元数据信息,用于描述角色的用途和属性。
瞬态元数据 (Transient Metadata): 临时的元数据信息,不会持久化存储。
角色定义 YAML 示例:
# roles.yml monitoring_role: cluster: - monitor indices: - names: ["metrics-*", "logs-*"] privileges: ["read"] applications: - application: kibana-.kibana privileges: ["read"] run_as: [] metadata: description: "Monitoring role with read-only access to metrics and logs indices" transient_metadata: {} data_writer_role: cluster: [] indices: - names: ["application-*"] privileges: ["write", "index", "create_index"] applications: [] run_as: [] metadata: description: "Role for writing data to application indices" transient_metadata: {}
代码实践:创建角色
可以使用 Elasticsearch 的 Create or update role API 创建或更新角色。
请求示例 (使用 curl):
curl -X PUT "https://<elasticsearch_host>:<port>/_security/role/monitoring_role?pretty" -H 'Content-Type: application/json' -d' { "cluster": ["monitor"], "indices": [ { "names": ["metrics-*", "logs-*"], "privileges": ["read"] } ], "applications": [ { "application": "kibana-.kibana", "privileges": ["read"] } ], "run_as": [], "metadata" : { "description" : "Monitoring role with read-only access to metrics and logs indices" } } '
内容详解:
PUT /_security/role/{role_name}: 指定 API 端点和角色名称。
-H 'Content-Type: application/json': 设置请求头,指定内容类型为 JSON。
-d '{...}': 请求体,包含角色定义的 JSON 数据。
响应示例:
{ "role" : { "created" : true, "name" : "monitoring_role" } }
角色映射是将角色与用户或用户组关联起来的关键步骤。Elasticsearch 支持多种角色映射方式,包括:
文件角色映射 (File-based Role Mapping): 通过 roles_mapping.yml 文件配置角色映射规则。适用于本地安全域 (Native Realm)。
API 角色映射 (API-based Role Mapping): 使用 Create or update role mapping API 动态管理角色映射规则。
安全域角色映射 (Realm-based Role Mapping): 某些安全域 (例如 LDAP, Active Directory) 可以直接从外部身份验证系统中获取用户组信息,并进行角色映射。
文件角色映射示例 (roles_mapping.yml):
# roles_mapping.yml monitoring_role: - users: ["monitoring_user", "admin_user"] - groups: ["monitoring_team"] data_writer_role: - users: ["data_writer_user"]
内容详解:
monitoring_role: 角色名称。
users: 用户列表,monitoring_user 和 admin_user 将被分配 monitoring_role 角色。
groups: 用户组列表,属于 monitoring_team 用户组的用户将被分配 monitoring_role 角色。
代码实践:创建 API 角色映射
可以使用 Create or update role mapping API 创建或更新角色映射规则。
请求示例 (使用 curl):
curl -X PUT "https://<elasticsearch_host>:<port>/_security/role_mapping/monitoring_role_mapping?pretty" -H 'Content-Type: application/json' -d' { "roles": ["monitoring_role"], "rules": { "any": [ { "field": { "username": "monitoring_user" } }, { "field": { "groups": "monitoring_team" } } ] }, "enabled": true } '
内容详解:
PUT /_security/role_mapping/{mapping_name}: 指定 API 端点和角色映射名称。
roles: 要映射的角色列表,这里是 monitoring_role。
rules: 角色映射规则,使用 DSL (Domain Specific Language) 定义。
any: 表示满足任何一个子规则即可。
field: 基于字段匹配的规则。
username: 匹配用户名为 monitoring_user 的用户。
groups: 匹配用户组包含 monitoring_team 的用户。
enabled: 是否启用角色映射规则,设置为 true 表示启用。
响应示例:
{ "role_mapping" : { "created" : true, "name" : "monitoring_role_mapping" } }
Elasticsearch 的权限体系非常精细,可以控制用户在集群和索引级别的各种操作。
集群权限控制对整个 Elasticsearch 集群的操作,常见的集群权限包括:
| 权限名称 | 描述 | 适用场景 |
|---|---|---|
all |
拥有所有集群操作权限 | 管理员角色 |
monitor |
监控集群状态、指标和健康状况 | 监控用户、运维人员 |
manage |
管理集群设置、节点、索引模板、快照仓库等 | 运维人员、DevOps 工程师 |
manage_security |
管理安全配置,包括用户、角色、安全域、API 密钥等 | 安全管理员、权限管理员 |
cluster:admin/reroute |
手动重新路由分片 | 高级运维人员、故障排除 |
cluster:admin/settings/update |
更新集群动态设置 | 运维人员、性能调优 |
cluster:monitor/nodes/stats |
获取节点统计信息 | 监控工具、性能分析 |
代码实践:集群权限示例
在角色定义中配置集群权限:
# roles.yml cluster_admin_role: cluster: ["all"] indices: [] applications: [] run_as: [] metadata: description: "Cluster administrator role with full access" transient_metadata: {} monitoring_role: cluster: ["monitor", "cluster:monitor/nodes/stats"] indices: [] applications: [] run_as: [] metadata: description: "Monitoring role with monitor and nodes stats permissions" transient_metadata: {}
索引权限控制对特定索引或索引模式的操作,常见的索引权限包括:
| 权限名称 | 描述 | 适用场景 |
|---|---|---|
all |
拥有对索引的所有操作权限 | 索引管理员角色 |
read |
读取索引数据 (包括 get, mget, search, scroll 等) |
数据分析师、应用读取数据 |
write |
写入索引数据 (包括 index, create, update, bulk 等) |
应用写入数据、数据采集 |
index |
创建索引文档 | 应用写入新文档 |
create_index |
创建索引 | 索引管理员、数据初始化 |
delete |
删除索引文档或索引 | 数据清理、索引生命周期管理 |
manage |
管理索引设置、映射、别名、刷新、清除缓存等 | 索引管理员、运维人员 |
view_index_metadata |
查看索引元数据 (映射、设置、别名等) | 索引监控、索引信息查看 |
indices:data/read/field_caps |
获取字段能力信息 (Field Capabilities) | 应用程序、查询优化 |
索引权限配置详解:
索引权限的配置需要指定以下信息:
索引名称或模式 (names/patterns): 指定权限应用于哪些索引。可以使用通配符 (*) 匹配多个索引。
权限列表 (privileges): 指定允许的操作权限列表。
字段 (field): 限制权限应用于哪些字段。用于 字段级别安全 (Field-Level Security, FLS)。
查询 (query): 限制权限应用于哪些文档。用于 文档级别安全 (Document-Level Security, DLS)。
代码实践:索引权限示例
在角色定义中配置索引权限:
# roles.yml read_only_role: cluster: [] indices: - names: ["products-*", "orders-*"] privileges: ["read", "view_index_metadata", "indices:data/read/field_caps"] applications: [] run_as: [] metadata: description: "Read-only role for products and orders indices" transient_metadata: {} data_writer_role: cluster: [] indices: - names: ["logs-*"] privileges: ["write", "index", "create_index"] applications: [] run_as: [] metadata: description: "Data writer role for logs indices" transient_metadata: {} fls_dls_role: cluster: [] indices: - names: ["sensitive_data"] privileges: ["read"] field: ["public_field", "sensitive_field"] # FLS: 字段级别安全,只允许访问 public_field 和 sensitive_field query: '{"term": {"department": "finance"}}' # DLS: 文档级别安全,只允许访问 department 为 finance 的文档 applications: [] run_as: [] metadata: description: "Role with FLS and DLS applied to sensitive_data index" transient_metadata: {}
内容详解:
read_only_role: 只读角色,可以读取 products-* 和 orders-* 索引的数据,并查看索引元数据和字段能力。
data_writer_role: 数据写入角色,可以写入数据到 logs-* 索引,并创建索引。
fls_dls_role: 应用了 FLS 和 DLS 的角色,只能读取 sensitive_data 索引中 department 为 finance 的文档,并且只能访问 public_field 和 sensitive_field 字段。
API 密钥 (API Keys) 是一种用于程序化访问 Elasticsearch 集群的身份验证和授权机制。API 密钥可以关联到特定的用户和角色,拥有与用户相同的权限。
API 密钥的优势:
程序化访问: 方便应用程序、脚本和服务以编程方式访问 Elasticsearch。
细粒度控制: 可以为 API 密钥分配特定的角色和权限,实现细粒度的访问控制。
安全性: API 密钥可以设置过期时间,并可以随时撤销,提高安全性。
代码实践:创建 API 密钥
可以使用 Create API key API 创建 API 密钥。
请求示例 (使用 curl):
curl -X POST "https://<elasticsearch_host>:<port>/_security/api_key?pretty" -H 'Content-Type: application/json' -d' { "name": "monitoring_api_key", "role_descriptors": { "monitoring_role": { "cluster": ["monitor"], "indices": [ { "names": ["metrics-*", "logs-*"], "privileges": ["read"] } ] } } } '
内容详解:
POST /_security/api_key: 指定 API 端点。
name: API 密钥名称,用于标识和管理 API 密钥。
role_descriptors: API 密钥关联的角色描述符,定义 API 密钥拥有的权限。
monitoring_role: 角色名称,与之前定义的角色 monitoring_role 对应。
角色描述符的结构与角色定义类似,可以配置集群权限、索引权限和应用权限。
响应示例:
{ "api_key" : { "id" : "xxxxxxxxxxxxxxxxxxxxxxx", "name" : "monitoring_api_key", "creation" : 1678886400000, "invalidated" : false, "username" : "elastic", "realm" : "native", "role_descriptors" : { "monitoring_role" : { "cluster" : [ "monitor" ], "indices" : [ { "names" : [ "metrics-*", "logs-*" ], "privileges" : [ "read" ] } ], "applications" : [ ] } } }, "encoded" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
使用 API 密钥进行身份验证:
在请求头中添加 Authorization 头部,值为 ApiKey <API Key ID>:<API Key 密钥>。
请求示例 (使用 curl):
curl -X GET "https://<elasticsearch_host>:<port>/_cluster/health?pretty" -H "Authorization: ApiKey xxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
场景描述:
假设一个日志分析平台,需要对不同类型的用户进行授权管理:
管理员 (Admin): 拥有所有权限,可以管理集群和索引,查看所有日志数据。
安全分析师 (Security Analyst): 可以查看安全相关的日志索引 (security-*),进行安全分析。
应用开发人员 (Application Developer): 可以查看自己应用产生的日志索引 (app-dev-*),进行问题排查。
监控系统 (Monitoring System): 需要监控集群状态和指标,但不能访问任何日志数据。
授权方案:
创建角色:
admin_role: 集群权限 all,索引权限 * 的 all。
security_analyst_role: 集群权限 monitor,索引权限 security-* 的 read。
app_developer_role: 集群权限 monitor,索引权限 app-dev-* 的 read。
monitoring_system_role: 集群权限 monitor,索引权限为空。
创建用户或 API 密钥:
为管理员创建本地用户 admin_user,并分配 admin_role。
为安全分析师创建本地用户 security_analyst_user,并分配 security_analyst_role。
为应用开发人员创建本地用户 app_dev_user,并分配 app_developer_role。
为监控系统创建 API 密钥 monitoring_api_key,并分配 monitoring_system_role。
角色映射:
Mermaid 图表:授权架构
图 2: 日志分析平台授权架构
如图 2 所示,不同的用户和系统被分配了不同的角色,从而实现了细粒度的访问控制,确保了日志数据的安全和平台的稳定运行。
最小权限原则: 始终遵循最小权限原则,只授予用户完成其工作所需的最小权限。
角色管理: 合理设计和管理角色,避免角色数量过多和权限混乱。
定期审查: 定期审查角色和角色映射配置,确保授权策略的有效性和安全性。
审计日志: 启用安全审计日志,记录用户的操作行为,便于安全监控和审计。
使用 API 密钥: 对于程序化访问,优先使用 API 密钥,并妥善保管 API 密钥。
文档级别安全 (DLS) 和字段级别安全 (FLS): 对于敏感数据,考虑使用 DLS 和 FLS 进行更细粒度的访问控制。
安全域选择: 根据实际需求选择合适的安全域,例如本地安全域、LDAP 安全域或 Active Directory 安全域。
授权 (Authorization) 是 Elasticsearch 安全领域的重要组成部分,它决定了用户可以执行的操作和访问的资源。通过深入理解 Elasticsearch 的授权机制,合理配置角色和权限,可以构建安全可靠的 Elasticsearch 集群,保护数据的安全性和完整性。
本文详细介绍了 Elasticsearch 授权的核心概念、角色定义、角色映射、权限详解、API 密钥以及实践案例,希望能帮助读者全面掌握 Elasticsearch 的授权技术,并在实际应用中有效地实施授权策略,提升 Elasticsearch 集群的安全性。