服务帐户
编辑服务帐户编辑
Elastic Stack 安全功能提供专门用于与连接到 Elasticsearch 的外部服务(例如 Fleet 服务器)集成的*服务帐户*。服务帐户具有一组固定的权限,在您为其创建服务帐户令牌之前无法进行身份验证。此外,服务帐户在代码中预定义,并且始终启用。
服务帐户对应于特定的外部服务。您可以为服务帐户创建服务帐户令牌。然后,该服务可以使用该令牌进行身份验证并执行相关操作。例如,Fleet 服务器可以使用其服务令牌对 Elasticsearch 进行身份验证,然后管理其自己的 API 密钥。
您可以为同一个服务帐户创建多个服务令牌,这可以防止在同一个外部服务的多个实例之间共享凭据。每个实例可以使用其自己的不同服务令牌进行身份验证,同时承担相同的身份。
与 内置用户 相比,服务帐户提供了更高的灵活性,因为它们
- 不依赖于 内部
native
领域,并且不要求始终依赖于.security
索引 - 使用以服务帐户主体命名的 角色描述符,而不是传统角色
- 通过服务帐户令牌支持多个凭据
服务帐户不包含在 获取用户 API 的响应中。要检索服务帐户,请使用 获取服务帐户 API。使用 获取服务帐户凭据 API 检索服务帐户的所有服务凭据。
服务帐户的使用编辑
服务帐户具有 唯一主体,其格式为 <命名空间>/<服务>
,其中 命名空间
是服务帐户的顶级分组,服务
是服务的名称,并且在其命名空间内必须唯一。
服务帐户在代码中预定义。以下服务帐户可用
-
elastic/fleet-server
- Fleet 服务器用于与 Elasticsearch 通信的服务帐户。
-
elastic/kibana
- Kibana 用于与 Elasticsearch 通信的服务帐户。
-
elastic/enterprise-search-server
- Enterprise Search 用于与 Elasticsearch 通信的服务帐户。
不要尝试使用服务帐户对单个用户进行身份验证。服务帐户只能使用服务令牌进行身份验证,而服务令牌不适用于普通用户。
服务帐户令牌编辑
服务帐户令牌(或服务令牌)是服务用于对 Elasticsearch 进行身份验证的唯一字符串。对于给定的服务帐户,每个令牌必须具有唯一的名称。由于令牌包含访问凭据,因此使用它们的任何客户端都应始终对其保密。
服务令牌可以由 .security
索引(推荐)或 service_tokens
文件支持。您可以为单个服务帐户创建多个服务令牌,这使得同一个服务的多个实例可以使用不同的凭据运行。
您必须创建服务令牌才能使用服务帐户。您可以使用以下任一方法创建服务令牌:
- 创建服务帐户令牌 API,它将新的服务令牌保存在
.security
索引中,并在 HTTP 响应中返回承载令牌。 - elasticsearch-service-tokens CLI 工具,它将新的服务令牌保存在
$ES_HOME/config/service_tokens
文件中,并将承载令牌输出到您的终端
我们建议您通过 REST API 而不是 CLI 创建服务令牌。API 将服务令牌存储在 .security
索引中,这意味着这些令牌可用于所有节点上的身份验证,并将备份在集群快照中。CLI 的使用适用于存在外部编排流程(例如 Elastic Cloud Enterprise 或 Elastic Cloud on Kubernetes)的情况,这些流程将管理 service_tokens
文件的创建和分发。
这两种方法(API 和 CLI)都会创建一个服务令牌,其保证的密钥字符串长度为 22
。服务令牌的密钥字符串的最小可接受长度为 10
。如果密钥字符串不满足此最小长度,则对 Elasticsearch 的身份验证将失败,甚至不会检查服务令牌的值。
服务令牌永不过期。如果不再需要它们,您必须主动将其 删除。
使用服务令牌进行身份验证编辑
服务帐户当前不支持基本身份验证。
要使用服务帐户令牌,请在请求中包含生成的令牌值,并使用 Authorization: Bearer
标头
curl -H "Authorization: Bearer AAEAAWVsYXN0aWM...vZmxlZXQtc2VydmVyL3Rva2VuMTo3TFdaSDZ" https://127.0.0.1:9200/_security/_authenticate
成功的身份验证响应包含一个 token
字段,其中包含一个用于服务令牌名称的 name
字段和一个用于服务令牌类型的 type
字段
{ "username": "elastic/fleet-server", "roles": [], "full_name": "Service account - elastic/fleet-server", "email": null, "token": { "name": "token1", "type": "_service_account_index" }, "metadata": { "_elastic_service_account": true }, "enabled": true, "authentication_realm": { "name": "_service_account", "type": "_service_account" }, "lookup_realm": { "name": "_service_account", "type": "_service_account" }, "authentication_type": "token" }