From a6eaea607472215ce4621383cc3f7ead42958a0f Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Thu, 20 Aug 2026 12:00:00 +0000 Subject: [PATCH] netpol: zehn Arbeitslasten ohne Ausgang nach draussen (#0088) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- apps/production/networkpolicy.yaml | 112 ++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/apps/production/networkpolicy.yaml b/apps/production/networkpolicy.yaml index a68e591..995e5ad 100644 --- a/apps/production/networkpolicy.yaml +++ b/apps/production/networkpolicy.yaml @@ -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