Sichere Kommunikation in Kubernetes mit Consul Connect und Vault Agent Injector


Bicycle

Sichere Kommunikation in Kubernetes mit Consul Connect 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 HashiCorp Consul Connect in Kombination mit HashiCorp Vault Agent Injector ins Spiel und bringen die gleiche bewährte Service-Mesh-Lösung aus dem HashiCorp-Ökosystem nach Kubernetes.

In diesem Blog-Beitrag erkunden wir, wie Sie die Kommunikation Ihrer Workloads in Kubernetes mit HashiCorp Consul Connect Service Mesh sichern können, während Sie gleichzeitig Vault Agent Injector für dynamisches Secret-Management nutzen und dabei eine direkte Kubernetes-Entsprechung zu unseren Nomad-Beispielen bereitstellen.

Hinweis: Dieser Artikel demonstriert, wie Sie die gleiche HashiCorp Consul Connect Service Mesh-Technologie, die in unserem Beitrag Sichere Kommunikation auf HashiCorp Nomad mit Consul Connect gezeigt wurde, in Kubernetes verwenden können. Er baut auch auf den Secret-Management-Konzepten aus Kubernetes und Vault Agent Injector: Dynamisches Secrets Management auf.

Was ist HashiCorp Consul Connect?

Consul Connect ist HashiCorps Service-Mesh-Lösung, die sichere Service-zu-Service-Kommunikation in Ihrer Infrastruktur bereitstellt. Sie erreicht dies durch die Aktivierung von mutual Transport Layer Security (mTLS) zwischen Services. Jeder Service erhält seine eigene Identität, und Consul stellt sicher, dass nur vertrauenswürdige Services miteinander kommunizieren können. Durch die Verwendung von Connect 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 Consul Connect:

  • 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 in Consul registrierte Service hat eine eindeutige Identität, die für feingranulige Zugriffskontrolle verwendet werden kann.
  • Autorisierungsrichtlinien (Intentions): Sie können Intentions definieren, die kontrollieren, welche Services kommunizieren dürfen, was eine zusätzliche Sicherheitsebene hinzufügt.
  • Automatische Zertifikat-Rotation: Consul verwaltet den Zertifikat-Lebenszyklus und stellt sicher, dass Zertifikate automatisch erneuert und rotiert werden, um den operativen Aufwand zu reduzieren.
  • Native Kubernetes-Integration: Consul Connect kann nativ in Kubernetes mit dem offiziellen Consul Helm Chart ausgeführt werden.

Warum Consul Connect mit Kubernetes?

Während Kubernetes hervorragende Orchestrierungsmöglichkeiten bietet, fehlen ihm native Service-Mesh-Features für verschlüsselte Kommunikation zwischen Services. Consul Connect schließt diese Lücke, indem es HashiCorps bewährte Service-Mesh-Technologie in Kubernetes-Umgebungen bringt. In Kombination mit Vault Agent Injector erhalten Sie:

  • Vertraute Technologie: Verwenden Sie das gleiche Consul Connect, das Sie aus Nomad-Umgebungen kennen
  • Umfassende Sicherheit: Netzwerk-Sicherheit (Consul Connect) und Secret-Management (Vault)
  • Zero-Trust-Architektur: Services müssen explizit autorisiert werden, um zu kommunizieren und entsprechende Secrets zu erhalten
  • Operative Konsistenz: Behalten Sie die gleichen Service-Mesh-Patterns über Nomad- und Kubernetes-Deployments bei
  • HashiCorp-Ökosystem-Integration: Nahtlose Integration zwischen Consul, Vault und Kubernetes

Einrichtung von Consul Connect und Vault Agent Injector in Kubernetes

Voraussetzungen:

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

Schritt 1: Consul Connect Injector für externen Consul installieren

Installieren Sie nur die Consul Connect Injector-Komponenten, um sich direkt mit einem externen Consul-Cluster zu verbinden, ohne Consul-Clients bereitzustellen:

 1# HashiCorp Helm Repository hinzufügen
 2helm repo add hashicorp https://helm.releases.hashicorp.com
 3helm repo update
 4
 5# consul-values.yaml für externe Consul-Konfiguration erstellen
 6cat > consul-values.yaml <<EOF
 7global:
 8  name: consul
 9  datacenter: dc1
10  # Konfiguration für direkte Nutzung externer Consul-Server
11  consulAPITimeout: 5s
12
13# Server-Installation deaktivieren - wir verwenden externen Consul
14server:
15  enabled: false
16
17# Client deaktivieren - Connect Injector kommuniziert direkt mit externem Consul
18client:
19  enabled: false
20
21# Connect Injection für externen Consul aktivieren
22connectInject:
23  enabled: true
24  default: false  # Wir aktivieren explizit pro Service
25  # Injector für direkten externen Consul-Zugriff konfigurieren
26  consulNode:
27    meta:
28      pod-name: \${HOSTNAME}
29      node-name: \${NODE_NAME}
30  # Externe Consul-Server
31  k8sAllowNamespaces: ["*"]
32  k8sDenyNamespaces: []
33
34controller:
35  enabled: true
36
37# UI deaktivieren, da wir externen Consul verwenden
38ui:
39  enabled: false
40
41# DNS deaktivieren, da keine Clients bereitgestellt werden
42dns:
43  enabled: false
44
45# Externe Consul-Verbindung konfigurieren
46externalServers:
47  enabled: true
48  hosts: ["consul.example.com"]
49  httpsPort: 8501  # HTTPS-Port für sichere Verbindung verwenden
50  useSystemRoots: true
51EOF
52
53# Consul Connect-Komponenten installieren
54kubectl create namespace consul
55helm install consul hashicorp/consul \
56  --namespace consul \
57  --values consul-values.yaml
58
59# Warten bis Connect Injector bereit ist
60kubectl wait --for=condition=ready pod -l app=consul-connect-injector -n consul --timeout=300s

Schritt 2: Vault Agent Injector installieren

Installieren Sie den Vault Agent Injector wie in unseren vorherigen Beiträgen demonstriert:

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

Schritt 3: Vault-Authentifizierung konfigurieren

Richten Sie dieselbe Vault-Konfiguration wie in unseren vorherigen Kubernetes-Beiträgen 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
 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 und Policies konfigurieren

 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# Transit Engine für Verschlüsselung aktivieren
20vault secrets enable -path=dynamic-app/transit transit
21vault write -f dynamic-app/transit/keys/app
22
23# Vault Policy erstellen
24vault policy write dynamic-app-consul - <<EOF
25path "dynamic-app/db/creds/app" {
26  capabilities = ["read"]
27}
28path "dynamic-app/transit/encrypt/app" {
29  capabilities = ["update"]
30}
31path "dynamic-app/transit/decrypt/app" {
32  capabilities = ["update"]
33}
34EOF
35
36# Kubernetes-Rolle erstellen
37vault write auth/kubernetes/role/dynamic-app-consul \
38    bound_service_account_names=dynamic-app-consul \
39    bound_service_account_namespaces=demo \
40    policies=dynamic-app-consul \
41    ttl=24h

Services mit Consul Connect und Vault Integration bereitstellen

Schritt 5: Demo-Namespace und Service-Registrierung erstellen

1# Demo-Namespace erstellen
2kubectl create namespace demo
3
4# Service Accounts erstellen
5kubectl create serviceaccount dynamic-app-consul -n demo
6kubectl create serviceaccount mysql-server-consul -n demo

Schritt 6: MySQL-Datenbank mit Consul Connect bereitstellen

 1# mysql-consul-deployment.yaml
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: mysql-server
 6  namespace: demo
 7  labels:
 8    app: mysql-server
 9spec:
10  replicas: 1
11  selector:
12    matchLabels:
13      app: mysql-server
14  template:
15    metadata:
16      labels:
17        app: mysql-server
18      annotations:
19        "consul.hashicorp.com/connect-inject": "true"
20        "consul.hashicorp.com/connect-service": "mysql-server"
21        "consul.hashicorp.com/connect-service-port": "3306"
22    spec:
23      serviceAccountName: mysql-server-consul
24      containers:
25      - name: mysql
26        image: mysql:9
27        env:
28        - name: MYSQL_ROOT_PASSWORD
29          value: "super-duper-password"
30        - name: MYSQL_DATABASE
31          value: "my_app"
32        ports:
33        - containerPort: 3306
34          name: mysql
35        resources:
36          requests:
37            cpu: 500m
38            memory: 1Gi
39          limits:
40            cpu: 500m
41            memory: 1Gi
42        readinessProbe:
43          exec:
44            command:
45            - "/bin/bash"
46            - "-c"
47            - "mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD"
48          initialDelaySeconds: 30
49          periodSeconds: 10
50        livenessProbe:
51          exec:
52            command:
53            - "/bin/bash"
54            - "-c"
55            - "mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD"
56          initialDelaySeconds: 60
57          periodSeconds: 10
58
59---
60apiVersion: v1
61kind: Service
62metadata:
63  name: mysql-server
64  namespace: demo
65  labels:
66    app: mysql-server
67spec:
68  ports:
69  - port: 3306
70    name: mysql
71    targetPort: 3306
72  selector:
73    app: mysql-server

Schritt 7: Dynamic App mit Consul Connect und Vault Agent Injector bereitstellen

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

Consul Connect Sicherheitsrichtlinien konfigurieren

Schritt 8: Consul Connect Intentions erstellen

Erstellen Sie Consul Intentions zur Kontrolle der Service-zu-Service-Kommunikation, genau wie im Nomad-Beispiel. Verbinden Sie sich mit Ihrem externen Consul-Cluster, um Intentions zu konfigurieren:

 1# Consul-Adresse Umgebungsvariable setzen
 2export CONSUL_HTTP_ADDR="https://consul.example.com:8500"
 3
 4# Intention erstellen, um dynamic-app die Verbindung zu mysql-server zu erlauben
 5consul intention create -allow dynamic-app mysql-server
 6
 7# Intentions verifizieren
 8consul intention list
 9
10# Optional: Granularere Intentions mit deny-all Standard erstellen
11consul intention create -deny "*" "*"
12consul intention create -allow dynamic-app mysql-server

Alternativ können Sie Kubernetes CRDs für Intentions verwenden:

 1# consul-intentions.yaml
 2apiVersion: consul.hashicorp.com/v1alpha1
 3kind: ServiceIntentions
 4metadata:
 5  name: mysql-server-intentions
 6  namespace: demo
 7spec:
 8  destination:
 9    name: mysql-server
10  sources:
11  - name: dynamic-app
12    action: allow

Erweiterte Konfigurationsoptionen

Vorteile der Client-losen Architektur

Dieser Deployment-Ansatz verwendet keine Consul-Clients in Kubernetes und bietet mehrere Vorteile:

  1. Reduzierter Ressourcenverbrauch: Keine Consul-Client-Pods, die Cluster-Ressourcen verbrauchen
  2. Vereinfachte Operationen: Weniger Komponenten zu überwachen und zu warten
  3. Direkte Kommunikation: Connect Injector kommuniziert direkt mit externen Consul-Servern
  4. Bessere Sicherheit: Keine lokalen Consul-Agents, die kompromittiert werden könnten
  5. Zentralisiertes Management: Alle Consul-Operationen erfolgen auf externem Cluster

Funktionsweise ohne Clients

Der Consul Connect Injector arbeitet unabhängig und:

  • Registriert Services direkt bei externen Consul-Servern über HTTPS API
  • Ruft Connect-Zertifikate direkt von Consul-Servern ab
  • Verwaltet Proxy-Konfigurationen ohne lokale Consul-Agents
  • Behandelt Service Discovery über externe Consul API-Aufrufe

Benutzerdefinierte Connect Proxy-Konfiguration

Sie können die Connect Proxy-Konfiguration mit Annotationen anpassen:

1annotations:
2  "consul.hashicorp.com/connect-inject": "true"
3  "consul.hashicorp.com/connect-service": "dynamic-app"
4  "consul.hashicorp.com/connect-service-port": "8080"
5  "consul.hashicorp.com/connect-proxy-cpu-request": "50m"
6  "consul.hashicorp.com/connect-proxy-memory-request": "64Mi"
7  "consul.hashicorp.com/connect-proxy-cpu-limit": "100m"
8  "consul.hashicorp.com/connect-proxy-memory-limit": "128Mi"
9  "consul.hashicorp.com/envoy-extra-args": "--log-level debug"

Health Checks Integration

Consul Connect kann mit Kubernetes Health Checks integriert werden:

1annotations:
2  "consul.hashicorp.com/service-sync": "true"
3  "consul.hashicorp.com/service-port": "8080"
4  "consul.hashicorp.com/connect-service-port": "8080"

Vorteile der Verwendung von Consul Connect mit Vault Agent Injector in Kubernetes

  1. Konsistenter Technologie-Stack: Verwenden Sie das gleiche Consul Connect über Nomad- und Kubernetes-Deployments hinweg
  2. End-to-End-Verschlüsselung: Alle Kommunikation zwischen Services ist mit mTLS verschlüsselt
  3. Zero-Trust-Netzwerk: Services müssen explizit zur Kommunikation über Intentions berechtigt werden
  4. Integriertes Secret-Management: Vault Agent Injector bietet dynamische Secrets ohne Code-Änderungen
  5. Native Kubernetes-Integration: Consul Connect läuft nativ in Kubernetes mit CRD-Unterstützung
  6. Operative Vertrautheit: Gleiche operative Modelle wie bei Nomad-basierten Consul Connect-Deployments

Vergleich: Nomad vs Kubernetes mit Consul Connect

FeatureNomad + Consul ConnectKubernetes + Consul Connect (Client-los)
Service-RegistrierungAutomatisch via NomadDirekte API-Aufrufe an externen Consul
Sidecar-InjectionNative Nomad-IntegrationKubernetes Admission Controller
KonfigurationJob-Spezifikation HCLKubernetes Annotationen
Service DiscoveryConsul DNS/APIExterne Consul API-Aufrufe
Health ChecksNomad + Consul ChecksKubernetes + Externe Consul API
Ressourcen-ManagementNomad SchedulerKubernetes Scheduler
Lokale Consul-AgentsOptional mit ConnectKeine erforderlich (client-los)

Fazit

Die Verwendung von HashiCorp Consul Connect mit Vault Agent Injector in Kubernetes bietet eine vertraute und mächtige Service-Mesh-Lösung, die Konsistenz mit Ihrer bestehenden HashiCorp-Infrastruktur aufrechterhält. Dieser Ansatz ist besonders wertvoll für Organisationen, die bereits Consul Connect mit Nomad verwenden und die gleichen Sicherheitsmuster auf Kubernetes-Workloads ausweiten möchten.

Wichtige Vorteile dieses Ansatzes:

  • Technologie-Konsistenz: Gleiches Consul Connect Service Mesh über Orchestrierungsplattformen hinweg
  • Zero-Trust-Sicherheit: Explizite Service-Kommunikations-Autorisierung über Intentions
  • Umfassendes Secret-Management: Dynamische Secrets von Vault ohne Anwendungsänderungen
  • Operative Vertrautheit: Konsistente Fehlerbehebung und Überwachung über Plattformen hinweg
  • Schrittweise Migration: Service-Mesh-Konsistenz während der Migration von Nomad zu Kubernetes beibehalten
  • Ressourcen-Effizienz: Client-lose Architektur reduziert Kubernetes-Ressourcenverbrauch
  • Vereinfachte Architektur: Direkte Kommunikation mit externem Consul eliminiert lokale Agents

Durch die Nutzung von Consul Connect in Kubernetes können Sie sichere, authentifizierte und verschlüsselte Kommunikation zwischen Ihren Services gewährleisten, während Sie die operativen Muster und das Fachwissen beibehalten, das Ihr Team mit HashiCorps Service-Mesh-Technologie entwickelt hat.

Beginnen Sie noch heute mit der Verbesserung Ihrer Kubernetes-Deployments durch die Integration von Consul Connect mit Vault Agent Injector und behalten Sie das gleiche Niveau an Service-Mesh-Sicherheit und operativer Konsistenz in Ihrer gesamten Infrastruktur bei.

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