LoFP LoFP / 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.

Techniques

Sample rules

GKE Certificate Signing Request for Privileged Identity

Description

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.

Detection logic

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