Ce document explique comment ajouter le chiffrement TLS à un déploiement Spanner Omni sur des machines virtuelles (VM). Un déploiement doté de fonctionnalités de sécurité réseau utilise le protocole TLS (Transport Layer Security) 1.3 pour chiffrer et authentifier les communications au sein du déploiement et avec ses clients. Spanner Omni fournit le protocole TLS mutuel (mTLS) pour une sécurité renforcée, où les deux parties établissent l'authenticité avant d'échanger des données. 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 de disposer d'un accès 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 les communications 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 = FALSEau fichier de configuration.vmxde la machine virtuelle.
Étape 1 : Créer un déploiement sans chiffrement TLS
Suivez les étapes de la section Créer un déploiement de VM Spanner Omni sans chiffrement. Vérifiez que le déploiement de votre VM sans fonctionnalités de chiffrement et 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 de l'API Spanner. |
| Certificats du serveur | Les certificats de serveur permettent de protéger les communications entre serveurs. |
| Certificats clients | Les utilisateurs finaux ou les applications utilisent des certificats client pour établir leur identité et leur confiance avec les serveurs Spanner Omni. |
Une autorité de certification (CA) émet ces certificats. 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 poste 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 des autorités de certification
- Générer des certificats de serveur
- Générer des certificats client
Créer des autorités de certification
Vous devez créer deux autorités de certification (CA) distinctes pour isoler la communication interne entre les serveurs de la communication externe avec les clients et l'API :
- Autorité de certification de serveur interne (
ca.crt) : émet des certificats de serveur (server.crt) utilisés exclusivement pour la communication mTLS interne entre les serveurs Spanner Omni. - Autorité de certification de l'API et du client (
ca-api.crt) : émet le certificat du serveur d'API (api.crt) et les certificats mTLS du client (client.crt). Vous pouvez également utiliser une autorité de certification externe de confiance pour les certificats de l'API et du client.
Créez l'autorité de certification du serveur interne pour la communication entre les serveurs :
spanner certificates create-ca --ca-certificate-directory=certsCette commande crée le certificat CA du serveur interne (
certs/ca.crt) et écrit sa clé privée dans$HOME/.spanner/private-keys/ca.key.Créez une autorité de certification distincte pour les certificats d'API et de client, puis copiez son certificat CA dans
certs/ca-api.crt:spanner certificates create-ca \ --ca-certificate-directory=api-certs \ --ca-private-key-directory=$HOME/.spanner/api-private-keys cp api-certs/ca.crt certs/ca-api.crtCes commandes créent le certificat CA de l'API et du client (
api-certs/ca.crt, copié danscerts/ca-api.crt) et écrivent sa clé privée dans$HOME/.spanner/api-private-keys/ca.key.
Sauvegardez et sécurisez $HOME/.spanner/private-keys et $HOME/.spanner/api-private-keys. Un utilisateur ayant accès à ces clés privées peut signer des certificats arbitraires auxquels le déploiement fait confiance.
Générer des certificats de serveur
Vous générez deux types de certificats de serveur :
Certificat de serveur Spanner : chiffre les communications entre les serveurs Spanner Omni.
Certificat d'API : chiffre les communications des systèmes qui interagissent avec le déploiement.
Cette configuration permet une gestion plus flexible de ces certificats, comme une rotation des certificats.
Créer le certificat de serveur Spanner
Les serveurs Spanner Omni utilisent des certificats de serveur pour chiffrer les communications entre eux (communication interserveur).
Créez le certificat de serveur :
SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
Remplacez SERVER_LIST par une liste de noms de serveurs ou de suffixes Spanner, séparés par une virgule.
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 les communications des systèmes qui interagissent avec le déploiement. L'utilisation de certificats et d'autorités de certification distincts pour l'API et la communication inter-serveurs vous permet d'isoler les domaines de confiance et d'effectuer une rotation indépendante de chaque type.
Créez le certificat d'API à l'aide de l'autorité de certification de l'API :
SERVER_NAMES=LB_DNS
spanner certificates create-server \
--filename-prefix=api \
--hostnames=${SERVER_NAMES} \
--ca-certificate-directory=api-certs \
--ca-private-key-directory=$HOME/.spanner/api-private-keys \
--output-directory=certs
Remplacez LB_DNS par le nom d'hôte DNS de l'équilibreur de charge.
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 clients permettent d'utiliser mTLS entre le client et le serveur.
Signez les certificats client avec l'API et l'autorité de certification client (api-certs/ca.crt, qui correspond à certs/ca-api.crt) et incluez un nom d'utilisateur pour l'autorisation. Ne signez pas les certificats client avec l'autorité de certification du serveur interne (certs/ca.crt). 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.
Créez le certificat client :
USERNAME=admin
spanner certificates create-client $USERNAME \
--output-directory=clientcerts \
--ca-certificate-directory=api-certs \
--ca-private-key-directory=$HOME/.spanner/api-private-keys
Cette commande crée les fichiers client.crt et client.key dans le répertoire clientcerts. Envoyez ces fichiers à toutes les machines qui se connectent aux serveurs du déploiement.
Si vous prévoyez d'utiliser les certificats clients 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=api-certs \
--ca-private-key-directory=$HOME/.spanner/api-private-keys \
--generate-pkcs8-key
Étape 4 : Générez la collection de clés du wrapper
Spanner Omni utilise un ensemble de clés de chiffrement de clé (KEK) pour chiffrer les clés internes, telles que les clés de chiffrement et de signature de jetons.
Les serveurs Spanner Omni lisent cet ensemble de clés à partir de BASE_DIR/kms/wrapper_key.
Pour générer un nouveau fichier de jeu de clés de wrapper à l'aide de spanner keys create-keyset, exécutez la commande suivante :
spanner keys create-keyset --output-file=kms/wrapper_key
Par défaut, spanner keys create-keyset génère une clé AES256_GCM. Pour générer un autre type de clé, utilisez l'option --key-template avec l'une des valeurs de type de clé suivantes : AES256_GCM, AES128_GCM, AES256_GCM_RAW, CHACHA20_POLY1305 ou XCHACHA20_POLY1305.
Distribuer l'ensemble de clés du wrapper à tous les serveurs
Copiez le répertoire kms dans le répertoire de base de tous les serveurs du déploiement avant de les démarrer :
scp -r kms REMOTE_HOST:BASE_DIR/kms
Étape 5 : Démarrez les serveurs
Pour démarrer les serveurs de votre déploiement, procédez comme suit :
- Vérifiez que vous avez généré les certificats et l'ensemble de clés de wrapper, et que vous les avez copiés sur tous les serveurs de votre déploiement.
- 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 de base pour assurer la continuité.
- Démarrez chaque serveur en suivant les instructions correspondant à votre type de déploiement dans les sections suivantes.
Déploiement sur un seul serveur
Pour démarrer un déploiement sur un seul serveur 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.
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.txtLe 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.
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 &Lors du démarrage initial,
spanner start-single-serverdéfinit les méthodes d'authentification et le protocole de mot de passe compatibles, puis crée l'utilisateuradmininitial avec le rôleroles/spanner.adminà l'aide du fichier de mot de passe spécifié.
Pour en savoir plus sur l'interaction avec votre déploiement, consultez Étape 8 : Interagir avec le déploiement.
Déploiement avec scaling horizontal
Pour les déploiements avec scaling horizontal, démarrez le serveur sur chaque machine. Les valeurs de server-address et zone doivent correspondre aux valeurs de la configuration de 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 &
Les serveurs étant désormais exécutés sur chaque machine, vous êtes prêt à créer le déploiement.
Étape 6 : Créer un déploiement avec chiffrement TLS
Pour créer le déploiement, procédez comme suit :
Créez un fichier de mot de passe contenant le mot de passe de l'utilisateur
adminpar défaut, avec ses autorisations définies sur 600 (lisible uniquement par son propriétaire) :printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txtLe 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.
Assurez-vous que
deployment.yamlinclut 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_OPAQUEVous pouvez spécifier une ou plusieurs des méthodes d'authentification suivantes :
AUTHENTICATION_METHOD_PASSWORD: authentification par mot de passeAUTHENTICATION_METHOD_CLIENT_CERTIFICATE: authentification par certificat client
Vous pouvez spécifier le protocole de mot de passe suivant :
PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: protocole OPAQUE
Exécutez la commande
spanner deployment createà partir de l'un des serveurs racine 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 7 : (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 l'option --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 entre les serveurs) |
Étape 8 : Interagir 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'option suivante avec chaque commande pour établir une connexion chiffrée :
--ca-certificate-file=certs/ca-api.crt
Si vous avez activé mTLS pour les clients, incluez également l'option suivante avec chaque commande :
--client-certificate-directory=clientcerts
Pour vous connecter et interagir avec votre déploiement, procédez comme suit :
Se connecter à Spanner Omni
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINTLorsque vous y êtes invité, saisissez le mot de passe configuré dans
admin_password.txt.Successfully logged in as "admin"Créer une base de données
spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crtCreating database...done.Ouvrir le shell SQL
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner>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)Vérifier les données
Répertoriez les bases de données :
spanner databases list --ca-certificate-file=certs/ca-api.crtNAME STATE VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME KMS_KEY_NAME ENABLE_DROP_PROTECTION mydb READY 1h 2025-02-07T12:25:30Z falseRécupérez les données de la table :
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. 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 9 : (Facultatif) Effectuez un scaling du déploiement
Vous pouvez ajouter des serveurs non racine à une zone pour augmenter sa capacité. Pour ajouter un serveur non racine, procédez comme suit :
Générez un certificat de serveur pour le serveur non racine et copiez-y les certificats. Pour en savoir plus, consultez Étape 2 : Générer les certificats.
Copiez l'ensemble de clés du wrapper sur le serveur non racine. Pour en savoir plus, consultez l'Étape 4 : Générer l'ensemble de clés de wrapper.
Démarrez le serveur non racine :
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
- Utilisez des bibliothèques clientes et des pilotes JDBC pour connecter votre application au déploiement.
- Gérer les utilisateurs et les rôles