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 应用程序级权限。此外,从“应用程序”UI 创建 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 密钥的用户。

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

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

使用超级用户帐户或具有上一步创建的角色的用户,在 Kibana 中,在主菜单中找到 应用程序 或使用 全局搜索字段。转到 设置代理密钥。输入 API 密钥的名称,然后至少选择一个权限。

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

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

Applications UI API key
在您的 APM 代理中设置 API 密钥编辑

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

备用 API 密钥创建方法编辑

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

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

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

在 8.6.0 中已弃用。

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

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

apikey 子命令编辑
创建

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

请求创建 API 密钥的用户需要具有 APM 服务器使用的 APM 权限。默认情况下,超级用户具有这些权限。

展开以获取有关将这些权限分配给其他用户的更多信息

要创建具有创建和管理 API 密钥的必需权限的 APM 服务器用户:

  1. 创建一个 API 密钥角色,如 apm_api_key,该角色具有以下 cluster 级别权限:

    权限 用途

    manage_own_api_key

    允许 APM 服务器创建、检索和使 API 密钥失效

  2. 根据 API 密钥角色 的用途,还应分配适当的 apm 应用程序级权限:

    • 接收代理配置,请分配 config_agent:read
    • 摄取代理数据,请分配 event:write
    • 上传源映射,请分配 sourcemap:write
信息
查询 API 密钥。--id--name 是必需的。
使失效
使 API 密钥失效。--id--name 是必需的。
验证
检查凭据字符串是否具有给定的权限。--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 Server 通信时使用的凭据,它是 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 Server 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