GKE Certificate Signing Request for Privileged Identity

Last updated 12 days ago on 2026-07-10
Created 12 days ago on 2026-07-10

About

Detects creation of a GKE CertificateSigningRequest (CSR) whose decoded subject requests a highly privileged Kubernetes identity in the Common Name (CN), such as system:masters, system:kube-controller-manager, or system:admin. This rule is scoped to identities with cluster-admin-equivalent or control-plane impersonation value. Attackers who can create and approve CSRs can use this technique to clone credentials for powerful identities and obtain durable cluster access. This signal applies to any actor, including compromised node identities that use legitimate kubelet signers but request a privileged CN.
Tags
Domain: CloudDomain: KubernetesData Source: GCPData Source: GCP Audit LogsData Source: Google Cloud PlatformUse Case: Threat DetectionTactic: PersistenceTactic: Privilege EscalationLanguage: esql
Severity
high
Risk Score
73
MITRE ATT&CK™

Privilege Escalation (TA0004)(external, opens in a new tab or window)

Persistence (TA0003)(external, opens in a new tab or window)

False Positive Examples
Legitimate GKE automation does not request certificates for system:masters, system:kube-controller-manager, or system:admin as the CSR subject. Node bootstrap and kubelet rotation use system:node:* identities instead. Alerts should be rare; tune exclusions only for documented custom PKI workflows that intentionally mint these identities.
License
Elastic License v2(external, opens in a new tab or window)

Definition

Integration Pack
Prebuilt Security Detection Rules
Related Integrations

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

Query
text code block:
from logs-gcp.audit-* metadata _id, _index, _version, _source | where data_stream.dataset == "gcp.audit" and service.name == "k8s.io" and event.outcome == "success" and event.action == "io.k8s.certificates.v1.certificatesigningrequests.create" | eval Esql.csr_request = json_extract(_source, "$.gcp.audit.request.spec.request") | where Esql.csr_request is not null | eval Esql.csr_pem = from_base64(Esql.csr_request) | eval Esql.csr_body_b64 = replace( replace( replace( replace(Esql.csr_pem, "-----BEGIN CERTIFICATE REQUEST-----", ""), "-----END CERTIFICATE REQUEST-----", ""), "\r", ""), "\n", "") | eval Esql.csr_der = from_base64(Esql.csr_body_b64) | where Esql.csr_der like "*system:masters*" or Esql.csr_der like "*system:kube-controller-manager*" or Esql.csr_der like "*system:admin*" | keep _id, _index, _version, @timestamp, client.user.email, gcp.audit.resource_name, source.ip, user_agent.original, Esql.*, event.*, gcp.audit.request, gcp.audit.response, data_stream.namespace

Install detection rules in Elastic Security

Detect GKE Certificate Signing Request for Privileged Identity 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).