Skip to main content

Audit & Evidence

Purpose: For security officers, shows how to locate audit logs and generate compliance evidence for regulatory reviews.

Task Summary​

Compliance reviews require evidence that security controls are active and enforced. openCenter produces audit evidence from four sources: Kubernetes API server audit logs, Kyverno policy reports, RBAC configuration, and secrets rotation records. This guide shows where each type of evidence lives and how to collect it.

Prerequisites​

  • kubectl access to the cluster with cluster-admin privileges
  • SSH access to control plane nodes (for API server audit logs)
  • opencenter CLI installed (for key rotation records)

API Server Audit Logs​

The Kubernetes API server logs all requests to the audit log. This includes resource creation, modification, deletion, and authentication events.

Location on control plane nodes:

/var/log/kubernetes/audit/audit.log

Collect Audit Logs​

# SSH to a control plane node
ssh user@control-plane-1

# View recent audit events
tail -100 /var/log/kubernetes/audit/audit.log | jq .

# Filter for specific resource types
grep '"resource":"secrets"' /var/log/kubernetes/audit/audit.log | tail -20 | jq .

# Filter for specific users
grep '"username":"admin@example.com"' /var/log/kubernetes/audit/audit.log | jq .

If Loki is configured, audit logs are also available via Grafana. Query with LogQL:

{job="kubernetes-audit"} | json | resource="secrets"

Kyverno Policy Reports​

Kyverno generates PolicyReport and ClusterPolicyReport resources that record every policy evaluation — both passes and violations.

Collect Policy Reports​

# List all cluster-wide policy reports
kubectl get clusterpolicyreport

# List namespace-scoped reports
kubectl get policyreport -A

# Export a detailed report for a namespace
kubectl get policyreport -n <namespace> -o yaml > evidence/policyreport-<namespace>.yaml

# Count violations by policy
kubectl get policyreport -A -o json | \
jq '[.items[].results[] | select(.result=="fail")] | group_by(.policy) | map({policy: .[0].policy, count: length})'

Policy reports are retained in the cluster as long as the evaluated resource exists. For long-term retention, export reports periodically or forward them to Loki.

RBAC Audit​

Document the current RBAC configuration to show who has access to what.

# List all ClusterRoleBindings
kubectl get clusterrolebindings -o wide > evidence/clusterrolebindings.txt

# List all RoleBindings across namespaces
kubectl get rolebindings -A -o wide > evidence/rolebindings.txt

# Show RBACDefinitions (openCenter RBAC Manager)
kubectl get rbacdefinitions -o yaml > evidence/rbacdefinitions.yaml

# Check effective permissions for a user
kubectl auth can-i --list --as=admin@example.com

Secrets Rotation Records​

Key rotation events are tracked by the openCenter CLI. Use check-keys to produce a point-in-time snapshot:

opencenter cluster check-keys <cluster-name> > evidence/key-rotation-status.txt

This output includes:

  • Current Age key creation date and age in days
  • Current SSH key creation date and age in days
  • Whether keys are within policy (90-day Age, 180-day SSH)

Git history provides a rotation audit trail. Each key rotation produces commits that update .sops.yaml and re-encrypt secrets:

git log --oneline --all -- '.sops.yaml' 'secrets/' > evidence/rotation-history.txt

Verification​

After collecting evidence, verify completeness:

Evidence TypeSourceExpected Content
API audit logsControl plane nodes or LokiRequest/response records for all API calls
Policy reportskubectl get policyreport -APass/fail results for all 17 ClusterPolicies
RBAC snapshotkubectl get clusterrolebindingsAll role bindings with subjects and roles
Key rotationopencenter cluster check-keysKey ages within policy thresholds

Further Reading​