Summary
20 CiliumNetworkPolicies exist and are genuinely default-deny, but zero in observability, network, flux-system, or most of kube-system. Many currently unconfined pods can reach unauthenticated in-cluster APIs: Loki runs auth_enabled: false, and the Prometheus/VMSingle/VictoriaLogs query APIs have no auth layer. Grafana is the exception — it is Kanidm-OAuth-authenticated (kubernetes/apps/observability/grafana/app/helmrelease.yaml:105) — but still lacks egress hygiene. A compromised pod can read all logs and query all metrics.
The namespace-wide default-deny pattern already exists in-tree: kubernetes/apps/ai/networkpolicy.yaml.
Proposed work
- Apply the
ai/ pattern to observability/: namespace-wide endpointSelector: {} default-deny on ingress and egress, plus per-workload allows (Alloy→both log backends, both metric stacks→scrape targets, Grafana→datasources and Kanidm, vmalert→Alertmanager).
- Then
network/ (external-dns→Cloudflare, cloudflared→edge, k8s-gateway, traefik backends).
kube-system/flux-system as a separate, careful follow-up phase — Cilium's own namespaces need conservative allowlists to avoid self-lockout.
Acceptance criteria
Related
Summary
20 CiliumNetworkPolicies exist and are genuinely default-deny, but zero in
observability,network,flux-system, or most ofkube-system. Many currently unconfined pods can reach unauthenticated in-cluster APIs: Loki runsauth_enabled: false, and the Prometheus/VMSingle/VictoriaLogs query APIs have no auth layer. Grafana is the exception — it is Kanidm-OAuth-authenticated (kubernetes/apps/observability/grafana/app/helmrelease.yaml:105) — but still lacks egress hygiene. A compromised pod can read all logs and query all metrics.The namespace-wide default-deny pattern already exists in-tree:
kubernetes/apps/ai/networkpolicy.yaml.Proposed work
ai/pattern toobservability/: namespace-wideendpointSelector: {}default-deny on ingress and egress, plus per-workload allows (Alloy→both log backends, both metric stacks→scrape targets, Grafana→datasources and Kanidm, vmalert→Alertmanager).network/(external-dns→Cloudflare, cloudflared→edge, k8s-gateway, traefik backends).kube-system/flux-systemas a separate, careful follow-up phase — Cilium's own namespaces need conservative allowlists to avoid self-lockout.Acceptance criteria
observabilityandnetworkhave base default-deny ingress+egress CNPs with explicit per-workload allows.Related