Skip to main content
compliance · azure

AKS clusters with no diagnostic setting exporting control-plane logs

resource types
1
rule IDs covered
1
severity
medium

What does ZopNight detect here?

Rule RC-1355 fires when an AKS cluster has no diagnostic setting shipping control-plane logs: kube-apiserver, kube-audit, kube-audit-admin, or kube-controller-manager. ZopNight resolves this with a secondary Resource Graph lookup over microsoft.insights/diagnosticsettings; only an explicit diagnostic_logging_enabled of "false" fires, and an absent flag abstains.

Signal and threshold

How ZopNight evaluates AKS clusters with no diagnostic setting exporting control-plane logs.
Field Value
Rule IDsRC-1355
Categorycompliance
Severitymedium
Metricnone — pure configuration read
Sourceaks_logging.go

Control-plane logs nobody is collecting

In AKS, Microsoft operates the control plane, so kube-apiserver, kube-audit and kube-controller-manager output exists only while a diagnostic setting exports it. There is no node to SSH into afterwards. Without one, the cluster keeps no record of which identity read a secret, deleted a namespace, or created a privileged pod. During an incident that gap is unrecoverable: the logs were never written anywhere, so no amount of forensics gets them back.

Two signals, two rules

AKS has two separate observability surfaces that are easy to conflate. Container Insights is the omsagent addon collecting node and workload telemetry, which is rule RC-1352’s subject. Diagnostic settings are a distinct ARM resource under microsoft.insights/diagnosticsettings that exports the control-plane log categories. A cluster can have either without the other, which is why RC-1355 is keyed to its own signal rather than reusing the addon flag.

How ZopNight proves the gap

Azure Resource Graph does not surface diagnostic settings on the cluster row itself, so the discoverer runs a secondary lookup over microsoft.insights/diagnosticsettings scoped to managed clusters, checking for at least one enabled control-plane category (kube-apiserver, kube-audit, kube-audit-admin, or kube-controller-manager) and stamps diagnostic_logging_enabled accordingly. The read is covered by the built-in Reader role. The rule fires only on an explicit "false"; when the lookup produced nothing, it abstains rather than firing on missing data, and the legacy customer-editable tag is ignored entirely.

Turning on kube-audit without drowning in it

The full kube-audit category logs every request, including reads, and on a busy cluster the Log Analytics bill will show it. The kube-audit-admin category records only write operations, which is the usual compromise for compliance evidence at tolerable cost. Send either to a Log Analytics workspace when you need to query, or to a storage account when you only need retention.

Verify diagnostic settings from the CLI

Terminal window
az monitor diagnostic-settings list \
--resource $(az aks show -n <cluster> -g <rg> --query id -o tsv) \
--query "[].{name:name, enabled:logs[?enabled].category}" -o table

Empty output, or settings whose enabled categories include none of the four control-plane logs, is the state this finding describes.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·