ConfigMaps
| Operation | Description | Sample | Rule |
|---|---|---|---|
| get-configmaps | Reads a single ConfigMap. Elastic flags this from the Azure Arc AAD-proxy service account outside its own namespaces, a sign of stolen Arc credentials. | Y | Y |
| list-configmaps | Lists ConfigMaps across a namespace. Elastic flags this from the Azure Arc AAD-proxy service account outside its own namespaces as credential abuse. | Y | Y |
| watch-configmaps | Opens a long-lived watch on ConfigMap changes. Elastic's new-terms user-agent rule alerts on a not-previously-seen identity streaming config changes. | Y | Y |
| create-configmaps | Creates a ConfigMap. Elastic flags this when issued by the Azure Arc AAD-proxy service account outside its expected namespaces, a sign of stolen Arc credentials. | Y | Y |
| update-configmaps | ConfigMap modified (e.g. CoreDNS config or aws-auth in kube-system). | Y | Y |
| patch-configmaps | Y | Y | |
| delete-configmaps | Removes a ConfigMap. The same coredns/kube-dns and EKS aws-auth rules match delete, since removing either breaks DNS resolution or an IAM role's cluster access. | Y | Y |
| deletecollection-configmaps | Y | N | |
| any-configmaps | Synthetic aggregation for rules that filter the configmaps resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone. | N | Y |
get configmaps
#Description
Reads a single ConfigMap. Elastic flags this from the Azure Arc AAD-proxy service account outside its own namespaces, a sign of stolen Arc credentials.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps/dw-harn-configmaps",
"verb": "get",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"name": "dw-harn-configmaps",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:46:43.173057Z",
"stageTimestamp": "2026-07-02T04:46:43.174560Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | in | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | secrets | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | get | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | list | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | delete | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → When Kubernetes operations are performed through Azure Arc Cluster Connect, the K8s audit log shows the Arc AAD proxy service account as the authenticated user, with the actual Azure AD identity in the Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload. The rule groups GKE audit get/list events on namespaces, nodes, pods, configmaps, serviceaccounts, roles, rolebindings, clusterroles, and clusterrolebindings into one-minute windows per Elastic #
system:serviceaccount:azure-arc:azure-arc-kube-aad-proxy-sa with the actual caller identity in the impersonatedUser field. This pattern indicates that someone is accessing the cluster through the Azure ARM API rather than directly via kubectl against the API server. While legitimate for Arc-managed workflows, adversaries with stolen service principal credentials can abuse Arc Cluster Connect to read, exfiltrate, or modify secrets and configmaps while appearing as the Arc proxy service account in K8s audit logs.T1213, T1530, T1552, T1552.007, T1565, T1565.001↳ also matches list-configmaps: list configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating Kubernetes Secret or ConfigMap Access via Azure Arc Proxy#
impersonatedUser field. This rule detects non-system secret and configmap access — including reads, writes, and deletions — routed through this proxy path. Read operations (get, list) are particularly important to detect as they represent the most common adversary action: exfiltrating secrets without leaving obvious modification traces.Possible investigation steps#
kubernetes.audit.impersonatedUser.username field — this contains the Azure AD object ID of the actual caller. Cross-reference with Azure AD to identify the service principal or user.kubernetes.audit.impersonatedUser.extra.oid field for the Azure AD object ID.default or application namespaces are more suspicious than azure-arc or kube-system.kubernetes.audit.objectRef.name — look for suspicious secret/configmap names that don't match known application resources.LISTCLUSTERUSERCREDENTIAL operation that initiated the Arc proxy session.Response and remediation#
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches list-configmaps: list configmaps, watch-configmaps: watch configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1613↳ also matches list-configmaps: list configmaps Investigation guide
Triage and analysis#
Investigating GKE Multi-Resource Discovery#
client.user.email, source.ip, and user_agent.original. It alerts when five or more distinct resource kinds appear and the burst includes both cluster-layout kinds (namespaces, pods, or nodes) and RBAC kinds. Allowed and denied authorizations are both included: failures still signal probing.Possible investigation steps#
Esql.enumerated_resources, Esql.enumerated_namespaces, and Esql.enumerated_resource_names for ordering and targeted APIs.source.ip and user_agent.original match expected admin or automation clients.False positive analysis#
Response and remediation#
References #
list configmaps
#Description
Lists ConfigMaps across a namespace. Elastic flags this from the Azure Arc AAD-proxy service account outside its own namespaces as credential abuse.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps?limit=500&timeout=3s",
"verb": "list",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:46:43.296648Z",
"stageTimestamp": "2026-07-02T04:46:43.297991Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | in | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | secrets | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | get | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | list | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | delete | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload. The rule groups GKE audit get/list events on namespaces, nodes, pods, configmaps, serviceaccounts, roles, rolebindings, clusterroles, and clusterrolebindings into one-minute windows per When Kubernetes operations are performed through Azure Arc Cluster Connect, the K8s audit log shows the Arc AAD proxy service account as the authenticated user, with the actual Azure AD identity in the Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-configmaps: get configmaps, watch-configmaps: watch configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1613↳ also matches get-configmaps: get configmaps Investigation guide
Triage and analysis#
Investigating GKE Multi-Resource Discovery#
client.user.email, source.ip, and user_agent.original. It alerts when five or more distinct resource kinds appear and the burst includes both cluster-layout kinds (namespaces, pods, or nodes) and RBAC kinds. Allowed and denied authorizations are both included: failures still signal probing.Possible investigation steps#
Esql.enumerated_resources, Esql.enumerated_namespaces, and Esql.enumerated_resource_names for ordering and targeted APIs.source.ip and user_agent.original match expected admin or automation clients.False positive analysis#
Response and remediation#
system:serviceaccount:azure-arc:azure-arc-kube-aad-proxy-sa with the actual caller identity in the impersonatedUser field. This pattern indicates that someone is accessing the cluster through the Azure ARM API rather than directly via kubectl against the API server. While legitimate for Arc-managed workflows, adversaries with stolen service principal credentials can abuse Arc Cluster Connect to read, exfiltrate, or modify secrets and configmaps while appearing as the Arc proxy service account in K8s audit logs.T1213, T1530, T1552, T1552.007, T1565, T1565.001↳ also matches get-configmaps: get configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating Kubernetes Secret or ConfigMap Access via Azure Arc Proxy#
impersonatedUser field. This rule detects non-system secret and configmap access — including reads, writes, and deletions — routed through this proxy path. Read operations (get, list) are particularly important to detect as they represent the most common adversary action: exfiltrating secrets without leaving obvious modification traces.Possible investigation steps#
kubernetes.audit.impersonatedUser.username field — this contains the Azure AD object ID of the actual caller. Cross-reference with Azure AD to identify the service principal or user.kubernetes.audit.impersonatedUser.extra.oid field for the Azure AD object ID.default or application namespaces are more suspicious than azure-arc or kube-system.kubernetes.audit.objectRef.name — look for suspicious secret/configmap names that don't match known application resources.LISTCLUSTERUSERCREDENTIAL operation that initiated the Arc proxy session.Response and remediation#
References #
watch configmaps
#Description
Opens a long-lived watch on ConfigMap changes. Elastic's new-terms user-agent rule alerts on a not-previously-seen identity streaming config changes.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps?resourceVersion=1349&timeout=3s&watch=true",
"verb": "watch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestReceivedTimestamp": "2026-07-02T04:46:43.299036Z",
"stageTimestamp": "2026-07-02T04:46:46.299397Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-configmaps: get configmaps, list-configmaps: list configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
References #
create configmaps
#Description
Creates a ConfigMap. Elastic flags this when issued by the Azure Arc AAD-proxy service account outside its expected namespaces, a sign of stolen Arc credentials.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps?fieldManager=kubectl-create&fieldValidation=Strict",
"verb": "create",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"name": "dw-harn-configmaps",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 201
},
"requestObject": {
"kind": "ConfigMap",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-configmaps",
"namespace": "dw-harn"
},
"data": {
"key": "value"
}
},
"responseObject": {
"kind": "ConfigMap",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-configmaps",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1349",
"creationTimestamp": "2026-07-02T04:46:43Z"
},
"data": {
"key": "value"
}
},
"requestReceivedTimestamp": "2026-07-02T04:46:43.099633Z",
"stageTimestamp": "2026-07-02T04:46:43.103754Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | in | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | secrets | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | get | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | list | 2 rules | elastic |
objectRef.resource (falco rule field) | eq | configmaps | 2 rules | falco |
stage (falco rule field) | eq | responsecomplete | 2 rules | falco |
EventType (elastic rule field) | eq | microsoft.containerservice/managedclusters/diagnosticlogs/read | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit-admin | 1 rule | elastic |
azure.platformlogs.properties.log.stage (elastic rule field) | eq | responsecomplete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | create | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | delete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | patch | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | update | 1 rule | elastic |
jevt.rawtime (falco rule field) | is_not_null | | 1 rule | falco |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → AKS kube-audit events are carried under the flattened Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload. When Kubernetes operations are performed through Azure Arc Cluster Connect, the K8s audit log shows the Arc AAD proxy service account as the authenticated user, with the actual Azure AD identity in the Elastic #
T1557↳ also matches update-configmaps: update configmaps, patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating Azure AKS CoreDNS or Kube-DNS Configuration Modified#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. CoreDNS resolves in-cluster service names; an attacker who edits coredns/kube-dns or creates/edits the user-managed coredns-custom ConfigMap can inject forward or rewrite rules that redirect service resolution to attacker-controlled endpoints, enabling cluster-wide interception of credentials and traffic. coredns-custom is the supported customization surface, so legitimate DNS tuning also lands here; the acting identity is excluded when it is an AKS platform reconciler (aksService), leaving non-platform changes as the signal.Possible investigation steps#
azure.platformlogs.properties.log.requestObject.data for added forward, rewrite, or hosts entries pointing at unexpected IPs or domains. This content, not the act of editing, is what distinguishes malicious DNS redirection from routine customization.azure.platformlogs.properties.log.user.username (and its groups in azure.platformlogs.properties.log.user.groups) and confirm it should manage the CoreDNS configuration; a workload service account (system:serviceaccount:<ns>:<sa>) editing cluster DNS is the higher-concern case.azure.platformlogs.properties.log.verb (a create of coredns-custom where it did not previously exist is notable) and azure.platformlogs.properties.log.objectRef.name (coredns, coredns-custom, or kube-dns), and inspect azure.platformlogs.properties.log.userAgent.azure.platformlogs.properties.log.sourceIPs and pivot on it for related RBAC changes, secret reads, or exec sessions.False positive analysis#
coredns-custom is the AKS-supported way to add custom forward/stub rules, so approved automation, GitOps, or administrators editing it are expected. The AKS reconciler (aksService) that continuously (re)creates coredns-custom is excluded by identity. Validate the change content and window, then exclude the specific verified service account rather than re-broadening to all system:*.Response and remediation#
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-configmaps: get configmaps, list-configmaps: list configmaps, watch-configmaps: watch configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
system:serviceaccount:azure-arc:azure-arc-kube-aad-proxy-sa with the actual caller identity in the impersonatedUser field. This pattern indicates that someone is accessing the cluster through the Azure ARM API rather than directly via kubectl against the API server. While legitimate for Arc-managed workflows, adversaries with stolen service principal credentials can abuse Arc Cluster Connect to read, exfiltrate, or modify secrets and configmaps while appearing as the Arc proxy service account in K8s audit logs.T1213, T1530, T1552, T1552.007, T1565, T1565.001↳ also matches get-configmaps: get configmaps, list-configmaps: list configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating Kubernetes Secret or ConfigMap Access via Azure Arc Proxy#
impersonatedUser field. This rule detects non-system secret and configmap access — including reads, writes, and deletions — routed through this proxy path. Read operations (get, list) are particularly important to detect as they represent the most common adversary action: exfiltrating secrets without leaving obvious modification traces.Possible investigation steps#
kubernetes.audit.impersonatedUser.username field — this contains the Azure AD object ID of the actual caller. Cross-reference with Azure AD to identify the service principal or user.kubernetes.audit.impersonatedUser.extra.oid field for the Azure AD object ID.default or application namespaces are more suspicious than azure-arc or kube-system.kubernetes.audit.objectRef.name — look for suspicious secret/configmap names that don't match known application resources.LISTCLUSTERUSERCREDENTIAL operation that initiated the Arc proxy session.Response and remediation#
Falco #
References #
update configmaps
#Description
ConfigMap modified (e.g. CoreDNS config or aws-auth in kube-system).
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps/dw-harn-configmaps?fieldManager=kubectl-replace&fieldValidation=Strict",
"verb": "update",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=4cf95d11cbd90036bab41cdc6b88cc8f91550e9135ed4bb61495b02f647812ff"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"name": "dw-harn-configmaps",
"uid": "00000000-0000-0000-0000-000000000000",
"apiVersion": "v1",
"resourceVersion": "498"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"kind": "ConfigMap",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-configmaps",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "498",
"creationTimestamp": "2026-07-02T21:30:04Z",
"labels": {
"dw-harn-patched": "1"
}
},
"data": {
"key": "value"
}
},
"responseObject": {
"kind": "ConfigMap",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-configmaps",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "498",
"creationTimestamp": "2026-07-02T21:30:04Z",
"labels": {
"dw-harn-patched": "1"
}
},
"data": {
"key": "value"
}
},
"requestReceivedTimestamp": "2026-07-02T21:30:07.886966Z",
"stageTimestamp": "2026-07-02T21:30:07.889370Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.verb (elastic rule field) | in | delete | 3 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | get | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | list | 2 rules | elastic |
kubernetes.audit.objectRef.namespace (elastic rule field) | eq | kube-system | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | secrets | 2 rules | elastic |
EventType (elastic rule field) | eq | microsoft.containerservice/managedclusters/diagnosticlogs/read | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit-admin | 1 rule | elastic |
azure.platformlogs.properties.log.stage (elastic rule field) | eq | responsecomplete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | create | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | delete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | patch | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | update | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Identify who performed the change (user.email, groups), from where (source.ip), and which ConfigMap was modified. If request/response capture is available, review the changed Corefile content for upstream redirection, wildcard rewrites, or unexpected forward/proxy targets. The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule. Identify who performed the change (user.name, groups), from where (source.ip), and which ConfigMap was modified. If request/response capture is available, review the changed Corefile content for upstream redirection, wildcard rewrites, or unexpected forward/proxy targets. Confirm who changed the mapping (user.name, groups, source.ip, user_agent.original) and whether the change aligns with approved cluster or node-group operations. Compare the new aws-auth mapRoles/mapUsers content to the prior revision if request/response capture is available in audit.Elastic #
T1565, T1565.001↳ also matches patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating GKE CoreDNS or Kube-DNS Configuration Modified#
Possible investigation steps#
Response and remediation#
Setup#
T1565, T1565.001↳ also matches patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating Kubernetes CoreDNS or Kube-DNS Configuration Modified#
Possible investigation steps#
Response and remediation#
T1098, T1098.006↳ also matches patch-configmaps: patch configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating EKS Authentication Configuration Modified#
Possible investigation steps#
Response and remediation#
Falco #
References #
patch configmaps
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps/dw-harn-configmaps?fieldManager=kubectl-patch",
"verb": "patch",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"name": "dw-harn-configmaps",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"requestObject": {
"metadata": {
"labels": {
"dw-harn-patched": "1"
}
}
},
"responseObject": {
"kind": "ConfigMap",
"apiVersion": "v1",
"metadata": {
"name": "dw-harn-configmaps",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "1355",
"creationTimestamp": "2026-07-02T04:46:43Z",
"labels": {
"dw-harn-patched": "1"
}
},
"data": {
"key": "value"
}
},
"requestReceivedTimestamp": "2026-07-02T04:46:46.370627Z",
"stageTimestamp": "2026-07-02T04:46:46.376157Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.verb (elastic rule field) | in | delete | 3 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | get | 2 rules | elastic |
kubernetes.audit.verb (elastic rule field) | in | list | 2 rules | elastic |
kubernetes.audit.objectRef.namespace (elastic rule field) | eq | kube-system | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | configmaps | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | secrets | 2 rules | elastic |
EventType (elastic rule field) | eq | microsoft.containerservice/managedclusters/diagnosticlogs/read | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit-admin | 1 rule | elastic |
azure.platformlogs.properties.log.stage (elastic rule field) | eq | responsecomplete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | create | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | delete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | patch | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | update | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs. This rule detects interactive commands executed inside containers that use atypical utilities to hit the Kubernetes API, paired with near-simultaneous API activity on pods, secrets, service accounts, roles/bindings, or pod exec/attach/log/portforward. It surfaces hands-on-keyboard discovery and lateral movement using custom scripts that evade common tool allowlists; for example, an intruder opens a shell in a pod, uses Python to query the in-cluster API to list secrets, then triggers pods/exec to pivot into another workload. AKS kube-audit events are carried under the flattened Identify who performed the change (user.email, groups), from where (source.ip), and which ConfigMap was modified. If request/response capture is available, review the changed Corefile content for upstream redirection, wildcard rewrites, or unexpected forward/proxy targets. The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule.Elastic #
T1059, T1059.004, T1069, T1087, T1609, T1610↳ also matches get-configmaps: get configmaps, list-configmaps: list configmaps, watch-configmaps: watch configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps Investigation guide
Triage and analysis#
Investigating Direct Interactive Kubernetes API Request by Unusual Utilities#
Possible investigation steps#
False positive analysis#
Response and remediation#
T1557↳ also matches create-configmaps: create configmaps, update-configmaps: update configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating Azure AKS CoreDNS or Kube-DNS Configuration Modified#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. CoreDNS resolves in-cluster service names; an attacker who edits coredns/kube-dns or creates/edits the user-managed coredns-custom ConfigMap can inject forward or rewrite rules that redirect service resolution to attacker-controlled endpoints, enabling cluster-wide interception of credentials and traffic. coredns-custom is the supported customization surface, so legitimate DNS tuning also lands here; the acting identity is excluded when it is an AKS platform reconciler (aksService), leaving non-platform changes as the signal.Possible investigation steps#
azure.platformlogs.properties.log.requestObject.data for added forward, rewrite, or hosts entries pointing at unexpected IPs or domains. This content, not the act of editing, is what distinguishes malicious DNS redirection from routine customization.azure.platformlogs.properties.log.user.username (and its groups in azure.platformlogs.properties.log.user.groups) and confirm it should manage the CoreDNS configuration; a workload service account (system:serviceaccount:<ns>:<sa>) editing cluster DNS is the higher-concern case.azure.platformlogs.properties.log.verb (a create of coredns-custom where it did not previously exist is notable) and azure.platformlogs.properties.log.objectRef.name (coredns, coredns-custom, or kube-dns), and inspect azure.platformlogs.properties.log.userAgent.azure.platformlogs.properties.log.sourceIPs and pivot on it for related RBAC changes, secret reads, or exec sessions.False positive analysis#
coredns-custom is the AKS-supported way to add custom forward/stub rules, so approved automation, GitOps, or administrators editing it are expected. The AKS reconciler (aksService) that continuously (re)creates coredns-custom is excluded by identity. Validate the change content and window, then exclude the specific verified service account rather than re-broadening to all system:*.Response and remediation#
T1565, T1565.001↳ also matches update-configmaps: update configmaps, delete-configmaps: delete configmaps Investigation guide
Triage and analysis#
Investigating GKE CoreDNS or Kube-DNS Configuration Modified#
Possible investigation steps#
Response and remediation#
Setup#
Falco #
References #
delete configmaps
#Description
Removes a ConfigMap. The same coredns/kube-dns and EKS aws-auth rules match delete, since removing either breaks DNS resolution or an IAM role's cluster access.
Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps/dw-harn-configmaps",
"verb": "delete",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=9bb0383c49b319fbf6b5ed61ab944378956d4292c784d32244ce2fa4dd846a3c"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"name": "dw-harn-configmaps",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"status": "Success",
"details": {
"name": "dw-harn-configmaps",
"kind": "configmaps",
"uid": "00000000-0000-0000-0000-000000000000"
},
"code": 200
},
"requestObject": {
"kind": "DeleteOptions",
"apiVersion": "meta.k8s.io/__internal",
"propagationPolicy": "Background"
},
"responseObject": {
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Success",
"details": {
"name": "dw-harn-configmaps",
"kind": "configmaps",
"uid": "00000000-0000-0000-0000-000000000000"
}
},
"requestReceivedTimestamp": "2026-07-02T04:46:46.437961Z",
"stageTimestamp": "2026-07-02T04:46:46.442284Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.verb (elastic rule field) | in | delete | 3 rules | elastic |
kubernetes.audit.objectRef.namespace (elastic rule field) | eq | kube-system | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | eq | configmaps | 2 rules | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit | 1 rule | elastic |
azure.platformlogs.category (elastic rule field) | in | kube-audit-admin | 1 rule | elastic |
azure.platformlogs.properties.log.stage (elastic rule field) | eq | responsecomplete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | create | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | delete | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | patch | 1 rule | elastic |
azure.platformlogs.properties.log.verb (elastic rule field) | in | update | 1 rule | elastic |
jevt.rawtime (falco rule field) | is_not_null | | 1 rule | falco |
objectRef.resource (falco rule field) | eq | configmaps | 1 rule | falco |
responseStatus.code (falco rule field) | starts_with | 2 | 1 rule | falco |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries → AKS kube-audit events are carried under the flattened Identify who performed the change (user.email, groups), from where (source.ip), and which ConfigMap was modified. If request/response capture is available, review the changed Corefile content for upstream redirection, wildcard rewrites, or unexpected forward/proxy targets. The GCP Fleet integration with GKE audit logs enabled is required to be compatible with this rule. When Kubernetes operations are performed through Azure Arc Cluster Connect, the K8s audit log shows the Arc AAD proxy service account as the authenticated user, with the actual Azure AD identity in the Elastic #
T1557↳ also matches create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating Azure AKS CoreDNS or Kube-DNS Configuration Modified#
azure.platformlogs.properties.log.* subtree and share the ARM operation event.action: Microsoft.ContainerService/managedClusters/diagnosticLogs/Read. CoreDNS resolves in-cluster service names; an attacker who edits coredns/kube-dns or creates/edits the user-managed coredns-custom ConfigMap can inject forward or rewrite rules that redirect service resolution to attacker-controlled endpoints, enabling cluster-wide interception of credentials and traffic. coredns-custom is the supported customization surface, so legitimate DNS tuning also lands here; the acting identity is excluded when it is an AKS platform reconciler (aksService), leaving non-platform changes as the signal.Possible investigation steps#
azure.platformlogs.properties.log.requestObject.data for added forward, rewrite, or hosts entries pointing at unexpected IPs or domains. This content, not the act of editing, is what distinguishes malicious DNS redirection from routine customization.azure.platformlogs.properties.log.user.username (and its groups in azure.platformlogs.properties.log.user.groups) and confirm it should manage the CoreDNS configuration; a workload service account (system:serviceaccount:<ns>:<sa>) editing cluster DNS is the higher-concern case.azure.platformlogs.properties.log.verb (a create of coredns-custom where it did not previously exist is notable) and azure.platformlogs.properties.log.objectRef.name (coredns, coredns-custom, or kube-dns), and inspect azure.platformlogs.properties.log.userAgent.azure.platformlogs.properties.log.sourceIPs and pivot on it for related RBAC changes, secret reads, or exec sessions.False positive analysis#
coredns-custom is the AKS-supported way to add custom forward/stub rules, so approved automation, GitOps, or administrators editing it are expected. The AKS reconciler (aksService) that continuously (re)creates coredns-custom is excluded by identity. Validate the change content and window, then exclude the specific verified service account rather than re-broadening to all system:*.Response and remediation#
T1565, T1565.001↳ also matches update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating GKE CoreDNS or Kube-DNS Configuration Modified#
Possible investigation steps#
Response and remediation#
Setup#
system:serviceaccount:azure-arc:azure-arc-kube-aad-proxy-sa with the actual caller identity in the impersonatedUser field. This pattern indicates that someone is accessing the cluster through the Azure ARM API rather than directly via kubectl against the API server. While legitimate for Arc-managed workflows, adversaries with stolen service principal credentials can abuse Arc Cluster Connect to read, exfiltrate, or modify secrets and configmaps while appearing as the Arc proxy service account in K8s audit logs.T1213, T1530, T1552, T1552.007, T1565, T1565.001↳ also matches get-configmaps: get configmaps, list-configmaps: list configmaps, create-configmaps: create configmaps, update-configmaps: update configmaps, patch-configmaps: patch configmaps Investigation guide
Triage and analysis#
Investigating Kubernetes Secret or ConfigMap Access via Azure Arc Proxy#
impersonatedUser field. This rule detects non-system secret and configmap access — including reads, writes, and deletions — routed through this proxy path. Read operations (get, list) are particularly important to detect as they represent the most common adversary action: exfiltrating secrets without leaving obvious modification traces.Possible investigation steps#
kubernetes.audit.impersonatedUser.username field — this contains the Azure AD object ID of the actual caller. Cross-reference with Azure AD to identify the service principal or user.kubernetes.audit.impersonatedUser.extra.oid field for the Azure AD object ID.default or application namespaces are more suspicious than azure-arc or kube-system.kubernetes.audit.objectRef.name — look for suspicious secret/configmap names that don't match known application resources.LISTCLUSTERUSERCREDENTIAL operation that initiated the Arc proxy session.Response and remediation#
Falco #
References #
deletecollection configmaps
#Example Audit Event #
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "00000000-0000-0000-0000-000000000000",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/dw-harn/configmaps?labelSelector=dw-harn-patched",
"verb": "deletecollection",
"user": {
"username": "kubernetes-admin",
"groups": [
"kubeadm:cluster-admins",
"system:authenticated"
],
"extra": {
"authentication.kubernetes.io/credential-id": [
"X509SHA256=3ffde68ef687218e01296d94b0aa59c81cc98de2bd73ab70e21510c8cd4b9cec"
]
}
},
"sourceIPs": [
"203.0.113.10"
],
"userAgent": "kubectl/v1.36.2 (linux/amd64) kubernetes/24e2b02",
"objectRef": {
"resource": "configmaps",
"namespace": "dw-harn",
"apiVersion": "v1"
},
"responseStatus": {
"metadata": {},
"code": 200
},
"responseObject": {
"kind": "ConfigMapList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "562"
},
"items": [
{
"metadata": {
"name": "dw-harn-configmaps",
"namespace": "dw-harn",
"uid": "00000000-0000-0000-0000-000000000000",
"resourceVersion": "561",
"creationTimestamp": "2026-07-02T23:12:05Z",
"labels": {
"dw-harn-patched": "1"
}
},
"data": {
"key": "value"
}
}
]
},
"requestReceivedTimestamp": "2026-07-02T23:12:08.772764Z",
"stageTimestamp": "2026-07-02T23:12:08.778349Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"kubeadm:cluster-admins\" of ClusterRole \"cluster-admin\" to Group \"kubeadm:cluster-admins\""
}
}
References #
any verb on configmaps (synthetic aggregation)
#Description
Synthetic aggregation for rules that filter the configmaps resource with no specific verb. Not a distinct audit record; hosts rule listings that key on objectRef.resource alone.
Common Indicators #
Field/value combinations most frequently checked by detection rules targeting this event, derived from cross-vendor predicate analysis.
| Field | Kind | Value | Rules | Vendors |
|---|---|---|---|---|
kubernetes.audit.objectRef.resource (elastic rule field) | in | nodes | 2 rules | elastic |
kubernetes.audit.objectRef.resource (elastic rule field) | in | pods | 2 rules | elastic |
EventType (elastic rule field) | in | get | 1 rule | elastic |
EventType (elastic rule field) | in | list | 1 rule | elastic |
kubernetes.audit.stage (elastic rule field) | eq | responsecomplete | 1 rule | elastic |
Detection Rules #
Full rule details for this event, including ATT&CK technique mappings and native queries →Elastic #
T1078get/list traffic across distinct API resource kinds that answer those questions (namespaces, workloads, roles, cluster-wide roles) is a common setup and orientation pattern for both interactive attackers and automated recon scripts. It is less typical for steady-state controllers, which usually touch a narrow set of resources repeatedly. This rule highlights that cross-resource burst from a single client fingerprint within a one-minute bucket so analysts can separate routine automation from potential discovery and permission reconnaissance ahead of follow-on actions.T1613