Deployment mit TLS-Verschlüsselung in Kubernetes erstellen

In Spanner Omni wird TLS 1.3 verwendet, um Daten zu verschlüsseln, die zwischen dem Client und dem Server sowie zwischen Spanner Omni-Servern übertragen werden. Spanner Omni bietet mTLS für erweiterte Sicherheitsfunktionen. Dabei stellen beide Parteien die Authentizität der jeweils anderen Partei fest, bevor Daten ausgetauscht werden. Wenn Sie die Verschlüsselung verwenden, müssen Ihre Server über mTLS kommunizieren. Sie können auswählen, ob Ihr Client und Ihr Server auch mTLS verwenden.

Hinweis

Folgende Anforderungen müssen erfüllt sein:

  • Kubernetes-Cluster erstellen Die Konfiguration unterstützt Google Kubernetes Engine (GKE) und Amazon Elastic Kubernetes Service (Amazon EKS). Möglicherweise müssen Sie die Konfiguration anpassen, damit sie in anderen Umgebungen funktioniert.

  • Achten Sie darauf, dass der Kubernetes-Cluster auf das Artifact Registry-Artefakt zugreifen kann, in dem der Spanner Omni-Container gehostet wird.

  • Installieren und konfigurieren Sie das kubectl-Befehlszeilentool und Helm.

  • Wenn Sie die Kubernetes-Umgebung auf Maschinen der vSphere-Virtualisierungsplattform einrichten, deaktivieren Sie die TSC-Virtualisierung (Time Stamp Counter), indem Sie monitor_control.virtual_rdtsc = FALSE in die Konfigurationsdatei .vmx der virtuellen Maschine einfügen. So wird sichergestellt, dass TrueTime richtig funktioniert.

  • Prüfen Sie, ob Ihre Umgebung die Systemanforderungen für Spanner Omni erfüllt.

Schritt 1: Zertifikate generieren

Sie müssen drei Zertifikatsätze erstellen:

  • API-Zertifikate: Diese tragen zum Schutz des Spanner Omni API-Servers bei.

  • Serverzertifikate: Diese schützen die Kommunikation zwischen Servern.

  • Clientzertifikate: Endnutzer oder Anwendungen verwenden diese, um ihre Identität und ihr Vertrauen gegenüber Spanner Omni-Servern zu bestätigen.

Diese Zertifikate werden von einer Zertifizierungsstelle ausgestellt. Spanner Omni bietet Tools zum Erstellen einer selbst signierten Zertifizierungsstelle und aller drei Zertifikatstypen.

Führen Sie die folgenden Schritte auf einem Ihrer Geräte aus. Bei den Schritten wird davon ausgegangen, dass der Namespace spanner-ns ist. Ändern Sie dies in den Namespace, den Sie in Ihrem Deployment verwenden möchten.

Sie können diese Zertifikate auf Ihrer Workstation mit der Spanner Omni CLI erstellen.

1. Zertifizierungsstelle erstellen

Alle Zertifikate werden von einer Zertifizierungsstelle ausgestellt. Ihre Organisation hat möglicherweise eine zentrale Zertifizierungsstelle oder Sie können eine öffentliche Zertifizierungsstelle verwenden. Sie können zwar dieselbe Zertifizierungsstelle für alle Zertifikate verwenden, aber API-Zertifikate und Clientzertifikate müssen dieselbe Zertifizierungsstelle verwenden.

Mit Spanner Omni können Sie eine private Zertifizierungsstelle erstellen.

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

Mit dem Befehl create-ca wird das CA-Zertifikat im Verzeichnis certs generiert. Sie können dieses Zertifikat entweder kopieren und als CA für API-Zertifikate verwenden oder eine andere CA erstellen. Achten Sie darauf, dass Sie beim Erstellen von Zertifikaten die richtige Zertifizierungsstelle verwenden.

cp certs/ca.crt certs/ca-api.crt

Das Verzeichnis $HOME/.spanner/private-keys enthält den privaten Schlüssel für die Zertifizierungsstelle. Es ist wichtig, dieses Verzeichnis zu sichern. Nutzer mit Zugriff auf den privaten Schlüssel können beliebige Zertifikate signieren, denen Clients vertrauen, die der selbstsignierten Zertifizierungsstelle vertrauen. Optional können Sie eine zusätzliche Zertifizierungsstelle erstellen oder eine extern vertrauenswürdige Zertifizierungsstelle für die API-Zertifikate verwenden. In diesem Dokument wird dieselbe Zertifizierungsstelle für alle Arten von Zertifikaten verwendet.

2. Serverzertifikate generieren

Sie müssen zwei Arten von Serverzertifikaten generieren:

  • API-Zertifikat: Verwenden Sie dieses Zertifikat, um die Kommunikation von Systemen zu verschlüsseln, die mit dem Deployment interagieren.

  • Spanner-Serverzertifikat: Spanner Omni-Server verwenden dieses Zertifikat, um die Kommunikation untereinander zu verschlüsseln.

Diese Konfiguration bietet Flexibilität bei der Verwaltung dieser Zertifikate. Damit können Sie beispielsweise die Zertifikatsrotation verwenden.

Spanner-Serverzertifikat erstellen

Führen Sie den folgenden Befehl aus, um das Serverzertifikat zu erstellen:

# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Mit diesem Befehl werden server.crt und server.key im Verzeichnis certs erstellt.

API-Zertifikat erstellen

Führen Sie den folgenden Befehl aus, um das API-Zertifikat zu erstellen:

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

Mit diesem Befehl werden api.crt und api.key im Verzeichnis certs erstellt. Verwenden Sie bei Bedarf eine extern vertrauenswürdige Zertifizierungsstelle für die API-Zertifikate.

3. Clientzertifikate generieren

Sie können Clientzertifikate verwenden, um Nutzer und Anwendungen zu authentifizieren. Clientzertifikate ermöglichen mTLS zwischen dem Client und dem Server. Wenn Sie mTLS nicht verwenden möchten, können Sie diesen Schritt überspringen.

Die Clientzertifikate müssen von derselben CA signiert werden, die auch das API-Zertifikat signiert. Außerdem müssen sie zur Autorisierung einen Nutzernamen enthalten. Verwenden Sie für dieses Beispiel den Nutzer admin, der der Standardnutzer für jede neue Datenbank ist. Weitere Informationen finden Sie unter Authentifizierung und Autorisierung in Spanner Omni.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Mit diesem Befehl werden client.crt und client.key im Verzeichnis clientcerts erstellt. Senden Sie diese Dateien an alle Computer, die eine Verbindung zum Deployment herstellen.

Wenn Sie Clientzertifikate mit der Java-Clientbibliothek verwenden möchten, müssen Sie den Zertifikatschlüssel im PKCS#8-Format generieren. Verwenden Sie den folgenden Befehl:

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

Schritt 2: Zertifikate und Administratorpasswort in den Kubernetes-Cluster übertragen

Führen Sie die folgenden Befehle aus, um den Namespace zu erstellen und die Zertifikate und das Administratorpasswort in Ihren Kubernetes-Cluster zu übertragen:

  1. Erstellen Sie den Namespace:

    kubectl create namespace NAMESPACE
    
  2. TLS-Zertifikate in ein Secret übertragen:

    kubectl create secret generic tls-certs \
      --from-file=ca.crt="certs/ca.crt" \
      --from-file=ca-api.crt="certs/ca-api.crt" \
      --from-file=server.crt="certs/server.crt" \
      --from-file=server.key="certs/server.key" \
      --from-file=api.crt="certs/api.crt" \
      --from-file=api.key="certs/api.key" \
      -n NAMESPACE
    
  3. Erstellen Sie eine Passwortdatei mit dem Passwort für den Standardnutzer admin mit eingeschränkten Berechtigungen (nur für den Inhaber lesbar, Berechtigungen 600):

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    Das Passwort muss die folgenden Anforderungen erfüllen:

    • Es muss zwischen 8 und 32 Zeichen lang sein.
    • Mindestens ein Großbuchstabe.
    • Mindestens ein Kleinbuchstabe.
    • Mindestens eine Zahl.
    • Mindestens ein Sonderzeichen.
  4. Erstellen Sie ein Secret für das Administratorpasswort:

    kubectl create secret generic spanner-admin-password \
      --from-file=password=admin_password.txt \
      -n NAMESPACE
    

Schritt 3: Bereitstellung mit TLS-Verschlüsselung erstellen

So erstellen Sie Ihr Deployment mit TLS-Verschlüsselung:

1. Helm-Konfiguration vorbereiten

Erstellen Sie eine Helm-Diagrammkonfiguration und erstellen Sie die Bereitstellungskonfiguration für Ihre Umgebung.

Wenn Sie TLS aktivieren und das Administratorpasswort konfigurieren möchten, legen Sie die folgenden Werte in der Konfiguration Ihres Helm-Diagramms fest:

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true
  # Name of the secret containing the administrator password
  adminPasswordSecret: spanner-admin-password

2. Bereitstellung erstellen

Führen Sie den folgenden Befehl aus, um das Deployment zu erstellen:

kubectl create ns monitoring

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
  --version VERSION \
  --set global.platform=gke \
  --set global.insecureMode=false \
  --set deployment.enableClientCertificateAuthentication=true \
  --set deployment.adminPasswordSecret=spanner-admin-password \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

Mit dem Befehl wird ein Bootstrap-Job ausgelöst. Sie können den Fortschritt anhand der Logs dieses Jobs verfolgen:

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

Die Ausgabe gibt den Fortschritt an. Wenn der Vorgang abgeschlossen ist, wird die Meldung „Bereitstellung erfolgreich erstellt“ angezeigt.

3. Status der Pods prüfen

Führen Sie den folgenden Befehl aus, um den Pod-Status zu prüfen:

kubectl get pods --watch --namespace NAMESPACE

Alle Pods haben den Status READY.

4. Zertifikat und Bereitstellung mit Load-Balancer-Details aktualisieren

Dieser Schritt ist erforderlich, wenn Clients von außerhalb des Kubernetes-Clusters eine Verbindung herstellen sollen.

# Get the service details
kubectl get service spanner -n NAMESPACE

# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update \
    --certificate-file=certs/api.crt \
    --certificate-key-file=certs/api.key \
    --hostnames=${OMNI_ENDPOINT} \
    --ca-certificate-directory=certs

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

Schritt 4: Mit Spanner Omni interagieren

Sie können von jeder VM aus über die Spanner Omni-Befehlszeile mit Ihrer Spanner Omni-Bereitstellung interagieren.

Wenn Sie mTLS für Clients aktiviert haben, verwenden Sie die folgenden Flags mit jedem Befehl:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. In Spanner Omni anmelden (optional)

Melden Sie sich in Spanner Omni an (dieser Schritt ist optional, wenn Sie Clientzertifikate verwenden):

./google/spanner/bin/spanner auth login admin \
    --ca-certificate-file=certs/ca-api.crt \
    --deployment-endpoint=DEPLOYMENT_ENDPOINT

Geben Sie bei entsprechender Aufforderung das in admin_password.txt konfigurierte Passwort ein.

Successfully logged in as "admin"

2. Datenbank erstellen

Führen Sie den folgenden Befehl aus, um eine Datenbank zu erstellen:

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. SQL-Shell öffnen

Führen Sie den folgenden Befehl aus, um die Shell zu öffnen:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

4. Tabelle erstellen und Daten hinzufügen

Führen Sie die folgenden SQL-Befehle aus:

spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)

spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)

5. Deployment prüfen

Führen Sie den folgenden Befehl aus, um die Datenbanken aufzulisten:

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Die Ausgabe sieht dann ungefähr so aus:

NAME STATUS VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME BEREIT 1 Std. 2025-02-07T12:25:30Z falsch

Führen Sie den folgenden Befehl aus, um die Daten abzufragen:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Führen Sie die folgenden SQL-Befehle aus:

SHOW TABLES;
SELECT * FROM names;

Alternativ können Sie der Anleitung unter PGAdapter mit Spanner Omni verwenden folgen, um PGAdapter zu konfigurieren und mit Tools wie psql zu interagieren.

Schritt 5: Bereitstellung überwachen

Wenn Sie Spanner Omni mit monitoring.enabled=true installiert haben, werden Messwerte von Prometheus erfasst. Sie können Grafana verwenden, um diese Messwerte zu visualisieren.

1. Dienstdetails abrufen

Führen Sie die folgenden Befehle aus, um die Dienstdetails abzurufen:

# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring

# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring

Nächste Schritte