Sichere Kommunikation in Kubernetes mit Istio Service Mesh und Vault Agent Injector


Bicycle

Sichere Kommunikation in Kubernetes mit Istio Service Mesh und Vault Agent Injector

In modernen cloud-nativen Kubernetes-Umgebungen ist Sicherheit von größter Bedeutung. Eine der wichtigsten Herausforderungen besteht darin, sichere Kommunikation zwischen Microservices zu gewährleisten und gleichzeitig Secrets sicher zu verwalten. Ob Sie eine monolithische Anwendung oder eine Reihe von Microservices in Kubernetes betreiben - die Sicherung der Service-zu-Service-Kommunikation und des Secret-Managements ist entscheidend, um unbefugten Zugriff zu verhindern und den Datenschutz zu gewährleisten. Hier kommen Istio Service Mesh in Kombination mit HashiCorp Vault Agent Injector ins Spiel - eine mächtige Kombination, die es Ihnen ermöglicht, die Kommunikation zwischen Services zu sichern und Secrets zu verwalten, ohne Ihren Anwendungscode ändern zu müssen.

In diesem Blog-Beitrag erkunden wir, wie Sie die Kommunikation Ihrer Workloads in Kubernetes mit Istio Service Mesh sichern können, während Sie gleichzeitig Vault Agent Injector für dynamisches Secret-Management nutzen, basierend auf den Konzepten, die wir in unseren vorherigen Beiträgen demonstriert haben.

Hinweis: Dieser Artikel kombiniert Konzepte aus unseren vorherigen Beiträgen über Kubernetes und Vault Agent Injector: Dynamisches Secrets Management und erweitert sie um Service Mesh-Sicherheitsmuster ähnlich denen in Sichere Kommunikation auf HashiCorp Nomad mit Consul Connect.

Was ist Istio Service Mesh?

Istio ist ein Open-Source-Service-Mesh, das eine einheitliche Möglichkeit bietet, Microservices zu sichern, zu verbinden und zu überwachen. Es erreicht dies durch die Aktivierung von mutual Transport Layer Security (mTLS) zwischen Services, Traffic-Management, Observability und Policy-Durchsetzung. Jeder Service erhält seine eigene Identität, und Istio stellt sicher, dass nur vertrauenswürdige Services miteinander kommunizieren können. Durch die Verwendung von Istio wird die Service-Kommunikation authentifiziert und verschlüsselt, wodurch sichergestellt wird, dass die Netzwerksicherheit auch in feindlichen oder kompromittierten Umgebungen aufrechterhalten wird.

Wichtige Features von Istio:

  • mTLS (Mutual TLS): Stellt sicher, dass die gesamte Service-zu-Service-Kommunikation verschlüsselt ist und sowohl Client als auch Server die Identität des anderen verifizieren.
  • Service-Identität: Jeder Service im Mesh hat eine eindeutige Identität basierend auf Kubernetes Service Accounts, die für feingranulige Zugriffskontrolle verwendet werden kann.
  • Autorisierungsrichtlinien: Sie können Richtlinien definieren, die kontrollieren, welche Services kommunizieren dürfen, was eine zusätzliche Sicherheitsebene hinzufügt.
  • Automatisches Zertifikat-Management: Istio verwaltet den Zertifikat-Lebenszyklus über Citadel und stellt sicher, dass Zertifikate automatisch erneuert und rotiert werden.
  • Traffic-Management: Erweiterte Traffic-Routing-, Load-Balancing- und Fault-Injection-Fähigkeiten.
  • Observability: Integrierte Metriken, Logs und Tracing für alle Service-Kommunikationen.

Warum Istio mit Vault Agent Injector kombinieren?

Kubernetes bietet hervorragende Orchestrierungsmöglichkeiten, aber die Sicherung der Service-zu-Service-Kommunikation und das Verwalten von Secrets erfordern zusätzliche Tools. Istio bietet die Service-Mesh-Ebene für sichere Kommunikation, während Vault Agent Injector dynamisches Secret-Management übernimmt. Diese Kombination bietet Ihnen:

  • Umfassende Sicherheit: Sowohl Netzwerk-Sicherheit (Istio) als auch Secret-Management (Vault)
  • Zero-Trust-Architektur: Services müssen explizit autorisiert werden, um zu kommunizieren, und Secrets werden dynamisch bereitgestellt
  • Operative Einfachheit: Beide Lösungen integrieren sich nahtlos in Kubernetes, ohne Änderungen am Anwendungscode zu erfordern
  • Skalierbarkeit: Beide Lösungen skalieren mit Ihrer Kubernetes-Infrastruktur

Einrichtung von Istio und Vault Agent Injector

Voraussetzungen:

  1. Kubernetes-Cluster mit ausreichenden Ressourcen für Istio
  2. Externer HashiCorp Vault-Cluster auf vault.example.com:8200
  3. Helm für die Installation von Komponenten
  4. kubectl für Ihren Cluster konfiguriert

Schritt 1: Istio installieren

Installieren Sie zuerst Istio in Ihrem Kubernetes-Cluster:

 1# Istio herunterladen und installieren
 2curl -L https://istio.io/downloadIstio | sh -
 3export PATH="$PATH:./istio-1.20.0/bin"
 4
 5# Istio mit Standard-Konfiguration installieren
 6istioctl install --set values.defaultRevision=default -y
 7
 8# Istio-Injection für den Demo-Namespace aktivieren
 9kubectl create namespace demo
10kubectl label namespace demo istio-injection=enabled
11
12# Istio-Installation verifizieren
13kubectl get pods -n istio-system

Schritt 2: Vault Agent Injector installieren

Installieren Sie den Vault Agent Injector wie in unserem vorherigen Beitrag demonstriert:

1helm repo add hashicorp https://helm.releases.hashicorp.com
2helm repo update
3
4# Nur den Agent Injector installieren (kein Vault-Server)
5helm install vault-injector hashicorp/vault \
6  --set "global.externalVaultAddr=https://vault.example.com:8200" \
7  --set "injector.enabled=true" \
8  --set "server.enabled=false" \
9  --set "csi.enabled=false"

Schritt 3: Vault-Authentifizierung konfigurieren

Richten Sie dieselbe Vault-Konfiguration wie in unserem vorherigen Kubernetes-Beitrag ein:

 1# Vault-Adresse Umgebungsvariable setzen
 2export VAULT_ADDR="https://vault.example.com:8200"
 3
 4# Kubernetes Auth-Methode aktivieren
 5vault auth enable kubernetes
 6
 7# Kubernetes Auth konfigurieren (wie im vorherigen Beitrag)
 8KUBERNETES_HOST=$(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.server}')
 9KUBERNETES_CA_CERT=$(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}' | base64 -d)
10
11# Service Account erstellen und Auth konfigurieren
12kubectl create serviceaccount vault-auth
13kubectl apply -f - <<EOF
14apiVersion: rbac.authorization.k8s.io/v1
15kind: ClusterRoleBinding
16metadata:
17  name: role-tokenreview-binding
18roleRef:
19  apiGroup: rbac.authorization.k8s.io
20  kind: ClusterRole
21  name: system:auth-delegator
22subjects:
23- kind: ServiceAccount
24  name: vault-auth
25  namespace: default
26EOF
27
28TOKEN_REVIEWER_JWT=$(kubectl create token vault-auth)
29
30vault write auth/kubernetes/config \
31    token_reviewer_jwt="$TOKEN_REVIEWER_JWT" \
32    kubernetes_host="$KUBERNETES_HOST" \
33    kubernetes_ca_cert="$KUBERNETES_CA_CERT"

Schritt 4: Vault Secrets konfigurieren (wie im vorherigen Beitrag)

 1# Database Secrets Engine aktivieren
 2vault secrets enable -path=dynamic-app/db database
 3
 4# MySQL-Verbindung konfigurieren
 5vault write dynamic-app/db/config/mysql \
 6    plugin_name=mysql-database-plugin \
 7    connection_url="{{username}}:{{password}}@tcp(mysql-server.demo.svc.cluster.local:3306)/" \
 8    allowed_roles="*" \
 9    username="root" \
10    password="super-duper-password"
11
12# Dynamische Credentials-Rolle erstellen
13vault write dynamic-app/db/roles/app \
14    db_name=mysql \
15    creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT ALL ON my_app.* TO '{{name}}'@'%';" \
16    default_ttl="1h" \
17    max_ttl="24h"
18
19# Vault Policy erstellen
20vault policy write dynamic-app-istio - <<EOF
21path "dynamic-app/db/creds/app" {
22  capabilities = ["read"]
23}
24EOF
25
26# Kubernetes-Rolle erstellen
27vault write auth/kubernetes/role/dynamic-app-istio \
28    bound_service_account_names=dynamic-app-istio \
29    bound_service_account_namespaces=demo \
30    policies=dynamic-app-istio \
31    ttl=24h

Services mit Istio und Vault Integration bereitstellen

Schritt 5: MySQL-Datenbank mit Istio bereitstellen

 1# mysql-istio-deployment.yaml
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: mysql-server
 6  namespace: demo
 7  labels:
 8    app: mysql-server
 9    version: v1
10spec:
11  replicas: 1
12  selector:
13    matchLabels:
14      app: mysql-server
15      version: v1
16  template:
17    metadata:
18      labels:
19        app: mysql-server
20        version: v1
21    spec:
22      containers:
23      - name: mysql
24        image: mysql:9
25        env:
26        - name: MYSQL_ROOT_PASSWORD
27          value: "super-duper-password"
28        ports:
29        - containerPort: 3306
30          name: mysql
31        resources:
32          requests:
33            cpu: 500m
34            memory: 1Gi
35          limits:
36            cpu: 500m
37            memory: 1Gi
38
39---
40# MySQL Service
41apiVersion: v1
42kind: Service
43metadata:
44  name: mysql-server
45  namespace: demo
46  labels:
47    app: mysql-server
48    service: mysql-server
49spec:
50  ports:
51  - port: 3306
52    name: mysql
53    targetPort: 3306
54  selector:
55    app: mysql-server

Schritt 6: Dynamic App mit Vault Agent Injector und Istio bereitstellen

  1# dynamic-app-istio.yaml
  2apiVersion: v1
  3kind: ServiceAccount
  4metadata:
  5  name: dynamic-app-istio
  6  namespace: demo
  7
  8---
  9apiVersion: apps/v1
 10kind: Deployment
 11metadata:
 12  name: dynamic-app
 13  namespace: demo
 14  labels:
 15    app: dynamic-app
 16    version: v1
 17spec:
 18  replicas: 1
 19  selector:
 20    matchLabels:
 21      app: dynamic-app
 22      version: v1
 23  template:
 24    metadata:
 25      labels:
 26        app: dynamic-app
 27        version: v1
 28      annotations:
 29        # Vault Agent Injector Annotationen
 30        vault.hashicorp.com/agent-inject: "true"
 31        vault.hashicorp.com/agent-inject-status: "update"
 32        vault.hashicorp.com/agent-inject-vault-addr: "https://vault.example.com:8200"
 33        vault.hashicorp.com/role: "dynamic-app-istio"
 34        vault.hashicorp.com/agent-inject-secret-config.ini: "dynamic-app/db/creds/app"
 35        vault.hashicorp.com/agent-inject-template-config.ini: |
 36          [DEFAULT]
 37          LogLevel = DEBUG
 38          Port = 8080
 39
 40          [DATABASE]
 41          Address = mysql-server.demo.svc.cluster.local
 42          Port = 3306
 43          Database = my_app
 44          User = {{ .Data.username }}
 45          Password = {{ .Data.password }}
 46
 47          [VAULT]
 48          Enabled = True
 49          InjectToken = True
 50          Namespace =
 51          Address = https://vault.example.com:8200
 52          KeyPath = dynamic-app/transit
 53          KeyName = app
 54    spec:
 55      serviceAccountName: dynamic-app-istio
 56      containers:
 57      - name: dynamic-app
 58        image: ghcr.io/infralovers/nomad-vault-mysql:1.0.0
 59        ports:
 60        - containerPort: 8080
 61          name: http
 62        env:
 63        - name: CONFIG_FILE
 64          value: "/vault/secrets/config.ini"
 65        - name: VAULT_ADDR
 66          value: "https://vault.example.com:8200"
 67        resources:
 68          requests:
 69            cpu: 256m
 70            memory: 256Mi
 71          limits:
 72            cpu: 256m
 73            memory: 256Mi
 74        livenessProbe:
 75          httpGet:
 76            path: /health
 77            port: 8080
 78          initialDelaySeconds: 30
 79          periodSeconds: 10
 80        readinessProbe:
 81          httpGet:
 82            path: /health
 83            port: 8080
 84          initialDelaySeconds: 5
 85          periodSeconds: 5
 86
 87---
 88# Dynamic App Service
 89apiVersion: v1
 90kind: Service
 91metadata:
 92  name: dynamic-app
 93  namespace: demo
 94  labels:
 95    app: dynamic-app
 96    service: dynamic-app
 97spec:
 98  ports:
 99  - port: 8080
100    name: http
101    targetPort: 8080
102  selector:
103    app: dynamic-app

Istio-Sicherheitsrichtlinien konfigurieren

Schritt 7: Strict mTLS aktivieren

Aktivieren Sie strict mTLS für den gesamten Demo-Namespace:

1# demo-peer-authentication.yaml
2apiVersion: security.istio.io/v1beta1
3kind: PeerAuthentication
4metadata:
5  name: demo-strict-mtls
6  namespace: demo
7spec:
8  mtls:
9    mode: STRICT

Schritt 8: Autorisierungsrichtlinien definieren

Erstellen Sie Autorisierungsrichtlinien zur Kontrolle der Service-zu-Service-Kommunikation:

 1# mysql-authorization-policy.yaml
 2apiVersion: security.istio.io/v1beta1
 3kind: AuthorizationPolicy
 4metadata:
 5  name: mysql-server-policy
 6  namespace: demo
 7spec:
 8  selector:
 9    matchLabels:
10      app: mysql-server
11  rules:
12  - from:
13    - source:
14        principals: ["cluster.local/ns/demo/sa/dynamic-app-istio"]
15    to:
16    - operation:
17        ports: ["3306"]
18
19---
20# Dynamic App Autorisierungsrichtlinie
21apiVersion: security.istio.io/v1beta1
22kind: AuthorizationPolicy
23metadata:
24  name: dynamic-app-policy
25  namespace: demo
26spec:
27  selector:
28    matchLabels:
29      app: dynamic-app
30  rules:
31  - from:
32    - source:
33        namespaces: ["istio-system"]  # Health Checks von Istio erlauben
34  - to:
35    - operation:
36        ports: ["8080"]

Schritt 9: Gateway und VirtualService für externen Zugriff erstellen

 1# dynamic-app-gateway.yaml
 2apiVersion: networking.istio.io/v1beta1
 3kind: Gateway
 4metadata:
 5  name: dynamic-app-gateway
 6  namespace: demo
 7spec:
 8  selector:
 9    istio: ingressgateway
10  servers:
11  - port:
12      number: 80
13      name: http
14      protocol: HTTP
15    hosts:
16    - dynamic-app.local
17
18---
19apiVersion: networking.istio.io/v1beta1
20kind: VirtualService
21metadata:
22  name: dynamic-app-vs
23  namespace: demo
24spec:
25  hosts:
26  - dynamic-app.local
27  gateways:
28  - dynamic-app-gateway
29  http:
30  - match:
31    - uri:
32        prefix: /
33    route:
34    - destination:
35        host: dynamic-app.demo.svc.cluster.local
36        port:
37          number: 8080

Vorteile der Verwendung von Istio mit Vault Agent Injector

  1. End-to-End-Sicherheit: Netzwerk-Verschlüsselung über Istio mTLS und sicheres Secret-Management über Vault
  2. Zero-Trust-Architektur: Services müssen explizit autorisiert werden, um zu kommunizieren und entsprechende Secrets zu erhalten
  3. Automatisches Zertifikat-Management: Istio übernimmt mTLS-Zertifikate, während Vault Anwendungs-Secrets verwaltet
  4. Richtlinien-basierte Sicherheit: Feingranulige Kontrolle sowohl über Netzwerk-Traffic als auch Secret-Zugriff
  5. Observability: Vollständige Sichtbarkeit in Service-Kommunikation und Secret-Nutzung
  6. Keine Code-Änderungen: Sowohl Istio als auch Vault integrieren ohne Anwendungsmodifikationen

Sicherheits-Best-Practices

  1. Prinzip der geringsten Berechtigung: Nur notwendige Service-Kommunikation erlauben
  2. Regelmäßige Richtlinien-Reviews: Autorisierungsrichtlinien periodisch prüfen
  3. Zertifikat-Gesundheit überwachen: Istios integrierte Zertifikat-Überwachung verwenden
  4. Secret-Rotation: Vaults automatische Secret-Rotations-Fähigkeiten nutzen
  5. Netzwerk-Segmentierung: Kubernetes-Namespaces mit strikten Richtlinien verwenden

Fazit

Die Kombination von Istio Service Mesh mit HashiCorp Vault Agent Injector bietet eine umfassende Sicherheitslösung für Kubernetes-Workloads. Dieser Ansatz liefert sowohl sichere Service-zu-Service-Kommunikation als auch dynamisches Secret-Management, ohne Änderungen an Ihrem Anwendungscode zu erfordern.

Wichtige Vorteile dieses integrierten Ansatzes:

  • Umfassende Sicherheit: Netzwerk-Verschlüsselung (mTLS) und Secret-Management in einer Lösung
  • Operative Einfachheit: Deklarative Konfiguration über Kubernetes-Ressourcen
  • Skalierbarkeit: Beide Lösungen skalieren nahtlos mit Ihrer Kubernetes-Infrastruktur
  • Zero Trust: Services und Secrets erfordern explizite Autorisierung
  • Observability: Vollständige Sichtbarkeit sowohl in Netzwerk-Traffic als auch Secret-Zugriff

Durch die gemeinsame Nutzung dieser Technologien können Sie eine robuste, sichere und beobachtbare Microservices-Architektur aufbauen, die cloud-nativen Best Practices folgt und gleichzeitig die operative Effizienz aufrechterhält.

Beginnen Sie noch heute mit der Verbesserung Ihrer Kubernetes-Deployments durch die Integration von Istio Service Mesh mit Vault Agent Injector und nutzen Sie sichere, authentifizierte und verschlüsselte Kommunikation kombiniert mit dynamischem Secret-Management in Ihren Services.

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren