Ve výchozím stavu může v Kubernetes každý pod komunikovat s každým jiným podem. To je z bezpečnostního hlediska nepřijatelné. Network Policies umožňují definovat, kdo s kým smí mluvit.
Proč výchozí stav nestačí¶
Představte si: máte v clusteru produkční databázi a vývojový workload. Ve výchozím stavu může vývojářův experimentální pod přímo přistoupit k produkční databázi. Stačí znát IP adresu nebo DNS jméno služby.
Předpoklad: CNI plugin s podporou Network Policies¶
Ne každý CNI plugin Network Policies podporuje. Flannel — ne. Calico — ano. Weave — ano. Cilium — ano. My používáme Calico, které kromě standardních Network Policies nabízí i rozšířené GlobalNetworkPolicy.
Příklad: izolace databáze¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-allow-only-api
namespace: production
spec:
podSelector:
matchLabels:
app: postgresql
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api-server
ports:
- protocol: TCP
port: 5432
Strategie: default deny¶
Doporučujeme začít s default deny politikou v každém namespace a pak explicitně povolovat potřebnou komunikaci. Je to víc práce na začátku, ale dramaticky lepší bezpečnostní postoj.
Praktické tipy¶
- Nezapomeňte povolit DNS (port 53) v egress pravidlech
- Labely jsou základ — konzistentní labeling strategie je nutnost
- Testujte politiky v dev prostředí před nasazením do produkce
- Calico má výborný
calicoctlpro debugging síťových pravidel - Vizualizace: Weave Scope nebo Calico Enterprise pro grafický přehled
Network Policies jsou základ zero trust v Kubernetes¶
Síťová izolace v clusteru není nice-to-have, je to nutnost. S Network Policies implementujete princip least privilege na síťové úrovni a dramaticky snížíte blast radius případného kompromitování.