API 密钥编辑

API 密钥以纯文本形式发送,因此只有与 TLS 结合使用时才能提供安全性。

启用后,API 密钥用于授权对 APM 服务器的请求。API 密钥不适用于在客户端上运行的 APM 代理(如 RUM 代理),因为无法阻止它们被公开。

您可以为每个 API 密钥分配一个或多个唯一权限

  • 代理配置 (config_agent:read): 代理需要此权限才能 远程读取代理配置
  • 摄取 (event:write): 摄取代理事件需要此权限。

要使用 API 密钥保护 APM 代理和 APM 服务器之间的通信,请确保已启用 TLS,然后完成以下步骤

启用 API 密钥编辑

API 密钥身份验证选项 中启用 API 密钥授权。您还应该设置 APM 服务器每分钟允许的唯一 API 密钥数量限制;此值应该是受监控服务中配置的唯一 API 密钥的数量。

在 Kibana 中创建 API 密钥用户编辑

API 密钥只能拥有与其创建者相同或更低的访问权限。您可以创建一个具有最低所需权限的角色,而不是使用超级用户帐户来创建 API 密钥。

创建 APM 代理 API 密钥的用户必须至少具有 manage_own_api_key 集群权限和它希望授予的 APM 应用程序级权限。此外,当从 APM 应用程序创建 API 密钥时,您需要相应的 Kibana 空间和功能权限。

以下示例使用 Kibana 角色管理 API 来创建一个名为 apm_agent_key_role 的角色。

POST /_security/role/apm_agent_key_role
{
   "cluster": [ "manage_own_api_key" ],
   "applications": [
      {
         "application":"apm",
         "privileges":[
            "event:write",
            "config_agent:read"
         ],
         "resources":[ "*" ]
      },
      {
         "application":"kibana-.kibana",
         "privileges":[ "feature_apm.all" ],
         "resources":[ "space:default" ] 
      }
   ]
}

此示例为默认空间分配权限。

将新创建的 apm_agent_key_role 角色分配给希望创建 APM 代理 API 密钥的任何用户。

在 APM 应用程序中创建 API 密钥编辑

APM 应用程序有一个内置的工作流程,您可以使用它轻松创建和查看 APM 代理 API 密钥。只有在 APM 应用程序中创建的 API 密钥才会显示在此处。

使用超级用户帐户或具有上一步中创建的角色的用户,打开 Kibana 并导航到 可观测性 > APM > 设置 > 代理密钥。输入 API 密钥的名称并至少选择一个权限。

例如,要创建一个可用于摄取 APM 事件和读取代理中心配置的 API 密钥,请选择 config_agent:readevent:write

单击 创建 APM 代理密钥 并复制 Base64 编码的 API 密钥。您将在下一步中需要它,并且您将无法再次查看它。

APM app API key
在 APM 代理中设置 API 密钥编辑

您现在可以在每个 APM 代理的配置中应用新创建的 API 密钥。有关其他信息,请参阅相关的代理文档

备用 API 密钥创建方法编辑

也可以在 Kibana 之外创建和验证 API 密钥

APM 服务器 API 密钥工作流程编辑

此 API 创建方法仅适用于 APM 服务器二进制文件。

在 8.6.0 中已弃用。

用户应通过 Kibana 或 Elasticsearch REST API 创建 API 密钥

APM 服务器提供了一个命令行界面,用于创建、检索、失效和验证 API 密钥。使用此方法创建的密钥只能用于与 APM 服务器通信。

apikey 子命令编辑
create

创建具有指定权限的 API 密钥。没有必需的标志。

请求创建 API 密钥的用户需要具有 APM 服务器使用的 APM 权限。默认情况下,超级用户具有这些权限。对于其他用户,您可以创建它们。有关所需权限,请参阅 创建 API 密钥用户

info
查询 API 密钥。需要 --id--name
invalidate
使 API 密钥失效。需要 --id--name
verify
检查凭据字符串是否具有给定的权限。需要 --credentials
权限编辑

如果在创建时未指定权限,则创建的密钥将拥有所有权限。

  • --agent-config 授予 config_agent:read 权限
  • --ingest 授予 event:write 权限
  • --sourcemap 授予 sourcemap:write 权限
创建 API 密钥编辑

使用 create 子命令创建 API 密钥。

以下示例创建一个 namejava-001 的 API 密钥,并授予“代理配置”和“摄取”权限。

apm-server apikey create --ingest --agent-config --name java-001

响应将类似于以下内容

Name ........... java-001
Expiration ..... never
Id ............. qT4tz28B1g59zC3uAXfW
API Key ........ rH55zKd5QT6wvs3UbbkxOA (won't be shown again)
Credentials .... cVQ0dHoyOEIxZzU5ekMzdUFYZlc6ckg1NXpLZDVRVDZ3dnMzVWJia3hPQQ== (won't be shown again)

您应该始终在创建 API 密钥后验证其权限。可以使用 verify 子命令完成验证。

以下示例验证 java-001 API 密钥是否具有“代理配置”和“摄取”权限。

apm-server apikey verify --agent-config --ingest --credentials cVQ0dHoyOEIxZzU5ekMzdUFYZlc6ckg1NXpLZDVRVDZ3dnMzVWJia3hPQQ==

如果 API 密钥具有请求的权限,则响应将类似于以下内容

Authorized for privilege "event:write"...:          Yes
Authorized for privilege "config_agent:read"...:    Yes

要使 API 密钥失效,请使用 invalidate 子命令。由于 Elasticsearch 缓存,从执行此子命令到其生效之间可能会有延迟。

以下示例使 java-001 API 密钥失效。

apm-server apikey invalidate --name java-001

响应将类似于以下内容

Invalidated keys ... qT4tz28B1g59zC3uAXfW
Error count ........ 0

apikey 子命令和标志的完整列表可在 API 密钥命令参考 中找到。

Elasticsearch API 密钥工作流程编辑

也可以使用 Elasticsearch 创建 API 密钥 API 来创建 API 密钥。

此示例创建一个名为 java-002 的 API 密钥

POST /_security/api_key
{
  "name": "java-002", 
  "expiration": "1d", 
  "role_descriptors": {
    "apm": {
      "applications": [
        {
          "application": "apm",
          "privileges": ["sourcemap:write", "event:write", "config_agent:read"], 
          "resources": ["*"]
        }
      ]
    }
  }
}

API 密钥的名称

API 密钥的到期时间

任何分配的权限

响应将类似于以下内容

{
  "id" : "GnrUT3QB7yZbSNxKET6d",
  "name" : "java-002",
  "expiration" : 1599153532262,
  "api_key" : "RhHKisTmQ1aPCHC_TPwOvw"
}

credential 字符串是代理用来与 APM 服务器通信的凭证,它是 API 密钥的 id:api_key 的 base64 编码表示形式。它可以像这样创建

echo -n GnrUT3QB7yZbSNxKET6d:RhHKisTmQ1aPCHC_TPwOvw | base64

您可以使用 身份验证 API 验证您的 API 密钥是否已正确进行 base64 编码

curl -H "Authorization: ApiKey R0gzRWIzUUI3eVpiU054S3pYSy06bXQyQWl4TlZUeEcyUjd4cUZDS0NlUQ==" localhost:9200/_security/_authenticate

如果 API 密钥已正确编码,您将看到类似于以下内容的响应

{
   "username":"1325298603",
   "roles":[],
   "full_name":null,
   "email":null,
   "metadata":{
      "saml_nameid_format":"urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
      "saml(http://saml.elastic-cloud.com/attributes/principal)":[
         "1325298603"
      ],
      "saml_roles":[
         "superuser"
      ],
      "saml_principal":[
         "1325298603"
      ],
      "saml_nameid":"_7b0ab93bbdbc21d825edf7dca9879bd8d44c0be2",
      "saml(http://saml.elastic-cloud.com/attributes/roles)":[
         "superuser"
      ]
   },
   "enabled":true,
   "authentication_realm":{
      "name":"_es_api_key",
      "type":"_es_api_key"
   },
   "lookup_realm":{
      "name":"_es_api_key",
      "type":"_es_api_key"
   }
}

然后,您可以使用 APM 服务器 CLI 验证 API 密钥是否具有请求的权限

apm-server apikey verify --credentials R25yVVQzUUI3eVpiU054S0VUNmQ6UmhIS2lzVG1RMWFQQ0hDX1RQd092dw==

如果 API 密钥具有请求的权限,则响应将类似于以下内容

Authorized for privilege "config_agent:read"...:  Yes
Authorized for privilege "event:write"...:        Yes
Authorized for privilege "sourcemap:write"...:    Yes