设置字段和文档级安全编辑

您可以通过向角色添加字段和文档级安全权限来控制对数据流或索引中数据的访问。 字段级安全权限 限制对文档中特定字段的访问。 文档级安全权限 限制对特定文档的访问。

文档和字段级安全目前旨在与只读特权帐户一起使用。 针对数据流或索引启用了文档和字段级安全的用户不应执行写入操作。

角色可以在每个索引的基础上定义字段和文档级权限。 未指定字段级权限的角色授予对所有字段的访问权限。 同样,未指定文档级权限的角色授予对索引中所有文档的访问权限。

在为用户分配多个角色时,请注意不要无意中授予超出预期的访问权限。 每个用户在每个数据流或索引中只有一组字段级和文档级权限。 请参阅 具有文档和字段级安全的多个角色

具有文档和字段级安全的多个角色编辑

用户可以拥有多个角色,每个角色可以在相同的数据流或索引上定义不同的权限。 重要的是要了解在这种情况下文档和字段级安全的行为。

文档级安全考虑用户持有的每个角色,并将每个角色对给定数据流或索引的文档级安全查询与“OR”组合。 这意味着只要有一个角色查询匹配,就会返回文档。 例如,如果一个角色授予对没有文档级安全的索引的访问权限,而另一个角色授予具有文档级安全的访问权限,则不会应用文档级安全; 拥有这两个角色的用户可以访问索引中的所有文档。

字段级安全考虑用户拥有的每个角色,并将所有列出的字段组合成每个数据流或索引的单个集合。 例如,如果一个角色授予对没有字段级安全的索引的访问权限,而另一个角色授予具有字段级安全的访问权限,则不会对该索引应用字段级安全; 拥有这两个角色的用户可以访问索引中的所有字段。

例如,假设 role_a 授予对 index1 中文档的 address 字段的访问权限; 它没有指定任何文档限制。 相反,role_b 限制对 index1 中的文档子集的访问权限; 它没有指定任何字段限制。 如果您为用户分配这两个角色,role_a 使用户可以访问所有文档,而 role_b 使用户可以访问所有字段。

如果您需要限制对文档和字段的访问,请考虑按索引拆分文档。

模板化角色查询编辑

创建角色时,您可以指定一个查询来定义 文档级安全权限。 您可以在角色查询中使用 Mustache 模板来将当前已认证用户的用户名插入角色中。 与 Elasticsearch 中支持模板或脚本的其他地方一样,您可以指定内联、存储或基于文件的模板,并定义自定义参数。 您可以通过 _user 参数访问当前已认证用户的详细信息。

例如,以下角色查询使用模板插入当前已认证用户的用户名

POST /_security/role/example1
{
  "indices" : [
    {
      "names" : [ "my-index-000001" ],
      "privileges" : [ "read" ],
      "query" : {
        "template" : {
          "source" : {
            "term" : { "acl.username" : "{{_user.username}}" }
          }
        }
      }
    }
  ]
}

您可以通过 _user 变量访问以下信息

属性 描述

_user.username

当前已认证用户的用户名。

_user.full_name

如果指定,则为当前已认证用户的全名。

_user.email

如果指定,则为当前已认证用户的电子邮件。

_user.roles

如果关联,则为当前已认证用户的角色名称列表。

_user.metadata

如果指定,则为包含当前已认证用户的自定义元数据的哈希。

您还可以访问自定义用户元数据。 例如,如果您在用户元数据中维护一个 group_id,则可以根据文档中的 group.id 字段应用文档级安全

POST /_security/role/example2
{
  "indices" : [
    {
      "names" : [ "my-index-000001" ],
      "privileges" : [ "read" ],
      "query" : {
        "template" : {
          "source" : {
            "term" : { "group.id" : "{{_user.metadata.group_id}}" }
          }
        }
      }
    }
  ]
}

如果您的元数据字段包含对象或数组,则可以使用 {{#toJson}}parameter{{/toJson}} 函数访问它。

POST /_security/role/example3
{
  "indices" : [
    {
      "names" : [ "my-index-000001" ],
      "privileges" : [ "read" ],
      "query" : {
        "template" : {
          "source" : "{ \"terms\": { \"group.statuses\": {{#toJson}}_user.metadata.statuses{{/toJson}} }}"
        }
      }
    }
  ]
}

预处理文档以添加安全详细信息编辑

为了保证用户只读取自己的文档,设置文档级安全是很有意义的。 在这种情况下,每个文档都必须与其关联的用户名或角色名称相关联,以便文档级安全的角色查询可以使用此信息。 这是 设置安全用户处理器 摄取处理器可以提供帮助的情况。

文档级安全不适用于写入 API。 您必须为使用相同数据流或索引的每个用户使用唯一的 ID,否则他们可能会覆盖其他用户的文档。 摄取处理器只是将当前已认证用户的属性添加到正在索引的文档中。

设置安全用户处理器 通过预处理摄取,将当前已认证用户的用户相关详细信息(如 usernamerolesemailfull_namemetadata)附加到当前文档。 当您使用摄取管道索引数据时,用户详细信息会自动附加到文档。 如果认证凭据是 API 密钥,则 API 密钥 idnamemetadata(如果存在且非空)也会附加到文档。

有关更多信息,请参阅 摄取管道设置安全用户

跨集群 API 密钥的字段和文档级安全编辑

跨集群 API 密钥 可用于对远程集群进行身份验证。 search 参数定义跨集群搜索的权限。 replication 参数定义跨集群复制的权限。

replication 不支持任何字段或文档级安全。 search 支持字段和文档级安全。

出于与 具有文档和字段级安全的多个角色 中描述的原因类似,如果您为 search 参数定义了文档或字段级安全,则无法创建具有 searchreplication 两个参数的单个跨集群 API 密钥。

如果您需要使用这两个参数,并且需要为 search 参数定义文档或字段级安全,请创建两个单独的跨集群 API 密钥,一个使用 search 参数,另一个使用 replication 参数。 您还需要设置两个不同的远程连接到同一个集群,每个命名连接使用相应的跨集群 API 密钥。