AWS EKS Secret get or list from Node or Pod Service Account

Last updated 3 days ago on 2026-10-20
Created 3 months ago on 2026-08-03

About

Kubernetes audit identities for kubelet (system:node:*) and workloads (system:serviceaccount:*) are meant to operate with tight, predictable API usage. Direct get or list on the Secrets API from those principals is often a sign of credential access. Attackers who stole a pod service-account token or node credentials sweep Secret objects for tokens, registry credentials, TLS keys, or application configuration. Even denied attempts still reveal intent to reach sensitive material. Legitimate controllers do read secrets they mount or manage, so this signal is most valuable when paired with triage (namespace scope, user agent, RBAC, and whether the identity should touch those secret names at all).
Tags
Domain: CloudDomain: ContainersPlatform: AWSPlatform: KubernetesData Source: AWSData Source: Amazon Web ServicesData Source: Kubernetes API Server Audit LogsService: AWS EKSUse Case: Threat DetectionTactic: Credential AccessRule Type: Custom Query (KQL)Profile: BetaLanguage: kuery
Severity
medium
Risk Score
47
MITRE ATT&CK™

Credential Access (TA0006)(external, opens in a new tab or window)

False Positive Examples
In-cluster operators, CSI drivers, GitOps agents, and some platform controllers legitimately list or get Secrets in namespaces they manage; exclude known service accounts, namespaces, or user agents after baselining. Rare kubelet or node maintenance tooling may touch Secret APIs; validate against change windows and approved node management paths.
License
Elastic License v2(external, opens in a new tab or window)

Definition

Rule Type
Query (Kibana Query Language)
Integration Pack
Prebuilt Security Detection Rules
Index Patterns
logs-aws.eks_audit-*
Related Integrations

aws(external, opens in a new tab or window)

Query
text code block:
data_stream.dataset:"aws.eks_audit" and event.action:(get or list) and aws.eks.audit.objectRef.resource:"secrets" and user.name:(system\:serviceaccount\:* or system\:node\:*) and source.ip:(* and not ("127.0.0.1" or "::1")) and not aws.eks.audit.user.groups:( "system:serviceaccounts:flux-system" or "system:serviceaccounts:kyverno" or "system:serviceaccounts:ibm-csi" or "system:serviceaccounts:harvester-system" or "system:serviceaccounts:cattle-system" or "system:serviceaccounts:cattle-monitoring-system" or system\:serviceaccounts\:cluster-fleet-local-local-* or "system:serviceaccounts:rabbitmq-system" or "system:serviceaccounts:cattle-fleet-system" ) and not aws.eks.audit.user.username:( "system:serviceaccount:security:trivy-operator" or "system:serviceaccount:cert-manager:cert-manager-cainjector" or "system:serviceaccount:cert-manager:cert-manager" )

Install detection rules in Elastic Security

Detect AWS EKS Secret get or list from Node or Pod Service Account in the Elastic Security detection engine by installing this rule into your Elastic Stack.

To setup this rule, check out the installation guide for Prebuilt Security Detection Rules(external, opens in a new tab or window).