服务账户

编辑

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 EnterpriseElastic 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"
}

服务账户令牌的名称。

服务账户令牌的类型。该值始终以 _service_account_ 开头,后跟一个字符串,指示正在使用的服务令牌后端(可以是 fileindex)。