API 密钥
编辑API 密钥编辑
API 密钥以纯文本形式发送,因此只有与 TLS 结合使用时才能提供安全性。
启用后,API 密钥用于授权对 APM 服务器的请求。API 密钥不适用于在客户端上运行的 APM 代理(如 RUM 代理),因为无法阻止它们被公开。
您可以为每个 API 密钥分配一个或多个唯一权限
-
代理配置 (
config_agent:read
): 代理需要此权限才能 远程读取代理配置。 -
摄取 (
event:write
): 摄取代理事件需要此权限。
要使用 API 密钥保护 APM 代理和 APM 服务器之间的通信,请确保已启用 TLS,然后完成以下步骤
启用 API 密钥编辑
在 API 密钥身份验证选项 中启用 API 密钥授权。您还应该设置 APM 服务器每分钟允许的唯一 API 密钥数量限制;此值应该是受监控服务中配置的唯一 API 密钥的数量。
默认情况下,API 密钥处于禁用状态。在 apm-server.yml
配置文件的 apm-server.auth.api_key
部分启用和配置此功能。
您至少必须启用 API 密钥,并且应该设置 APM 服务器每分钟允许的唯一 API 密钥数量限制。以下是一个使用 50 个唯一 API 密钥的 apm-server.auth.api_key
配置示例
所有其他配置选项都在 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:read
和 event:write
。
单击 创建 APM 代理密钥 并复制 Base64 编码的 API 密钥。您将在下一步中需要它,并且您将无法再次查看它。
在 APM 代理中设置 API 密钥编辑
您现在可以在每个 APM 代理的配置中应用新创建的 API 密钥。有关其他信息,请参阅相关的代理文档
-
Android:
apiKey
-
Go 代理:
ELASTIC_APM_API_KEY
-
.NET 代理:
ApiKey
-
iOS:
withApiKey
-
Java 代理:
api_key
-
Node.js 代理:
apiKey
-
PHP 代理:
api_key
-
Python 代理:
api_key
-
Ruby 代理:
api_key
备用 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
权限
使用 create
子命令创建 API 密钥。
以下示例创建一个 name
为 java-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": ["*"] } ] } } }
响应将类似于以下内容
{ "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