Créer un déploiement avec chiffrement TLS sur des VM

Ce document explique comment ajouter le chiffrement TLS à un déploiement Spanner Omni sur des machines virtuelles (VM). Un déploiement avec des fonctionnalités de sécurité réseau utilise le protocole TLS 1.3 (Transport Layer Security) pour chiffrer et authentifier la communication au sein du déploiement et avec ses clients. Spanner Omni fournit un protocole TLS mutuel (mTLS) pour renforcer la sécurité, où les deux parties établissent l'authenticité avant d'échanger des données. Le protocole mTLS est facultatif entre le client et le serveur, mais les serveurs Spanner Omni communiquent entre eux via mTLS.

Avant de commencer

Avant de commencer, assurez-vous que votre environnement répond aux exigences suivantes :

  • Assurez-vous d'avoir accès en SSH à chaque machine du déploiement. Cet accès vous permet de télécharger et d'exécuter le binaire Spanner Omni.

  • Votre réseau doit autoriser la communication TCP sur les ports 15000 à 15030.

  • Chaque machine doit disposer d'un espace de stockage suffisant pour héberger les données gérées par le déploiement.

  • Consultez la page Configuration système requise pour vous assurer que votre configuration répond aux exigences.

  • Si vous exécutez les binaires sur la plate-forme de virtualisation vSphere, désactivez la virtualisation TSC. Pour ce faire, ajoutez le paramètre monitor_control.virtual_rdtsc = FALSE au fichier de configuration .vmx de la machine virtuelle.

Étape 1 : Créer un déploiement sans chiffrement TLS

Suivez les étapes décrites dans Créer un déploiement de VM Spanner Omni sans chiffrement. Vérifiez que le déploiement de votre VM sans chiffrement ni fonctionnalités de sécurité fonctionne correctement. Cette page suppose que vous avez créé un déploiement régional avec trois zones.

Étape 2 : Générer les certificats

Vous devez créer trois ensembles de certificats :

Type de certificat Description
Certificats d'API Les certificats d'API permettent de protéger le serveur d'API Spanner.
Certificats du serveur Les certificats de serveur permettent de protéger la communication entre les serveurs.
Certificats clients Les utilisateurs finaux ou les applications utilisent des certificats client pour établir leur identité et leur fiabilité avec les serveurs Spanner Omni.

Ces certificats sont émis par une autorité de certification. Spanner Omni fournit des outils permettant de créer une autorité de certification et les trois types de certificats. Effectuez les étapes suivantes sur l'une de vos machines.

Vous pouvez créer ces certificats sur votre station de travail à l'aide de la CLI Spanner Omni, puis transférer les fichiers de certificat vers chaque serveur Spanner Omni. Pour en savoir plus, consultez le Guide de démarrage rapide avec la CLI Spanner Omni.

Pour générer des certificats, vous devez effectuer les étapes suivantes :

Créer une autorité de certification (AC)

Cette autorité est l'autorité de certification racine pour tous les certificats client et serveur que vous générerez lors des étapes suivantes.

spanner certificates create-ca --ca-certificate-directory=certs

Le répertoire certs contient le certificat CA. Créez une copie de ce certificat à utiliser comme CA pour les certificats d'API.

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

Le répertoire $HOME/.spanner/private-keys contient la clé privée de l'autorité de certification. Sauvegardez et sécurisez ce répertoire. Un utilisateur ayant accès à la clé privée peut signer des certificats arbitraires auxquels les clients faisant confiance à l'autorité de certification autosignée font confiance. Bien que vous puissiez utiliser la même autorité de certification pour tous les certificats, il est obligatoire que les certificats d'API et les certificats client utilisent la même autorité de certification. Vous pouvez également créer une autre autorité de certification (ou utiliser une autorité de certification externe de confiance) pour les certificats d'API. Assurez-vous d'utiliser la bonne autorité de certification lors des étapes suivantes de création des certificats. Ce document utilise la même autorité de certification pour tous les types de certificats.

Générer des certificats de serveur

Vous générez deux types de certificats de serveur :

Cette configuration permet de gérer ces certificats de manière plus flexible, par exemple en les renouvelant.

Créer le certificat de serveur Spanner

Les serveurs Spanner Omni utilisent des certificats de serveur pour chiffrer la communication entre eux (communication entre serveurs).

Créez le certificat de serveur en exécutant la commande suivante. Remplacez SERVER_LIST par une liste de noms ou de suffixes de serveurs Spanner, séparés par une virgule.

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Cette commande crée deux fichiers, server.crt et server.key, dans le répertoire certs.

Créer le certificat d'API

Les certificats d'API chiffrent la communication des systèmes interagissant avec le déploiement. L'utilisation de certificats distincts pour l'API et la communication entre serveurs vous permet de gérer et de renouveler chaque type indépendamment.

Créez le certificat d'API en exécutant la commande suivante. Remplacez LB_DNS par le DNS de l'équilibreur de charge.

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Cette commande crée deux autres fichiers, api.crt et api.key, dans le répertoire certs. Si nécessaire, vous pouvez utiliser une autorité de certification externe de confiance pour les certificats d'API.

Distribuez les certificats à tous les serveurs.

Copiez le répertoire certs sur tous les autres serveurs du déploiement pour les démarrer avec les fonctionnalités de sécurité réseau.

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

Étape 3 : Générez des certificats client

Vous pouvez utiliser des certificats clients pour authentifier les utilisateurs et les applications dans Spanner. Les certificats client permettent l'authentification mTLS entre le client et le serveur.

Les certificats client doivent être signés par la même autorité de certification que le certificat API et doivent contenir un nom d'utilisateur pour l'autorisation. Cet exemple utilise l'utilisateur admin, qui est l'utilisateur par défaut de chaque base de données. Pour en savoir plus sur les utilisateurs, les rôles et les options d'authentification, consultez Authentification et autorisation dans Spanner Omni.

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Cette commande crée les fichiers client.crt et client.key dans le répertoire clientcerts. Envoyez ces fichiers à n'importe quelle machine qui se connecte aux serveurs du déploiement.

Si vous prévoyez d'utiliser les certificats client avec la bibliothèque cliente Java, vous devez générer la clé de certificat au format PKCS#8. Exécutez la commande suivante :

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

Étape 4 : Démarrer les serveurs

Après avoir généré les certificats et les avoir copiés sur tous les serveurs de votre déploiement, démarrez chaque serveur. Créez un répertoire de base sur chaque serveur pour stocker les données, les métadonnées et les journaux. Si un serveur doit redémarrer, spécifiez le même répertoire pour assurer la continuité.

Déploiement sur un seul serveur

Pour démarrer un déploiement à serveur unique avec chiffrement, créez un fichier de mot de passe pour l'utilisateur admin initial et démarrez le serveur avec vos méthodes d'authentification et certificats compatibles.

  1. Créez le fichier de mot de passe avec des autorisations définies sur 600 afin qu'il ne soit lisible que par son propriétaire :

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

    Le mot de passe doit répondre aux exigences suivantes :

    • Comporter entre 8 et 32 caractères.
    • Au moins un caractère majuscule.
    • Au moins un caractère en minuscule.
    • Au moins un chiffre.
    • Au moins un caractère spécial.
  2. Démarrez le serveur unique avec TLS et l'authentification configurés :

    nohup spanner start-single-server \
        --base-dir=BASE_DIR \
        --certificate-directory=${HOME}/.spanner/certs \
        --auth-methods=password,client-certificate \
        --password-protocol=opaque \
        --initial-admin-password-file=admin_password.txt &
    

    Au démarrage initial, spanner start-single-server définit les méthodes d'authentification et le protocole de mot de passe compatibles, et crée le rôle d'administrateur initial user with theroles/spanner.admin` à l'aide du fichier de mot de passe spécifié.

Pour savoir comment interagir avec votre déploiement, consultez Étape 7 : Interagir avec le déploiement.

Déploiement avec scaling horizontal

Pour les déploiements avec scale-out, démarrez le serveur sur chaque machine. Les valeurs de server-address et zone doivent correspondre à celles de la configuration du déploiement. Le réseau doit résoudre server-address. Les serveurs utilisent server-address pour la communication interne. Exécutez la commande suivante pour démarrer le serveur racine :

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs &

La commande suivante montre un exemple avec des valeurs spécifiques :

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs &

Maintenant que les serveurs s'exécutent sur chaque machine, vous êtes prêt à créer le déploiement.

Étape 5 : Créer un déploiement avec chiffrement TLS

Pour créer le déploiement, procédez comme suit :

  1. Créez un fichier de mot de passe contenant le mot de passe de l'utilisateur admin par défaut, avec des autorisations définies sur 600 (lecture seule par le propriétaire) :

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

    Le mot de passe doit répondre aux exigences suivantes :

    • Comporter entre 8 et 32 caractères.
    • Au moins un caractère majuscule.
    • Au moins un caractère en minuscule.
    • Au moins un chiffre.
    • Au moins un caractère spécial.
  2. Assurez-vous que deployment.yaml inclut les méthodes d'authentification et le protocole de mot de passe que vous avez sélectionnés :

    deployment_settings:
      security_settings:
        authentication_methods:
          - AUTHENTICATION_METHOD_PASSWORD
          - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE
        password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE
    

    Vous pouvez spécifier une ou plusieurs des méthodes d'authentification suivantes :

    • AUTHENTICATION_METHOD_PASSWORD : authentification par mot de passe
    • AUTHENTICATION_METHOD_CLIENT_CERTIFICATE : authentification par certificat client

    Vous pouvez spécifier le protocole de mot de passe suivant :

    • PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE : protocole OPAQUE
  3. Exécutez la commande spanner deployment create à partir de l'un des serveurs racines pour créer le déploiement. Spécifiez le répertoire de base avec l'option --base-dir (en utilisant le même BASE_DIR que celui spécifié lors du démarrage du serveur racine) et fournissez le fichier de mot de passe administrateur avec l'option --admin-password-file :

    spanner deployment create \
        --config-file=deployment.yaml \
        --base-dir=BASE_DIR \
        --admin-password-file=admin_password.txt
    

La console de chaque machine affiche des messages indiquant que le déploiement inclut désormais le chiffrement TLS. Tous les serveurs communiquent entre eux via un canal chiffré.

Étape 6 : (Facultatif) Configurez un équilibreur de charge

Pour gérer et répartir le trafic client entre les serveurs de votre déploiement, configurez un équilibreur de charge. Assurez-vous que la configuration de l'équilibreur de charge pour la vérification de l'état'état utilise HTTPS au lieu de HTTP. Utilisez les informations de configuration suivantes :

Paramètre Valeur
Protocole TCP
Adresse IP du backend Adresses IP de vos serveurs.
Port 15000 (port par défaut). Si vous avez utilisé un autre port dans le flag --server-address, utilisez ce port.)
URL de la vérification d'état https://IP_ADDRESS:15012/healthz
Stratégie d'équilibrage roundrobin (répartit les requêtes de manière séquentielle sur les serveurs)

Étape 7 : Interagissez avec le déploiement

Vous pouvez interagir avec votre déploiement Spanner Omni depuis n'importe quelle VM à l'aide de la CLI Spanner Omni.

Vous devez inclure l'indicateur suivant avec chaque commande pour établir une connexion chiffrée :

  • --ca-certificate-file=certs/ca-api.crt

Si vous avez activé l'authentification mTLS pour les clients, incluez également l'indicateur suivant dans chaque commande :

  • --client-certificate-directory=clientcerts

Pour vous connecter à votre déploiement et interagir avec lui, procédez comme suit :

  1. Se connecter à Spanner Omni

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

    Lorsque vous y êtes invité, saisissez le mot de passe configuré dans admin_password.txt.

    Successfully logged in as "admin"
    
  2. Créer une base de données

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. Ouvrir le shell SQL

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. Créer une table et ajouter des données

    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. Vérifier les données

    Répertoriez les bases de données :

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    Récupérez les données du tableau :

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

Étape 8 : (Facultatif) Mettez à l'échelle le déploiement

Vous pouvez ajouter des serveurs non racine à une zone pour augmenter sa capacité. Pour ce faire, générez le certificat de serveur pour les serveurs non root, comme expliqué dans Étape 2 : Générer les certificats, et démarrez le serveur avec la commande suivante :

spanner start \
    --server-address=NON_ROOT_MACHINE \
    --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
    --zone=us-central1-a \
    --base-dir=./spandir \
    --certificate-directory=${HOME}/.spanner/certs

Étapes suivantes