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