Multi-Platform Service Mesh: Kubernetes, Nomad, Bare Metal und VMs mit Consul Connect verbinden
Multi-Platform Service Mesh: Kubernetes, Nomad, Bare Metal und VMs mit Consul Connect verbinden Moderne Infrastrukturen erstrecken sich oft über mehrere
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.
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.
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:
vault.example.com:8200
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
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"
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"
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
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
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
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
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"]
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
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:
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.
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