mTLS & Identity
Istio: SPIFFE-Identity
(spiffe://td/ns/X/sa/Y), istiod als CA, automatische
Cert-Rotation. PeerAuthentication STRICT pro
Namespace. FIPS 140-3 ab 1.31:
COMPLIANCE_POLICY=fips-140-3 (TLS 1.2+/AES-GCM,
P-256/P-384), davor als FIPS-Profil nur fips-140-2.
Linkerd: linkerd-identity als CA,
Identity per ServiceAccount, mTLS by default ohne
Opt-in (sobald beide Pods im Mesh sind). Trust Anchor aus
linkerd install läuft nach 365 Tagen ab: selbst
erzeugen, Issuer per cert-manager rotieren.
Cilium: Identity per Pod-Labels, nicht
ServiceAccount. Mutual Auth (SPIFFE, Beta seit 1.14) ist seit 1.20
abgekündigt; bis 1.19.5, 1.18.11 und 1.17.17 konnte damit, wer
ein gültiges Client-Zertifikat hatte, jede Identität imitieren
(GHSA-33qq-jq9c-6gcc, 1.14 bis 1.16 ohne Fix).
Nachfolger: ztunnel-Encryption (Beta seit 1.19,
Namespace-Label io.cilium/mtls-enabled=true, nicht mit
ClusterMesh).
Öffentlicher Trust Store
(eMudhra-Intermediates, 10/2026): Mesh-mTLS läuft über die
mesheigene CA und ist nicht betroffen. Betroffen ist nur, was dem
öffentlichen CA-Bundle vertraut: TLS-Origination und Egress zu
externen Hosts (Istio: DestinationRule mit
SIMPLE ohne caCertificates), JWKS-Abruf
durch istiod. Fix: Istio 1.31.3 und 1.30.7, Cilium 1.20.4, 1.19.10
und 1.18.16. Linkerd edge-26.10.2 baut mit Go 1.26.10;
bei Consul 2.1.0 (1.26.10) und Kuma 3.0.1 (1.27.3) deckt Go nur die
Go-Teile ab, nicht das CA-Bundle der Envoy-Images.
Authorization-Policy
Istio: AuthorizationPolicy mit
action: ALLOW | DENY | AUDIT | CUSTOM. JWT:
RequestAuthentication validiert,
AuthorizationPolicy erzwingt
(requestPrincipals, when). In Ambient
greifen L7-Regeln nur am Waypoint (targetRefs); gegen
Umgehung gehört eine ztunnel-Policy dazu, die nur die
Waypoint-Identität zulässt.
Ingress-Gateways umgehen den Waypoint per Default: L7-Policies am
Waypoint greifen für Nord-Süd-Traffic erst mit
istio.io/ingress-use-waypoint=true am Service (am
Namespace ab 1.25). DENY-Regeln mit methods
(und ALLOW mit notMethods) ließen sich
über HTTP/2 durch abweichende Groß-/Kleinschreibung der
Methode umgehen, Fix ab 1.31.2 und 1.30.6
(ISTIO-SECURITY-2026-007; dessen CVSS 9.2 gilt einer Brotli-Lücke
in Envoy).
Linkerd: AuthorizationPolicy auf
Server oder HTTPRoute,
ServerAuthorization ist die ältere Form.
Default-deny per Annotation
config.linkerd.io/default-inbound-policy: deny. Vor
edge-26.9.1 verfehlte ein Host-Header in
anderer Schreibweise eine hostnamegebundene HTTPRoute
und fiel auf eine breitere Route mit deren Policy durch
(GHSA-7cq8-3jwj-3pcf). Vor edge-26.6.2 blieb eine
gelöschte MeshTLSAuthentication wirksam
(GHSA-229q-25q4-rxm8).
Cilium: L7-Rules in
CiliumNetworkPolicy (HTTP-Method, Path, Header). JWT
nicht nativ.
Kuma: MeshTrafficPermission mit
Matches auf spiffeID oder sni.
Consul: Intentions.
# Istio: default-deny + selektive Erlaubnis
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata: {name: deny-all, namespace: prod}
spec: {} # leere Rules = deny
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata: {name: allow-api, namespace: prod}
spec:
selector: {matchLabels: {app: api}}
rules:
- from: [{source: {principals:
["cluster.local/ns/web/sa/frontend"]}}]
Projekte und Quellen
- Istio (CNCF Graduated): istio.io/latest/docs · github.com/istio/istio · cncf.io/projects/istio
- Linkerd (CNCF Graduated): linkerd.io/2-edge · github.com/linkerd/linkerd2 · cncf.io/projects/linkerd
- Cilium (CNCF Graduated): docs.cilium.io, Service Mesh · github.com/cilium/cilium · cncf.io/projects/cilium
- Kuma (CNCF Sandbox): kuma.io/docs · github.com/kumahq/kuma · cncf.io/projects/kuma
- Consul (HashiCorp, kein CNCF-Projekt): developer.hashicorp.com/consul · github.com/hashicorp/consul
- Gateway API (Kubernetes SIG Network): gateway-api.sigs.k8s.io, GAMMA · github.com/kubernetes-sigs/gateway-api
- Envoy (CNCF Graduated, Proxy in Istio, Cilium, Kuma und Consul): envoyproxy.io/docs · github.com/envoyproxy/envoy · cncf.io/projects/envoy