netpol: zehn Arbeitslasten ohne Ausgang nach draussen (#0088)

Sie sprechen ausschliesslich cluster-intern: die drei nginx-Dienste, beide
Postgres, der ClamAV-Vorschalter, haproxy, die Wiki-Gruppenpruefung und die
beiden Matrix-Bots. Fuer sie faellt der pauschale 0.0.0.0/0-Satz weg; DNS und
Cluster-Netz bleiben.

⚠️ Der Ausschluss steht in egress-block-metadata selbst, nicht in einer neuen
strengen Policy. NetworkPolicies sind additiv - solange irgendeine Policy
0.0.0.0/0 fuer einen Pod erlaubt, aendert eine zweite, strengere nichts. Genau
dieser Fehler waere die naheliegende Umsetzung gewesen.

Zwei Dinge vorher gemessen statt angenommen:

-  waehlt auch Pods, die das Label gar nicht tragen (29 Pods, 1 Treffer,
  notin liefert 28). Ohne diese Gewissheit haetten drei Pods ohne
  app.kubernetes.io/name ihren Metadaten-Schutz verloren.
- Die Selektoren gegen den laufenden Cluster geprueft: 20 behalten breiten
  Ausgang, 9 laufende Pods werden eng - Summe 29, also genau die Gesamtzahl.

Zwei Policies, weil ein podSelector nicht ueber zwei Label-Schluessel odern kann;
drei Pods im Namespace fuehren nur .

Rollback: beide neuen Policies loeschen, Ausschluss zuruecknehmen.
This commit is contained in:
Thore Cimbal
2026-08-20 12:00:00 +00:00
parent a3d7e03d90
commit a6eaea6074
+111 -1
View File
@@ -438,7 +438,34 @@ metadata:
name: egress-block-metadata
namespace: matrix
spec:
podSelector: {}
# Waehlt alle Pods AUSSER denen, die gar keinen Ausgang brauchen (#0088).
#
# ⚠️ Der Ausschluss muss HIER stehen, nicht in einer zusaetzlichen engen Policy:
# NetworkPolicies sind additiv. Solange diese Policy 0.0.0.0/0 fuer einen Pod
# erlaubt, aendert eine zweite, strengere Regel fuer denselben Pod nichts.
#
# `NotIn` waehlt auch Pods, die das Label gar nicht tragen - am 2026-08-20 im
# Cluster nachgemessen (29 Pods, 1 Treffer, notin liefert 28). Drei Pods im
# Namespace fuehren kein app.kubernetes.io/name, deshalb der zweite Ausdruck
# auf `app`. Beide Ausdruecke sind UND-verknuepft.
podSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: NotIn
values:
- element-web
- element-admin
- postgres
- wikijs-postgres
- clamav-http-scanner
- wikijs-gruppenpruefung
- haproxy
- draupnir
- key: app
operator: NotIn
values:
- element-web-docs
- concierge-bot
policyTypes:
- Egress
egress:
@@ -465,3 +492,86 @@ spec:
cidr: 0.0.0.0/0
except:
- 169.254.0.0/16
---
# Pods ohne jeden Bedarf an Ausgang nach draussen (#0088).
#
# Zehn Arbeitslasten sprechen ausschliesslich cluster-intern: die drei nginx-Dienste,
# beide Postgres, der ClamAV-Vorschalter, haproxy, die Wiki-Gruppenpruefung und die
# beiden Matrix-Bots (Foederation ist geschlossen, Draupnir holt keine fremden
# Policy-Listen). Fuer sie faellt der pauschale 0.0.0.0/0-Satz weg; erlaubt bleibt
# DNS und das Cluster-Netz.
#
# Zwei Policies, weil ein podSelector nicht ueber zwei Label-Schluessel odern kann -
# die Vereinigung mehrerer Policies leistet genau das.
#
# Rollback: beide Policies loeschen und den Ausschluss in egress-block-metadata
# zuruecknehmen.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-nur-intern
namespace: matrix
spec:
podSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- element-web
- element-admin
- postgres
- wikijs-postgres
- clamav-http-scanner
- wikijs-gruppenpruefung
- haproxy
- draupnir
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
- to:
- ipBlock:
cidr: 10.42.0.0/16
- ipBlock:
cidr: 10.43.0.0/16
---
# Dieselben Regeln fuer die zwei Pods, die kein app.kubernetes.io/name fuehren.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-nur-intern-app-label
namespace: matrix
spec:
podSelector:
matchExpressions:
- key: app
operator: In
values:
- element-web-docs
- concierge-bot
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
- to:
- ipBlock:
cidr: 10.42.0.0/16
- ipBlock:
cidr: 10.43.0.0/16