安全API

edit

要使用安全API,您必须在elasticsearch.yml文件中将xpack.security.enabled设置为true

使用以下API来执行安全活动。

应用程序权限

edit

使用以下API来添加、更新、检索和删除应用程序权限:

角色映射

edit

使用以下API来添加、删除、更新和检索角色映射:

角色

edit

使用以下API在本地领域中添加、删除、更新和检索角色:

令牌

edit

使用以下API来创建和使无效的承载令牌,以便在不要求基本身份验证的情况下进行访问:

API 密钥

edit

使用以下API来创建和更新通过REST接口访问的API密钥,而无需基本身份验证:

使用以下API来创建和更新用于基于API密钥的远程集群访问的跨集群API密钥:

使用以下API来检索和失效所有类型的API密钥:

用户

edit

使用以下API在原生领域中添加、删除、更新或检索用户:

服务账户

edit

使用以下API来列出服务账户和管理服务令牌:

OpenID Connect

edit

使用以下API在自定义Web应用程序(而非Kibana)中对用户进行OpenID Connect身份验证领域的身份验证

SAML

edit

使用以下API在自定义Web应用程序(而非Kibana)中对用户进行SAML身份验证时,针对SAML身份验证领域进行用户认证。

注册

edit

使用以下API,使新节点能够加入已启用安全性的现有集群,或使Kibana实例能够配置自身以与安全的Elasticsearch集群通信。

用户资料

edit

使用以下API来检索和管理用户资料。

认证 API

edit

使您能够提交带有基本认证头的请求,以验证用户并检索有关已验证用户的信息。

请求

edit

GET /_security/_authenticate

描述

edit

成功的调用返回一个JSON结构,显示用户信息,如用户名、分配给用户的角色、任何分配的元数据,以及关于对用户进行身份验证和授权的领域的信息。

响应代码

edit

如果用户无法通过身份验证,此API将返回401状态码。

示例

edit

要验证用户,请向 /_security/_authenticate 端点提交一个 GET 请求:

GET /_security/_authenticate

以下示例输出提供了关于“rdeniro”用户的信息:

{
  "username": "rdeniro",
  "roles": [
    "admin"
  ],
  "full_name": null,
  "email":  null,
  "metadata": { },
  "enabled": true,
  "authentication_realm": {
    "name" : "file",
    "type" : "file"
  },
  "lookup_realm": {
    "name" : "file",
    "type" : "file"
  },
  "authentication_type": "realm"
}

更改密码 API

edit

更改本机领域和内置用户的密码。

请求

edit

POST /_security/user/_password

POST /_security/user//_password

前提条件

edit
  • 每个用户都可以更改自己的密码。拥有manage_security权限的用户可以更改其他用户的密码。

描述

edit

您可以使用创建用户 API来更新用户的所有信息,但用户的用户名密码除外。此 API 用于更改用户的密码。

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
username
(可选,字符串) 你要更改密码的用户。如果你不指定此参数,则更改当前用户的密码。

请求体

edit
password

(字符串) 新的密码值。密码必须至少6个字符长。

需要提供passwordpassword_hash中的一个。

password_hash

(字符串) 新密码值的哈希。这必须使用与配置用于密码存储的相同哈希算法生成。更多详情,请参阅用户缓存和密码哈希算法中关于xpack.security.authc.password_hashing.algorithm设置的解释。

使用此参数允许客户端出于性能和/或保密原因预先哈希密码。

不能在同一请求中使用password参数和password_hash参数。

示例

edit

以下示例更新了jacknich用户的密码:

POST /_security/user/jacknich/_password
{
  "password" : "new-test-password"
}

成功的调用返回一个空的JSON结构。

{}

清除缓存 API

edit

从用户缓存中驱逐用户。您可以完全清除缓存或驱逐特定用户。

请求

edit

POST /_security/realm//_clear_cache

POST /_security/realm//_clear_cache?usernames=

描述

edit

用户凭证在每个节点上缓存在内存中,以避免每次传入请求时连接到远程认证服务或访问磁盘。有一些领域设置可以用来配置用户缓存。更多信息,请参见控制用户缓存

要从角色缓存中驱逐角色,请参阅清除角色缓存 API。 要从权限缓存中驱逐权限,请参阅清除权限缓存 API。 要从 API 密钥缓存中驱逐 API 密钥,请参阅清除 API 密钥缓存 API

路径参数

edit
<realms>
(必需,字符串) 要清除的领域列表,以逗号分隔。要清除所有领域,请使用 *。不支持其他通配符模式。
usernames
(可选,列表) 以逗号分隔的用户列表,用于从缓存中清除。 如果您不指定此参数,API将从用户缓存中清除所有用户。

示例

edit

例如,要清除由file领域缓存的所有用户:

POST /_security/realm/default_file/_clear_cache

要驱逐选定的用户,请指定usernames参数:

POST /_security/realm/default_file/_clear_cache?usernames=rdeniro,alpacino

要清除多个领域的缓存,请将领域指定为逗号分隔的列表:

POST /_security/realm/default_file,ldap1/_clear_cache

要清除所有领域的缓存,请使用 *

POST /_security/realm/*/_clear_cache

清除角色缓存 API

edit

从本地角色缓存中驱逐角色。

请求

edit

POST /_security/role//_clear_cache

前提条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
<roles>
(必需,字符串) 以逗号分隔的角色列表,用于从角色缓存中驱逐。要驱逐所有角色,请使用 *。不支持其他通配符模式。

示例

edit

清除角色缓存 API 从本机角色缓存中删除角色。例如,要清除 my_admin_role 的缓存:

POST /_security/role/my_admin_role/_clear_cache

指定多个角色为一个逗号分隔的列表。

POST /_security/role/my_admin_role,my_test_role/_clear_cache

要清除缓存中的所有角色,请使用 *

POST /_security/role/*/_clear_cache

清除权限缓存 API

edit

从本地应用程序权限缓存中清除权限。 对于权限已更新的应用程序,缓存也会自动清除。

请求

edit

POST /_security/privilege//_clear_cache

前提条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
<applications>
(必需,字符串) 要清除的应用程序的逗号分隔列表。要清除所有应用程序,请使用 *。不支持其他通配符模式。

示例

edit

清除权限缓存 API 从本地应用程序权限缓存中删除权限。 例如,要清除 myapp 的缓存:

POST /_security/privilege/myapp/_clear_cache

指定多个应用程序为逗号分隔的列表。

POST /_security/privilege/myapp,my-other-app/_clear_cache

要清除所有应用程序的缓存,请使用 *

POST /_security/privilege/*/_clear_cache

清除 API 密钥缓存 API

edit

从API密钥缓存中驱逐一部分所有条目。 在安全索引状态变化时,缓存也会自动清除。

请求

edit

POST /_security/api_key//_clear_cache

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

有关API密钥的更多信息,请参阅创建API密钥获取API密钥信息使API密钥失效

路径参数

edit
<ids>
(必需,字符串) 以逗号分隔的 API 密钥 ID 列表,用于从 API 密钥缓存中驱逐。要驱逐所有 API 密钥,请使用 *。不支持其他通配符模式。

示例

edit

清除 API 密钥缓存 API 会从 API 密钥缓存中驱逐条目。 例如,要清除 ID 为 yVGMr3QByxdh1MSaicYx 的 API 密钥的条目。

POST /_security/api_key/yVGMr3QByxdh1MSaicYx/_clear_cache

指定多个API密钥为一个逗号分隔的列表。

POST /_security/api_key/yVGMr3QByxdh1MSaicYx,YoiMaqREw0YVpjn40iMg/_clear_cache

要清除API密钥缓存中的所有条目,请使用*

POST /_security/api_key/*/_clear_cache

清除服务账户令牌缓存 API

edit

服务账户 令牌缓存中驱逐一部分所有条目。

请求

edit

POST /_security/service/{namespace}/{service}/credential/token/{token_name}/_clear_cache

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security 集群权限

描述

edit

存在两个独立的缓存用于服务账户令牌:一个缓存用于由service_tokens文件支持的令牌,另一个用于由.security索引支持的令牌。此API会清除两个缓存中的匹配条目。

.security索引支持的服务账户令牌缓存在安全索引状态变化时会自动清除。由service_tokens文件支持的令牌缓存在文件变化时会自动清除。

有关更多信息,请参阅服务账户

路径参数

edit
namespace
(必需,字符串)命名空间名称。
service
(必需,字符串) 服务名称。
token_name
(必需,字符串) 以逗号分隔的令牌名称列表,用于从服务帐户令牌缓存中驱逐。使用通配符 (*) 驱逐属于服务帐户的所有令牌。不支持其他通配符模式。

示例

edit

以下请求清除token1服务账户令牌缓存:

POST /_security/service/elastic/fleet-server/credential/token/token1/_clear_cache

指定多个令牌名称作为逗号分隔的列表:

POST /_security/service/elastic/fleet-server/credential/token/token1,token2/_clear_cache

要清除服务账户令牌缓存中的所有条目,请在令牌名称的位置使用通配符(*):

POST /_security/service/elastic/fleet-server/credential/token/*/_clear_cache

创建 API 密钥 API

edit

创建一个API密钥,以便在不要求基本身份验证的情况下进行访问。

请求

edit

POST /_security/api_key

PUT /_security/api_key

先决条件

edit
  • 要使用此API,您必须至少拥有manage_own_api_key集群权限。

如果用于验证此请求的凭证是API密钥,则派生的API密钥不能具有任何权限。如果您指定了权限,API将返回错误。 请参阅role_descriptors下的注释。

描述

edit

API 密钥由 Elasticsearch API 密钥服务创建,该服务默认自动启用。 有关禁用 API 密钥服务的说明,请参阅 API 密钥服务设置

成功的请求会返回一个包含API密钥、其唯一ID和名称的JSON结构。如果适用,它还会返回API密钥的过期信息,以毫秒为单位。

默认情况下,API 密钥永不过期。您可以在创建 API 密钥时指定过期信息。

请参阅API key service settings以获取与API key服务相关的配置设置。

请求体

edit

以下参数可以在POST或PUT请求的正文中指定:

name
(必需,字符串) 指定此API密钥的名称。
role_descriptors

(可选, 对象) 此API密钥的角色描述符。此参数是可选的。当未指定或为空数组时,API密钥将具有已认证用户权限的即时快照。如果提供角色描述符,则生成的权限将是API密钥权限和已认证用户权限的交集,从而限制API密钥的访问范围。

由于计算此权限交集的方式,除非派生密钥是在没有任何权限的情况下创建的,否则无法创建另一个API密钥的子API密钥。在这种情况下,您必须显式指定一个没有任何权限的角色描述符。派生的API密钥可用于身份验证;它将没有权限调用Elasticsearch API。

applications

(列表) 应用程序权限条目的列表。

application (required)
(字符串) 此条目适用的应用程序名称
privileges (required)
(列表) 字符串列表,其中每个元素是应用程序权限或操作的名称。
resources (required)
(列表) 权限应用的资源列表。
cluster
(列表) 集群权限列表。这些权限定义了API密钥能够执行的集群级别操作。
global
(对象) 定义全局权限的对象。全局权限是一种请求感知的集群权限。目前,全局权限的支持仅限于应用程序权限的管理。此字段是可选的。
indices

(列表) 一个索引权限条目的列表。

field_security
(对象) API密钥具有读访问权限的文档字段。有关更多信息,请参阅 设置字段和文档级别的安全性
names (required)
(列表) 此条目中权限应用的索引列表(或索引名称模式)。
privileges(required)
(列表) API密钥在指定索引上的索引级别权限。
query
定义API密钥具有读访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询,才能被API密钥访问。
metadata
(对象) 可选的元数据。在metadata对象中,以_开头的键保留供系统使用。
restriction

(对象) 可选的限制条件,用于指定角色描述符何时可以生效。更多信息,请参阅 角色限制

workflows

(列表) API 密钥被限制的工作流列表。 有关完整列表,请参见 工作流

为了使用角色限制,必须使用一个单一角色描述符创建API密钥。

run_as
(列表) API密钥可以模拟的用户列表。 有关更多信息,请参阅 代表其他用户提交请求
expiration
(可选,字符串) API 密钥的过期时间。默认情况下,API 密钥永不过期。
metadata
(可选, 对象) 您希望与API密钥关联的任意元数据。 它支持嵌套数据结构。 在metadata对象中,以_开头的键保留给系统使用。

示例

edit

以下示例创建一个API密钥:

POST /_security/api_key
{
  "name": "my-api-key",
  "expiration": "1d",   
  "role_descriptors": { 
    "role-a": {
      "cluster": ["all"],
      "indices": [
        {
          "names": ["index-a*"],
          "privileges": ["read"]
        }
      ]
    },
    "role-b": {
      "cluster": ["all"],
      "indices": [
        {
          "names": ["index-b*"],
          "privileges": ["all"]
        }
      ]
    }
  },
  "metadata": {
    "application": "my-application",
    "environment": {
       "level": 1,
       "trusted": true,
       "tags": ["dev", "staging"]
    }
  }
}

生成的API密钥的可选过期时间。如果未提供过期时间,则API密钥不会过期。

此API密钥的可选角色描述符。如果未提供,则应用已认证用户的权限。

成功的调用返回一个JSON结构,提供API密钥信息。

{
  "id": "VuaCfGcBCdbkQm-e5aOx",        
  "name": "my-api-key",
  "expiration": 1544068612110,         
  "api_key": "ui2lp2axTNmsyakw9tvNnw", 
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="  
}

此 API 密钥的唯一 id

此API密钥的可选过期时间(以毫秒为单位)

生成的 API 密钥

API key 凭证,即 idapi_key 的 UTF-8 表示形式通过冒号 (:) 连接后的 Base64 编码。

要使用生成的 API 密钥,发送一个带有 Authorization 标头的请求,其中包含一个 ApiKey 前缀,后跟 API 密钥凭据(响应中的 encoded 值)。

curl -H "Authorization: ApiKey VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==" \
http://localhost:9200/_cluster/health\?pretty 

如果你的节点将 xpack.security.http.ssl.enabled 设置为 true,那么在创建 API 密钥时必须指定 https

在类Unix系统上,可以使用以下命令创建encoded值:

echo -n "VuaCfGcBCdbkQm-e5aOx:ui2lp2axTNmsyakw9tvNnw" | base64 

使用 -n 以便 echo 命令不会打印尾随的换行符

以下示例创建了一个API密钥,该密钥具有对角色限制search_application_query工作流的限制, 该限制仅允许调用搜索应用程序搜索API

POST /_security/api_key
{
  "name": "my-restricted-api-key",
  "role_descriptors": {
    "my-restricted-role-descriptor": {
      "indices": [
        {
          "names": ["my-search-app"],
          "privileges": ["read"]
        }
      ],
      "restriction":  {
        "workflows": ["search_application_query"]
      }
    }
  }
}

创建或更新应用程序权限 API

edit

添加或更新应用程序权限

请求

edit

POST /_security/privilege

PUT /_security/privilege

先决条件

edit

要使用此API,您必须拥有以下任一条件:

  • manage_security 集群权限(或更高权限,如 all);
  • 请求中引用的应用程序的 “管理应用程序权限” 全局权限

描述

edit

此API用于创建或更新权限。要删除权限,请使用删除应用程序权限API

更多信息,请参阅应用程序权限

要检查用户的应用程序权限,请使用has privileges API

请求体

edit

body 是一个 JSON 对象,其中字段的名称是应用程序名称,每个字段的值是一个对象。这个内部对象中的字段是权限的名称,每个值都是一个包含以下字段的 JSON 对象:

actions
(字符串数组) 此权限授予的操作名称列表。此字段必须存在且不能为空数组。
metadata
(对象) 可选的元数据。在 metadata 对象中,以 _ 开头的键保留供系统使用。

验证

edit
Application names

应用程序名称由一个前缀和一个可选的后缀组成,这些名称遵循以下规则:

  • 前缀必须以小写ASCII字母开头
  • 前缀只能包含ASCII字母或数字
  • 前缀必须至少3个字符长
  • 如果后缀存在,它必须以-_开头
  • 后缀不能包含以下任何字符: \, /, *, ?, ", <, >, |, ,, *
  • 名称的任何部分都不能包含空白字符。
Privilege names
特权名称必须以小写ASCII字母开头,并且只能包含ASCII字母和数字以及字符_-.
Action names
操作名称可以包含任意数量的可打印ASCII字符,并且必须包含以下至少一个字符:/ *, :

响应体

edit

成功的调用将返回一个JSON结构,显示权限是否已创建或更新。

示例

edit

要添加单个权限,请向 /_security/privilege/ 端点提交 PUT 或 POST 请求。例如:

PUT /_security/privilege
{
  "myapp": {
    "read": {
      "actions": [ 
        "data:read/*" , 
        "action:login" ],
        "metadata": { 
          "description": "Read access to myapp"
        }
      }
    }
}

这些字符串在“myapp”应用程序中具有重要意义。Elasticsearch 不会对它们赋予任何含义。

这里使用通配符(*)意味着此权限授予对所有以data:read/开头的操作的访问权限。Elasticsearch不会对这些操作赋予任何特殊含义。然而,如果请求包含应用程序权限,例如data:read/usersdata:read/settingshas privileges API会尊重通配符的使用,并返回true

元数据对象是可选的。

{
  "myapp": {
    "read": {
      "created": true 
    }
  }
}

当更新现有权限时,created 被设置为 false。

要添加多个权限,请向 /_security/privilege/ 端点提交一个 POST 请求。例如:

PUT /_security/privilege
{
  "app01": {
    "read": {
      "actions": [ "action:login", "data:read/*" ]
    },
    "write": {
      "actions": [ "action:login", "data:write/*" ]
    }
  },
  "app02": {
    "all": {
      "actions": [ "*" ]
    }
  }
}

成功的调用将返回一个JSON结构,显示权限是否已创建或更新。

{
  "app02": {
    "all": {
      "created": true
    }
  },
  "app01": {
    "read": {
      "created": true
    },
    "write": {
      "created": true
    }
  }
}

创建或更新角色映射 API

edit

创建和更新角色映射。

请求

edit

POST /_security/role_mapping/

PUT /_security/role_mapping/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

角色映射定义了每个用户被分配的角色。每个映射都有规则来识别用户,并有一系列角色授予这些用户。

角色映射API通常是管理角色映射的首选方式,而不是使用角色映射文件。创建或更新角色映射API不能更新在角色映射文件中定义的角色映射。

此API不创建角色。相反,它将用户映射到现有角色。 角色可以通过使用创建或更新角色API角色文件来创建。

有关更多信息,请参阅将用户和组映射到角色

角色模板

edit

角色映射最常见的用途是将用户已知的值映射到一个固定的角色名称。例如,所有在 LDAP 组 cn=admin,dc=example,dc=com 中的用户都应该在 Elasticsearch 中被赋予 superuser 角色。为此目的使用了 roles 字段。

对于更复杂的需求,可以使用 Mustache 模板来动态确定应授予用户的角色名称。为此目的使用了 role_templates 字段。

要成功使用角色模板,必须启用相关的脚本功能。否则,所有尝试使用角色模板创建角色映射的操作都会失败。请参阅允许的脚本类型设置

在角色映射规则中可用的所有用户字段也可以在角色模板中使用。因此,可以将用户分配到一个反映其用户名、其或他们进行身份验证的领域名称的角色。

默认情况下,模板会被评估以生成一个字符串,该字符串是应分配给用户的角色的名称。如果模板的format设置为"json",则模板应生成一个JSON字符串或角色名称的JSON字符串数组。

路径参数

edit
name
(字符串) 用于标识角色映射的唯一名称。该名称仅作为通过API进行交互的标识符使用;它不会以任何方式影响映射的行为。

请求体

edit

以下参数可以在PUT或POST请求的正文中指定,并涉及添加角色映射:

enabled
(必需,布尔值) 当执行角色映射时,将忽略enabled设置为false的映射。
metadata
(对象) 附加的元数据,用于定义每个用户被分配的角色。在 metadata 对象中,以 _ 开头的键是为系统使用保留的。
roles
(字符串列表) 授予符合角色映射规则的用户的角色名称列表。 必须指定 rolesrole_templates 中的一个
role_templates
(对象列表) 一个 mustache 模板列表,这些模板将被评估以确定应授予与角色映射规则匹配的用户的角色名称。 这些对象的格式定义如下。 必须指定 rolesrole_templates 中的一个
rules
(必需,对象) 确定哪些用户应被映射匹配的规则。规则是一个通过使用JSON DSL表达的逻辑条件。 参见 角色映射资源

示例

edit

以下示例将“用户”角色分配给所有用户:

POST /_security/role_mapping/mapping1
{
  "roles": [ "user"],
  "enabled": true, 
  "rules": {
    "field" : { "username" : "*" }
  },
  "metadata" : { 
    "version" : 1
  }
}

当执行角色映射时,enabled 设置为 false 的映射将被忽略。

元数据是可选的。

成功的调用将返回一个JSON结构,显示映射是否已创建或更新。

{
  "role_mapping" : {
    "created" : true 
  }
}

当更新现有映射时,created 被设置为 false。

以下示例将“user”和“admin”角色分配给特定用户:

POST /_security/role_mapping/mapping2
{
  "roles": [ "user", "admin" ],
  "enabled": true,
  "rules": {
     "field" : { "username" : [ "esadmin01", "esadmin02" ] }
  }
}

以下示例匹配针对特定领域进行身份验证的用户:

POST /_security/role_mapping/mapping3
{
  "roles": [ "ldap-user" ],
  "enabled": true,
  "rules": {
    "field" : { "realm.name" : "ldap1" }
  }
}

以下示例匹配用户名是 esadmin 或者用户属于 cn=admin,dc=example,dc=com 组的用户:

POST /_security/role_mapping/mapping4
{
  "roles": [ "superuser" ],
  "enabled": true,
  "rules": {
    "any": [
      {
        "field": {
          "username": "esadmin"
        }
      },
      {
        "field": {
          "groups": "cn=admins,dc=example,dc=com"
        }
      }
    ]
  }
}

上述示例在您的身份管理系统(如Active Directory或SAML身份提供者)中的组名与Elasticsearch中的角色名没有一一对应关系时非常有用。角色映射是将组名角色名关联起来的方法。

如果有多个组,可以使用数组语法来表示组字段。 这会匹配任意一个组(而不是所有组):

POST /_security/role_mapping/mapping4
{
  "roles": [ "superuser" ],
  "enabled": true,
  "rules": {
    "any": [
      {
        "field": {
          "username": "esadmin"
        }
      },
      {
        "field": {
          "groups": [
               "cn=admins,dc=example,dc=com",
               "cn=other,dc=example,dc=com"
            ]
        }
      }
    ]
  }
}

然而,在极少数情况下,您的用户组名称可能与您的 Elasticsearch 角色名称完全匹配。当您的 SAML 身份提供商包含其自己的“组映射”功能并且可以配置为在用户的 SAML 属性中释放 Elasticsearch 角色名称时,可能会出现这种情况。

在这些情况下,可以使用一个将组名视为角色名的模板。

注意: 这应该仅在你打算为所有提供的组定义角色时进行。将用户映射到大量不必要或未定义的角色是低效的,并且可能对系统性能产生负面影响。如果你只需要映射部分组,那么你应该使用显式映射来完成。

POST /_security/role_mapping/mapping5
{
  "role_templates": [
    {
      "template": { "source": "{{#tojson}}groups{{/tojson}}" }, 
      "format" : "json" 
    }
  ],
  "rules": {
    "field" : { "realm.name" : "saml1" }
  },
  "enabled": true
}

The tojson mustache函数用于将组名称列表转换为有效的JSON数组。

因为模板生成的是一个JSON数组,所以格式必须设置为json

以下示例匹配特定 LDAP 子树中的用户:

POST /_security/role_mapping/mapping6
{
  "roles": [ "example-user" ],
  "enabled": true,
  "rules": {
    "field" : { "dn" : "*,ou=subtree,dc=example,dc=com" }
  }
}

以下示例匹配特定领域中特定LDAP子树中的用户:

POST /_security/role_mapping/mapping7
{
  "roles": [ "ldap-example-user" ],
  "enabled": true,
  "rules": {
    "all": [
      { "field" : { "dn" : "*,ou=subtree,dc=example,dc=com" } },
      { "field" : { "realm.name" : "ldap1" } }
    ]
  }
}

规则可以更复杂并包含通配符匹配。例如,以下映射匹配满足以下所有条件的任何用户:

  • 专有名称匹配模式 *,ou=admin,dc=example,dc=com, 或者用户名是 es-admin,或者用户名是 es-system
  • cn=people,dc=example,dc=com 组中的用户
  • 用户没有 terminated_date
POST /_security/role_mapping/mapping8
{
  "roles": [ "superuser" ],
  "enabled": true,
  "rules": {
    "all": [
      {
        "any": [
          {
            "field": {
              "dn": "*,ou=admin,dc=example,dc=com"
            }
          },
          {
            "field": {
              "username": [ "es-admin", "es-system" ]
            }
          }
        ]
      },
      {
        "field": {
          "groups": "cn=people,dc=example,dc=com"
        }
      },
      {
        "except": {
          "field": {
            "metadata.terminated_date": null
          }
        }
      }
    ]
  }
}

模板角色可以用于自动将每个用户映射到他们自己的自定义角色。角色本身可以通过角色 API或使用自定义角色提供者来定义。

在这个示例中,每个使用“cloud-saml”领域进行身份验证的用户都将自动映射到两个角色——"saml_user"角色和以_user_为前缀的用户名角色。例如,用户nwong将被分配saml_user_user_nwong角色。

POST /_security/role_mapping/mapping9
{
  "rules": { "field": { "realm.name": "cloud-saml" } },
  "role_templates": [
    { "template": { "source" : "saml_user" } }, 
    { "template": { "source" : "_user_{{username}}" } }
  ],
  "enabled": true
}

因为在同一个角色映射中不能同时指定rolesrole_templates,我们可以通过使用一个没有替换的模板来应用一个“固定名称”角色。

创建或更新角色 API

edit

在本地领域中添加和更新角色。

请求

edit

POST /_security/role/

PUT /_security/role/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

角色管理API通常是管理角色的首选方式,而不是使用基于文件的角色管理。创建或更新角色API不能更新在角色文件中定义的角色。

路径参数

edit
name
(字符串) 角色的名称。

请求体

edit

以下参数可以在PUT或POST请求的正文中指定,并涉及添加角色:

applications

(列表) 应用程序权限条目的列表。

application (必需)
(字符串) 此条目适用的应用程序的名称
privileges
(列表) 字符串列表,其中每个元素是应用程序权限或操作的名称。
resources
(列表) 权限应用的资源列表。
cluster
(列表) 集群权限列表。这些权限定义了具有此角色的用户能够执行的集群级别操作。
description
(字符串) 角色的描述。 最大长度为 1000 个字符。
global
(对象) 定义全局权限的对象。全局权限是一种请求感知的集群权限形式。目前,对全局权限的支持仅限于应用程序权限的管理。此字段是可选的。
indices

(列表) 一个索引权限条目的列表。

field_security
(对象) 角色所有者具有读访问权限的文档字段。有关更多信息,请参阅 设置字段和文档级安全
names (必需)
(列表) 权限条目适用的索引列表(或索引名称模式)。
privileges(必需)
(列表) 角色所有者在指定索引上的索引级权限。
query
定义角色所有者具有读访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询,才能被角色所有者访问。
metadata
(对象) 可选的元数据。在 metadata 对象中,以 _ 开头的键保留供系统使用。
run_as
(列表) 该角色所有者可以模拟的用户列表。 更多信息,请参阅 代表其他用户提交请求
remote_indices

(列表) 远程索引权限条目列表。

远程索引对于使用基于API密钥模型的远程集群是有效的。 它们对使用基于证书模型的远程集群没有影响。

clusters (必需)
(列表) 权限应用到的集群别名列表。
field_security
(对象) 角色所有者具有读访问权限的文档字段。有关更多信息,请参阅 设置字段和文档级安全
names (必需)
(列表) 远程集群上的索引(或索引名称模式)列表(使用clusters指定),权限应用到这些索引。
privileges (必需)
(列表) 角色所有者在指定索引上的索引级权限。
query
定义角色所有者具有读访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询,才能被角色所有者访问。

更多信息,请参阅定义角色

示例

edit

以下示例添加了一个名为 my_admin_role 的角色:

POST /_security/role/my_admin_role
{
  "description": "Grants full access to all management features within the cluster.",
  "cluster": ["all"],
  "indices": [
    {
      "names": [ "index1", "index2" ],
      "privileges": ["all"],
      "field_security" : { // optional
        "grant" : [ "title", "body" ]
      },
      "query": "{\"match\": {\"title\": \"foo\"}}" // optional
    }
  ],
  "applications": [
    {
      "application": "myapp",
      "privileges": [ "admin", "read" ],
      "resources": [ "*" ]
    }
  ],
  "run_as": [ "other_user" ], // optional
  "metadata" : { // optional
    "version" : 1
  }
}

成功的调用将返回一个JSON结构,显示角色是否已创建或更新。

{
  "role": {
    "created": true 
  }
}

当更新现有角色时,created 被设置为 false。

以下示例配置了一个可以在JDBC中运行SQL的角色:

POST /_security/role/cli_or_drivers_minimal
{
  "cluster": ["cluster:monitor/main"],
  "indices": [
    {
      "names": ["test"],
      "privileges": ["read", "indices:admin/get"]
    }
  ]
}

以下示例在远程集群上配置了一个具有远程索引权限的角色:

POST /_security/role/role_with_remote_indices
{
  "remote_indices": [
    {
      "clusters": [ "my_remote" ], 
      "names": ["logs*"], 
      "privileges": ["read", "read_cross_cluster", "view_index_metadata"] 
    }
  ]
}

远程索引权限适用于别名为 my_remote 的远程集群。

在远程集群(my_remote)上,为匹配模式 logs* 的索引授予权限。

实际授予的 索引权限 对于 logs*my_remote 上。

批量创建或更新角色 API

edit

此功能处于技术预览阶段,可能会在未来的版本中进行更改或移除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。

在原生领域中批量添加和更新角色。

请求

edit

POST /_security/role/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

角色管理API通常是管理角色的首选方式,而不是使用基于文件的角色管理。批量创建或更新角色API不能更新在角色文件中定义的角色。

路径参数

edit
refresh
写请求的可选设置 刷新策略。默认为立即刷新。

请求体

edit

以下参数可以在POST请求的正文中指定,并涉及添加一组角色:

roles
(对象) 要添加的角色,作为角色名称到角色映射。
<role_name> (required)
(字符串) 角色名称。
applications

(列表) 应用程序权限条目的列表。

application (必需)
(字符串) 此条目适用的应用程序的名称。
privileges
(列表) 字符串列表,其中每个元素是应用程序权限或操作的名称。
resources
(列表) 应用权限的资源列表。
cluster
(列表) 集群权限列表。这些权限定义了具有此角色的用户能够执行的集群级别操作。
global
(对象) 定义全局权限的对象。全局权限是一种请求感知的集群权限形式。目前,对全局权限的支持仅限于应用程序权限的管理。
indices

(列表) 一个索引权限条目的列表。

field_security
(对象) 角色所有者具有读访问权限的文档字段。有关更多信息,请参阅 设置字段和文档级安全
names (必需)
(列表) 权限应用到的索引(或索引名称模式)列表。
privileges(必需)
(列表) 角色所有者在指定索引上的索引级权限。
query
定义角色所有者具有读访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询,才能被角色所有者访问。
metadata
(对象) 可选的元数据。在 metadata 对象中,以 _ 开头的键保留供系统使用。
run_as
(列表) 该角色所有者可以模拟的用户列表。 更多信息,请参阅 代表其他用户提交请求
remote_indices

[测试版] 此功能处于测试阶段,可能会发生变化。设计和代码不如正式发布的功能成熟,并且是按原样提供的,不提供任何保证。测试版功能不受正式发布功能的SLA支持。 (列表) 远程索引权限条目的列表。

远程索引对于使用基于API密钥模型的远程集群是有效的。 它们对使用基于证书模型的远程集群没有影响。

clusters (必需)
(列表) 此条目中权限适用的集群别名列表。
field_security
(对象) 角色所有者具有读访问权限的文档字段。有关更多信息,请参阅 设置字段和文档级安全
names (必需)
(列表) 远程集群上的索引(或索引名称模式)列表(使用clusters指定),此条目中的权限适用。
privileges (必需)
(列表) 角色所有者在指定索引上的索引级权限。
query
定义角色所有者具有读访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询,才能被角色所有者访问。

更多信息,请参阅定义角色

示例

edit

以下示例添加了名为 my_admin_rolemy_user_role 的角色:

POST /_security/role
{
    "roles": {
        "my_admin_role": {
            "cluster": [
                "all"
            ],
            "indices": [
                {
                    "names": [
                        "index1",
                        "index2"
                    ],
                    "privileges": [
                        "all"
                    ],
                    "field_security": {
                        "grant": [
                            "title",
                            "body"
                        ]
                    },
                    "query": "{\"match\": {\"title\": \"foo\"}}"
                }
            ],
            "applications": [
                {
                    "application": "myapp",
                    "privileges": [
                        "admin",
                        "read"
                    ],
                    "resources": [
                        "*"
                    ]
                }
            ],
            "run_as": [
                "other_user"
            ],
            "metadata": {
                "version": 1
            }
        },
        "my_user_role": {
            "cluster": [
                "all"
            ],
            "indices": [
                {
                    "names": [
                        "index1"
                    ],
                    "privileges": [
                        "read"
                    ],
                    "field_security": {
                        "grant": [
                            "title",
                            "body"
                        ]
                    },
                    "query": "{\"match\": {\"title\": \"foo\"}}"
                }
            ],
            "applications": [
                {
                    "application": "myapp",
                    "privileges": [
                        "admin",
                        "read"
                    ],
                    "resources": [
                        "*"
                    ]
                }
            ],
            "run_as": [
                "other_user"
            ],
            "metadata": {
                "version": 1
            }
        }
    }
}

成功的调用将返回一个JSON结构,显示角色是否已创建、更新或未发生任何更改。

{
    "created": [ 
        "my_admin_role", 
        "my_user_role"
    ]
}

结果类型,其中之一为 createdupdatednooperrors

已创建的角色列表。

因为每个角色创建或更新的错误是单独处理的,所以API允许部分成功。

以下查询会为my_admin_role抛出错误,因为权限bad_cluster_privilege不存在,但对于my_user_role则会成功。

POST /_security/role
{
    "roles": {
        "my_admin_role": {
            "cluster": [
                "bad_cluster_privilege"
            ],
            "indices": [
                {
                    "names": [
                        "index1",
                        "index2"
                    ],
                    "privileges": ["all"],
                    "field_security": {
                        "grant": [
                            "title",
                            "body"
                        ]
                    },
                    "query": "{\"match\": {\"title\": \"foo\"}}"
                }
            ],
            "applications": [
                {
                    "application": "myapp",
                    "privileges": [
                        "admin",
                        "read"
                    ],
                    "resources": [
                        "*"
                    ]
                }
            ],
            "run_as": [
                "other_user"
            ],
            "metadata": {
                "version": 1
            }
        },
        "my_user_role": {
            "cluster": [
                "all"
            ],
            "indices": [
                {
                    "names": [
                        "index1"
                    ],
                    "privileges": [
                        "read"
                    ],
                    "field_security": {
                        "grant": [
                            "title",
                            "body"
                        ]
                    },
                    "query": "{\"match\": {\"title\": \"foo\"}}"
                }
            ],
            "applications": [
                {
                    "application": "myapp",
                    "privileges": [
                        "admin",
                        "read"
                    ],
                    "resources": [
                        "*"
                    ]
                }
            ],
            "run_as": [
                "other_user"
            ],
            "metadata": {
                "version": 1
            }
        }
    }
}

结果将把errors字段设置为true,并保留my_admin_role更新的错误。

{
    "created": [
        "my_user_role" 
    ],
    "errors": { 
        "count": 1, 
        "details": {
            "my_admin_role": { 
                "type": "action_request_validation_exception",
                "reason": "Validation Failed: 1: unknown cluster privilege [bad_cluster_privilege]. a privilege must be either one of the predefined cluster privilege names [manage_own_api_key,manage_data_stream_global_retention,monitor_data_stream_global_retention,none,cancel_task,cross_cluster_replication,cross_cluster_search,delegate_pki,grant_api_key,manage_autoscaling,manage_index_templates,manage_logstash_pipelines,manage_oidc,manage_saml,manage_search_application,manage_search_query_rules,manage_search_synonyms,manage_service_account,manage_token,manage_user_profile,monitor_connector,monitor_enrich,monitor_inference,monitor_ml,monitor_rollup,monitor_snapshot,monitor_text_structure,monitor_watcher,post_behavioral_analytics_event,read_ccr,read_connector_secrets,read_fleet_secrets,read_ilm,read_pipeline,read_security,read_slm,transport_client,write_connector_secrets,write_fleet_secrets,create_snapshot,manage_behavioral_analytics,manage_ccr,manage_connector,manage_enrich,manage_ilm,manage_inference,manage_ml,manage_rollup,manage_slm,manage_watcher,monitor_data_frame_transforms,monitor_transform,manage_api_key,manage_ingest_pipelines,manage_pipeline,manage_data_frame_transforms,manage_transform,manage_security,monitor,manage,all] or a pattern over one of the available cluster actions;"
            }
        }
    }
}

成功创建的角色。

遇到的错误。

导致错误的put角色请求的数量。

按角色名称键入的错误。

批量删除角色 API

edit

此功能处于技术预览阶段,可能会在未来的版本中进行更改或移除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。

在原生领域中批量删除角色。

请求

edit

DELETE /_security/role/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

角色管理API通常是管理角色的首选方式,而不是使用基于文件的角色管理。批量删除角色API不能删除在角色文件中定义的角色。

路径参数

edit
refresh
写请求的刷新策略的可选设置。默认为立即刷新。

请求体

edit

以下参数可以在DELETE请求的正文中指定,并涉及删除一组角色:

names
(list) 要删除的角色名称列表。

示例

edit

以下示例删除了一个my_admin_rolemy_user_role角色:

DELETE /_security/role
{
    "names": ["my_admin_role", "my_user_role"]
}

如果角色成功删除,请求将返回:

{
    "deleted": [
        "my_admin_role",
        "my_user_role"
    ]
}

如果找不到角色,未找到的角色将归类在 not_found 下:

DELETE /_security/role
{
    "names": ["my_admin_role", "not_an_existing_role"]
}
{
    "deleted": [
        "my_admin_role"
    ],
    "not_found": [
        "not_an_existing_role"
    ]
}

如果请求失败或无效,错误将归类在 errors 下:

DELETE /_security/role
{
    "names": ["my_admin_role", "superuser"]
}
{
    "deleted": [
        "my_admin_role"
    ],
    "errors": {
        "count": 1,
        "details": {
            "superuser": {
                "type": "illegal_argument_exception",
                "reason": "role [superuser] is reserved and cannot be deleted"
            }
        }
    }
}

创建或更新用户 API

edit

在本地领域中添加和更新用户。这些用户通常被称为本地用户

请求

edit

POST /_security/user/

PUT /_security/user/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

添加新用户时需要密码,但在更新现有用户时是可选的。要更改用户的密码而不更新任何其他字段,请使用更改密码 API

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
username

(必需,字符串) 用户的标识符。

用户名必须至少为1个字符,且不超过507个字符。它们可以包含字母数字字符(a-zA-Z0-9)、空格、标点符号以及基本拉丁(ASCII)字符块中的可打印符号。不允许使用前导或尾随空格。

查询参数

edit
refresh
(字符串) 可以是 truefalsewait_for 之一。 这些值与 索引 API 中的含义相同, 但此 API(Put User)的默认值为 true

请求体

edit

以下参数可以在POST或PUT请求的正文中指定:

enabled
(布尔值) 指定用户是否启用。默认值为 true
email
(字符串) 用户的电子邮件。
full_name
(字符串) 用户的完整姓名。
metadata
(object) 您希望与用户关联的任意元数据。
password

(必需*, 字符串) 用户的密码。密码必须至少6个字符长。

在添加用户时,需要提供passwordpassword_hash中的一个。 在更新现有用户时,密码是可选的,以便在不修改用户密码的情况下更新用户的其他字段(例如他们的角色)。

password_hash

(字符串) 用户密码的哈希值。这必须使用与配置用于密码存储的相同哈希算法生成。更多详情,请参阅 用户缓存和密码哈希算法中关于 xpack.security.authc.password_hashing.algorithm 设置的解释。

使用此参数允许客户端出于性能和/或保密原因预先哈希密码。

不能在同一请求中使用password参数和password_hash参数。

roles
(必需,列表) 用户拥有的一组角色。这些角色决定了用户的访问权限。要创建没有角色的用户,请指定一个空列表: []

*表示该设置在某些情况下是必需的,但并非所有情况下都必需。

示例

edit

以下示例创建了一个用户 jacknich

POST /_security/user/jacknich
{
  "password" : "l0ng-r4nd0m-p@ssw0rd",
  "roles" : [ "admin", "other_role1" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}

成功的调用将返回一个JSON结构,显示用户是否已被创建或更新。

{
  "created": true 
}

当更新现有用户时,created 设置为 false。

添加用户后,来自该用户的请求可以进行身份验证。例如:

curl -u jacknich:l0ng-r4nd0m-p@ssw0rd http://localhost:9200/_cluster/health

创建服务账户令牌 API

edit

创建一个服务账户令牌,以便在不使用基本身份验证的情况下进行访问。

请求

edit

POST /_security/service///credential/token/

PUT /_security/service///credential/token/

POST /_security/service///credential/token

先决条件

edit
  • 要使用此API,您必须至少拥有manage_service_account 集群权限

描述

edit

成功的创建服务账户令牌API调用返回一个JSON结构,其中包含服务账户令牌、其名称及其密钥值。

服务账户令牌永不过期。如果不再需要,您必须主动删除它们。

路径参数

edit
namespace
(必需,字符串)命名空间名称。
service
(必需,字符串) 服务名称。
token_name

(可选, 字符串) 服务账户令牌的名称。如果省略,将生成一个随机名称。

令牌名称必须至少为1个字符,且不超过256个字符。它们可以包含字母数字字符(a-zA-Z0-9)、破折号(-)和下划线(_),但不能以下划线开头。

令牌名称在关联的服务帐户上下文中必须是唯一的。它们还必须在其完全限定名称中全局唯一,这些名称由服务帐户主体和令牌名称组成,例如 //

示例

edit

以下请求创建一个服务账户令牌:

POST /_security/service/elastic/fleet-server/credential/token/token1

响应包括服务账户令牌、其名称及其密钥值:

{
  "created": true,
  "token": {
    "name": "token1",
    "value": "AAEAAWVsYXN0aWM...vZmxlZXQtc2VydmVyL3Rva2VuMTo3TFdaSDZ" 
  }
}

用作承载令牌的秘密值

要使用服务账户令牌,请在请求中包含生成的令牌值,并使用Authorization: Bearer头:

curl -H "Authorization: Bearer AAEAAWVsYXN0aWM...vZmxlZXQtc2VydmVyL3Rva2VuMTo3TFdaSDZ" http://localhost:9200/_cluster/health

如果你的节点将 xpack.security.http.ssl.enabled 设置为 true,那么 你必须在请求 URL 中指定 https

以下请求创建一个具有自动生成令牌名称的服务令牌:

POST /_security/service/elastic/fleet-server/credential/token

响应包括服务账户令牌、其自动生成的名称及其密钥值:

{
  "created": true,
  "token": {
    "name": "Jk5J1HgBuyBK5TpDrdo4",
    "value": "AAEAAWVsYXN0aWM...vZmxlZXQtc2VydmVyL3Rva2VuMTo3TFdaSDZ"
  }
}

委托 PKI 认证 API

edit

实现将X509Certificate链交换为Elasticsearch访问令牌。

请求

edit

POST /_security/delegate_pki

先决条件

edit
  • 要调用此API,(代理)用户必须具有delegate_pkiall 集群权限。内置的kibana_system角色已经授予此权限。请参阅安全权限

描述

edit

此API实现了将X509Certificate链交换为Elasticsearch访问令牌的功能。根据RFC 5280,证书链通过依次考虑每个已安装的PKI领域的信任配置进行验证,其中delegation.enabled设置为true(默认值为false)。成功信任的客户端证书还需根据相应领域的username_pattern验证主题专有名称。

此API由智能可信代理(如Kibana)调用,这些代理终止用户的TLS会话,但仍希望通过使用PKI领域来验证用户,就像用户直接连接到Elasticsearch一样。有关更多详细信息,请参阅PKI authentication for clients connecting to Kibana

目标证书中的主题公钥与相应私钥之间的关联经过验证。这是TLS认证过程的一部分,并委托给调用此API的代理。代理被信任已执行TLS认证,此API将该认证转换为Elasticsearch访问令牌。

请求体

edit
x509_certificate_chain

(必需,字符串列表) X509Certificate 链,表示为一个有序的字符串数组。数组中的每个字符串都是证书的 DER 编码的 base64 编码(RFC4648 第 4 节 - 不是 base64url 编码)。

第一个元素是目标证书,包含请求访问的主体可分辨名称。这可能后面跟随额外的证书;每个后续证书用于证明前一个证书。

响应体

edit
access_token
(字符串) 与客户端证书的主题区分名相关联的访问令牌。
expires_in
(时间单位) 令牌过期的时长(以秒为单位)。
type
(字符串) 令牌的类型。

示例

edit

以下是一个示例请求:

POST /_security/delegate_pki
{
  "x509_certificate_chain": ["MIIDeDCCAmCgAwIBAgIUBzj/nGGKxP2iXawsSquHmQjCJmMwDQYJKoZIhvcNAQELBQAwUzErMCkGA1UEAxMiRWxhc3RpY3NlYXJjaCBUZXN0IEludGVybWVkaWF0ZSBDQTEWMBQGA1UECxMNRWxhc3RpY3NlYXJjaDEMMAoGA1UEChMDb3JnMB4XDTIzMDcxODE5MjkwNloXDTQzMDcxMzE5MjkwNlowSjEiMCAGA1UEAxMZRWxhc3RpY3NlYXJjaCBUZXN0IENsaWVudDEWMBQGA1UECxMNRWxhc3RpY3NlYXJjaDEMMAoGA1UEChMDb3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAllHL4pQkkfwAm/oLkxYYO+r950DEy1bjH+4viCHzNADLCTWO+lOZJVlNx7QEzJE3QGMdif9CCBBxQFMapA7oUFCLq84fPSQQu5AnvvbltVD9nwVtCs+9ZGDjMKsz98RhSLMFIkxdxi6HkQ3Lfa4ZSI4lvba4oo+T/GveazBDS+NgmKyq00EOXt3tWi1G9vEVItommzXWfv0agJWzVnLMldwkPqsw0W7zrpyT7FZS4iLbQADGceOW8fiauOGMkscu9zAnDR/SbWl/chYioQOdw6ndFLn1YIFPd37xL0WsdsldTpn0vH3YfzgLMffT/3P6YlwBegWzsx6FnM/93Ecb4wIDAQABo00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBQKNRwjW+Ad/FN1Rpoqme/5+jrFWzAfBgNVHSMEGDAWgBRcya0c0x/PaI7MbmJVIylWgLqXNjANBgkqhkiG9w0BAQsFAAOCAQEACZ3PF7Uqu47lplXHP6YlzYL2jL0D28hpj5lGtdha4Muw1m/BjDb0Pu8l0NQ1z3AP6AVcvjNDkQq6Y5jeSz0bwQlealQpYfo7EMXjOidrft1GbqOMFmTBLpLA9SvwYGobSTXWTkJzonqVaTcf80HpMgM2uEhodwTcvz6v1WEfeT/HMjmdIsq4ImrOL9RNrcZG6nWfw0HR3JNOgrbfyEztEI471jHznZ336OEcyX7gQuvHE8tOv5+oD1d7s3Xg1yuFp+Ynh+FfOi3hPCuaHA+7F6fLmzMDLVUBAllugst1C3U+L/paD7tqIa4ka+KNPCbSfwazmJrt4XNiivPR4hwH5g=="] 
}

一个单元素的证书链。

返回以下响应:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "authentication" : {
    "username" : "Elasticsearch Test Client",
    "roles" : [ ],
    "full_name" : null,
    "email" : null,
    "metadata" : {
      "pki_dn" : "O=org, OU=Elasticsearch, CN=Elasticsearch Test Client",
      "pki_delegated_by_user" : "test_admin",
      "pki_delegated_by_realm" : "file"
    },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "pki1",
      "type" : "pki"
    },
    "lookup_realm" : {
      "name" : "pki1",
      "type" : "pki"
    },
    "authentication_type" : "realm"
  }
}

删除应用程序权限 API

edit

移除应用程序权限

请求

edit

DELETE /_security/privilege//

先决条件

edit

要使用此API,您必须拥有以下任一条件:

  • manage_security 集群权限(或更高权限,如 all);或者
  • 请求中引用的应用程序的 “管理应用程序权限” 全局权限

路径参数

edit
application
(必需,字符串) 应用程序的名称。应用程序权限总是与一个应用程序相关联。
privilege
(必需, 字符串) 权限的名称。

示例

edit

以下示例从 myapp 应用程序中删除了 read 应用程序权限:

DELETE /_security/privilege/myapp/read

如果权限成功删除,请求将返回 {"found": true}。 否则,found 设置为 false。

{
  "myapp": {
    "read": {
      "found" : true
    }
  }
}

删除角色映射 API

edit

移除角色映射。

请求

edit

DELETE /_security/role_mapping/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

角色映射定义了每个用户被分配的角色。更多信息,请参见将用户和组映射到角色

角色映射API通常是管理角色映射的首选方式,而不是使用角色映射文件。删除角色映射API无法移除在角色映射文件中定义的角色映射。

路径参数

edit
name
(字符串) 用于标识角色映射的唯一名称。该名称仅作为通过API进行交互的标识符使用;它不会以任何方式影响映射的行为。

示例

edit

以下示例删除角色映射:

DELETE /_security/role_mapping/mapping1

如果映射成功删除,请求将返回 {"found": true}。 否则,found 设置为 false。

{
  "found" : true
}

删除角色 API

edit

移除本机领域中的角色。

请求

edit

DELETE /_security/role/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

角色管理API通常是管理角色的首选方式,而不是使用基于文件的角色管理。删除角色API无法移除在角色文件中定义的角色。

路径参数

edit
name
(字符串) 角色的名称。

示例

edit

以下示例删除了一个my_admin_role角色:

DELETE /_security/role/my_admin_role

如果角色成功删除,请求将返回{"found": true}。 否则,found 设置为 false。

{
  "found" : true
}

删除服务账户令牌 API

edit

删除指定命名空间服务服务帐户令牌。

请求

edit

DELETE /_security/service///credential/token/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_service_account 集群权限

描述

edit

API 响应指示是否找到并删除了指定的服务帐户令牌,或者未找到该令牌。

路径参数

edit
namespace
(必需,字符串)命名空间名称。
service
(必需,字符串) 服务名称。
token_name
(必需,字符串)服务账户令牌的名称。

示例

edit

以下请求从elastic/fleet-server服务帐户中删除token1服务帐户令牌:

DELETE /_security/service/elastic/fleet-server/credential/token/token42

如果服务账户令牌成功删除,请求将返回{"found": true}。否则,响应将具有状态码404,并且`found`将被设置为false

{
  "found" : true
}

删除用户 API

edit

从本地领域删除用户。

请求

edit

DELETE /_security/user/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
username
(必需,字符串) 用户的标识符。

示例

edit

以下示例删除了用户 jacknich

DELETE /_security/user/jacknich

如果用户成功删除,请求将返回{"found": true}。 否则,found 将设置为 false。

{
  "found" : true
}

禁用用户 API

edit

在本地领域中禁用用户。

请求

edit

PUT /_security/user//_disable

前提条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

默认情况下,当您创建用户时,他们是启用的。您可以使用此API来撤销用户对Elasticsearch的访问权限。要重新启用用户,有一个启用用户API

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
username
(必需, 字符串) 用户的标识符。

示例

edit

以下示例禁用了用户 jacknich

PUT /_security/user/jacknich/_disable

启用用户API

edit

在本地领域启用用户。

请求

edit

PUT /_security/user//_enable

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

描述

edit

默认情况下,当您创建用户时,他们是启用的。您可以使用此启用用户 API 和 禁用用户 API 来更改该属性。

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
username
(必需,字符串) 用户的标识符。

示例

edit

以下示例启用了用户 jacknich

PUT /_security/user/jacknich/_enable

注册 Kibana API

edit

使Kibana实例能够配置自身以与安全的Elasticsearch集群进行通信。

此API目前仅供Kibana内部使用。

请求

edit

GET /_security/enroll/kibana

描述

edit

Kibana 在内部使用此 API 来配置自身,以便与已启用安全功能的 Elasticsearch 集群进行通信。

示例

edit

以下示例展示了如何注册一个 Kibana 实例。

GET /_security/enroll/kibana

API返回以下响应:

{
  "token" : {
    "name" : "enroll-process-token-1629123923000", 
    "value": "AAEAAWVsYXN0aWM...vZmxlZXQtc2VydmVyL3Rva2VuMTo3TFdaSDZ" 
  },
  "http_ca" : "MIIJlAIBAzVoGCSqGSIb3...vsDfsA3UZBAjEPfhubpQysAICAA=", 
}

用于elastic/kibana服务账户的持有者令牌的名称。

用于elastic/kibana服务账户的承载令牌的值。 使用此值来验证服务账户与Elasticsearch的身份。

用于签署Elasticsearch在HTTP层上用于TLS的节点证书的CA证书。该证书以ASN.1 DER编码的Base64编码字符串形式返回。

注册节点 API

edit

允许一个新节点加入已启用安全功能的现有集群。

请求

edit

GET /_security/enroll/node

描述

edit

enroll node API 的目的是允许一个新节点加入一个已启用了安全性的现有集群。enroll node API 响应包含加入节点启动发现和安全相关设置所需的所有信息,以便其能够成功加入集群。

响应包含密钥和证书材料,允许调用者为集群中所有节点的HTTP层生成有效的签名证书。

示例

edit
GET /security/enroll/node

API返回的响应如下

{
  "http_ca_key" : "MIIJlAIBAzCCCVoGCSqGSIb3DQEHAaCCCUsEgglHMIIJQzCCA98GCSqGSIb3DQ....vsDfsA3UZBAjEPfhubpQysAICCAA=", 
  "http_ca_cert" : "MIIJlAIBAzCCCVoGCSqGSIb3DQEHAaCCCUsEgglHMIIJQzCCA98GCSqGSIb3DQ....vsDfsA3UZBAjEPfhubpQysAICCAA=", 
  "transport_ca_cert" : "MIIJlAIBAzCCCVoGCSqGSIb3DQEHAaCCCUsEgglHMIIJQzCCA98GCSqG....vsDfsA3UZBAjEPfhubpQysAICCAA=", 
  "transport_key" : "MIIEJgIBAzCCA98GCSqGSIb3DQEHAaCCA9AEggPMMIIDyDCCA8QGCSqGSIb3....YuEiOXvqZ6jxuVSQ0CAwGGoA==", 
  "transport_cert" : "MIIEJgIBAzCCA98GCSqGSIb3DQEHAaCCA9AEggPMMIIDyDCCA8QGCSqGSIb3....YuEiOXvqZ6jxuVSQ0CAwGGoA==", 
  "nodes_addresses" : [                          
    "192.168.1.2:9300"
  ]
}

新节点用于签署其HTTP层证书的CA私钥,作为ASN.1 DER编码的Base64编码字符串。

新节点用于为其HTTP层证书签名的CA证书,作为ASN.1 DER编码的Base64编码字符串。

用于签署传输层TLS证书的CA证书,作为ASN.1 DER编码的Base64编码字符串。

节点可以用于其传输层TLS的私钥,作为ASN.1 DER编码的Base64编码字符串。

节点可用于其传输层TLS的证书,作为ASN.1 DER编码的Base64编码字符串。

已加入集群的节点的传输地址列表,格式为 主机:端口

获取API密钥信息API

edit

检索一个或多个API密钥的信息。

请求

edit

GET /_security/api_key

先决条件

edit
  • 要使用此API,您必须至少拥有manage_own_api_keyread_security集群权限。

    • 如果你只有 manage_own_api_key 权限,此 API 仅返回你拥有的 API 密钥。

      使用具有 manage_own_api_key 权限的 API 密钥进行身份验证,不允许检索已验证用户的自有密钥。相反,请使用基本凭证对用户进行身份验证。

    • 如果你有 read_securitymanage_api_key 或更高的权限(包括 manage_security),此 API 返回所有 API 密钥,无论所有权如何。

描述

edit

可以通过此API检索由创建API密钥生成的API密钥信息。

路径参数

edit

以下参数可以在GET请求的查询参数中指定,并涉及检索API密钥:

id
(可选,字符串) API 密钥 ID。此参数不能与任何 namerealm_nameusername 一起使用。
name
(可选,字符串) API 密钥名称。此参数不能与任何 idrealm_nameusername 一起使用。它支持带通配符的前缀搜索。
realm_name
(可选,字符串) 认证领域名称。此参数不能与 idname 一起使用,也不能在 owner 标志设置为 true 时使用。
username
(可选,字符串) 用户的用户名。此参数不能与 idname 一起使用,也不能在 owner 标志设置为 true 时使用。
owner
(可选, 布尔值) 一个布尔标志,可用于查询当前经过身份验证的用户拥有的API密钥。默认为false。 当此参数设置为true时,不能指定realm_nameusername参数,因为它们被假定为当前经过身份验证的用户。
with_limited_by
(可选, 布尔值) 一个布尔标志,用于返回与API密钥关联的所有者用户的角色描述符的快照。API密钥的实际权限是其分配的角色描述符与所有者用户的角色描述符的交集(实际上受其限制)。API密钥必须具有manage_api_key或更高权限才能检索任何API密钥(包括其自身)的受限角色描述符。
with_profile_uid
(可选,布尔值) 确定是否也为API密钥所有者用户检索用户配置文件 uid。 如果存在,配置文件uid将在每个API密钥的profile_uid响应字段下返回。 默认为false
active_only
(可选, 布尔值) 一个布尔标志,用于查询当前处于活动状态的API密钥。 API密钥在查询时如果既未失效也未过期,则被视为活动状态。您可以与其他参数(如ownername)一起指定此参数。如果active_onlyfalse,响应将同时包含活动和非活动(已过期或已失效)的密钥。默认为false

当未指定参数 "id"、"name"、"username" 和 "realm_name",并且 "owner" 设置为 false 时,如果用户有权限,它将检索所有 API 密钥。如果用户无权检索其他用户的 API 密钥,则会返回错误。

示例

edit

如果你如下创建一个API密钥:

POST /_security/api_key
{
  "name": "my-api-key",
  "role_descriptors": {},
  "metadata": {
    "application": "myapp"
  }
}

成功调用后返回一个JSON结构,提供API密钥信息。例如:

{
  "id":"VuaCfGcBCdbkQm-e5aOx",
  "name":"my-api-key",
  "api_key":"ui2lp2axTNmsyakw9tvNnw",
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}

您可以使用以下示例通过ID检索API密钥:

GET /_security/api_key?id=VuaCfGcBCdbkQm-e5aOx&with_limited_by=true

成功调用返回一个包含API密钥信息的JSON结构:

{
  "api_keys": [ 
    {
      "id": "VuaCfGcBCdbkQm-e5aOx", 
      "name": "my-api-key", 
      "creation": 1548550550158, 
      "expiration": 1548551550158, 
      "invalidated": false, 
      "username": "myuser", 
      "realm": "native1", 
      "realm_type": "native",
      "metadata": { 
        "application": "myapp"
      },
      "role_descriptors": { }, 
      "limited_by": [  
        {
          "role-power-user": {
            "cluster": [
              "monitor"
            ],
            "indices": [
              {
                "names": [
                  "*"
                ],
                "privileges": [
                  "read"
                ],
                "allow_restricted_indices": false
              }
            ],
            "applications": [ ],
            "run_as": [ ],
            "metadata": { },
            "transient_metadata": {
              "enabled": true
            }
          }
        }
      ]
    }
  ]
}

为此次请求检索到的API密钥列表。

API 密钥的 ID

API 密钥的名称

API 密钥的创建时间,以毫秒为单位

API 密钥的可选过期时间,单位为毫秒

API 密钥的失效状态。如果该密钥已被失效,则其值为 true,并且还有一个包含失效时间的附加字段,以毫秒为单位。否则,其值为 false

创建此API密钥的主体

为创建此API密钥的主体所在的领域名称

API 密钥的元数据

分配给此API密钥的角色描述符,当它被创建 或最后更新时。 一个空的角色描述符意味着API密钥继承所有者的用户权限。

与API密钥关联的所有者用户的权限。 这是在创建和 后续更新时捕获的时间点快照。API密钥的 有效权限是其分配的权限与 所有者用户权限的交集。

您可以使用以下示例按名称检索API密钥:

GET /_security/api_key?name=my-api-key

API密钥名称支持通过使用通配符进行前缀搜索:

GET /_security/api_key?name=my-*

以下示例检索 native1 领域中的所有 API 密钥:

GET /_security/api_key?realm_name=native1

以下示例检索用户 myuser 在所有领域中的所有 API 密钥:

GET /_security/api_key?username=myuser

以下示例检索当前经过身份验证的用户拥有的所有 API 密钥:

GET /_security/api_key?owner=true

以下示例在用户有权限的情况下检索所有API密钥:

GET /_security/api_key

以下示例在用户有权限的情况下检索所有活动的API密钥:

GET /_security/api_key?active_only=true

以下创建一个API密钥

POST /_security/api_key
{
  "name": "my-api-key-1",
  "metadata": {
    "application": "my-application"
  }
}

以下示例检索由当前经过身份验证的用户拥有的、标识为指定id的API密钥:

GET /_security/api_key?id=VuaCfGcBCdbkQm-e5aOx&owner=true

最后,以下示例立即检索用户 myusernative1 领域中的所有 API 密钥:

GET /_security/api_key?username=myuser&realm_name=native1

成功的调用将返回一个包含一个或多个API密钥信息的JSON结构。

{
  "api_keys": [
    {
      "id": "0GF5GXsBCXxz2eDxWwFN",
      "name": "hadoop_myuser_key",
      "creation": 1548550550158,
      "expiration": 1548551550158,
      "invalidated": false,
      "username": "myuser",
      "realm": "native1",
      "realm_type": "native",
      "metadata": {
        "application": "myapp"
      },
      "role_descriptors": {
        "role-a": {
          "cluster": [
            "monitor"
          ],
          "indices": [
            {
              "names": [
                "index-a"
              ],
              "privileges": [
                "read"
              ],
              "allow_restricted_indices": false
            }
          ],
          "applications": [ ],
          "run_as": [ ],
          "metadata": { },
          "transient_metadata": {
            "enabled": true
          }
        }
      }
    },
    {
      "id": "6wHJmcQpReKBa42EHV5SBw",
      "name": "api-key-name-2",
      "creation": 1548550550158,
      "invalidated": false,
      "username": "user-y",
      "realm": "realm-2",
      "metadata": {},
      "role_descriptors": { }
    }
  ]
}

获取应用程序权限 API

edit

检索应用程序权限

请求

edit

GET /_security/privilege

GET /_security/privilege/

GET /_security/privilege//

先决条件

edit

要使用此API,您必须拥有以下任一条件:

  • read_security 集群权限(或更高权限,如 manage_securityall);或者
  • 所引用应用程序的 “管理应用程序权限” 全局权限

描述

edit

要检查用户的应用程序权限,请使用has privileges API

路径参数

edit
application
(可选,字符串) 应用程序的名称。应用程序权限总是与一个应用程序相关联。如果你不指定这个参数,API将返回所有应用程序的所有权限信息。
privilege
(可选,字符串) 权限的名称。如果您不指定此参数,API 将返回所请求应用程序的所有权限信息。

示例

edit

以下示例检索有关app01应用程序的read权限的信息:

GET /_security/privilege/myapp/read

成功的调用返回一个由应用程序名称和权限名称键控的对象。如果权限未定义,请求将返回404状态。

{
  "myapp": {
    "read": {
      "application": "myapp",
      "name": "read",
      "actions": [
        "data:read/*",
        "action:login"
      ],
      "metadata": {
        "description": "Read access to myapp"
      }
    }
  }
}

要检索应用程序的所有权限,请省略权限名称:

GET /_security/privilege/myapp/

要检索所有特权,请省略应用程序和特权名称:

GET /_security/privilege/

获取内置权限 API

edit

检索在此版本的 Elasticsearch 中可用的集群权限索引权限列表。

请求

edit

GET /_security/privilege/_builtin

先决条件

edit
  • 要使用此API,您必须拥有read_security集群权限(或更高权限,如manage_securityall)。

描述

edit

此API检索在正在查询的Elasticsearch版本中可用的集群和索引权限名称集。

要检查用户是否具有特定权限,请使用has privileges API

响应体

edit

响应是一个包含两个字段的对象:

cluster
(字符串数组) 此版本的 Elasticsearch 所理解的 集群权限列表。
index
(字符串数组) 此版本的 Elasticsearch 所理解的 索引权限列表。
remote_cluster
(字符串数组) 此版本的 Elasticsearch 所理解的 远程集群 权限列表。

示例

edit

以下示例检索所有内置权限的名称:

GET /_security/privilege/_builtin

成功调用返回一个包含“cluster”、“index”和“remote_cluster”字段的对象。

{
  "cluster" : [
    "all",
    "cancel_task",
    "create_snapshot",
    "cross_cluster_replication",
    "cross_cluster_search",
    "delegate_pki",
    "grant_api_key",
    "manage",
    "manage_api_key",
    "manage_autoscaling",
    "manage_behavioral_analytics",
    "manage_ccr",
    "manage_connector",
    "manage_data_frame_transforms",
    "manage_data_stream_global_retention",
    "manage_enrich",
    "manage_ilm",
    "manage_index_templates",
    "manage_inference",
    "manage_ingest_pipelines",
    "manage_logstash_pipelines",
    "manage_ml",
    "manage_oidc",
    "manage_own_api_key",
    "manage_pipeline",
    "manage_rollup",
    "manage_saml",
    "manage_search_application",
    "manage_search_query_rules",
    "manage_search_synonyms",
    "manage_security",
    "manage_service_account",
    "manage_slm",
    "manage_token",
    "manage_transform",
    "manage_user_profile",
    "manage_watcher",
    "monitor",
    "monitor_connector",
    "monitor_data_frame_transforms",
    "monitor_data_stream_global_retention",
    "monitor_enrich",
    "monitor_inference",
    "monitor_ml",
    "monitor_rollup",
    "monitor_snapshot",
    "monitor_text_structure",
    "monitor_transform",
    "monitor_watcher",
    "none",
    "post_behavioral_analytics_event",
    "read_ccr",
    "read_connector_secrets",
    "read_fleet_secrets",
    "read_ilm",
    "read_pipeline",
    "read_security",
    "read_slm",
    "transport_client",
    "write_connector_secrets",
    "write_fleet_secrets"
  ],
  "index" : [
    "all",
    "auto_configure",
    "create",
    "create_doc",
    "create_index",
    "cross_cluster_replication",
    "cross_cluster_replication_internal",
    "delete",
    "delete_index",
    "index",
    "maintenance",
    "manage",
    "manage_data_stream_lifecycle",
    "manage_follow_index",
    "manage_ilm",
    "manage_leader_index",
    "monitor",
    "none",
    "read",
    "read_cross_cluster",
    "view_index_metadata",
    "write"
  ],
  "remote_cluster" : [
    "monitor_enrich"
  ]
}

获取角色映射 API

edit

检索角色映射。

请求

edit

GET /_security/role_mapping

GET /_security/role_mapping/

先决条件

edit
  • 要使用此API,您必须至少拥有read_security集群权限。

描述

edit

角色映射定义了每个用户被分配的角色。更多信息,请参见将用户和组映射到角色

角色映射API通常是管理角色映射的首选方式,而不是使用角色映射文件。 获取角色映射API无法检索在角色映射文件中定义的角色映射。

路径参数

edit
name
(可选,字符串) 用于标识角色映射的唯一名称。该名称仅用作通过API进行交互的标识符;它不会以任何方式影响映射的行为。您可以指定多个映射名称,以逗号分隔的列表形式。如果您未指定此参数,API将返回有关所有角色映射的信息。

响应体

edit

成功的调用会检索到一个对象,其中键是请求映射的名称,值是这些映射的JSON表示。更多信息,请参阅角色映射资源

响应代码

edit

如果没有与请求名称对应的映射,响应将返回状态码 404

示例

edit

以下示例检索有关 mapping1 角色映射的信息:

GET /_security/role_mapping/mapping1
{
  "mapping1": {
    "enabled": true,
    "roles": [
      "user"
    ],
    "rules": {
      "field": {
        "username": "*"
      }
    },
    "metadata": {}
  }
}

获取角色 API

edit

检索本机领域中的角色。

请求

edit

GET /_security/role

GET /_security/role/

先决条件

edit
  • 要使用此API,您必须至少拥有read_security集群权限。

描述

edit

角色管理API通常是管理角色的首选方式,而不是使用基于文件的角色管理。get roles API无法检索在角色文件中定义的角色。

路径参数

edit
name
(可选,字符串) 角色的名称。您可以指定多个角色作为逗号分隔的列表。如果您不指定此参数,API 将返回有关所有角色的信息。

响应体

edit

成功调用后返回一个包含角色信息的数组,其中包含角色的JSON表示形式。返回的角色格式是角色定义格式的简单扩展,仅添加了一个额外的字段transient_metadata.enabled。如果角色被自动禁用,例如当许可证级别不允许角色授予的某些权限时,此字段为false

响应代码

edit

如果角色未在原生领域中定义,请求将返回404。

示例

edit

以下示例检索有关本机领域中my_admin_role角色的信息:

GET /_security/role/my_admin_role
{
  "my_admin_role": {
    "description": "Grants full access to all management features within the cluster.",
    "cluster" : [ "all" ],
    "indices" : [
      {
        "names" : [ "index1", "index2" ],
        "privileges" : [ "all" ],
        "allow_restricted_indices" : false,
        "field_security" : {
          "grant" : [ "title", "body" ]}
      }
    ],
    "applications" : [ ],
    "run_as" : [ "other_user" ],
    "metadata" : {
      "version" : 1
    },
    "transient_metadata": {
      "enabled": true
    }
  }
}

要检索所有角色,请省略角色名称:

GET /_security/role

查询角色 API

edit

查询DSL的方式检索角色,并以分页的方式进行。

请求

edit

GET /_security/_query/role

POST /_security/_query/role

先决条件

edit
  • 要使用此API,您必须至少拥有read_security集群权限。

描述

edit

角色管理API通常是管理角色的首选方式,而不是使用基于文件的角色管理。查询角色API不会检索在角色文件中定义的角色,也不会检索内置角色。您可以选择使用查询来过滤结果。此外,结果可以分页和排序。

请求体

edit

您可以在请求体中指定以下参数:

query

(可选,字符串) 一个 查询 用于过滤返回的角色。 该查询支持部分查询类型,包括 match_all, bool, term, terms, match, ids, prefix, wildcard, exists, range, 以及 simple query string

您可以查询与角色关联的以下值。

Valid values for query
name
(keyword) The name of the role.
description
(text) The description of the role.
metadata
(flattened) Metadata field associated with the role, such as metadata.app_tag. Note that metadata is internally indexed as a flattened field type. This means that all sub-fields act like keyword fields when querying and sorting. It also implies that it is not possible to refer to a subset of metadata fields using wildcard patterns, e.g. metadata.field*, even for query types that support field name patterns. Lastly, all the metadata fields can be searched together when simply mentioning the metadata field (i.e. not followed by any dot and sub-field name).
applications

该角色授予的应用程序权限列表。

application
(keyword) The name of the application associated to the privileges and resources.
privileges
(keyword) The names of the privileges that the role grants.
resources
(keyword) The resources to which the privileges apply.
from

(可选,整数) 起始文档偏移量。需要是非负数,默认为 0

默认情况下,您不能使用fromsize参数分页浏览超过10,000条结果。要分页浏览更多结果,请使用search_after参数。

size

(可选, 整数) 返回的命中数量。必须为非负数,默认为 10

默认情况下,您不能使用fromsize参数分页浏览超过10,000条结果。要分页浏览更多结果,请使用search_after参数。

sort
(可选, 对象) 排序定义。你可以按 usernamerolesenabled 进行排序。 此外,还可以对 _doc 字段应用排序,以按索引顺序排序。
search_after
(可选, 数组) Search after 定义。

响应体

edit

此API返回以下顶级字段:

total
找到的角色总数。
count
响应中返回的角色数量。
roles
与查询匹配的角色列表。 返回的角色格式是角色定义格式的扩展。 它添加了transient_metadata.enabled_sort字段。 transient_metadata.enabled在角色被自动禁用时设置为false, 例如当角色授予的权限不被已安装的许可证允许时。 _sort在搜索查询对某些字段进行排序时存在。 它包含用于排序的值的数组。

示例

edit

以下请求列出了所有角色,按角色名称排序:

POST /_security/_query/role
{
    "sort": ["name"]
}

成功的调用将返回一个包含为一个或多个角色检索到的信息的JSON结构:

{
    "total": 2,
    "count": 2,
    "roles": [ 
        {
          "name" : "my_admin_role",
          "cluster" : [
            "all"
          ],
          "indices" : [
            {
              "names" : [
                "index1",
                "index2"
              ],
              "privileges" : [
                "all"
              ],
              "field_security" : {
                "grant" : [
                  "title",
                  "body"
                ]
              },
              "allow_restricted_indices" : false
            }
          ],
          "applications" : [ ],
          "run_as" : [
            "other_user"
          ],
          "metadata" : {
            "version" : 1
          },
          "transient_metadata" : {
            "enabled" : true
          },
          "description" : "Grants full access to all management features within the cluster.",
          "_sort" : [
            "my_admin_role"
          ]
        },
        {
          "name" : "my_user_role",
          "cluster" : [ ],
          "indices" : [
            {
              "names" : [
                "index1",
                "index2"
              ],
              "privileges" : [
                "all"
              ],
              "field_security" : {
                "grant" : [
                  "title",
                  "body"
                ]
              },
              "allow_restricted_indices" : false
            }
          ],
          "applications" : [ ],
          "run_as" : [ ],
          "metadata" : {
            "version" : 1
          },
          "transient_metadata" : {
            "enabled" : true
          },
          "description" : "Grants user access to some indicies.",
          "_sort" : [
            "my_user_role"
          ]
        }
    ]
}

为该请求检索到的角色列表

同样地,可以使用以下请求来查询仅具有特定描述的用户访问角色:

POST /_security/_query/role
{
  "query": {
    "match": {
      "description": {
        "query": "user access"
      }
    }
  },
  "size": 1 
}

仅返回最佳匹配的角色

{
    "total": 2,
    "count": 1,
    "roles": [
        {
          "name" : "my_user_role",
          "cluster" : [ ],
          "indices" : [
            {
              "names" : [
                "index1",
                "index2"
              ],
              "privileges" : [
                "all"
              ],
              "field_security" : {
                "grant" : [
                  "title",
                  "body"
                ]
              },
              "allow_restricted_indices" : false
            }
          ],
          "applications" : [ ],
          "run_as" : [ ],
          "metadata" : {
            "version" : 1
          },
          "transient_metadata" : {
            "enabled" : true
          },
          "description" : "Grants user access to some indicies."
        }
    ]
}

获取服务账户 API

edit

检索有关服务账户的信息。

目前,仅提供 elastic/fleet-server 服务账户。

请求

edit

GET /_security/service

GET /_security/service/

GET /_security/service//

先决条件

edit
  • 要使用此API,您必须至少拥有manage_service_account 集群权限

描述

edit

此API返回与提供的路径参数匹配的服务帐户列表。

路径参数

edit
namespace
(可选,字符串) 命名空间的名称。省略此参数以检索所有服务帐户的信息。如果省略此参数,还必须省略 service 参数。
service
(可选,字符串) 服务名称的名称。省略此参数以 检索属于指定 namespace 的所有服务帐户的信息。

响应体

edit

成功的调用将返回一个服务账户的JSON对象。如果未找到服务账户,API将返回一个空对象。

示例

edit

以下请求检索elastic/fleet-server服务帐户的服务帐户:

GET /_security/service/elastic/fleet-server
{
  "elastic/fleet-server": {
    "role_descriptor": {
      "cluster": [
        "monitor",
        "manage_own_api_key",
        "read_fleet_secrets",
        "cluster:admin/xpack/connector/*"
      ],
      "indices": [
        {
          "names": [
            "logs-*",
            "metrics-*",
            "traces-*",
            ".logs-endpoint.diagnostic.collection-*",
            ".logs-endpoint.action.responses-*",
            ".logs-endpoint.heartbeat-*"
          ],
          "privileges": [
            "write",
            "create_index",
            "auto_configure"
          ],
          "allow_restricted_indices": false
        },
        {
          "names": [
            "profiling-*"
          ],
          "privileges": [
            "read",
            "write"
          ],
          "allow_restricted_indices": false
        },
        {
          "names": [
            "traces-apm.sampled-*"
          ],
          "privileges": [
            "read",
            "monitor",
            "maintenance"
          ],
          "allow_restricted_indices": false
        },
        {
          "names": [
            ".fleet-secrets*"
          ],
          "privileges": [
            "read"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-actions*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-agents*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-artifacts*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-enrollment-api-keys*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-policies*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-policies-leader*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-servers*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            ".fleet-fileds*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance"
          ],
          "allow_restricted_indices": true
        },
        {
          "names": [
            "synthetics-*"
          ],
          "privileges": [
            "read",
            "write",
            "create_index",
            "auto_configure"
          ],
          "allow_restricted_indices": false
        },
        {
          "names": [
            ".elastic-connectors*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance",
            "view_index_metadata"
          ],
          "allow_restricted_indices": false
        },
        {
          "names": [
            "content-*",
            ".search-acl-filter-*"
          ],
          "privileges": [
            "read",
            "write",
            "monitor",
            "create_index",
            "auto_configure",
            "maintenance",
            "view_index_metadata"
          ],
          "allow_restricted_indices": false
        }
      ],
      "applications": [
        {
          "application": "kibana-*",
          "privileges": [
            "reserved_fleet-setup"
          ],
          "resources": [
            "*"
          ]
        }
      ],
      "run_as": [],
      "metadata": {},
      "transient_metadata": {
        "enabled": true
      }
    }
  }
}

省略 namespaceservice 以检索所有服务帐户:

GET /_security/service

获取服务账户凭证API

edit

检索某个服务账户的所有服务凭证。

请求

edit

GET /_security/service///credential

先决条件

edit
  • 要使用此API,您必须至少拥有read_security 集群权限(或更高权限,如manage_service_accountmanage_security)。

描述

edit

使用此API检索服务帐户的凭据列表。 响应包括通过 创建服务帐户令牌API 创建的服务帐户令牌以及来自集群中所有节点的文件支持的令牌。

对于由 service_tokens 文件支持的令牌,API 从集群的所有节点收集它们。来自不同节点的具有相同名称的令牌被假定为相同的令牌,并且仅在服务令牌总数中计数一次。

路径参数

edit
namespace
(必需,字符串)命名空间名称。
service
(必需,字符串) 服务名称。

示例

edit

以下请求使用创建服务账户令牌APIelastic/fleet-server服务账户中创建名为token1的服务账户令牌:

POST /_security/service/elastic/fleet-server/credential/token/token1

以下请求返回elastic/fleet-server服务帐户的所有凭据:

GET /_security/service/elastic/fleet-server/credential

响应包括与指定服务帐户相关的所有凭据:

{
  "service_account": "elastic/fleet-server",
  "count": 3,
  "tokens": {
    "token1": {},        
    "token42": {}        
  },
  "nodes_credentials": { 
    "_nodes": {          
      "total": 3,
      "successful": 3,
      "failed": 0
    },
    "file_tokens": {      
      "my-token": {
        "nodes": [ "node0", "node1" ] 
      }
    }
  }
}

一个新的服务账户令牌,由.security索引支持

一个由 .security 索引支持的现有服务账户令牌

本节包含从集群所有节点收集的服务帐户凭据

显示节点如何响应上述收集请求的总体状态

从所有节点收集的文件支持的令牌

找到(文件支持的)my-token 的节点列表

获取安全索引设置

edit

检索安全内部索引的设置。

先决条件

edit
  • 要使用此API,您必须至少拥有read_security集群权限。

描述

edit

此API允许用户检索安全内部索引(.security 及其相关索引)的用户可配置设置。只会显示索引设置的一个子集——那些用户可配置的设置。这包括:

  • index.auto_expand_replicas
  • index.number_of_replicas

示例

edit

检索安全设置的示例:

GET /_security/settings

可配置的设置可以使用更新安全索引设置 API 进行修改。

获取令牌 API

edit

创建一个不需基本身份验证即可访问的承载令牌。

请求

edit

POST /_security/oauth2/token

先决条件

edit
  • 要使用此API,您必须拥有manage_token集群权限。

描述

edit

令牌由 Elasticsearch 令牌服务创建,当您在 HTTP 接口上配置 TLS 时,该服务会自动启用。请参阅 为 Elasticsearch 加密 HTTP 客户端通信。或者,您可以显式启用 xpack.security.authc.token.enabled 设置。当您在生产模式下运行时,引导检查会阻止您启用令牌服务,除非您也在 HTTP 接口上启用 TLS。

获取令牌API与典型的OAuth 2.0令牌API采用相同的参数,除了使用JSON请求体。

成功的获取令牌API调用返回一个JSON结构,其中包含访问令牌、令牌过期的时间(秒)、类型以及可用时的范围。

由 get token API 返回的令牌有一个有限的有效期,超过这个时间后,它们将无法再使用。这个时间周期由 xpack.security.authc.token.timeout 设置定义。更多信息,请参阅 Token service settings

如果您想立即使一个令牌失效,您可以通过使用使令牌失效API来实现。

请求体

edit

以下参数可以在POST请求的正文中指定,并涉及创建令牌:

grant_type

(必需,字符串) 授权的类型。 支持的授权类型有:password_kerberosclient_credentialsrefresh_token

client_credentials
这种授权类型实现了OAuth2的客户端凭据授予。它适用于机器对机器的通信,不适合或不设计用于自助用户创建令牌。它只生成无法刷新的访问令牌。前提是使用client_credentials的实体始终可以访问一组(客户端,非最终用户)凭据,并且可以随时进行身份验证。
_kerberos
这种授权类型在内部支持并实现了基于SPNEGO的Kerberos支持。_kerberos授权类型可能会随版本变化而变化。
password
这种授权类型实现了OAuth2的资源所有者密码凭据授予。在这种授权中,受信任的客户端交换最终用户的凭据以获取访问令牌和(可能)刷新令牌。请求需要由经过身份验证的用户发出,但代表另一个经过身份验证的用户(其凭据作为请求参数传递)。这种授权类型不适合或不设计用于自助用户创建令牌。
refresh_token
这种授权类型实现了OAuth2的刷新令牌授予。在这种授权中,用户交换先前颁发的刷新令牌以获取新的访问令牌和新的刷新令牌。
password
(可选*,字符串) 用户的密码。如果您指定password授权类型,则此参数是必需的。此参数不适用于任何其他支持的授权类型。
kerberos_ticket
(可选*,字符串) 经过base64编码的kerberos票据。如果你指定_kerberos授权类型,此参数是必需的。此参数不适用于任何其他支持的授权类型。
refresh_token
(可选*,字符串) 创建令牌时返回的字符串,用于延长其有效期。如果指定refresh_token授权类型,则此参数是必需的。此参数与其他任何支持的授权类型均无效。
scope
(可选,字符串) 令牌的作用域。目前,无论请求中发送的值是什么,令牌的作用域仅为 FULL
username
(可选*,字符串) 用于标识用户的用户名。如果您指定password授权类型,则此参数是必需的。此参数不适用于任何其他支持的授权类型。

示例

edit

以下示例使用client_credentials授权类型获取令牌,该类型简单地为已认证的用户创建一个令牌:

POST /_security/oauth2/token
{
  "grant_type" : "client_credentials"
}

以下示例输出包含访问令牌、令牌过期的时间(以秒为单位)以及类型:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
    ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "authentication_type" : "realm"
  }
}

此API返回的令牌可以通过发送带有Authorization标头的请求来使用,该标头的值以“Bearer ”为前缀,后跟access_token的值。

curl -H "Authorization: Bearer dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==" http://localhost:9200/_cluster/health

以下示例使用password授权类型为test_admin用户获取令牌。此请求需要由具有足够权限的已认证用户发出,该用户可能与在username参数中传递的用户名相同,也可能不同:

POST /_security/oauth2/token
{
  "grant_type" : "password",
  "username" : "test_admin",
  "password" : "x-pack-test-password"
}

以下示例输出包含访问令牌、令牌过期时间(以秒为单位)、类型和刷新令牌:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS",
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
    ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "authentication_type" : "realm"
  }
}

要延长使用密码授权类型获得的现有令牌的生命周期, 您可以在令牌创建后的24小时内再次调用API并使用刷新令牌。例如:

POST /_security/oauth2/token
{
  "grant_type": "refresh_token",
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
}

API将返回一个新的令牌和刷新令牌。每个刷新令牌只能使用一次。

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS",
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
    ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "authentication_type" : "token"
  }
}

以下示例使用kerberos授权类型获取访问令牌和刷新令牌,该类型只需将base64编码的kerberos票据交换为令牌:

POST /_security/oauth2/token
{
  "grant_type" : "_kerberos",
  "kerberos_ticket" : "YIIB6wYJKoZIhvcSAQICAQBuggHaMIIB1qADAgEFoQMCAQ6iBtaDcp4cdMODwOsIvmvdX//sye8NDJZ8Gstabor3MOGryBWyaJ1VxI4WBVZaSn1WnzE06Xy2"
}

如果Kerberos认证成功,API将返回一个新的令牌和刷新令牌。 每个刷新令牌只能使用一次。当在Spnego GSS上下文中请求相互认证时, 服务器将在kerberos_authentication_response_token中返回一个base64编码的令牌,供客户端使用并完成认证。

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
  "kerberos_authentication_response_token": "YIIB6wYJKoZIhvcSAQICAQBuggHaMIIB1qADAg",
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
    ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
    },
    "authentication_type" : "realm"
  }
}

获取用户权限 API

edit

检索已登录用户的安全权限

请求

edit

GET /_security/user/_privileges

先决条件

edit
  • 所有用户都可以使用此API,但仅限于确定自己的权限。要检查其他用户的权限,您必须使用run as功能。有关更多信息,请参阅代表其他用户提交请求

描述

edit

要检查用户是否具有特定的权限列表,请使用has privileges API

示例

edit
GET /_security/user/_privileges
{
  "cluster" : [
    "all"
  ],
  "global" : [ ],
  "indices" : [
    {
      "names" : [
        "*"
      ],
      "privileges" : [
        "all"
      ],
      "allow_restricted_indices" : true
    }
  ],
  "applications" : [
    {
      "application" : "*",
      "privileges" : [
        "*"
      ],
      "resources" : [
        "*"
      ]
    }
  ],
  "run_as" : [
    "*"
  ]
}

获取用户 API

edit

检索本地领域和内置用户的信息。

请求

edit

GET /_security/user

GET /_security/user/

先决条件

edit
  • 要使用此API,您必须至少拥有read_security集群权限。

描述

edit

有关原生领域的更多信息,请参阅 领域原生用户认证

路径参数

edit
username
(可选,字符串) 用户的标识符。您可以指定多个用户名作为逗号分隔的列表。如果您省略此参数,API将检索所有用户的信息。

查询参数

edit
with_profile_uid
(可选, 布尔值) 确定是否检索用户的用户配置文件 uid(如果存在)。默认为 false

响应体

edit

成功调用返回一个包含用户JSON表示的用户数组。请注意,用户密码不包括在内。

响应代码

edit

如果用户未在native领域中定义,请求将返回404错误。

示例

edit

要检索本地用户,请向 /_security/user/ 端点提交 GET 请求:

GET /_security/user/jacknich
{
  "jacknich": {
    "username": "jacknich",
    "roles": [
      "admin", "other_role1"
    ],
    "full_name": "Jack Nicholson",
    "email": "jacknich@example.com",
    "metadata": { "intelligence" : 7 },
    "enabled": true
  }
}

要检索用户 profile_uid 作为响应的一部分:

GET /_security/user/jacknich?with_profile_uid=true
{
  "jacknich": {
    "username": "jacknich",
    "roles": [
      "admin", "other_role1"
    ],
    "full_name": "Jack Nicholson",
    "email": "jacknich@example.com",
    "metadata": { "intelligence" : 7 },
    "enabled": true,
    "profile_uid": "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0"
  }
}

省略用户名以检索所有用户:

GET /_security/user

授予 API 密钥 API

edit

代表另一个用户创建API密钥。

请求

edit

POST /_security/api_key/grant

先决条件

edit
  • 要使用此API,您必须拥有grant_api_keymanage_api_key集群权限。

描述

edit

此API类似于创建API密钥,但它为与运行API的用户不同的用户创建API密钥。

调用者必须拥有为其创建API密钥的用户的身份验证凭据。没有该用户的凭据,无法使用此API创建API密钥。 支持的用户身份验证凭据类型包括: * 用户名和密码 * Elasticsearch访问令牌 * JWTs

为用户提供了身份验证凭据的用户可以选择"作为"(冒充)另一个用户。在这种情况下,API 密钥将代表被冒充的用户创建。

此API旨在供需要为用户创建和管理API密钥的应用程序使用,但不能保证这些用户有权自行创建API密钥(参见先决条件)。API密钥由Elasticsearch API密钥服务创建,该服务会自动启用。

成功的 grant API key API 调用返回一个包含 API 密钥、其唯一 ID 和名称的 JSON 结构。如果适用,它还会以毫秒为单位返回 API 密钥的过期信息。

默认情况下,API 密钥永不过期。您可以在创建 API 密钥时指定过期信息。

请参阅API key service settings以获取与API key服务相关的配置设置。

请求体

edit

以下参数可以在POST请求的正文中指定:

access_token
(必填*, 字符串) 用户的 Elasticsearch 访问令牌 或 JWT。支持 访问ID JWT 令牌类型,它们依赖于底层 JWT 领域配置。 创建的 API 密钥将具有使用此令牌进行身份验证的用户的权限的即时快照(甚至更受限制的权限,请参阅 role_descriptors 参数)。 如果您指定 access_token 授权类型,则此参数是必需的。它与其他授权类型无效。
api_key

(必需,对象) 定义 API 密钥。

expiration
(可选,字符串) API 密钥的过期时间。默认情况下,API 密钥永不过期。
name
(必需,字符串) 指定此 API 密钥的名称。
role_descriptors
(可选,对象) 此 API 密钥的角色描述符。此参数是可选的。当未指定或为空数组时,API 密钥具有指定用户或访问令牌的权限的即时快照。如果提供角色描述符,则生成的权限是 API 密钥权限与用户或访问令牌权限的交集。角色描述符的结构与 创建 API 密钥 API 的请求相同。
metadata
(可选,对象) 您希望与 API 密钥关联的任意元数据。它支持嵌套数据结构。 在 metadata 对象中,以 _ 开头的键保留供系统使用。
client_authentication

(可选, 对象) 当使用 access_token 授权类型时,并且提供 JWT 时,这指定了需要它的 JWTs 的客户端认证(即通常由 ES-Client-Authentication 请求头指定的内容)。

scheme
(必需, 字符串) 方案(区分大小写),如在 ES-Client-Authentication 请求头中提供的。目前,唯一支持的值是 SharedSecret
value
(必需, 字符串) 客户端凭据的值,该值跟随方案,如在 ES-Client-Authentication 请求头中提供的。例如,如果请求头是 ES-Client-Authentication: SharedSecret myShar3dS3cret,如果客户端直接使用 JWT 进行认证,那么这里的 value 应该是 myShar3dS3cret
grant_type

(必需, 字符串) 授权类型。支持的授权类型有:access_token,password

access_token
在这种授权类型中,您必须提供一个由Elasticsearch令牌服务创建的访问令牌(参见获取令牌API为Elasticsearch加密HTTP客户端通信),或者一个JWT(可以是JWT access_token或JWT id_token)。
password
在这种授权类型中,您必须提供您想要创建API密钥的用户ID和密码。
password
(必填*, 字符串) 用户的密码。如果您指定password授权类型,此参数是必需的。它与其他授权类型不兼容。
username
(必需*, 字符串) 用于标识用户的用户名。如果指定 password 授权类型,此参数是必需的。它不适用于其他授权类型。
run_as
(可选,字符串) 要模拟的用户名称。

*表示在某些情况下需要设置,但并非所有情况下都需要。

示例

edit
POST /_security/api_key/grant
{
  "grant_type": "password",
  "username" : "test_admin",
  "password" : "x-pack-test-password",
  "api_key" : {
    "name": "my-api-key",
    "expiration": "1d",
    "role_descriptors": {
      "role-a": {
        "cluster": ["all"],
        "indices": [
          {
          "names": ["index-a*"],
          "privileges": ["read"]
          }
        ]
      },
      "role-b": {
        "cluster": ["all"],
        "indices": [
          {
          "names": ["index-b*"],
          "privileges": ["all"]
          }
        ]
      }
    },
    "metadata": {
      "application": "my-application",
      "environment": {
         "level": 1,
         "trusted": true,
         "tags": ["dev", "staging"]
      }
    }
  }
}

提供凭据的用户(test_admin)可以“以”另一个用户(test_user)的身份运行。 API 密钥将授予被模拟的用户(test_user)。

POST /_security/api_key/grant
{
  "grant_type": "password",
  "username" : "test_admin",  
  "password" : "x-pack-test-password",  
  "run_as": "test_user",  
  "api_key" : {
    "name": "another-api-key"
  }
}

提供凭证并执行“以...身份运行”的用户。

上述用户的凭证

将为哪个模拟用户创建API密钥。

拥有权限 API

edit

确定已登录用户是否具有指定的权限列表。

请求

edit

GET /_security/user/_has_privileges

POST /_security/user/_has_privileges

先决条件

edit
  • 所有用户都可以使用此API,但仅限于确定自己的权限。 要检查其他用户的权限,您必须使用run as功能。有关更多信息,请参阅 代表其他用户提交请求

描述

edit

有关您可以在此API中指定的权限列表,请参阅安全权限

成功的调用将返回一个JSON结构,显示是否将每个指定的权限分配给用户。

请求体

edit
cluster
(列表) 您要检查的集群权限列表。
index
names
(列表) 索引列表。
allow_restricted_indices
(布尔值) 如果使用通配符或正则表达式来覆盖受限索引的模式,则需要将其设置为 true(默认值为 false)。隐式地,受限索引不匹配索引模式,因为受限索引通常具有有限的权限,并且将它们包含在模式测试中会使大多数此类测试结果为 false。如果受限索引在 names 列表中被显式包含,则无论 allow_restricted_indices 的值如何,都会检查它们对应的权限。
privileges
(列表) 您希望为指定索引检查的权限列表。
application
application
(字符串) 应用程序的名称。
privileges
(列表) 您想要检查的指定资源的权限列表。可以是应用程序权限名称,或者是这些权限授予的操作名称。
resources
(列表) 要检查权限的资源名称列表。

示例

edit

以下示例检查当前用户是否具有特定的集群、索引和应用程序权限集:

GET /_security/user/_has_privileges
{
  "cluster": [ "monitor", "manage" ],
  "index" : [
    {
      "names": [ "suppliers", "products" ],
      "privileges": [ "read" ]
    },
    {
      "names": [ "inventory" ],
      "privileges" : [ "read", "write" ]
    }
  ],
  "application": [
    {
      "application": "inventory_manager",
      "privileges" : [ "read", "data:write/inventory" ],
      "resources" : [ "product/1852563" ]
    }
  ]
}

以下示例输出显示了“rdeniro”用户拥有的权限:

{
  "username": "rdeniro",
  "has_all_requested" : false,
  "cluster" : {
    "monitor" : true,
    "manage" : false
  },
  "index" : {
    "suppliers" : {
      "read" : true
    },
    "products" : {
      "read" : true
    },
    "inventory" : {
      "read" : true,
      "write" : false
    }
  },
  "application" : {
    "inventory_manager" : {
      "product/1852563" : {
        "read": false,
        "data:write/inventory": false
      }
    }
  }
}

使API密钥失效API

edit

使一个或多个API密钥失效。

请求

edit

DELETE /_security/api_key

先决条件

edit
  • 要使用此API,您必须至少拥有manage_securitymanage_api_keymanage_own_api_key集群权限。 manage_security权限允许删除任何API密钥,包括REST和跨集群API密钥manage_api_key权限允许删除任何REST API密钥,但不包括跨集群API密钥。 manage_own_api_key仅允许删除用户拥有的REST API密钥。 此外,使用manage_own_api_key权限时,必须以以下三种格式之一发出失效请求:

    1. 设置参数 owner=true
    2. 或者,设置 usernamerealm_name 以匹配用户的身份。
    3. 或者,如果请求是由API密钥发出的,即API密钥使自身失效,请在 ids 字段中指定其ID。

描述

edit

此API使通过创建API密钥授予API密钥 API创建的API密钥失效。 失效的API密钥将无法通过身份验证,但仍可以使用 获取API密钥信息查询API密钥信息API查看, 至少在配置的保留期内,直到它们被自动删除。

请求体

edit

以下参数可以在DELETE请求的正文中指定,并涉及使API密钥失效:

ids
(可选,字符串数组) API 密钥 ID 列表。当使用任何 namerealm_nameusername 时,不能使用此参数
name
(可选,字符串) API 密钥名称。此参数不能与任何 idsrealm_nameusername 一起使用。
realm_name
(可选,字符串) 认证域的名称。此参数不能与 idsname 一起使用,也不能在 owner 标志设置为 true 时使用。
username
(可选,字符串) 用户的用户名。此参数不能与 idsname 一起使用,也不能在 owner 标志设置为 true 时使用。
owner
(可选, 布尔值) 一个布尔标志,可用于查询当前经过身份验证的用户拥有的API密钥。默认为false。 当此参数设置为true时,不能指定realm_nameusername参数,因为它们被假定为当前经过身份验证的用户。

如果 "owner" 是 "false"(默认),则必须指定 "ids"、"name"、"username" 和 "realm_name" 中的至少一个。

响应体

edit

成功的调用返回一个JSON结构,其中包含已失效的API密钥的ID、已失效的API密钥的ID,以及在使特定API密钥失效时可能遇到的错误列表。

示例

edit

如果你如下创建一个API密钥:

POST /_security/api_key
{
  "name": "my-api-key"
}

成功调用后返回一个JSON结构,提供API密钥信息。例如:

{
  "id": "VuaCfGcBCdbkQm-e5aOx",
  "name": "my-api-key",
  "api_key": "ui2lp2axTNmsyakw9tvNnw",
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}

以下示例立即使由指定ids标识的API密钥失效:

DELETE /_security/api_key
{
  "ids" : [ "VuaCfGcBCdbkQm-e5aOx" ]
}

以下示例立即使指定名称标识的API密钥失效:

DELETE /_security/api_key
{
  "name" : "my-api-key"
}

以下示例立即使native1领域中的所有API密钥失效:

DELETE /_security/api_key
{
  "realm_name" : "native1"
}

以下示例立即使用户 myuser 在所有领域中的所有 API 密钥失效:

DELETE /_security/api_key
{
  "username" : "myuser"
}

以下示例会立即使由当前认证用户拥有的、指定ids标识的API密钥失效:

DELETE /_security/api_key
{
  "ids" : ["VuaCfGcBCdbkQm-e5aOx"],
  "owner" : "true"
}

以下示例会立即使当前经过身份验证的用户拥有的所有 API 密钥失效:

DELETE /_security/api_key
{
  "owner" : "true"
}

最后,以下示例立即使用户 myusernative1 领域中的所有 API 密钥失效:

DELETE /_security/api_key
{
  "username" : "myuser",
  "realm_name" : "native1"
}
{
  "invalidated_api_keys": [ 
    "api-key-id-1"
  ],
  "previously_invalidated_api_keys": [ 
    "api-key-id-2",
    "api-key-id-3"
  ],
  "error_count": 2, 
  "error_details": [ 
    {
      "type": "exception",
      "reason": "error occurred while invalidating api keys",
      "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "invalid api key id"
      }
    },
    {
      "type": "exception",
      "reason": "error occurred while invalidating api keys",
      "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "invalid api key id"
      }
    }
  ]
}

作为此请求的一部分被作废的API密钥的ID。

已失效的API密钥的ID。

当使API密钥失效时遇到的错误数量。

这些错误的详细信息。当 error_count 为 0 时,此字段不会出现在响应中。

使令牌失效 API

edit

使一个或多个访问令牌或刷新令牌失效。

请求

edit

DELETE /_security/oauth2/token

描述

edit

获取令牌 API返回的访问令牌具有有限的有效期,超过该时间后,它们将无法再使用。该时间周期由xpack.security.authc.token.timeout设置定义。更多信息,请参阅令牌服务设置

通过获取令牌API返回的刷新令牌仅在24小时内有效。它们也只能使用一次。

如果您想立即使一个或多个访问或刷新令牌失效,请使用此失效令牌API。

请求体

edit

以下参数可以在DELETE请求的正文中指定,并涉及令牌的失效:

token
(可选, 字符串) 一个访问令牌。此参数不能与任何 refresh_token, realm_nameusername 一起使用。
refresh_token
(可选, 字符串) 一个刷新令牌。此参数不能与 refresh_token, realm_nameusername 一起使用。
realm_name
(可选,字符串) 认证域的名称。此参数不能与 refresh_tokentoken 一起使用。
username
(可选,字符串) 用户的用户名。此参数不能与 refresh_tokentoken 一起使用

虽然所有参数都是可选的,但至少需要其中一个。更具体地说,需要指定tokenrefresh_token参数中的一个。如果这两个都没有指定,则需要指定realm_name和/或username

响应体

edit

成功的调用返回一个JSON结构,其中包含被作废的令牌数量、已经作废的令牌数量,以及在作废特定令牌时可能遇到的错误列表。

示例

edit

例如,如果您使用 client_credentials 授权类型创建令牌,如下所示:

POST /_security/oauth2/token
{
  "grant_type" : "client_credentials"
}

获取令牌API返回有关访问令牌的以下信息:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
      ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "authentication_type" : "realm"
  }
}

此访问令牌现在可以立即失效,如下例所示:

DELETE /_security/oauth2/token
{
  "token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ=="
}

如果你使用密码授权类型为用户获取令牌,响应中可能还会包含一个刷新令牌。例如:

POST /_security/oauth2/token
{
  "grant_type" : "password",
  "username" : "test_admin",
  "password" : "x-pack-test-password"
}

获取令牌API返回以下信息:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS",
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
      ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "authentication_type" : "realm"
  }
}

刷新令牌现在也可以立即失效,如下例所示:

DELETE /_security/oauth2/token
{
  "refresh_token" : "vLBPvmAB6KvwvJZr27cS"
}

以下示例立即使saml1领域中的所有访问令牌和刷新令牌失效:

DELETE /_security/oauth2/token
{
  "realm_name" : "saml1"
}

以下示例立即使所有领域中用户myuser的所有访问令牌和刷新令牌失效:

DELETE /_security/oauth2/token
{
  "username" : "myuser"
}

最后,以下示例立即使saml1领域中用户myuser的所有访问令牌和刷新令牌失效:

DELETE /_security/oauth2/token
{
  "username" : "myuser",
  "realm_name" : "saml1"
}
{
  "invalidated_tokens":9, 
  "previously_invalidated_tokens":15, 
  "error_count":2, 
  "error_details":[ 
    {
      "type":"exception",
      "reason":"Elasticsearch exception [type=exception, reason=foo]",
      "caused_by":{
        "type":"exception",
        "reason":"Elasticsearch exception [type=illegal_argument_exception, reason=bar]"
      }
    },
    {
      "type":"exception",
      "reason":"Elasticsearch exception [type=exception, reason=boo]",
      "caused_by":{
        "type":"exception",
        "reason":"Elasticsearch exception [type=illegal_argument_exception, reason=far]"
      }
    }
  ]
}

作为此请求的一部分被无效化的令牌数量。

已经被作废的令牌数量。

当令牌失效时遇到的错误数量。

这些错误的详细信息。当 error_count 为 0 时,此字段不会出现在响应中。

OpenID Connect 准备认证 API

edit

根据Elasticsearch中相应OpenID Connect认证域的配置,创建一个oAuth 2.0认证请求作为URL字符串。

请求

edit

POST /_security/oidc/prepare

描述

edit

此API的响应是一个指向配置的OpenID Connect提供者的授权端点的URL,可用于重定向用户的浏览器以继续身份验证过程。

Elasticsearch 通过 OpenID Connect API 暴露了所有必要的 OpenID Connect 相关功能。这些 API 由 Kibana 内部使用,以提供基于 OpenID Connect 的身份验证,但也可以被其他自定义 Web 应用程序或其他客户端使用。另请参阅 OpenID Connect authenticate APIOpenID Connect logout API

请求体

edit

以下参数可以在请求体中指定:

realm
(可选,字符串)Elasticsearch 中 OpenID Connect 领域的名称,其配置应被用于生成身份验证请求。当指定了 iss 时,不能指定此项。realmiss 中必须指定其中一个。
state
(可选,字符串)用于在身份验证请求和响应之间维护状态的值,通常用作跨站请求伪造的缓解措施。如果 API 的调用者没有提供值,Elasticsearch 将自行生成一个具有足够熵的值,并在响应中返回它。
nonce
(可选,字符串)用于将客户端会话与ID令牌关联并减轻重放攻击的值。如果API的调用者未提供值,Elasticsearch将自行生成一个具有足够熵的值,并在响应中返回。
iss
(可选,字符串)在第三方发起的单点登录情况下,这是RP要发送身份验证请求的OP的发行者标识符。 当指定了realm时,不能指定此项。realmiss中必须指定一个。
login_hint
(可选,字符串)在第三方发起的单点登录情况下,作为login_hint参数包含在认证请求中的字符串值。当指定realm时,此参数无效

示例

edit

以下示例生成用于 OpenID Connect 领域 oidc1 的身份验证请求:

POST /_security/oidc/prepare
{
  "realm" : "oidc1"
}

以下示例输出包含指向OpenID Connect Provider的授权端点的URI,以及所有作为HTTP GET参数的身份验证请求参数:

{
  "redirect" : "http://127.0.0.1:8080/c2id-login?scope=openid&response_type=id_token&redirect_uri=https%3A%2F%2Fmy.fantastic.rp%2Fcb&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I&nonce=WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM&client_id=elasticsearch-rp",
  "state" : "4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
  "nonce" : "WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM",
  "realm" : "oidc1"
}

以下示例为 OpenID Connect Realm oidc1 生成一个身份验证请求,其中 state 和 nonce 的值由客户端生成:

POST /_security/oidc/prepare
{
  "realm" : "oidc1",
  "state" : "lGYK0EcSLjqH6pkT5EVZjC6eIW5YCGgywj2sxROO",
  "nonce" : "zOBXLJGUooRrbLbQk5YCcyC8AXw3iloynvluYhZ5"
}

以下示例输出包含指向OpenID Connect Provider的授权端点的URI,以及所有作为HTTP GET参数的身份验证请求参数:

{
  "redirect" : "http://127.0.0.1:8080/c2id-login?scope=openid&response_type=id_token&redirect_uri=https%3A%2F%2Fmy.fantastic.rp%2Fcb&state=lGYK0EcSLjqH6pkT5EVZjC6eIW5YCGgywj2sxROO&nonce=zOBXLJGUooRrbLbQk5YCcyC8AXw3iloynvluYhZ5&client_id=elasticsearch-rp",
  "state" : "lGYK0EcSLjqH6pkT5EVZjC6eIW5YCGgywj2sxROO",
  "nonce" : "zOBXLJGUooRrbLbQk5YCcyC8AXw3iloynvluYhZ5",
  "realm" : "oidc1"
}

以下示例生成一个第三方发起的单点登录的身份验证请求,指定用于匹配适当OpenID Connect身份验证领域的发行者:

POST /_security/oidc/prepare
{
  "iss" : "http://127.0.0.1:8080",
  "login_hint": "this_is_an_opaque_string"
}

以下示例输出包含指向OpenID Connect Provider的授权端点的URI,以及所有作为HTTP GET参数的身份验证请求参数:

{
  "redirect" : "http://127.0.0.1:8080/c2id-login?login_hint=this_is_an_opaque_string&scope=openid&response_type=id_token&redirect_uri=https%3A%2F%2Fmy.fantastic.rp%2Fcb&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I&nonce=WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM&client_id=elasticsearch-rp",
  "state" : "4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
  "nonce" : "WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM",
  "realm" : "oidc1"
}

OpenID Connect 认证 API

edit

提交响应以供Elasticsearch消费的oAuth 2.0身份验证请求。验证成功后,Elasticsearch将响应一个Elasticsearch内部访问令牌和刷新令牌,随后可用于身份验证。

请求

edit

POST /_security/oidc/authenticate

描述

edit

此API端点基本上将成功的OpenID Connect身份验证响应交换为用于身份验证的Elasticsearch访问和刷新令牌。

Elasticsearch 通过 OpenID Connect API 提供了所有必要的 OpenID Connect 相关功能。这些 API 由 Kibana 内部使用,以提供基于 OpenID Connect 的身份验证,但也可以被其他自定义 Web 应用程序或其他客户端使用。另请参阅 OpenID Connect 准备身份验证 APIOpenID Connect 登出 API

请求体

edit
redirect_uri
(必需,字符串)OpenID Connect Provider在成功认证后,将用户代理重定向到的URL,以响应认证请求。此URL应按原样提供(URL编码),从响应体中获取或作为OpenID Connect Provider响应中的Location头值。
state
(必需,字符串)用于在身份验证请求和响应之间保持状态。此值需要与之前调用 /_security/oidc/prepare 时提供的值相同,或者与 Elasticsearch 生成并包含在该调用响应中的值相同。
nonce
(必需,字符串)用于将客户端会话与ID令牌关联,并缓解重放攻击。此值需要与之前调用/_security/oidc/prepare时提供的值相同,或者是由Elasticsearch生成并包含在该调用响应中的值。
realm
(可选,字符串)用于标识应使用的OpenID Connect领域的名称。当定义了多个领域时,这很有用。

示例

edit

以下示例请求将成功认证后从 OpenID Connect Provider 返回的响应交换为 Elasticsearch 访问令牌和刷新令牌,以便在后续请求中使用。此示例来自使用授权代码授予流程的认证。

POST /_security/oidc/authenticate
{
  "redirect_uri" : "https://oidc-kibana.elastic.co:5603/api/security/oidc/callback?code=jtI3Ntt8v3_XvcLzCFGq&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
  "state" : "4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
  "nonce" : "WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM",
  "realm" : "oidc1"
}

以下示例输出包含生成的访问令牌、令牌过期的时间(以秒为单位)、类型以及刷新令牌:

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
}

OpenID Connect 注销 API

edit

提交一个请求以使一个刷新令牌和一个访问令牌失效,该访问令牌是在调用 /_security/oidc/authenticate 时生成的响应。

请求

edit

POST /_security/oidc/logout

描述

edit

如果Elasticsearch中的OpenID Connect认证领域已相应配置, 此调用的响应将包含一个指向OpenID Connect提供者的结束会话端点的URI,以便执行单点注销。

Elasticsearch 通过 OpenID Connect API 暴露了所有必要的 OpenID Connect 相关功能。这些 API 由 Kibana 内部使用,以提供基于 OpenID Connect 的身份验证,但也可以被其他自定义 Web 应用程序或其他客户端使用。另请参阅 OpenID Connect authenticate APIOpenID Connect prepare authentication API

请求体

edit
access_token
(必需,字符串) 要作为注销一部分而被无效化的访问令牌的值。
refresh_token
(可选,字符串) 要作为注销一部分而被无效化的刷新令牌的值。

示例

edit

以下示例执行注销

POST /_security/oidc/logout
{
  "token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "refresh_token": "vLBPvmAB6KvwvJZr27cS"
}

以下示例响应的输出包含指向 OpenID Connect Provider 的 End Session Endpoint 的 URI,以及所有作为 HTTP GET 参数的注销请求参数:

{
  "redirect" : "https://op-provider.org/logout?id_token_hint=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c&post_logout_redirect_uri=http%3A%2F%2Foidc-kibana.elastic.co%2Floggedout&state=lGYK0EcSLjqH6pkT5EVZjC6eIW5YCGgywj2sxROO"
}

查询 API 密钥信息 API

edit

查询DSL的方式检索API密钥的信息,并以分页的方式进行。

请求

edit

GET /_security/_query/api_key

POST /_security/_query/api_key

先决条件

edit
  • 要使用此API,您必须至少拥有manage_own_api_keyread_security集群权限。
  • 如果您仅拥有manage_own_api_key权限,此API仅返回您拥有的API密钥。如果您拥有read_securitymanage_api_key或更高权限(包括manage_security),此API将返回所有API密钥,无论其所有权如何。

描述

edit

使用此API以分页方式检索通过创建API密钥API创建的API密钥。您可以选择使用查询来过滤结果。

路径参数

edit
with_limited_by
(可选, 布尔值) 一个布尔标志,用于返回与API密钥关联的所有者用户的角色描述符的快照。API密钥的实际权限是其分配的角色描述符与所有者用户的角色描述符的交集(实际上受其限制)。除非具有manage_api_key或更高权限,否则API密钥无法检索任何API密钥的受限角色描述符(包括其自身)。
with_profile_uid
(可选,布尔值) 确定是否也为API密钥所有者用户检索用户配置文件 uid。 如果存在,配置文件uid将在每个API密钥的profile_uid响应字段下返回。 默认为false
typed_keys
(可选,布尔值) 如果为true,聚合名称在响应中会带有各自类型的前缀。 默认为false

请求体

edit

您可以在请求体中指定以下参数:

query

(可选, 对象) 一个 查询 用于过滤返回哪些 API 密钥。 如果缺少查询参数,则等同于 match_all 查询。 该查询支持部分查询类型,包括 match_all, bool, term, terms, match, ids, prefix, wildcard, exists, range, 以及 simple query string

您可以查询与API密钥关联的以下公共值。

与API密钥关联的可查询字符串值在内部映射为关键词。 因此,如果在匹配查询中未指定分析器参数,则提供的匹配查询字符串将被解释为单个关键词值。这样的匹配查询等同于术语查询。

Valid values for query
id
API密钥的ID。注意 id 必须使用 ids 查询进行查询。
type
API密钥可以是类型 rest,如果通过 创建API密钥授予API密钥 API创建,或者是类型 cross_cluster 如果通过 创建跨集群API密钥 API创建。
name
API密钥的名称。
creation
API密钥的创建时间,以毫秒为单位。
expiration
API密钥的过期时间,以毫秒为单位。如果密钥未配置为过期,则为 null
invalidated
指示API密钥是否已失效。如果为 true,则密钥已失效。 默认为 false
invalidation
API密钥的失效时间,以毫秒为单位。此字段仅对已失效的API密钥设置。
username
API密钥所有者的用户名。
realm
API密钥所有者的领域名称。
metadata
与API密钥关联的元数据字段,例如 metadata.my_field。 元数据在内部索引为 扁平化 字段类型。 这意味着所有字段在查询和排序时都像 keyword 字段一样。 使用通配符模式引用元数据字段的子集是不可能的,例如 metadata.field*,即使对于支持字段名称模式的查询类型也是如此。最后,当简单地提到 metadata(后面没有任何点和子字段名称)时,可以一起搜索所有元数据字段。

您无法查询API密钥的角色描述符。

aggs or aggregations
(可选, 对象) 任何在返回的API密钥语料库上运行的聚合。 聚合和查询一起工作。聚合仅在匹配查询的API密钥上计算。 这仅支持一部分聚合类型,即:词项范围日期范围缺失基数值计数复合过滤器过滤器。 此外,聚合仅在query所使用的相同字段子集上运行。
from

(可选,整数) 起始文档偏移量。需要是非负数,默认为 0

默认情况下,您不能使用fromsize参数分页浏览超过10,000条结果。要分页浏览更多结果,请使用search_after参数。

size

(可选,整数) 返回的命中数。必须不小于零,默认为 10size 参数可以设置为 0,在这种情况下不会返回 API 密钥匹配项, 仅返回聚合结果。

默认情况下,您不能使用fromsize参数分页浏览超过10,000条结果。要分页浏览更多结果,请使用search_after参数。

sort
(可选, 对象) 排序定义。除了 id 之外, API 密钥的所有公共字段都适用于排序。此外,排序也可以应用于 _doc 字段,以按索引顺序排序。
search_after
(可选, 数组) Search after 定义。

响应体

edit

此API返回以下顶级字段:

total
找到的API密钥总数。
count
响应中返回的API密钥数量。
api_keys
API 密钥信息列表。

示例

edit

以下请求列出了所有 API 密钥,假设您拥有 manage_api_key 权限:

GET /_security/_query/api_key

成功调用返回一个包含从一个或多个API密钥中检索到的信息的JSON结构:

{
  "total": 3,
  "count": 3,
  "api_keys": [ 
    {
      "id": "nkvrGXsB8w290t56q3Rg",
      "name": "my-api-key-1",
      "creation": 1628227480421,
      "expiration": 1629091480421,
      "invalidated": false,
      "username": "elastic",
      "realm": "reserved",
      "realm_type": "reserved",
      "metadata": {
        "letter": "a"
      },
      "role_descriptors": { 
        "role-a": {
          "cluster": [
            "monitor"
          ],
          "indices": [
            {
              "names": [
                "index-a"
              ],
              "privileges": [
                "read"
              ],
              "allow_restricted_indices": false
            }
          ],
          "applications": [ ],
          "run_as": [ ],
          "metadata": { },
          "transient_metadata": {
            "enabled": true
          }
        }
      }
    },
    {
      "id": "oEvrGXsB8w290t5683TI",
      "name": "my-api-key-2",
      "creation": 1628227498953,
      "expiration": 1628313898953,
      "invalidated": false,
      "username": "elastic",
      "realm": "reserved",
      "metadata": {
        "letter": "b"
      },
      "role_descriptors": { } 
    }
  ]
}

为此次请求检索到的API密钥列表

当此API密钥创建或最后一次更新时分配给它的角色描述符。请注意,API密钥的有效权限是其分配的权限与所有者用户权限的时间点快照的交集。

空的权限描述符意味着API密钥继承所有者用户的权限。

如果您使用以下详细信息创建API密钥:

POST /_security/api_key
{
  "name": "application-key-1",
  "metadata": { "application": "my-application"}
}

成功调用后返回一个JSON结构,提供API密钥信息。例如:

{
  "id": "VuaCfGcBCdbkQm-e5aOx",
  "name": "application-key-1",
  "api_key": "ui2lp2axTNmsyakw9tvNnw",
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}

使用响应中的信息通过ID检索API密钥:

GET /_security/_query/api_key?with_limited_by=true
{
  "query": {
    "ids": {
      "values": [
        "VuaCfGcBCdbkQm-e5aOx"
      ]
    }
  }
}

成功调用将返回一个包含API密钥信息的JSON结构,包括其受限角色描述符:

{
  "api_keys": [
    {
      "id": "VuaCfGcBCdbkQm-e5aOx",
      "name": "application-key-1",
      "creation": 1548550550158,
      "expiration": 1548551550158,
      "invalidated": false,
      "username": "myuser",
      "realm": "native1",
      "realm_type": "native",
      "metadata": {
        "application": "my-application"
      },
      "role_descriptors": { },
      "limited_by": [ 
        {
          "role-power-user": {
            "cluster": [
              "monitor"
            ],
            "indices": [
              {
                "names": [
                  "*"
                ],
                "privileges": [
                  "read"
                ],
                "allow_restricted_indices": false
              }
            ],
            "applications": [ ],
            "run_as": [ ],
            "metadata": { },
            "transient_metadata": {
              "enabled": true
            }
          }
        }
      ]
    }
  ]
}

与API密钥关联的所有者用户的权限。 这是在创建和 后续更新时捕获的时间点快照。API密钥的 有效权限是其分配的权限与 所有者用户权限的交集。

您也可以通过名称检索API密钥:

GET /_security/_query/api_key
{
  "query": {
    "term": {
      "name": {
        "value": "application-key-1"
      }
    }
  }
}

使用 bool 查询来发出复杂的逻辑条件,并使用 fromsizesort 来帮助分页结果:

GET /_security/_query/api_key
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "name": "app1-key-" 
          }
        },
        {
          "term": {
            "invalidated": "false" 
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "name": "app1-key-01" 
          }
        }
      ],
      "filter": [
        {
          "wildcard": {
            "username": "org-*-user" 
          }
        },
        {
          "term": {
            "metadata.environment": "production" 
          }
        }
      ]
    }
  },
  "from": 20, 
  "size": 10, 
  "sort": [ 
    { "creation": { "order": "desc", "format": "date_time" } },
    "name"
  ]
}

API 密钥名称必须以 app1-key- 开头

API 密钥必须仍然有效

API 密钥名称不能是 app1-key-01

API 密钥必须由符合 通配符 模式 org-*-user 的用户名拥有

API 密钥必须具有元数据字段 environment,其值为 production

开始搜索结果的偏移量是第20个(基于零的索引)API密钥

响应的页面大小为10个API密钥

结果首先按 创建 日期降序排序,然后按名称升序排序

响应包含一个匹配的 API 密钥列表及其排序值:

{
  "total": 100,
  "count": 10,
  "api_keys": [
    {
      "id": "CLXgVnsBOGkf8IyjcXU7",
      "name": "app1-key-79",
      "creation": 1629250154811,
      "invalidated": false,
      "username": "org-admin-user",
      "realm": "native1",
      "metadata": {
        "environment": "production"
      },
      "role_descriptors": { },
      "_sort": [
        "2021-08-18T01:29:14.811Z",  
        "app1-key-79"  
      ]
    },
    {
      "id": "BrXgVnsBOGkf8IyjbXVB",
      "name": "app1-key-78",
      "creation": 1629250153794,
      "invalidated": false,
      "username": "org-admin-user",
      "realm": "native1",
      "metadata": {
        "environment": "production"
      },
      "role_descriptors": { },
      "_sort": [
        "2021-08-18T01:29:13.794Z",
        "app1-key-78"
      ]
    },
    ...
  ]
}

第一个排序值是创建时间,以date_time 格式显示,如请求中所定义

第二个排序值是API键名称

聚合示例

edit

例如,给定2个用户“june”和“king”,每个用户拥有3个API密钥:

  • 一个永不过期的(对用户“king”无效)
  • 一个在10天后过期的
  • 还有一个在100天后过期的(对用户“june”无效)

以下请求返回有效(未过期且未失效)的API密钥名称,这些密钥即将在30天内到期,按所有者用户名分组。

请求

edit
POST /_security/_query/api_key
{
  "size": 0,
  "query": {
    "bool": {
      "must": {
        "term": {
          "invalidated": false  
        }
      },
      "should": [  
        {
          "range": { "expiration": { "gte": "now" } }
        },
        {
          "bool": { "must_not": { "exists": { "field": "expiration" } } }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "aggs": {
    "keys_by_username": {
      "composite": {
        "sources": [ { "usernames": { "terms": { "field": "username" } } } ]  
      },
      "aggs": {
        "expires_soon": {
          "filter": {
            "range": { "expiration": { "lte": "now+30d/d" } }  
          },
          "aggs": {
            "key_names": { "terms": { "field": "name" } }
          }
        }
      }
    }
  }
}

匹配的API密钥不得失效

匹配的API密钥必须未过期或没有过期日期

将所有匹配的键(即所有有效的键)按其所有者用户名进行聚合

进一步将每个用户名的有效密钥聚合到一个即将过期的存储桶中

响应

edit
{
  "total" : 4,  
  "count" : 0,
  "api_keys" : [ ],
  "aggregations" : {
    "keys_by_username" : {
      "after_key" : {
        "usernames" : "king"
      },
      "buckets" : [
        {
          "key" : {
            "usernames" : "june"
          },
          "doc_count" : 2,  
          "expires_soon" : {
            "doc_count" : 1,
            "key_names" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "june-key-10",
                  "doc_count" : 1
                }
              ]
            }
          }
        },
        {
          "key" : {
            "usernames" : "king"
          },
          "doc_count" : 2,
          "expires_soon" : {
            "doc_count" : 1,  
            "key_names" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [  
                {
                  "key" : "king-key-10",
                  "doc_count" : 1
                }
              ]
            }
          }
        }
      ]
    }
  }
}

有效API密钥的总数(每个用户2个)

用户“june”的有效API密钥数量

用户 "king" 的即将过期的有效 API 密钥数量

用户 "king" 即将过期的 API 密钥名称

要检索已失效(但尚未删除)的API密钥,按所有者用户名和API密钥名称分组,请发出以下请求:

请求

edit
POST /_security/_query/api_key
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "term": {
          "invalidated": true
        }
      }
    }
  },
  "aggs": {
    "invalidated_keys": {
      "composite": {
        "sources": [
          { "username": { "terms": { "field": "username" } } },
          { "key_name": { "terms": { "field": "name" } } }
        ]
      }
    }
  }
}

响应

edit
{
  "total" : 2,
  "count" : 0,
  "api_keys" : [ ],
  "aggregations" : {
    "invalidated_keys" : {
      "after_key" : {
        "username" : "king",
        "key_name" : "king-key-no-expire"
      },
      "buckets" : [
        {
          "key" : {
            "username" : "june",
            "key_name" : "june-key-100"
          },
          "doc_count" : 1
        },
        {
          "key" : {
            "username" : "king",
            "key_name" : "king-key-no-expire"
          },
          "doc_count" : 1
        }
      ]
    }
  }
}

查询用户 API

edit

分页方式使用查询DSL检索本地用户

获取用户API不同,内置用户不包含在结果中。此API仅适用于本地用户

请求

edit

GET /_security/_query/user

POST /_security/_query/user

先决条件

edit
  • 要使用此API,您必须至少拥有read_security集群权限。

描述

edit

使用此API以分页方式检索由 本地领域管理的用户。 您可以选择使用查询来过滤结果。

请求体

edit

您可以在请求体中指定以下参数:

query

(可选, 字符串) 一个 查询 用于过滤返回哪些用户。 该查询支持部分查询类型,包括 match_all, bool, term, terms, match, ids, prefix, wildcard, exists, range, 以及 simple query string

您可以查询与用户关联的以下公共值。

Valid values for query
username
用户的标识符。
roles
分配给用户的 角色 的角色名称数组。
full_name
用户的完整名称。
email
用户的电子邮件。
enabled
指定用户是否已启用。
from

(可选,整数) 起始文档偏移量。需要是非负数,默认为 0

默认情况下,您不能使用fromsize参数分页浏览超过10,000条结果。要分页浏览更多结果,请使用search_after参数。

size

(可选, 整数) 返回的命中数量。必须为非负数,默认为 10

默认情况下,您不能使用fromsize参数分页浏览超过10,000条结果。要分页浏览更多结果,请使用search_after参数。

sort
(可选, 对象) 排序定义。你可以按 usernamerolesenabled 进行排序。 此外,还可以对 _doc 字段应用排序,以按索引顺序排序。
search_after
(可选, 数组) Search after 定义。

查询参数

edit
with_profile_uid
(可选, 布尔值) 确定是否检索用户的用户配置文件 uid(如果存在)。默认为 false

响应体

edit

此API返回以下顶级字段:

total
找到的用户总数。
count
响应中返回的用户数量。
users
与查询匹配的用户列表。

示例

edit

以下请求列出所有用户,假设您拥有read_security权限:

GET /_security/_query/user

成功的调用返回一个包含从一个或多个用户检索到的信息的JSON结构:

{
    "total": 2,
    "count": 2,
    "users": [ 
        {
            "username": "jacknich",
            "roles": [
                "admin",
                "other_role1"
            ],
            "full_name": "Jack Nicholson",
            "email": "jacknich@example.com",
            "metadata": {
                "intelligence": 7
            },
            "enabled": true
        },
        {
            "username": "sandrakn",
            "roles": [
                "admin",
                "other_role1"
            ],
            "full_name": "Sandra Knight",
            "email": "sandrakn@example.com",
            "metadata": {
                "intelligence": 7
            },
            "enabled": true
        }
    ]
}

为此请求检索到的用户列表

如果您使用以下详细信息创建用户:

POST /_security/user/jacknich
{
  "password" : "l0ng-r4nd0m-p@ssw0rd",
  "roles" : [ "admin", "other_role1" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}

成功调用返回一个JSON结构:

{
  "created": true
}

使用用户信息通过查询获取用户:

POST /_security/_query/user
{
    "query": {
        "prefix": {
            "roles": "other"
        }
    }
}

成功调用返回用户的JSON结构:

{
    "total": 1,
    "count": 1,
    "users": [
        {
            "username": "jacknich",
            "roles": [
                "admin",
                "other_role1"
            ],
            "full_name": "Jack Nicholson",
            "email": "jacknich@example.com",
            "metadata": {
                "intelligence": 7
            },
            "enabled": true
        }
    ]
}

要检索用户 profile_uid 作为响应的一部分:

POST /_security/_query/user?with_profile_uid=true
{
    "query": {
        "prefix": {
            "roles": "other"
        }
    }
}
{
    "total": 1,
    "count": 1,
    "users": [
        {
            "username": "jacknich",
            "roles": [
                "admin",
                "other_role1"
            ],
            "full_name": "Jack Nicholson",
            "email": "jacknich@example.com",
            "metadata": {
                "intelligence": 7
            },
            "enabled": true,
            "profile_uid": "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0"
        }
    ]
}

使用 bool 查询来发出复杂的逻辑条件,并使用 fromsizesort 来帮助分页结果:

POST /_security/_query/user
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "email": "*example.com" 
          }
        },
        {
          "term": {
            "enabled": true 
          }
        }
      ],
      "filter": [
        {
          "wildcard": {
            "roles": "*other*" 
          }
        }
      ]
    }
  },
  "from": 1, 
  "size": 2, 
  "sort": [
    { "username": { "order": "desc"} } 
  ]
}

电子邮件必须以example.com结尾

用户必须启用

结果将被过滤,仅包含至少拥有一个包含子字符串 other 的角色的用户

开始搜索结果的偏移量是第2个(基于零的索引)用户

响应的页面大小为2个用户

结果按 username 降序排列

响应包含一个匹配用户的列表以及他们的排序值:

{
    "total": 5,
    "count": 2,
    "users": [
        {
            "username": "ray",
            "roles": [
                "other_role3"
            ],
            "full_name": "Ray Nicholson",
            "email": "rayn@example.com",
            "metadata": {
                "intelligence": 7
            },
            "enabled": true,
            "_sort": [
                "ray" 
            ]
        },
        {
            "username": "lorraine",
            "roles": [
                "other_role3"
            ],
            "full_name": "Lorraine Nicholson",
            "email": "lorraine@example.com",
            "metadata": {
                "intelligence": 7
            },
            "enabled": true,
            "_sort": [
                "lorraine"
            ]
        }
    ]
}

排序值是 username

更新 API 密钥 API

edit

请求

edit

PUT /_security/api_key/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_own_api_key集群权限。 用户只能更新他们创建或被授予的API密钥。 要更新其他用户的API密钥,请使用run_as功能 代表其他用户提交请求。

无法使用 API 密钥作为此 API 的身份验证凭据。 要更新 API 密钥,需要所有者用户的凭据。

描述

edit

使用此API更新由创建API密钥授予API密钥API创建的API密钥。 如果您需要对许多API密钥应用相同的更新,可以使用批量更新API密钥来减少开销。

无法更新已过期的API密钥,或已被invalidate API Key作废的API密钥。

此API支持对API密钥的访问范围、元数据和过期时间的更新。 API密钥的访问范围由请求中指定的role_descriptors以及请求时所有者用户权限的快照决定。 所有者权限的快照会在每次调用时自动更新。

如果在请求中未指定role_descriptors,调用此API仍可能更改API密钥的访问范围。 如果自API密钥创建或上次修改以来,所有者的权限发生了变化,则可能会发生此更改。

路径参数

edit
id
(必需, 字符串) 要更新的API密钥的ID。

请求体

edit

您可以在请求体中指定以下参数,这是可选的。

role_descriptors
(可选, 对象) 要分配给此API密钥的角色描述符。 API密钥的有效权限是其分配的权限与所有者用户权限的时间点快照的交集。 您可以通过在此参数中指定它们来分配新权限。 要移除已分配的权限,您可以提供一个空的role_descriptors参数,即空对象{}。 如果API密钥没有分配的权限,它将继承所有者用户的全部权限。 所有者权限的快照始终会更新,无论您是否提供role_descriptors参数。 角色描述符的结构与创建API密钥API的请求相同。
metadata
(可选, 对象) 您希望与 API 密钥关联的任意元数据。 它支持嵌套数据结构。 在 metadata 对象中,以 _ 开头的顶级键保留用于系统使用。 指定时,这将完全替换之前与 API 密钥关联的元数据。
expiration
(可选, 字符串) API 密钥的过期时间。默认情况下,API 密钥永不过期。可以省略以保持不变。

响应体

edit
updated
(布尔值) 如果 true,API 密钥已更新。 如果 false,API 密钥没有变化,因为没有检测到变化。

示例

edit

如果你如下创建一个API密钥:

POST /_security/api_key
{
  "name": "my-api-key",
  "role_descriptors": {
    "role-a": {
      "cluster": ["all"],
      "indices": [
        {
          "names": ["index-a*"],
          "privileges": ["read"]
        }
      ]
    }
  },
  "metadata": {
    "application": "my-application",
    "environment": {
       "level": 1,
       "trusted": true,
       "tags": ["dev", "staging"]
    }
  }
}

成功调用后返回一个JSON结构,提供API密钥信息。 例如:

{
  "id": "VuaCfGcBCdbkQm-e5aOx",
  "name": "my-api-key",
  "api_key": "ui2lp2axTNmsyakw9tvNnw",
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}

对于下面的示例,假设所有者用户的权限是:

{
  "cluster": ["all"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["all"]
    }
  ]
}

以下示例更新了上面创建的API密钥,为其分配新的角色描述符和元数据:

PUT /_security/api_key/VuaCfGcBCdbkQm-e5aOx
{
  "role_descriptors": {
    "role-a": {
      "indices": [
        {
          "names": ["*"],
          "privileges": ["write"]
        }
      ]
    }
  },
  "metadata": {
    "environment": {
       "level": 2,
       "trusted": true,
       "tags": ["production"]
    }
  }
}

成功调用返回一个JSON结构,表明API密钥已更新:

{
  "updated": true
}

更新后API密钥的有效权限将是提供的角色描述符与所有者用户权限的交集:

{
  "indices": [
    {
      "names": ["*"],
      "privileges": ["write"]
    }
  ]
}

以下示例移除了API密钥之前分配的权限,使其继承所有者用户的完整权限。

PUT /_security/api_key/VuaCfGcBCdbkQm-e5aOx
{
  "role_descriptors": {}
}

返回的响应如下:

{
  "updated": true
}

更新后API密钥的有效权限将与所有者用户的权限相同:

{
  "cluster": ["all"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["all"]
    }
  ]
}

对于下一个示例,假设所有者用户的权限已从原始权限更改为:

{
  "cluster": ["manage_security"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["read"]
    }
  ]
}

以下请求会自动更新与API密钥关联的用户权限的快照:

PUT /_security/api_key/VuaCfGcBCdbkQm-e5aOx

返回的响应如下:

{
  "updated": true
}

生成的API密钥的以下有效权限:

{
  "cluster": ["manage_security"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["read"]
    }
  ]
}

更新安全索引设置

edit

更新安全内部指数的设置。

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

请求体

edit
security
(可选, 对象) 用于大多数安全配置的索引设置,包括通过API配置的Native realm用户和角色。
security-tokens
(可选, 对象) 用于存储 tokens 的索引的设置。
security-profile
(可选, 对象) 用于存储 profile 信息的索引设置。

描述

edit

此API允许用户修改安全内部索引的设置(.security 及其相关索引)。只有一部分设置允许修改。这包括:

  • index.auto_expand_replicas
  • index.number_of_replicas

如果设置了index.auto_expand_replicas,则在更新期间将忽略index.number_of_replicas

示例

edit

修改安全设置的示例:

PUT /_security/settings
{
    "security": {
        "index.auto_expand_replicas": "0-all"
    },
    "security-tokens": {
        "index.auto_expand_replicas": "0-all"
    },
    "security-profile": {
        "index.auto_expand_replicas": "0-all"
    }
}

可以使用获取安全索引设置 API 检索配置的设置。如果系统上未使用某个索引,但为其提供了设置,请求将被拒绝——此 API 尚不支持在这些索引使用之前配置其设置。

批量更新 API 密钥 API

edit

请求

edit

POST /_security/api_key/_bulk_update

前提条件

edit
  • 要使用此API,您必须至少拥有manage_own_api_key集群权限。 用户只能更新他们创建或被授予的API密钥。 要更新其他用户的API密钥,请使用run_as功能 代表其他用户提交请求。

无法使用 API 密钥作为此 API 的身份验证凭据。 要更新 API 密钥,需要所有者用户的凭据。

描述

edit

此API类似于更新单个API密钥,但它允许您在一次API调用中对多个API密钥应用相同的更新。 此操作可以大大提高性能,而不是逐个进行更新。

无法更新已过期或失效的 API 密钥。

此API支持对API密钥访问范围、元数据和过期的更新。 每个API密钥的访问范围由您在请求中指定的role_descriptors以及请求时所有者用户权限的快照决定。 所有者权限的快照会在每次调用时自动更新。

如果在请求中未指定role_descriptors,调用此API仍可能更改API密钥的访问范围。 如果自API密钥创建或上次修改以来,所有者的权限发生了变化,则可能会发生此更改。

请求体

edit

您可以在请求体中指定以下参数。

ids
(必需,列表) 要更新的 API 密钥的 ID。
role_descriptors
(可选, 对象) 要分配给 API 密钥的角色描述符。 API 密钥的有效权限是其分配的权限与所有者用户权限的快照的交集。 您可以通过在此参数中指定它们来分配新权限。 要移除已分配的权限,请将 role_descriptors 参数提供为空对象 {}。 如果 API 密钥没有分配的权限,它将继承所有者用户的全部权限。 无论是否提供 role_descriptors 参数,所有者权限的快照始终会更新。 角色描述符的结构与 创建 API 密钥 API 的请求相同。
metadata
(可选, 对象) 与API密钥关联的任意嵌套元数据。

metadata对象中,以下划线(_)开头的顶级键是为系统使用保留的。 使用此参数指定的任何信息将完全替换与API密钥先前关联的元数据。

expiration
(可选,字符串) API 密钥的过期时间。默认情况下,API 密钥永不过期。可以省略以保持不变。

响应体

edit

成功的请求返回一个JSON结构,其中包含所有已更新API密钥的ID、已经具有请求更改且不需要更新的API密钥的ID,以及任何更新失败的错误详情

示例

edit

对于下面的示例,假设用户创建了两个API密钥。 用户创建了第一个API密钥:

POST /_security/api_key
{
  "name": "my-api-key",
  "role_descriptors": {
    "role-a": {
      "cluster": ["all"],
      "indices": [
        {
          "names": ["index-a*"],
          "privileges": ["read"]
        }
      ]
    }
  },
  "metadata": {
    "application": "my-application",
    "environment": {
       "level": 1,
       "trusted": true,
       "tags": ["dev", "staging"]
    }
  }
}

这将返回包含以下 API 密钥信息的响应。

{
  "id": "VuaCfGcBCdbkQm-e5aOx",
  "name": "my-api-key",
  "api_key": "ui2lp2axTNmsyakw9tvNnw",
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}

用户创建第二个API密钥:

POST /_security/api_key
{
  "name": "my-other-api-key",
  "metadata": {
    "application": "my-application",
    "environment": {
       "level": 2,
       "trusted": true,
       "tags": ["dev", "staging"]
    }
  }
}

生成了以下 API 密钥信息。

{
  "id": "H3_AhoIBA9hmeQJdg7ij",
  "name": "my-other-api-key",
  "api_key": "134G4ilmT_uGWXHRfJfXXA",
  "encoded": "SDNfQWhvSUJBOWhtZVFKZGc3aWo6MTM0RzRpbG1UX3VHV1hIUmZKZlhYQQ=="
}

此外,假设所有者用户的权限是:

{
  "cluster": ["all"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["all"]
    }
  ]
}

以下示例更新了上面创建的API密钥,为其分配新的角色描述符、元数据并更新其过期时间。

POST /_security/api_key/_bulk_update
{
  "ids": [
    "VuaCfGcBCdbkQm-e5aOx",
    "H3_AhoIBA9hmeQJdg7ij"
  ],
  "role_descriptors": {
    "role-a": {
      "indices": [
        {
          "names": ["*"],
          "privileges": ["write"]
        }
      ]
    }
  },
  "metadata": {
    "environment": {
       "level": 2,
       "trusted": true,
       "tags": ["production"]
    }
  },
  "expiration": "30d"
}

成功调用返回一个JSON结构,表明API密钥已更新:

{
  "updated": [
    "VuaCfGcBCdbkQm-e5aOx",
    "H3_AhoIBA9hmeQJdg7ij"
  ],
  "noops": []
}

更新后,两个API密钥的有效权限将是提供的角色描述符与所有者用户的权限的交集:

{
  "indices": [
    {
      "names": ["*"],
      "privileges": ["write"]
    }
  ]
}

以下示例移除了API密钥之前分配的权限,使其继承所有者用户的全部权限。

POST /_security/api_key/_bulk_update
{
  "ids": [
    "VuaCfGcBCdbkQm-e5aOx",
    "H3_AhoIBA9hmeQJdg7ij"
  ],
  "role_descriptors": {}
}

返回的响应如下:

{
  "updated": [
    "VuaCfGcBCdbkQm-e5aOx",
    "H3_AhoIBA9hmeQJdg7ij"
  ],
  "noops": []
}

更新后,API 密钥的有效权限将与所有者用户的权限相同:

{
  "cluster": ["all"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["all"]
    }
  ]
}

对于下一个示例,假设所有者用户的权限已从原始权限更改为:

{
  "cluster": ["manage_security"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["read"]
    }
  ]
}

以下请求自动更新与两个API密钥关联的用户权限的快照。

POST /_security/api_key/_bulk_update
{
  "ids": [
    "VuaCfGcBCdbkQm-e5aOx",
    "H3_AhoIBA9hmeQJdg7ij"
  ]
}

返回的响应如下:

{
  "updated": [
    "VuaCfGcBCdbkQm-e5aOx",
    "H3_AhoIBA9hmeQJdg7ij"
  ],
  "noops": []
}

结果导致两个API密钥的以下有效权限:

{
  "cluster": ["manage_security"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["read"]
    }
  ]
}

如果任何API密钥更新失败,错误详情将包含在errors字段中。 例如:

{
  "updated": ["VuaCfGcBCdbkQm-e5aOx"],
  "noops": [],
  "errors": { 
    "count": 3,
    "details": {
       "g_PqP4IBcBaEQdwM5-WI": { 
         "type": "resource_not_found_exception",
         "reason": "no API key owned by requesting user found for ID [g_PqP4IBcBaEQdwM5-WI]"
       },
       "OM4cg4IBGgpHBfLerY4B": {
         "type": "illegal_argument_exception",
         "reason": "cannot update invalidated API key [OM4cg4IBGgpHBfLerY4B]"
       },
       "Os4gg4IBGgpHBfLe2I7j": {
         "type": "exception",
         "reason": "bulk request execution failure",
         "caused_by": { 
           "type" : "version_conflict_engine_exception",
           "reason" : "[1]: version conflict, required seqNo [1], primary term [1]. current document has seqNo [2] and primary term [1]"
         }
       }
    }
  }
}

count 为 0 时,此字段不在响应中出现。

发生错误的API密钥的ID。

错误详情可能还包括一个caused_by字段。

SAML 准备认证 API

edit

创建一个基于 Elasticsearch 中相应 SAML 领域配置的 SAML 身份验证请求()作为 URL 字符串。

此API旨在供Kibana以外的自定义Web应用程序使用。 如果您使用的是Kibana,请参阅在Elastic Stack上配置SAML单点登录

请求

edit

POST /_security/saml/prepare

描述

edit

此API返回一个指向SAML身份提供者的URL。您可以使用该URL重定向用户的浏览器,以继续身份验证过程。URL包含一个名为SAMLRequest的参数,该参数包含一个经过压缩和Base64编码的SAML身份验证请求。如果配置指示SAML身份验证请求应被签名,则URL有两个额外的参数,分别名为SigAlgSignature。这些参数包含用于签名的算法和签名值本身。 它还返回一个唯一标识此SAML身份验证请求的随机字符串。此API的调用者需要存储此标识符,因为它需要在身份验证过程的后续步骤中使用(参见SAML authenticate API)。

Elasticsearch 通过 SAML API 提供了所有必要的 SAML 相关功能。 这些 API 由 Kibana 内部使用,以提供基于 SAML 的身份验证,但也可以由其他自定义 Web 应用程序或其他客户端使用。另请参阅 SAML authenticate APISAML invalidate APISAML logout APISAML complete logout API

请求体

edit
acs
(可选,字符串) 与 Elasticsearch 中 SAML 领域之一的断言消费者服务 URL 匹配。该领域用于生成身份验证请求。 您必须指定此参数或 realm 参数。
realm
(可选,字符串) Elasticsearch 中用于生成身份验证请求的 SAML 领域的名称。您必须指定此参数或 acs 参数。
relay_state
(可选, 字符串) 一个字符串,将包含在此API返回的重定向URL中,作为RelayState查询参数。如果身份验证请求已签名,此值将用作签名计算的一部分。

响应体

edit
id
(字符串) 用于存储由API调用者发出的SAML请求的唯一标识符。
realm
(字符串) 用于构建身份验证请求的 Elasticsearch 领域名称。
redirect
(字符串) 重定向用户的URL。

示例

edit

以下示例为名为 saml1 的 SAML 领域生成一个 SAML 身份验证请求

POST /_security/saml/prepare
{
  "realm" : "saml1"
}

以下示例为具有断言消费服务URL匹配`https://kibana.org/api/security/saml/callback`的SAML领域生成一个SAML认证请求。

POST /_security/saml/prepare
{
  "acs" : "https://kibana.org/api/security/saml/callback"
}

此API返回以下响应:

{
  "redirect": "https://my-idp.org/login?SAMLRequest=fVJdc6IwFP0rmbwDgUKLGbFDtc462%2B06FX3Yl50rBJsKCZsbrPbXL6J22hdfk%2FNx7zl3eL%2BvK7ITBqVWCfVdRolQuS6k2iR0mU2dmN6Phgh1FTQ8be2rehH%2FWoGWdESF%2FPST0NYorgElcgW1QG5zvkh%2FPfHAZbwx2upcV5SkiMLYzmqsFba1MAthdjIXy5enhL5a23DPOyo6W7kGBa7cwhZ2gO7G8OiW%2BR400kORt0bag7fzezAlk24eqcD2OxxlsNN5O3MdsW9c6CZnbq7rntF4d3s0D7BaHTZhIWN52P%2BcjiuGRbDU6cdj%2BEjJbJLQv4N4ADdhxBiEZbQuWclY4Q8iABbCXczCdSiKMAC%2FgyO2YqbQgrIJDZg%2FcFjsMD%2Fzb3gUcBa5sR%2F9oWR%2BzuJBqlPG14Jbn0DIf2TZ3Jn%2FXmSUrC5ddQB6bob37uZrJdeF4dIDHV3iuhb70Ptq83kOz53ubDLXlcwPJK0q%2FT42AqxIaAkVCkqm2tRgr49yfJGFU%2FZQ3hy3QyuUpd7obPv97kb%2FAQ%3D%3D"}",
  "realm": "saml1",
  "id": "_989a34500a4f5bf0f00d195aa04a7804b4ed42a1"
}

SAML 认证 API

edit

向 Elasticsearch 提交一个 SAML Response 消息以供消费。

此API旨在供Kibana以外的自定义Web应用程序使用。 如果您使用的是Kibana,请参阅在Elastic Stack上配置SAML单点登录

请求

edit

POST /_security/saml/authenticate

描述

edit

提交的SAML消息可以是:

  • 对使用SAML prepare authentication API 创建的SAML身份验证请求的响应。
  • 在IdP发起的单点登录(SSO)流程中的非请求SAML消息。

在任何情况下,SAML消息都需要是一个以为根元素的base64编码的XML文档。

成功验证后,Elasticsearch 会返回一个 Elasticsearch 内部访问令牌和刷新令牌,这些令牌可以随后用于身份验证。此 API 端点本质上是用 SAML 响应交换 Elasticsearch 访问和刷新令牌,这些令牌可以用于对 Elasticsearch 进行身份验证。

Elasticsearch 通过 SAML API 暴露了所有必要的 SAML 相关功能。 这些 API 由 Kibana 内部使用,以提供基于 SAML 的身份验证,但也可以由其他自定义 Web 应用程序或其他客户端使用。另请参阅 SAML prepare authentication APISAML invalidate APISAML logout APISAML complete logout API

请求体

edit
content
(必需,字符串) 由用户浏览器发送的SAML响应,通常是一个Base64编码的XML文档。
ids
(必需,数组) 包含当前用户所有有效 SAML 请求 ID 的 JSON 数组。
realm
(可选,字符串) 应该对 SAML 响应进行身份验证的领域名称。 在定义了多个 SAML 领域的情况下很有用。

响应体

edit
access_token
(字符串) Elasticsearch 生成的访问令牌。
username
(字符串) 已认证用户的名称。
expires_in
(整数) 令牌到期前的剩余时间(以秒为单位)。
refresh_token
(字符串) Elasticsearch 生成的刷新令牌。
realm
(字符串) 用户被认证的域的名称。

示例

edit

以下示例交换一个表示在SAML IdP成功认证的SAML响应,以获取一个Elasticsearch访问令牌和刷新令牌,用于后续请求:

POST /_security/saml/authenticate
{
  "content" : "PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMD.....",
  "ids" : ["4fee3b046395c4e751011e97f8900b5273d56685"]
}

API返回以下响应:

{
  "access_token" : "46ToAxZVaXVVZTVKOVF5YU04ZFJVUDVSZlV3",
  "username" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "mJdXLtmvTUSpoLwMvdBt_w",
  "realm": "saml1"
}

SAML 注销 API

edit

提交请求以使访问令牌和刷新令牌失效。

此API旨在供Kibana以外的自定义Web应用程序使用。 如果您使用的是Kibana,请参阅在Elastic Stack上配置SAML单点登录

请求

edit

POST /_security/saml/logout

描述

edit

此API使通过SAML authenticate API为用户生成的令牌失效。

如果Elasticsearch中的SAML领域配置得当,并且SAML身份提供者支持此功能,Elasticsearch的响应将包含一个URL,用于将用户重定向到包含SAML注销请求的身份提供者(启动SP发起的SAML单点注销)。

Elasticsearch 通过 SAML API 暴露了所有必要的 SAML 相关功能。 这些 API 由 Kibana 内部使用,以提供基于 SAML 的身份验证,但也可以由其他自定义 Web 应用程序或其他客户端使用。另请参阅 SAML authenticate APISAML prepare authentication APISAML invalidate APISAML complete logout API

请求体

edit
token
(必需,字符串) 作为调用 SAML authenticate API 响应返回的访问令牌。或者,通过使用 refresh_token 刷新原始令牌后收到的最新令牌。
refresh_token
(可选, 字符串) 作为调用 SAML authenticate API响应返回的刷新令牌。或者,是在刷新原始访问令牌后收到的最新刷新令牌。

响应体

edit
redirect
(字符串) 一个包含SAML注销请求作为参数的URL。用户可以使用此URL重定向回SAML身份提供者并启动单点注销。

示例

edit

以下示例使通过调用SAML authenticate API 生成的成功SAML响应的一对令牌失效:

POST /_security/saml/logout
{
  "token" : "46ToAxZVaXVVZTVKOVF5YU04ZFJVUDVSZlV3",
  "refresh_token" : "mJdXLtmvTUSpoLwMvdBt_w"
}

API返回以下响应:

{
  "redirect" : "https://my-idp.org/logout/SAMLRequest=...."
}

SAML 失效 API

edit

向 Elasticsearch 提交一个 SAML LogoutRequest 消息以供消费。

此API旨在供Kibana以外的自定义Web应用程序使用。 如果您使用的是Kibana,请参阅在Elastic Stack上配置SAML单点登录

请求

edit

POST /_security/saml/invalidate

描述

edit

注销请求来自SAML IdP,在IdP发起的单点注销过程中。 自定义Web应用程序可以使用此API让Elasticsearch处理LogoutRequest。 在成功验证请求后,Elasticsearch会使与该特定SAML主体对应的访问令牌和刷新令牌失效,并提供一个包含SAML LogoutResponse消息的URL,以便用户可以重定向回其IdP。

Elasticsearch 通过 SAML API 暴露了所有必要的 SAML 相关功能。 这些 API 由 Kibana 内部使用,以提供基于 SAML 的身份验证,但也可以由其他自定义 Web 应用程序或其他客户端使用。另请参阅 SAML authenticate APISAML prepare authentication APISAML logout APISAML complete logout API

请求体

edit
acs
(可选,字符串) 与Elasticsearch中SAML领域之一的断言消费者服务URL匹配的URL。您必须指定此参数或realm参数。
query_string
(必需,字符串)用户被SAML IdP重定向以启动单点注销的URL的查询部分。此查询应包含一个名为SAMLRequest的参数,该参数包含一个被压缩和Base64编码的SAML注销请求。如果SAML IdP已签署注销请求,URL应包含两个额外的参数,名为SigAlgSignature,分别包含用于签名的算法和签名值本身。 为了使Elasticsearch能够验证IdP的签名,query_string字段的值必须与浏览器提供的字符串完全匹配。客户端应用程序不得尝试以任何方式解析或处理该字符串。
queryString
[7.14.0] 在7.14.0中已弃用。请改用query_string 请参阅query_string
realm
(可选, 字符串) Elasticsearch 中 SAML 领域的名称。您必须指定此参数或 acs 参数。

响应体

edit
invalidated
(整数) 作为此注销的一部分被无效化的令牌数量。
realm
(字符串) Elasticsearch 中对用户进行身份验证的 SAML 领域的领域名称。
redirect
(字符串) 一个作为参数的SAML注销响应,以便用户可以被重定向回SAML身份提供者。

示例

edit

以下示例使与用户相关的领域 saml1 的所有令牌失效,该用户在 SAML 注销请求中被标识:

POST /_security/saml/invalidate
{
  "query_string" : "SAMLRequest=nZFda4MwFIb%2FiuS%2BmviRpqFaClKQdbvo2g12M2KMraCJ9cRR9utnW4Wyi13sMie873MeznJ1aWrnS3VQGR0j4mLkKC1NUeljjA77zYyhVbIE0dR%2By7fmaHq7U%2BdegXWGpAZ%2B%2F4pR32luBFTAtWgUcCv56%2Fp5y30X87Yz1khTIycdgpUW9kY7WdsC9zxoXTvMvWuVV98YyMnSGH2SYE5pwALBIr9QKiwDGpW0oGVUznGeMyJZKFkQ4jBf5HnhUymjIhzCAL3KNFihbYx8TBYzzGaY7EnIyZwHzCWMfiDnbRIftkSjJr%2BFu0e9v%2B0EgOquRiiZjKpiVFp6j50T4WXoyNJ%2FEWC9fdqc1t%2F1%2B2F3aUpjzhPiXpqMz1%2FHSn4A&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256&Signature=MsAYz2NFdovMG2mXf6TSpu5vlQQyEJAg%2B4KCwBqJTmrb3yGXKUtIgvjqf88eCAK32v3eN8vupjPC8LglYmke1ZnjK0%2FKxzkvSjTVA7mMQe2AQdKbkyC038zzRq%2FYHcjFDE%2Bz0qISwSHZY2NyLePmwU7SexEXnIz37jKC6NMEhus%3D",
  "realm" : "saml1"
}
{
  "redirect" : "https://my-idp.org/logout/SAMLResponse=....",
  "invalidated" : 2,
  "realm" : "saml1"
}

SAML 完全注销 API

edit

验证从SAML身份提供者发送的注销响应。

此API旨在供Kibana以外的自定义Web应用程序使用。 如果您使用的是Kibana,请参阅在Elastic Stack上配置SAML单点登录

请求

edit

POST /_security/saml/complete_logout

描述

edit

SAML IdP 在处理完 SP 发起的 SAML 单点注销 后,可能会向 SP 发送一个注销响应。此 API 通过确保内容相关并验证其签名来验证响应。如果验证过程成功,则返回空响应。IdP 可以通过 HTTP-Redirect 或 HTTP-Post 绑定发送响应。调用此 API 的调用者必须相应地准备请求,以便此 API 可以处理其中任何一种方式。

Elasticsearch 通过 SAML API 提供了所有必要的 SAML 相关功能。 这些 API 由 Kibana 内部使用,以提供基于 SAML 的身份验证,但也可以由其他自定义 Web 应用程序或其他客户端使用。另请参阅 SAML authenticate APISAML prepare authentication APISAML invalidate APISAML logout API

请求体

edit
realm
(必需,字符串) 用于验证注销响应的 Elasticsearch 中 SAML 领域的名称。
ids
(必需,数组) 包含当前用户所有有效 SAML 请求 ID 的 JSON 数组。
query_string
(可选, 字符串) 如果 SAML IdP 使用 HTTP-Redirect 绑定发送注销响应,此字段必须设置为重定向 URI 的查询字符串。
queryString
[7.14.0] 在7.14.0中已弃用。请改用query_string 参见query_string
content
(可选,字符串) 如果 SAML IdP 使用 HTTP-Post 绑定发送注销响应,此字段必须设置为注销响应中 SAMLResponse 表单参数的值。

示例

edit

以下示例验证通过HTTP-Redirect绑定发送的SAML IdP的注销响应:

POST /_security/saml/complete_logout
{
  "realm": "saml1",
  "ids": [ "_1c368075e0b3..." ],
  "query_string": "SAMLResponse=fZHLasMwEEVbfb1bf...&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=CuCmFn%2BLqnaZGZJqK..."
}

如果注销响应是通过HTTP-Post绑定发送的,可以按如下方式进行验证:

POST /_security/saml/complete_logout
{
  "realm": "saml1",
  "ids": [ "_1c368075e0b3..." ],
  "content": "PHNhbWxwOkxvZ291dFJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46..."
}

API在成功时返回一个空响应。

SAML服务提供者元数据API

edit

生成SAML 2.0服务提供商的SAML元数据。

请求

edit

GET /_security/saml/metadata/

描述

edit

SAML 2.0 规范提供了一种机制,使服务提供商能够使用元数据文件描述其功能和配置。此 API 根据 Elasticsearch 中 SAML 领域的配置生成服务提供商元数据。

路径参数

edit
<realm_name>
(必需,字符串) Elasticsearch 中 SAML 领域的名称。

响应体

edit
metadata
(字符串) 包含领域SAML服务提供商元数据的XML字符串。

示例

edit

以下示例为 SAML 领域 saml1 生成服务提供商元数据:

GET /_security/saml/metadata/saml1

API返回包含SAML元数据的XML字符串的响应:

{
    "metadata" : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><md:EntityDescriptor xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\" entityID=\"https://kibana.org\"><md:SPSSODescriptor AuthnRequestsSigned=\"false\" WantAssertionsSigned=\"true\" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol\"><md:SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://kibana.org/logout\"/><md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://kibana.org/api/security/saml/callback\" index=\"1\" isDefault=\"true\"/></md:SPSSODescriptor></md:EntityDescriptor>"
}

SSL证书API

edit

The certificates API 使您能够检索有关用于加密 Elasticsearch 集群中通信的 X.509 证书的信息。

请求

edit

GET /_ssl/certificates

先决条件

edit
  • 如果启用了安全功能,您必须拥有monitor集群权限才能使用此API。更多信息,请参阅安全权限

描述

edit

有关证书如何与传输层安全(TLS)一起配置的更多信息,请参阅 使用 TLS 加密节点间通信

API返回一个包含所有TLS上下文中证书的列表,包括:

  • 传输和HTTP接口的设置
  • 在认证领域内使用的TLS设置
  • 远程监控导出器的TLS设置

该列表包括用于配置信任的证书,例如在 xpack.security.transport.ssl.truststorexpack.security.transport.ssl.certificate_authorities 设置中配置的证书。它还包括用于配置服务器身份的证书,例如 xpack.security.http.ssl.keystorexpack.security.http.ssl.certificate 设置。

该列表不包括从Java运行时环境(JRE)默认SSL上下文中获取的证书,即使这些证书在Elasticsearch中正在使用。

当一个PKCS#11令牌被配置为JRE的信任库时,API将返回所有包含在PKCS#11令牌中的证书,无论这些证书是否在Elasticsearch TLS配置中使用。

如果 Elasticsearch 配置为使用密钥库或信任库,API 输出将包含该库中的所有证书,即使其中一些证书可能不在集群中处于活动使用状态。

响应体

edit

响应是一个对象数组,每个对象代表一个单独的证书。每个对象中的字段包括:

path
(字符串) 证书的路径,如在 elasticsearch.yml 文件中配置的那样。
format
(字符串) 文件的格式。可以是以下之一:jks, PKCS12, PEM
alias
(字符串) 如果路径指向一个容器文件(如jks密钥库或PKCS#12文件),则为证书的别名。否则,为null。
subject_dn
(字符串) 证书主题的专有名称。
serial_number
(字符串) 证书序列号的十六进制表示。
has_private_key
(布尔值) 指示 Elasticsearch 是否可以访问此证书的私钥。
expiry
(字符串) 证书的到期日期(not-after日期)的ISO格式日期。
issuer
(字符串) 证书颁发者的可分辨名称。

示例

edit

以下示例提供了有关 Elasticsearch 单个节点上证书的信息:

GET /_ssl/certificates

API返回以下结果:

[
  {
    "path": "certs/elastic-certificates.p12",
    "format": "PKCS12",
    "alias": "instance",
    "subject_dn": "CN=Elastic Certificate Tool Autogenerated CA",
    "serial_number": "a20f0ee901e8f69dc633ff633e5cd5437cdb4137",
    "has_private_key": false,
    "expiry": "2021-01-15T20:42:49.000Z"
  },
  {
    "path": "certs/elastic-certificates.p12",
    "format": "PKCS12",
    "alias": "ca",
    "subject_dn": "CN=Elastic Certificate Tool Autogenerated CA",
    "serial_number": "a20f0ee901e8f69dc633ff633e5cd5437cdb4137",
    "has_private_key": false,
    "expiry": "2021-01-15T20:42:49.000Z"
  },
  {
    "path": "certs/elastic-certificates.p12",
    "format": "PKCS12",
    "alias": "instance",
    "subject_dn": "CN=instance",
    "serial_number": "fc1905e1494dc5230218d079c47a617088f84ce0",
    "has_private_key": true,
    "expiry": "2021-01-15T20:44:32.000Z"
  }
]

激活用户配置文件 API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

代表另一个用户创建或更新用户配置文件。

请求

edit

POST /_security/profile/_activate

先决条件

edit
  • 要使用此API,您必须拥有manage_user_profile集群权限。

描述

edit

激活用户配置文件 API 创建或更新一个配置文件文档,该文档包含从用户的认证对象中提取的信息,包括 usernamefull_nameroles 以及认证领域。例如,在 JWT access_token 的情况下,配置文件用户的 username 是从 JWT 令牌声明中提取的,该声明由认证该令牌的 JWT 领域的 claims.principal 设置所指向。

当更新个人资料文档时,API会启用该文档(如果它之前被禁用)。任何更新都不会改变labelsdata字段的现有内容。

此API仅供需要为最终用户创建或更新配置文件的应用程序(如Kibana)使用。

调用应用程序必须拥有一个access_token,或者为用户的目标配置文件文档提供usernamepassword的组合。

请求体

edit
access_token
(必填*, 字符串) 用户的 Elasticsearch 访问令牌 或 JWT。支持 访问ID JWT 令牌类型,它们依赖于底层 JWT 领域配置。 如果您指定 access_token 授权类型,则此参数是必需的。它与其他授权类型不兼容。
client_authentication

(可选, 对象) 当使用 access_token 授权类型时,并且提供 JWT 时,这指定了需要它的 JWTs 的客户端认证(即通常由 ES-Client-Authentication 请求头指定的内容)。

scheme
(必需, 字符串) 方案(区分大小写),如在 ES-Client-Authentication 请求头中提供的。目前,唯一支持的值是 SharedSecret
value
(必需, 字符串) 客户端凭据的值,该值跟随方案,如在 ES-Client-Authentication 请求头中提供的。例如,如果请求头是 ES-Client-Authentication: SharedSecret myShar3dS3cret,如果客户端直接使用 JWT 进行认证,那么这里的 value 应该是 myShar3dS3cret
grant_type

(必需, 字符串) 授权的类型。

有效值为 grant_type
access_token
在这种授权类型中,您必须提供一个由 Elasticsearch 令牌服务创建的访问令牌(参见 获取令牌 API为 Elasticsearch 加密 HTTP 客户端通信),或者一个 JWT(可以是 JWT access_token 或 JWT id_token)。
password
在这种授权类型中,您必须提供要为其创建 API 密钥的用户的 usernamepassword
password
(必填*, 字符串) 用户的密码。如果您指定password授权类型,此参数是必需的。它与其他授权类型不兼容。
username
(必填*, 字符串) 用于标识用户的用户名。如果您指定password授权类型,则此参数是必需的。它与其他授权类型不兼容。

*表示在某些情况下需要设置,但并非所有情况下都需要。

响应体

edit

成功的激活用户配置文件 API 调用返回一个 JSON 结构,其中包含配置文件唯一 ID、用户信息、操作时间戳和版本控制编号。

示例

edit
POST /_security/profile/_activate
{
  "grant_type": "password",
  "username" : "jacknich",
  "password" : "l0ng-r4nd0m-p@ssw0rd"
}

API返回以下响应:

{
  "uid": "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0",
  "enabled": true,
  "last_synchronized": 1642650651037,
  "user": {
    "username": "jacknich",
    "roles": [
      "admin", "other_role1"
    ],
    "realm_name": "native",
    "full_name": "Jack Nicholson",
    "email": "jacknich@example.com"
  },
  "labels": {},
  "data": {},
  "_doc": {
    "_primary_term": 88,
    "_seq_no": 66
  }
}

禁用用户配置文件 API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

禁用用户配置文件,使其在用户配置文件搜索中不可见。

请求

edit

POST /_security/profile//_disable

PUT /_security/profile//_disable

先决条件

edit

要使用此API,您必须拥有manage_user_profile集群权限。

描述

edit

当您激活用户档案时,它会自动启用并在用户档案搜索中可见。您可以使用禁用用户档案API来禁用用户档案,使其在这些搜索中不可见。

要重新启用已禁用的用户配置文件,请使用启用用户配置文件 API

路径参数

edit
<uid>
(必需,字符串) 用户配置文件的唯一标识符。

查询参数

edit
refresh
(可选,枚举) 如果 true,Elasticsearch 会刷新受影响的 shards 以使此操作对搜索可见,如果 wait_for 则等待刷新以使此操作对搜索可见,如果 false 则不对刷新做任何操作。 有效值: true, false, wait_for。默认值: false

示例

edit

以下请求禁用了与uid匹配的用户档案:

POST /_security/profile/u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0/_disable

启用用户配置文件API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

启用用户配置文件,使其在 用户配置文件搜索中可见。

请求

edit

POST /_security/profile//_enable

PUT /_security/profile//_enable

先决条件

edit

要使用此API,您必须拥有manage_user_profile集群权限。

描述

edit

当您激活用户配置文件时,它会自动启用并在用户配置文件搜索中可见。如果您之后禁用用户配置文件,您可以使用启用用户配置文件 API 使该配置文件再次在这些搜索中可见。

路径参数

edit
<uid>
(必需, 字符串) 用户配置文件的唯一标识符。

查询参数

edit
refresh
(可选,枚举) 如果 true,Elasticsearch 会刷新受影响的 shards 以使此操作对搜索可见,如果 wait_for 则等待刷新以使此操作对搜索可见,如果 false 则不对刷新做任何操作。 有效值:truefalsewait_for。默认值:false

示例

edit

以下请求为匹配u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0uid启用用户配置文件:

POST /_security/profile/u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0/_enable

获取用户资料 API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

使用唯一用户档案ID列表检索用户档案。

请求

edit

GET /_security/profile/

先决条件

edit

要使用此API,您必须至少拥有read_security 集群权限(或更高权限,如manage_user_profilemanage_security)。

描述

edit

获取用户配置文件API返回与指定uid匹配的用户配置文件文档,该uid是在激活用户配置文件时生成的。

路径参数

edit
uid
(必需,字符串) 用户配置文件的唯一标识符。您可以指定多个ID作为逗号分隔的列表。

查询参数

edit
data
(可选,字符串) 用于 data 字段过滤器的逗号分隔列表。要返回所有内容,请使用 data=*。要返回内容的子集,请使用 data= 来检索嵌套在指定 下的内容。默认不返回任何内容。

响应体

edit

成功的调用将返回用户配置文件的JSON表示形式及其内部版本号。如果未找到所提供的uid的配置文件文档,API将返回一个空对象。默认情况下,不会返回data字段的内容,以避免反序列化潜在的大负载。

示例

edit
GET /_security/profile/u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0

API 返回以下响应,对应于匹配 u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0uid

{
  "profiles": [
    {
      "uid": "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0",
      "enabled": true,
      "last_synchronized": 1642650651037,
      "user": {
        "username": "jacknich",
        "roles": [
          "admin", "other_role1"
        ],
        "realm_name": "native",
        "full_name": "Jack Nicholson",
        "email": "jacknich@example.com"
      },
      "labels": {
        "direction": "north"
      },
      "data": {}, 
      "_doc": {
        "_primary_term": 88,
        "_seq_no": 66
      }
    }
  ]
}

默认情况下,data 字段中不会返回任何内容。

以下请求检索嵌套在键 app1 下的 data 子集,以及用户的个人资料:

GET /_security/profile/u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0?data=app1.key1
{
  "profiles": [
    {
      "uid": "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0",
      "enabled": true,
      "last_synchronized": 1642650651037,
      "user": {
        "username": "jacknich",
        "roles": [
          "admin", "other_role1"
        ],
        "realm_name": "native",
        "full_name": "Jack Nicholson",
        "email": "jacknich@example.com"
      },
      "labels": {
        "direction": "north"
      },
      "data": {
        "app1": {
          "key1": "value1"
        }
      },
      "_doc": {
        "_primary_term": 88,
        "_seq_no": 66
      }
    }
  ]
}

如果在获取用户资料时出现任何错误,它们将返回在 errors 字段中:

{
  "profiles": [],
  "errors": {
    "count": 1,
    "details": {
       "u_FmxQt3gr1BBH5wpnz9HkouPj3Q710XkOgg1PWkwLPBW_5": {
         "type": "resource_not_found_exception",
         "reason": "profile document not found"
       }
    }
  }
}

建议用户资料 API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

获取与指定搜索条件匹配的用户配置文件建议。

请求

edit

GET /_security/profile/_suggest

POST /_security/profile/_suggest

先决条件

edit

要使用此API,您必须至少拥有read_security 集群权限(或更高权限,如manage_user_profilemanage_security)。

查询参数

edit
data
(可选,字符串) 用于 data 字段过滤器的逗号分隔列表。要返回所有内容,请使用 data=*。要返回内容的子集,请使用 data= 来检索嵌套在指定 下的内容。默认不返回任何内容。

请求体

edit
name
(可选, 字符串) 用于匹配用户配置文件文档中与名称相关的字段的查询字符串。名称相关的字段包括用户的usernamefull_nameemail
size
(可选, 整数) 返回的配置文件数量。默认为 10
data
(可选,字符串) 用于data字段的分隔符列表,以过滤配置文件文档。它的工作方式与data查询参数相同。

指定data作为查询参数和请求体字段是错误的。

hint

(可选, 对象) 额外的搜索条件以提高建议结果的相关性。 与指定提示匹配的配置文件在响应中排名更高。 但不匹配提示的配置文件只要匹配name字段查询,就不会被排除在响应之外。

Properties of hint:
uids
(可选, 字符串列表) 要匹配的配置文件UID列表。
labels
(可选, 对象) 一个键值对,用于匹配配置文件的labels部分。 键必须是字符串,值必须是字符串或字符串列表。 如果配置文件匹配至少一个字符串,则认为它匹配。

响应体

edit
total
(对象) 匹配配置文件数量的元数据。
took
(整数) Elasticsearch 执行请求所花费的毫秒数。
profiles
(对象数组) 按相关性排序的配置文件文档列表,符合搜索条件。

示例

edit

以下请求获取与名称相关字段匹配jack的配置文件文档的建议。它指定了uidslabels提示以提高相关性:

POST /_security/profile/_suggest
{
  "name": "jack",  
  "hint": {
    "uids": [  
      "u_8RKO7AKfEbSiIHZkZZ2LJy2MUSDPWDr3tMI_CkIGApU_0",
      "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0"
    ],
    "labels": {
      "direction": ["north", "east"]  
    }
  }
}

配置文件的与名称相关的字段必须匹配 jack,才能包含在响应中。

提示 uids 包括用户 jackspajacknich 的配置文件 UID。

如果配置文件的direction标签与northeast匹配,labels提示会将这些配置文件的排名提高。

API返回:

{
  "took": 30,
  "total": {
    "value": 3,
    "relation": "eq"
  },
  "profiles": [
    {
      "uid": "u_79HkWkwmnBH5gqFKwoxggWPjEBOur1zLPXQPEl1VBW0_0",
      "user": {
        "username": "jacknich",    
        "roles": [ "admin", "other_role1" ],
        "realm_name": "native",
        "email" : "jacknich@example.com",
        "full_name": "Jack Nicholson"
      },
      "labels": {
        "direction": "north"
      },
      "data": {}
    },
    {
      "uid": "u_8RKO7AKfEbSiIHZkZZ2LJy2MUSDPWDr3tMI_CkIGApU_0",
      "user": {
        "username": "jackspa",    
        "roles": [ "user" ],
        "realm_name": "native",
        "email" : "jackspa@example.com",
        "full_name": "Jack Sparrow"
      },
      "labels": {
        "direction": "south"
      },
      "data": {}
    },
    {
      "uid": "u_P_0BMHgaOK3p7k-PFWUCbw9dQ-UFjt01oWJ_Dp2PmPc_0",
      "user": {
        "username": "jackrea",    
        "roles": [ "admin" ],
        "realm_name": "native",
        "email" : "jackrea@example.com",
        "full_name": "Jack Reacher"
      },
      "labels": {
        "direction": "west"
      },
      "data": {}
    }
  ]
}

用户 jacknich 排名最高,因为该用户的资料同时匹配了 uidslabels 提示

用户 jackspa 排名第二,因为该配置文件仅匹配 uids 提示

用户 jackrea 排名最低,因为该配置文件与任何提示都不匹配。然而,它不会被排除在响应之外,因为它与 name 查询匹配。

更新用户资料数据 API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

更新与指定唯一ID关联的用户个人资料的特定数据。

请求

edit

POST /_security/profile//_data

前提条件

edit

要使用此API,您必须拥有以下权限之一:

  • manage_user_profile 集群权限。
  • update_profile_data 全局权限,用于请求中引用的命名空间。

描述

edit

更新用户资料API使用JSON对象更新现有用户资料文档中的labelsdata字段。新的键及其值会被添加到用户资料文档中,而冲突的键将被请求中包含的数据替换。

对于labelsdata,内容由顶级字段进行命名空间划分。 update_profile_data全局权限仅授予更新允许的命名空间的权限。

路径参数

edit
uid
(必需,字符串) 用户配置文件的唯一标识符。

查询参数

edit
if_seq_no
(可选,整数) 仅在文档具有此序列号时执行操作。请参阅乐观并发控制
if_primary_term
(可选,整数) 仅在文档具有此主项时执行操作。请参阅乐观并发控制
refresh
(可选,枚举) 如果 true,Elasticsearch 会刷新受影响的 shards 以使此操作对搜索可见,如果 wait_for 则等待刷新以使此操作对搜索可见,如果 false 则不对刷新做任何操作。 有效值:truefalsewait_for。默认值:false
uid
(必需,字符串) 用户配置文件的唯一标识符。

请求体

edit
labels
(必需*, 对象) 您希望与用户档案关联的可搜索数据。 此字段支持嵌套数据结构。在 labels 对象中, 顶级键不能以下划线 (_) 开头或包含句点 (.)。
data
(必需*, 对象) 您希望与用户档案关联的不可搜索数据。 此字段支持嵌套数据结构。在 data 对象中,顶级键不能以下划线 (_) 开头或包含句点 (.)。 data 对象不可搜索,但可以通过 获取用户档案 API 检索。

*表示在某些情况下需要设置,但并非所有情况下都需要。

响应体

edit

成功的更新用户资料数据API调用返回一个JSON结构,表明请求已被确认:

{
  "acknowledged": true
}

示例

edit

以下请求更新与uid匹配的配置文件文档,u_P_0BMHgaOK3p7k-PFWUCbw9dQ-UFjt01oWJ_Dp2PmPc_0

POST /_security/profile/u_P_0BMHgaOK3p7k-PFWUCbw9dQ-UFjt01oWJ_Dp2PmPc_0/_data
{
  "labels": {
    "direction": "east"
  },
  "data": {
    "app1": {
      "theme": "default"
    }
  }
}

您可以更新配置文件数据以替换某些键并添加新键:

POST /_security/profile/u_P_0BMHgaOK3p7k-PFWUCbw9dQ-UFjt01oWJ_Dp2PmPc_0/_data
{
  "labels": {
    "direction": "west"
  },
  "data": {
    "app1": {
      "font": "large"
    }
  }
}

如果你现在获取个人资料,将返回合并后的个人资料数据:

GET /_security/profile/u_P_0BMHgaOK3p7k-PFWUCbw9dQ-UFjt01oWJ_Dp2PmPc_0?data=*
{
  "profiles": [
    {
      "uid": "u_P_0BMHgaOK3p7k-PFWUCbw9dQ-UFjt01oWJ_Dp2PmPc_0",
      "enabled": true,
      "last_synchronized": 1642650651037,
      "user": {
        "username": "jackrea",
        "roles": [
          "admin"
        ],
        "realm_name": "native",
        "full_name": "Jack Reacher",
        "email": "jackrea@example.com"
      },
      "labels": {
        "direction": "west"
      },
      "data": {
        "app1": {
          "theme": "default",
          "font": "large"
        }
      },
      "_doc": {
        "_primary_term": 88,
        "_seq_no": 66
      }
    }
  ]
}

拥有权限用户配置文件 API

edit

用户配置文件功能仅设计用于 Kibana 和 Elastic 的可观测性、企业搜索及 Elastic 安全解决方案。个人用户和外部应用程序不应直接调用此 API。Elastic 保留在未来的版本中更改或移除此功能而无需事先通知的权利。

确定与指定用户配置文件 ID 关联的用户是否拥有所有请求的权限。

请求

edit

GET /_security/profile/_has_privileges

POST /_security/profile/_has_privileges

先决条件

edit

要使用此API,您必须至少拥有read_security 集群权限(或更高权限,如manage_user_profilemanage_security)。

描述

edit

此API使用由激活用户配置文件返回的配置文件ID,来识别要检查权限的用户。 它类似于拥有权限API,但与它不同的是,此API检查其他用户的权限,而不是调用它的用户的权限。

请参阅安全权限以获取可在此API中指定的权限列表。

成功的调用将返回具有所有请求权限的配置文件ID子集列表。

请求体

edit
uids
(列表) 一个包含配置文件ID的列表。特权是为与这些配置文件关联的用户检查的。
privileges

包含所有要检查的权限的对象。

cluster
(列表) 您要检查的集群权限列表。
index
names
(列表) 索引列表。
allow_restricted_indices
(布尔值) 如果使用通配符或正则表达式来覆盖受限索引的模式,则需要将其设置为 true(默认值为 false)。隐式地,受限索引不匹配索引模式,因为受限索引通常具有有限的权限,并且将它们包含在模式测试中会使大多数此类测试结果为 false。如果受限索引明确包含在 names 列表中,则无论 allow_restricted_indices 的值如何,都会检查它们对应的权限。
privileges
(列表) 您要为指定索引检查的权限列表。
application
application
(字符串) 应用程序的名称。
privileges
(列表) 您要为指定资源检查的权限列表。可以是应用程序权限名称,或者是这些权限授予的操作名称。
resources
(列表) 应检查权限的资源名称列表。

请注意,上面的privileges部分与其他Has Privileges API的请求体相同。

响应体

edit

一个成功的用户权限配置文件API调用返回一个包含两个字段的JSON结构:

has_privilege_uids
(列表) 具有所请求权限的用户请求的配置文件ID的子集。 所有 所请求的权限。
errors

(对象) 在满足请求时遇到的错误。如果没有错误,此字段不存在。 它包括没有所有请求权限的用户的配置文件ID。

对象的属性在 errors
count
(数字) 错误总数
details
(对象) 详细的错误报告,键为配置文件ID,值为确切的错误。

示例

edit

以下示例检查与指定配置文件关联的两个用户是否具有所有请求的集群、索引和应用程序权限:

POST /_security/profile/_has_privileges
{
  "uids": [
    "u_LQPnxDxEjIH0GOUoFkZr5Y57YUwSkL9Joiq-g4OCbPc_0",
    "u_rzRnxDgEHIH0GOUoFkZr5Y27YUwSk19Joiq=g4OCxxB_1",
    "u_does-not-exist_0"
  ],
  "privileges": {
    "cluster": [ "monitor", "create_snapshot", "manage_ml" ],
    "index" : [
      {
        "names": [ "suppliers", "products" ],
        "privileges": [ "create_doc"]
      },
      {
        "names": [ "inventory" ],
        "privileges" : [ "read", "write" ]
      }
    ],
    "application": [
      {
        "application": "inventory_manager",
        "privileges" : [ "read", "data:write/inventory" ],
        "resources" : [ "product/1852563" ]
      }
    ]
  }
}

以下示例输出表明,三个用户中只有一个拥有所有权限,其中一个未找到:

{
  "has_privilege_uids": ["u_rzRnxDgEHIH0GOUoFkZr5Y27YUwSk19Joiq=g4OCxxB_1"],
  "errors": {
    "count": 1,
    "details": {
      "u_does-not-exist_0": {
        "type": "resource_not_found_exception",
        "reason": "profile document not found"
      }
    }
  }
}

创建跨集群API密钥API

edit

基于API密钥的远程集群访问创建一个cross_cluster类型的API密钥。 cross_cluster API密钥不能用于通过REST接口进行身份验证。 相反,REST API密钥旨在通过REST接口使用, 并且不能用于基于API密钥的远程集群访问。

请求

edit

POST /_security/cross_cluster/api_key

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。

要验证此请求,您必须使用不是API密钥的凭证。即使您使用具有所需权限的API密钥,API也会返回错误。

描述

edit

跨集群API密钥由Elasticsearch API密钥服务创建,该服务默认自动启用。 有关禁用API密钥服务的说明,请参阅API密钥服务设置

成功的请求返回一个包含API密钥、其唯一ID和名称的JSON结构。如果适用,它还会返回API密钥的过期信息,以毫秒为单位。

默认情况下,API 密钥永不过期。您可以在创建 API 密钥时指定过期信息。

请参阅API key service settings以获取与API key服务相关的配置设置。

跨集群API密钥只能通过 更新跨集群API密钥API进行更新。 尝试使用更新REST API密钥API批量更新REST API密钥API进行更新将导致错误。 它们可以通过获取API密钥API查询API密钥API使API密钥失效API进行检索和失效。

请求体

edit

以下参数可以在POST请求的正文中指定:

name
(必需,字符串) 指定此API密钥的名称。
access

(必需, 对象) 授予此 API 密钥的访问权限。访问权限由跨集群搜索和跨集群复制的权限组成。至少必须指定其中之一。

search

(可选, 列表) 一个用于跨集群搜索的索引权限条目列表。

names
(必需, 列表) 一个索引或名称模式的列表,此条目中的权限适用于这些索引或名称模式。
field_security
(可选, 对象) 角色所有者具有读访问权限的文档字段。当同时定义了 replication 字段时,此字段可能不会被设置。有关更多信息,请参阅 跨集群 API 密钥的字段和文档级安全
query
(可选) 定义角色所有者具有读访问权限的文档的搜索查询。指定索引中的文档必须匹配此查询才能被角色所有者访问。当同时定义了 replication 字段时,此字段可能不会被设置。有关更多信息,请参阅 跨集群 API 密钥的字段和文档级安全
allow_restricted_indices
(可选, 布尔值) 如果 names 字段中的模式应覆盖 系统索引,则需要设置为 true(默认值为 false)。
replication

(可选,列表) 用于跨集群复制的索引权限条目列表。

names
(必需, 列表) 一个索引或名称模式的列表,此条目中的权限适用于这些索引或名称模式。

对于搜索或复制访问,不应指定任何显式的权限。创建过程会自动将access规范转换为角色描述符,并相应地分配相关权限。access值及其对应的role_descriptors会在获取API密钥信息API查询API密钥信息API的响应中返回。

REST API 密钥不同,跨集群 API 密钥不会捕获已验证用户的权限。API 密钥的有效权限与使用 access 参数指定的权限完全一致。

expiration
(可选, 字符串) API 密钥的过期时间。默认情况下,API 密钥永不过期。
metadata
(可选, 对象) 您希望与API密钥关联的任意元数据。 它支持嵌套数据结构。 在metadata对象中,以_开头的键保留用于系统使用。

示例

edit

以下示例创建了一个跨集群的API密钥:

POST /_security/cross_cluster/api_key
{
  "name": "my-cross-cluster-api-key",
  "expiration": "1d",   
  "access": {
    "search": [  
      {
        "names": ["logs*"]
      }
    ],
    "replication": [  
      {
        "names": ["archive*"]
      }
    ]
  },
  "metadata": {
    "description": "phase one",
    "environment": {
       "level": 1,
       "trusted": true,
       "tags": ["dev", "staging"]
    }
  }
}

生成的API密钥的可选过期时间。如果未提供过期时间,则API密钥不会过期。

授予API密钥跨集群搜索访问权限。

跨集群复制访问权限将被授予API密钥。

成功的调用返回一个JSON结构,提供API密钥信息。

{
  "id": "VuaCfGcBCdbkQm-e5aOx",        
  "name": "my-cross-cluster-api-key",
  "expiration": 1544068612110,         
  "api_key": "ui2lp2axTNmsyakw9tvNnw", 
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="  
}

此 API 密钥的唯一 id

此API密钥的可选过期时间(以毫秒为单位)

生成的 API 密钥密文

API key 凭证,即 idapi_key 的 UTF-8 表示形式通过冒号 (:) 连接后的 Base64 编码

API 密钥信息可以通过 获取 API 密钥信息 API 来检索。

GET /_security/api_key?id=VuaCfGcBCdbkQm-e5aOx

成功调用返回一个包含API密钥信息的JSON结构:

{
  "api_keys": [
    {
      "id": "VuaCfGcBCdbkQm-e5aOx", 
      "name": "my-cross-cluster-api-key", 
      "type": "cross_cluster", 
      "creation": 1548550550158,
      "expiration": 1548551550158,
      "invalidated": false,
      "username": "myuser",
      "realm": "native1",
      "metadata": {
        "description": "phase one",
          "environment": {
             "level": 1,
             "trusted": true,
             "tags": ["dev", "staging"]
          }
      },
      "role_descriptors": {  
        "cross_cluster": {
          "cluster": [  
              "cross_cluster_search", "cross_cluster_replication"
          ],
          "indices": [
            {  
              "names": [
                "logs*"
              ],
              "privileges": [
                "read", "read_cross_cluster", "view_index_metadata"
              ],
              "allow_restricted_indices": false
            },
            {  
              "names": [
                "archive*"
              ],
              "privileges": [
                "cross_cluster_replication", "cross_cluster_replication_internal"
              ],
              "allow_restricted_indices": false
            }
          ],
          "applications": [ ],
          "run_as": [ ],
          "metadata": { },
          "transient_metadata": {
            "enabled": true
          }
        }
      },
      "access": {  
        "search": [
          {
            "names": [
              "logs*"
            ],
            "allow_restricted_indices": false
          }
        ],
        "replication": [
          {
            "names": [
              "archive*"
            ],
            "allow_restricted_indices": false
          }
        ]
      }
    }
  ]
}

API 密钥的 ID

API 密钥的名称

API 密钥的类型

为跨集群 API 密钥生成的角色描述符。它总是包含一个名为 cross_cluster 的角色描述符。跨集群 API 密钥没有受限的角色描述符。

进行所需跨集群访问所需的集群权限。 如果只需要跨集群搜索,则值为cross_cluster_search。 如果只需要跨集群复制,则值为cross_cluster_replication。 如果需要搜索和复制,则两者都需要。

与所需跨集群搜索访问相对应的索引权限。

与所需跨集群复制访问相对应的索引权限。

The access 对应于在API密钥创建时指定的值。

要使用生成的 API 密钥,请将其配置为 API 密钥远程集群配置的一部分中的集群凭据。

更新跨集群API密钥API

edit

更新用于基于API密钥的远程集群访问的现有跨集群API密钥。

请求

edit

PUT /_security/cross_cluster/api_key/

先决条件

edit
  • 要使用此API,您必须至少拥有manage_security集群权限。 用户只能更新他们自己创建的API密钥。 要更新其他用户的API密钥,请使用run_as功能 代表其他用户提交请求。

无法使用 API 密钥作为此 API 的身份验证凭据。 要更新 API 密钥,需要所有者用户的凭据。

描述

edit

使用此API更新由创建跨集群API密钥API创建的跨集群API密钥。 无法更新已过期的API密钥,或已被使API密钥失效的API密钥。

此API支持对API密钥的访问范围、元数据和过期时间的更新。 每次调用时,所有者用户的信息,例如用户名领域,也会自动更新。

此API无法更新REST API密钥,应通过更新API密钥批量更新API密钥API进行更新。

路径参数

edit
id
(必需, 字符串) 要更新的API密钥的ID。

请求体

edit

您可以在请求体中指定以下参数。这些参数是可选的,但不能全部缺失。

access
(可选, 对象) 授予此API密钥的访问权限。访问权限由跨集群搜索和跨集群复制的权限组成。 至少需要指定其中之一。 指定时,新的访问分配将完全替换之前分配的访问权限。 有关字段结构的详细信息,请参阅创建跨集群API密钥API的相同参数
metadata
(可选, 对象) 您希望与 API 密钥关联的任意元数据。 它支持嵌套数据结构。 在 metadata 对象中,以 _ 开头的顶级键保留用于系统使用。 指定时,这将完全替换之前与 API 密钥关联的元数据。
expiration
(可选, 字符串) API 密钥的过期时间。默认情况下,API 密钥永不过期。可以省略以保持不变。

响应体

edit
updated
(布尔值) 如果 true,API 密钥已更新。 如果 false,API 密钥没有变化,因为没有检测到变化。

示例

edit

如果你创建一个跨集群API密钥如下:

POST /_security/cross_cluster/api_key
{
  "name": "my-cross-cluster-api-key",
  "access": {
    "search": [
      {
        "names": ["logs*"]
      }
    ]
  },
  "metadata": {
    "application": "search"
  }
}

成功调用后返回一个JSON结构,提供API密钥信息。 例如:

{
  "id": "VuaCfGcBCdbkQm-e5aOx",
  "name": "my-cross-cluster-api-key",
  "api_key": "ui2lp2axTNmsyakw9tvNnw",
  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}

API 密钥的信息,包括其确切的角色描述符,可以通过 获取 API 密钥信息 API 进行检查

GET /_security/api_key?id=VuaCfGcBCdbkQm-e5aOx

成功调用返回一个包含API密钥信息的JSON结构:

{
  "api_keys": [
    {
      "id": "VuaCfGcBCdbkQm-e5aOx",
      "name": "my-cross-cluster-api-key",
      "type": "cross_cluster",
      "creation": 1548550550158,
      "expiration": null,
      "invalidated": false,
      "username": "myuser",
      "realm": "native1",
      "metadata": {
        "application": "search"
      },
      "role_descriptors": {
        "cross_cluster": {  
          "cluster": [
              "cross_cluster_search"
          ],
          "indices": [
            {
              "names": [
                "logs*"
              ],
              "privileges": [
                "read", "read_cross_cluster", "view_index_metadata"
              ],
              "allow_restricted_indices": false
            }
          ],
          "applications": [ ],
          "run_as": [ ],
          "metadata": { },
          "transient_metadata": {
            "enabled": true
          }
        }
      },
      "access": {  
        "search": [
          {
            "names": [
              "logs*"
            ],
            "allow_restricted_indices": false
          }
        ]
      }
    }
  ]
}

对应于创建时指定access范围的角色描述符。 在此示例中,它授予logs*索引模式的跨集群搜索权限。

The access 对应于在API密钥创建时指定的值。

以下示例更新了上面创建的API密钥,为其分配了新的访问范围和元数据:

PUT /_security/cross_cluster/api_key/VuaCfGcBCdbkQm-e5aOx
{
  "access": {
    "replication": [
      {
        "names": ["archive"]
      }
    ]
  },
  "metadata": {
    "application": "replication"
  }
}

成功调用返回一个JSON结构,表明API密钥已更新:

{
  "updated": true
}

更新后,API 密钥的权限可以通过 获取 API 密钥信息 API 再次检查,结果将是:

{
  "api_keys": [
    {
      "id": "VuaCfGcBCdbkQm-e5aOx",
      "name": "my-cross-cluster-api-key",
      "type": "cross_cluster",
      "creation": 1548550550158,
      "expiration": null,
      "invalidated": false,
      "username": "myuser",
      "realm": "native1",
      "metadata": {
        "application": "replication"
      },
      "role_descriptors": {
        "cross_cluster": {  
          "cluster": [
              "cross_cluster_replication"
          ],
          "indices": [
            {
              "names": [
                "archive*"
              ],
              "privileges": [
                "cross_cluster_replication", "cross_cluster_replication_internal"
              ],
              "allow_restricted_indices": false
            }
          ],
          "applications": [ ],
          "run_as": [ ],
          "metadata": { },
          "transient_metadata": {
            "enabled": true
          }
        }
      },
      "access": {  
        "replication": [
          {
            "names": [
              "archive*"
            ],
            "allow_restricted_indices": false
          }
        ]
      }
    }
  ]
}

角色描述符已更新为在更新时指定的访问范围。 在此示例中,它已更新为授予archive*索引模式的跨集群复制权限。

The access 对应于在API密钥更新时指定的值。