服务账户
编辑服务账户
编辑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 响应中返回 bearer 令牌。 - elasticsearch-service-tokens CLI 工具,它将新的服务令牌保存在
$ES_HOME/config/service_tokens
文件中,并将 bearer 令牌输出到您的终端
我们建议您通过 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" }