跳到主要内容

Elasticsearch 文档级权限

Elasticsearch是一个强大的分布式搜索引擎,广泛用于日志分析、全文搜索和实时数据分析等场景。随着数据量的增加,数据安全性变得尤为重要。文档级权限控制是一种细粒度的权限管理方式,允许你根据用户或角色限制对特定文档的访问。本文将详细介绍如何在Elasticsearch中实现文档级权限控制。

什么是文档级权限?

文档级权限是指根据用户或角色的权限,限制其对Elasticsearch中特定文档的访问。这种权限控制方式适用于需要严格数据隔离的场景,例如多租户系统或敏感数据管理。

在Elasticsearch中,文档级权限通常通过以下方式实现:

  1. 字段过滤:根据用户权限过滤文档中的特定字段。
  2. 文档过滤:根据用户权限过滤特定文档。

实现文档级权限的步骤

1. 定义角色和权限

首先,你需要定义用户角色及其对应的权限。Elasticsearch提供了基于角色的访问控制(RBAC),可以通过Kibana或Elasticsearch API进行配置。

例如,创建一个名为 read_only 的角色,该角色只能读取特定索引中的文档:

json
PUT /_security/role/read_only
{
"indices": [
{
"names": ["my_index"],
"privileges": ["read"],
"query": {
"term": {
"access_level": "public"
}
}
}
]
}

2. 分配角色给用户

接下来,将角色分配给用户。例如,将 read_only 角色分配给用户 user1

json
PUT /_security/user/user1
{
"password": "secure_password",
"roles": ["read_only"]
}

3. 查询时应用权限

当用户查询数据时,Elasticsearch会自动应用角色中定义的权限。例如,user1 只能访问 my_indexaccess_levelpublic 的文档:

json
GET /my_index/_search
{
"query": {
"match_all": {}
}
}

4. 文档级权限的实际应用

假设你有一个多租户系统,每个租户的数据存储在同一个索引中。你可以通过文档级权限确保每个租户只能访问自己的数据。

例如,为每个租户创建一个角色,限制其只能访问 tenant_id 与其匹配的文档:

json
PUT /_security/role/tenant_1
{
"indices": [
{
"names": ["tenant_data"],
"privileges": ["read"],
"query": {
"term": {
"tenant_id": "tenant_1"
}
}
}
]
}

5. 使用字段过滤

除了文档过滤,你还可以通过字段过滤限制用户访问文档中的特定字段。例如,限制用户只能访问 public_data 字段:

json
PUT /_security/role/limited_access
{
"indices": [
{
"names": ["my_index"],
"privileges": ["read"],
"field_security": {
"grant": ["public_data"]
}
}
]
}

实际案例

假设你正在开发一个医疗系统,患者的病历数据存储在Elasticsearch中。为了保护患者隐私,你需要确保医生只能访问自己负责的患者的病历。

  1. 定义角色:为每个医生创建一个角色,限制其只能访问 doctor_id 与其匹配的文档。
  2. 分配角色:将角色分配给对应的医生用户。
  3. 查询数据:当医生查询病历时,Elasticsearch会自动过滤出与其相关的文档。

总结

文档级权限是Elasticsearch中实现细粒度访问控制的重要方式。通过定义角色、分配权限和应用查询过滤,你可以确保用户只能访问其有权访问的数据。这种方式特别适用于多租户系统、敏感数据管理等场景。

附加资源

练习

  1. 创建一个名为 analyst 的角色,该角色只能读取 logs 索引中 log_levelinfo 的文档。
  2. analyst 角色分配给用户 user2,并验证其权限是否生效。