wif.tax

Elastic

F Elastic Agent, Fleet and integrations (incl. APM/OTLP intake and agentless cloud integrations)

Agents and OpenTelemetry shippers get into Elastic with an enrollment token, an Elasticsearch API key or an APM secret token. Expiry is optional and none of these is a GitHub partner pattern. Outbound, AWS and Azure can be keyless (an agent's own role, or federated identity for some Elastic-hosted integrations, still in preview). GCP, Okta, Entra ID, GitHub and Google Workspace want a pasted secret.

Docs: elastic.co · Checked 2026-10-14 · source YAML · dispute via PR

Inbound F

How a workload running anywhere authenticates to this product.

A Fleet enrollment token (an Elasticsearch API key tied to one agent policy) is swapped for per-agent API keys issued by Fleet. APM agents and OTLP shippers send a static APM secret token or an Elasticsearch API key in the Authorization header. No workload federation.

This card covers the ingest and enrollment credentials an operator has to hold. The Fleet enrollment token, standalone-agent and EDOT/OTLP Elasticsearch API keys, and APM agent API keys exist on every deployment type: Elastic Cloud Hosted, Serverless and self-managed. The Managed OTLP Endpoint (mOTLP) and the other managed inputs are Elastic Cloud Hosted and Serverless only. Its key cannot be scoped to particular indices; the docs say "Index-level privilege scoping is not supported for managed inputs". The APM secret token is a shared static string configured on APM Server and on every APM agent. ECH and ECE create one when the deployment is created. A Fleet Server you host yourself authenticates with an Elasticsearch service token. Service tokens never expire. On Elastic Cloud, Elastic hosts Fleet Server and you never handle this token. Fleet-managed agents swap the enrollment token for per-agent communication and output API keys. These are least-privilege and Fleet manages them, but they are still long-lived bearer keys on the host. None of these paths accepts an OIDC/JWT from a workload's own issuer, so the grade is decided by static-key hygiene (2 of 5 checks pass, so F). Two paths that could avoid a bearer key are graded on other cards. PKI client certificates on a self-managed Elasticsearch output, and the Elasticsearch JWT realm, belong to `elasticsearch`. Kibana and Fleet API automation with Elasticsearch API keys belongs to `kibana`. Elastic Cloud organisation API keys belong to `elastic-cloud-api`. ECE belongs to `elastic-cloud-enterprise`.

Outbound B

How this product reaches into your cloud, repos, or other SaaS.

AWS can be keyless: an agent you host uses its EC2 instance profile, EKS Pod Identity or IRSA, or assumes a role with an external ID. Elastic-hosted (agentless) CSPM, Asset Discovery and GuardDuty on AWS and Azure can use a federated identity (preview). Azure CSPM can use a managed identity. GCP, most Azure log/metric integrations, Okta, Entra ID, GitHub and Google Workspace want a pasted access key, client secret, API token, PAT or service-account JSON key.

The deciding question is who hosts the collector. An Elastic Agent you deploy can use the cloud identity of the machine it runs on. That covers the AWS instance profile, EKS Pod Identity or IRSA, and the Azure VM managed identity for CSPM. The GCP CSPM Cloud Shell flow for an agent also attaches a service account to the VM. In each case no secret reaches Elastic. Elastic Managed integrations, formerly "agentless", run on Elastic's infrastructure and are available on Serverless and ECH only. They are GA on Serverless and on ECH 9.5+. For these, the only keyless option is "federated identity", formerly "cloud connectors". This is an AWS role ARN plus external ID, or an Azure user-assigned managed identity. It is still Preview on Serverless and Stack 9.2+, and is documented only for CSPM and Asset Discovery on AWS and Azure, plus the GuardDuty input of the AWS integration. Elastic-hosted collection from AWS CloudWatch/S3/EC2 and similar sources, from GCP, from Azure logs/metrics, and from every SaaS source needs a static secret. Connectors checked: AWS (access keys, temporary keys, assume role, assume role with external ID, instance or pod role, federated identity). AWS CSPM (federated identity, CloudFormation access keys, temporary keys). GCP and GCP CSPM (service-account JSON key; the Elastic-hosted Cloud Shell script prints a key to paste in). Azure CSPM (federated identity, client secret, managed identity on an agent you host). Azure logs and metrics (connection string or client secret). Okta (API token, OAuth2 with a JWK private key you generate, or the Elastic OIN app whose client secret you paste in, so it is still a static secret). Entra ID entity analytics (client secret). GitHub audit and security (PAT; GitHub App permissions are mentioned for some streams). Google Workspace (service-account JSON key with domain-wide delegation). Graded B: keyless on AWS and Azure, static keys elsewhere. CSPM on self-managed clusters needs a paid subscription; on Elastic Cloud it is available to everyone.

Hygiene for any static credential the product still issues

✗ Expiry enforceable
Enrollment tokens and standalone-agent API keys can be given an expiry, but by default they never expire and no documented org or cluster policy can force one. APM agent keys created in the Applications UI, Fleet Server service tokens and APM secret tokens never expire.
  • elastic.co checked 2026-10-14
    “(Optional) In the Expiration field, enter a duration such as 30d , 24h , or 90m to set how long the token is valid. Leave the field empty to create a token that never expires.”
  • elastic.co checked 2026-10-14
    “API keys do not expire.”
  • elastic.co checked 2026-10-14
    “Service tokens never expire. You must actively delete them if they are no longer needed.”
✓ Rotation via API
Enrollment tokens can be created, revoked and deleted through the Fleet API. Ingest and APM keys are Elasticsearch API keys with create and invalidate APIs. The APM secret token can only be changed by editing the APM integration policy or apm-server.yml, which restarts APM Server.
  • elastic.co checked 2026-10-14
    “Create an enrollment API key for a given agent policy.”
  • elastic.co checked 2026-10-14
    “To perform bulk operations programmatically, use the POST /api/fleet/enrollment_api_keys/_bulk_delete endpoint.”
✓ Scoped keys
Enrollment tokens are bound to one agent policy. Fleet-issued per-agent keys carry only the permissions that agent needs. Standalone, APM and mOTLP keys take role descriptors (for example event:write only). The weak spots are the APM secret token, which is all-or-nothing, and mOTLP keys, which cannot be limited to particular indices.
  • elastic.co checked 2026-10-14
    “The enrollment token enrolls the Elastic Agent in a specific agent policy that defines the data to be collected by the agent and which output to use.”
  • elastic.co checked 2026-10-14
    “You can assign one or more unique privileges to each API key:”
  • elastic.co checked 2026-10-14
    “Index-level privilege scoping is not supported for managed inputs.”
✗ Last-used visible
The enrollment token object (active, api_key_id, created_at, expire_at, name, policy_id) has no last-used field, and neither does the Elasticsearch API key type (creation, expiration, invalidated, invalidation). Fleet does show each agent's last check-in, so stale agents can be found. Unused enrollment tokens, ingest keys and APM keys cannot.
  • elastic.co checked 2026-10-14
    “The expiration date of the enrollment token as an ISO 8601 date string. Absent when the token never expires.”
  • github.com checked 2026-10-14
    “expiration?: EpochTime<UnitMillis>”
✗ Leak revocation
GitHub lists "Elastic Cloud API Key" and "Elastic Stack API Key" as user (non-partner) patterns only. Neither is in the partner column, so a leaked enrollment token or ingest API key is flagged to the repo owner but not reported to Elastic for automatic revocation. APM secret tokens are arbitrary strings with no pattern at all.

Notes

Elastic is assessed as five cards: `elastic-cloud-api`, `elasticsearch`, `kibana`, `elastic-agent-fleet` and `elastic-cloud-enterprise`. Every credential on this card ends up as an Elasticsearch API key or service token, so any federation added to `elasticsearch` (an ingest path accepting workload JWTs) would be what moves this card. The inbound grade only moves if one of these changes: Fleet enrollment or the managed OTLP and APM intake accepts a workload OIDC token; API-key expiry can be enforced and last-used is tracked; or Elastic joins GitHub's secret-scanning partner program. The outbound grade only moves when Elastic-hosted federated identity leaves preview and covers GCP and the SaaS sources.

Badge

wif.tax grade F

[![wif.tax grade](https://wif.tax/badge/elastic-agent-fleet.svg)](https://wif.tax/p/elastic-agent-fleet/)