Cette page explique comment appliquer le chiffrement SSL/TLS pour une instance afin de vous assurer que toutes les connexions sont chiffrées. Vous pouvez également en savoir plus sur la façon dont Cloud SQL utilise des certificats SSL/TLS autogérés pour se connecter en toute sécurité aux instances Cloud SQL.
Présentation
Cloud SQL crée automatiquement un certificat de serveur lors de la création d'une instance. Nous vous recommandons d'appliquer toutes les connexions afin qu'elles utilisent le chiffrement SSL/TLS.
Pour valider l'identité du client/serveur à l'aide de certificats SSL/TLS, vous devez créer un certificat client et télécharger les certificats sur la machine hôte du client MySQL. Lorsque vous appliquez le protocole SSL pour une instance, celle-ci nécessite un redémarrage. Un redémarrage peut également être nécessaire après avoir modifié les certificats SSL/TLS. Lorsqu'un redémarrage est nécessaire, Cloud SQL le redémarre automatiquement pour vous. Le redémarrage d'une instance peut entraîner un temps d'arrêt.Appliquer le chiffrement SSL/TLS
Vous pouvez utiliser le paramètre Mode SSL pour appliquer le chiffrement SSL des manières suivantes :
Autoriser à la fois les connexions non-SSL/non-TLS et SSL/TLS. Le certificat client n'est pas validé pour les connexions SSL/TLS. Il s'agit de l'option par défaut.
Autoriser uniquement les connexions chiffrées avec SSL/TLS. Le certificat client n'est pas validé pour les connexions SSL.
- Autoriser uniquement les connexions chiffrées avec SSL/TLS et avec des certificats clients valides.
Si vous sélectionnez Autoriser les connexions non-SSL/non-TLS et SSL/TLS pour votre instance Cloud SQL, les connexions SSL/TLS, ainsi que les connexions non chiffrées et non sécurisées, sont acceptées. Si vous n'exigez pas SSL/TLS pour toutes les connexions, les connexions non chiffrées sont toujours autorisées. Par conséquent, si vous accédez à votre instance à l'aide d'une adresse IP publique, nous vous recommandons vivement d'appliquer le protocole SSL à toutes les connexions.
Vous pouvez vous connecter directement aux instances à l'aide de certificats SSL/TLS, ou vous pouvez vous connecter à l'aide du proxy d'authentification Cloud SQL ou des connecteurs Cloud SQL. Si vous vous connectez à l'aide du proxy d'authentification Cloud SQL ou de connecteurs Cloud SQL, les connexions sont automatiquement chiffrées avec SSL/TLS. Avec le proxy d'authentification Cloud SQL et les connecteurs Cloud SQL, les identités client et serveur sont également validées automatiquement, quel que soit le paramètre de mode SSL.
Pour activer l'exigence SSL/TLS, procédez comme suit :
Console
-
Dans la console Google Cloud, accédez à la page Instances Cloud SQL.
- Pour ouvrir la page Présentation d'une instance, cliquez sur son nom.
- Dans le menu de navigation SQL, sélectionnez Connexions.
- Cliquez sur l'onglet Sécurité.
- Sélectionnez l'une des options suivantes :
- Autoriser le trafic réseau non chiffré (non recommandé)
- Autoriser uniquement les connexions SSL. Cette option n'autorise que les connexions utilisant le chiffrement SSL/TLS. Les certificats ne sont pas validés.
- Exiger des certificats client de confiance. Cette option n'autorise que les connexions provenant de clients utilisant un certificat client valide et qui sont chiffrés par SSL.
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
Remplacez SSL_ENFORCEMENT_MODE par l'un des éléments suivants :
ALLOW_UNENCRYPTED_AND_ENCRYPTED
autorise les connexions non-SSL/non-TLS et SSL/TLS. Pour les connexions SSL, le certificat client n'est pas validé. Il s'agit de la valeur par défaut.ENCRYPTED_ONLY
autorise uniquement les connexions chiffrées avec SSL/TLS. Le certificat client n'est pas validé pour les connexions SSL.TRUSTED_CLIENT_CERTIFICATE_REQUIRED
autorise uniquement les connexions chiffrées avec SSL/TLS et avec les certificats clients valides. Pour en savoir plus, consultez la page Paramètres de Cloud SQL pour MySQL
Terraform
Pour appliquer le chiffrement SSL/TLS, utilisez une ressource Terraform :
Appliquer les modifications
Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.
Préparer Cloud Shell
- Lancez Cloud Shell.
-
Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.
Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.
Préparer le répertoire
Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).
-
Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension
.tf
, par exemplemain.tf
. Dans ce tutoriel, le fichier est appelémain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.
Copiez l'exemple de code dans le fichier
main.tf
que vous venez de créer.Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.
- Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
- Enregistrez les modifications.
-
Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
terraform init
Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option
-upgrade
:terraform init -upgrade
Appliquer les modifications
-
Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
terraform plan
Corrigez les modifications de la configuration si nécessaire.
-
Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant
yes
lorsque vous y êtes invité :terraform apply
Attendez que Terraform affiche le message "Apply completed!" (Application terminée).
- Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.
Supprimer les modifications
Pour supprimer vos modifications, procédez comme suit :
- Pour désactiver la protection contre la suppression, définissez l'argument
deletion_protection
surfalse
dans le fichier de configuration Terraform.deletion_protection = "false"
- Appliquez la configuration Terraform mise à jour en exécutant la commande suivante et en saisissant
yes
lorsque vous y êtes invité :terraform apply
-
Supprimez les ressources précédemment appliquées à votre configuration Terraform en exécutant la commande suivante et en saisissant
yes
à la requête :terraform destroy
REST v1
-
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
- PROJECT_ID : ID du projet.
- SSL_ENFORCEMENT_MODE : utilisez l'une des options suivantes :
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: autorise les connexions non-SSL/non-TLS et SSL/TLS. Pour les connexions SSL, le certificat client n'est pas vérifié. Il s'agit de la valeur par défaut.ENCRYPTED_ONLY
: autorise uniquement les connexions chiffrées avec SSL/TLS.TRUSTED_CLIENT_CERTIFICATE_REQUIRED
: autorise uniquement les connexions chiffrées avec SSL/TLS et avec les certificats clients valides.
- INSTANCE_ID : ID de l'instance.
Méthode HTTP et URL :
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
Corps JSON de la requête :
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
REST v1beta4
-
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
- PROJECT_ID : ID du projet.
- SSL_ENFORCEMENT_MODE : utilisez l'une des options suivantes :
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: autorise les connexions non-SSL/non-TLS et SSL/TLS. Pour les connexions SSL, le certificat client n'est pas vérifié. Il s'agit de la valeur par défaut.ENCRYPTED_ONLY
: autorise uniquement les connexions chiffrées avec SSL/TLS.TRUSTED_CLIENT_CERTIFICATE_REQUIRED
: autorise uniquement les connexions chiffrées avec SSL/TLS et avec les certificats clients valides.
- INSTANCE_ID : ID de l'instance.
Méthode HTTP et URL :
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
Corps JSON de la requête :
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
Certificats du serveur
Cloud SQL crée automatiquement un certificat de serveur lors de la création d'une instance. Tant que celui-ci est valide, vous n'avez pas besoin de gérer activement le certificat du serveur. Cloud SQL vous permet de choisir entre deux hiérarchies d'autorités de certification (CA) différentes. La hiérarchie d'autorité de certification que vous sélectionnez devient le mode d'autorité de certification du serveur de l'instance. Si vous utilisez une autorité de certification par instance comme mode d'autorité de certification de serveur pour votre instance, les certificats de serveur ont une date d'expiration de 10 ans. Si vous utilisez une autorité de certification partagée comme mode d'autorité de certification du serveur de votre instance (Preview), le certificat du serveur expirera dans un an. Après la date d'expiration, le certificat du serveur n'est plus valide et les clients ne peuvent plus établir de connexion sécurisée avec votre instance à l'aide de ce certificat. Si un client est configuré pour vérifier l'autorité de certification ou le nom d'hôte dans le certificat du serveur, ses connexions aux instances Cloud SQL dont les certificats de serveur ont expiré échoueront. Pour éviter toute interruption des connexions client, effectuez une rotation du certificat de serveur avant son expiration. Vous êtes régulièrement informé que le certificat du serveur approche de la date d'expiration. Les notifications sont envoyées les nombres de jours suivants avant la date d'expiration: 90, 30, 10, 2 et 1.
Vous pouvez obtenir des informations sur votre certificat de serveur, telles que sa date de création et d'expiration. Avant la date d'expiration, vous pouvez en créer une manuellement.
Console
-
Dans la console Google Cloud, accédez à la page Instances Cloud SQL.
- Pour ouvrir la page Présentation d'une instance, cliquez sur son nom.
- Dans le menu de navigation SQL, sélectionnez Connexions.
- Cliquez sur l'onglet Sécurité.
- Accédez à la section Gérer les certificats de serveur.
Vous pouvez consulter la date d'expiration de votre certificat de serveur dans le tableau.
gcloud
Pour les instances qui utilisent des certificats serveur autosignés (autorité de certification par instance):
- Pour obtenir des informations sur le certificat du serveur, exécutez la commande sql ssl server-ca-certs list:
gcloud sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- Pour créer un certificat de serveur, exécutez la commande sql ssl server-ca-certs create:
gcloud sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- Téléchargez les informations de certificat sous la forme d'un fichier PEM local :
gcloud sql ssl server-ca-certs list \ --format="value(cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- Mettez à jour l'ensemble de vos clients pour qu'ils utilisent les nouvelles informations. Pour cela, copiez le fichier téléchargé vers vos machines hôtes clientes afin de remplacer les fichiers
server-ca.pem
existants.
Pour les instances qui utilisent des certificats de serveur délivrés par une autorité de certification partagée (Preview):
- Pour obtenir des informations sur le certificat du serveur, exécutez la commande beta sql ssl server-certs list:
gcloud beta sql ssl server-certs list \ --instance=INSTANCE_NAME
- Pour créer un certificat de serveur, utilisez la commande beta sql ssl server-certs create:
gcloud beta sql ssl server-certs create \ --instance=INSTANCE_NAME
- Téléchargez les informations de certificat sous la forme d'un fichier PEM local :
gcloud beta sql ssl server-certs list \ --format="value(ca_cert.cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- Mettez à jour l'ensemble de vos clients pour qu'ils utilisent les nouvelles informations. Pour cela, copiez le fichier téléchargé vers vos machines hôtes clientes afin de remplacer les fichiers
server-ca.pem
existants.
Terraform
Pour fournir des informations de certificat de serveur en tant que sortie, utilisez une source de données Terraform :
- Ajoutez le code suivant à votre fichier de configuration Terraform :
data "google_sql_ca_certs" "ca_certs" { instance = google_sql_database_instance.default.name } locals { furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0] latest_ca_cert = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time] } output "db_latest_ca_cert" { description = "Latest CA certificate used by the primary database server" value = local.latest_ca_cert sensitive = true }
- Pour créer le fichier
server-ca.pem
, exécutez la commande suivante :terraform output db_latest_ca_cert > server-ca.pem
Certificats clients
Créer un certificat client
Vous pouvez créer jusqu'à 10 certificats clients pour chaque instance. Pour créer des certificats clients, vous devez disposer du rôle IAM Cloud SQL Admin
.
Voici quelques points importants à connaître sur les certificats clients :
- Si vous perdez la clé privée d'un certificat, vous devez en créer un nouveau. La clé privée ne peut pas être récupérée.
- Par défaut, le certificat client a une date d'expiration de 10 ans.
- Vous n'êtes pas averti de l'expiration des certificats client.
- Pour créer un certificat SSL, votre instance Cloud SQL doit être opérationnelle.
Console
-
Dans la console Google Cloud, accédez à la page Instances Cloud SQL.
- Pour ouvrir la page Présentation d'une instance, cliquez sur son nom.
- Dans le menu de navigation SQL, sélectionnez Connexions.
- Cliquez sur l'onglet Sécurité.
- Cliquez sur Créer un certificat client.
- Dans la boîte de dialogue Créer un certificat client, ajoutez un nom unique.
- Cliquez sur Créer.
- Dans la première section de la boîte de dialogue Nouveau certificat SSL créé, cliquez sur Télécharger client-key.pem pour télécharger la clé privée dans un fichier nommé
client-key.pem
. - Dans la deuxième section, cliquez sur Télécharger client-cert.pem pour télécharger le certificat client dans un fichier nommé
client-cert.pem
. - Dans la troisième section, cliquez sur Télécharger server-ca.pem pour télécharger le certificat de serveur dans un fichier nommé
server-ca.pem
. - Cliquez sur Fermer.
gcloud
Créez un certificat client à l'aide de la commande
ssl client-certs create
:gcloud sql ssl client-certs create CERT_NAME client-key.pem \ --instance=INSTANCE_NAME
Récupérez la clé publique du certificat que vous venez de créer, puis copiez-la dans le fichier
client-cert.pem
à l'aide de la commandessl client-certs describe
:gcloud sql ssl client-certs describe CERT_NAME \ --instance=INSTANCE_NAME \ --format="value(cert)" > client-cert.pem
Copiez ensuite le certificat de serveur dans le fichier
server-ca.pem
à l'aide de la commandeinstances describe
:gcloud sql instances describe INSTANCE_NAME \ --format="value(serverCaCert.cert)" > server-ca.pem
Terraform
Pour créer un certificat client, utilisez une ressource Terraform :
REST v1
Créez un certificat SSL/TLS en lui attribuant un nom unique pour cette instance :
Avant d'utiliser les données de requête, effectuez les remplacements suivants :
- project-id : ID du projet
- instance-id : ID de l'instance
- client-cert-name : nom du certificat client
Méthode HTTP et URL :
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/sslCerts
Corps JSON de la requête :
{ "commonName" : "client-cert-name" }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
- À partir de la réponse obtenue, copiez tout le contenu du certificat entre guillemets (sans inclure les guillemets) dans des fichiers locaux, comme suit :
- Copiez
serverCaCert.cert
dansserver-ca.pem
. - Copiez
clientCert.cert
dansclient-cert.pem
. - Copiez
certPrivateKey
dansclient-key.pem
.
- Copiez
-
Avant d'utiliser les données de requête, effectuez les remplacements suivants :
- project-id : ID du projet
- instance-id : ID de l'instance
- activation-policy : la règle d'activation peut être définie sur ALWAYS ou NEVER.
Méthode HTTP et URL :
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/restart
Corps JSON de la requête :
{ "settings": { "activationPolicy": "activation-policy" } }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-20T21:30:35.667Z", "operationType": "RESTART", "name": "operation-id", "targetId": "instance-id", "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id", "targetProject": "project-id" }
REST v1beta4
Créez un certificat SSL/TLS en lui attribuant un nom unique pour cette instance :
Avant d'utiliser les données de requête, effectuez les remplacements suivants :
- project-id : ID du projet
- instance-id : ID de l'instance
- client-cert-name : nom du certificat client
Méthode HTTP et URL :
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/sslCerts
Corps JSON de la requête :
{ "commonName" : "client-cert-name" }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
- À partir de la réponse obtenue, copiez tout le contenu du certificat entre guillemets (sans inclure les guillemets) dans des fichiers locaux, comme suit :
- Copiez
serverCaCert.cert
dansserver-ca.pem
. - Copiez
clientCert.cert
dansclient-cert.pem
. - Copiez
certPrivateKey
dansclient-key.pem
.
- Copiez
-
Avant d'utiliser les données de requête, effectuez les remplacements suivants :
- project-id : ID du projet
- instance-id : ID de l'instance
- activation-policy : la règle d'activation peut être définie sur ALWAYS ou NEVER.
Méthode HTTP et URL :
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/restart
Corps JSON de la requête :
{ "settings": { "activationPolicy": "activation-policy" } }
Pour envoyer votre requête, développez l'une des options suivantes :
Vous devriez recevoir une réponse JSON de ce type :
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-20T21:30:35.667Z", "operationType": "RESTART", "name": "operation-id", "targetId": "instance-id", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id", "targetProject": "project-id" }
À ce stade, vous avez :
- un certificat de serveur enregistré sous
server-ca.pem
; - un certificat de clé publique client enregistré sous
client-cert.pem
; - une clé privée client enregistrée sous
client-key.pem
.
Selon l'outil que vous utilisez pour vous connecter, ces trois éléments sont spécifiés de différentes manières. Par exemple, lors de la connexion via un client MySQL, ces trois fichiers correspondent respectivement aux valeurs des options de commande --ssl-ca
, --ssl-cert
et --ssl-key
. Pour un exemple de connexion utilisant un client MySQL et SSL/TLS, consultez la section
Se connecter avec le client MySQL.
À propos de la validation de l'identité des serveurs
La validation de l'identité du serveur dépend de la configuration de la hiérarchie de l'autorité de certification (CA) du serveur de votre instance Cloud SQL.
Si votre instance est configurée pour utiliser l'autorité de certification par instance, la vérification de l'autorité de certification permet également de vérifier l'identité du serveur, car chaque instance dispose d'une autorité de certification unique.
Si votre instance est configurée pour utiliser l'autorité de certification partagée (Preview), vous devez vérifier le nom d'hôte et l'autorité de certification pour valider l'identité du serveur, car les autorités de certification du serveur sont partagées entre les instances.
Si vous disposez d'une autorité de certification par instance, vous ne pouvez effectuer la validation de l'identité du serveur basée sur le nom DNS que pour les instances Private Service Connect.
Si vous disposez d'une autorité de certification partagée (bêta), vous pouvez effectuer une vérification de l'identité du serveur basée sur le nom DNS pour tous les types d'instances, à savoir Private Service Connect, Accès aux services privés et instances IP publiques.
Vous pouvez afficher la hiérarchie de l'autorité de certification configurée pour une instance Cloud SQL en consultant les détails de l'instance.
Pour en savoir plus, consultez Afficher les informations sur l'instance ou la section suivante, Activer la validation de l'identité du serveur.
Activer la validation de l'identité du serveur
Si vous sélectionnez des autorités de certification partagées comme mode d'autorité de certification du serveur de votre instance Cloud SQL (Preview), nous vous recommandons également d'activer la validation de l'identité du serveur. Les instances qui utilisent une autorité de certification partagée comme mode d'autorité de certification du serveur contiennent le nom DNS de l'instance dans le champ SAN (Subject Alternative Name) du certificat du serveur. Vous pouvez obtenir ce nom DNS à l'aide de l'API de recherche d'instance et utiliser la réponse comme nom d'hôte pour la validation de l'identité du serveur. Vous devez configurer la résolution DNS pour le nom DNS.
Pour activer la validation de l'identité du serveur, procédez comme suit:
Récupérez le nom DNS.
Pour afficher des informations récapitulatives sur une instance Cloud SQL, y compris son nom DNS, utilisez la commande
gcloud sql instances describe
:gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID
Effectuez les remplacements suivants :
- INSTANCE_NAME : nom de l'instance Cloud SQL.
- PROJECT_ID: ID ou numéro de projet du projet Google Cloud contenant l'instance.
Dans la réponse, vérifiez que le nom DNS apparaît. Ce nom a le format suivant:
INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
Exemple :
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.
Créez l'enregistrement DNS dans une zone DNS. Si vous vous connectez en privé, créez l'enregistrement DNS dans une zone DNS privée du réseau cloud privé virtuel (VPC) correspondant.
Lorsque vous vous connectez à l'instance Cloud SQL pour MySQL, configurez le nom DNS comme nom d'hôte. Activez ensuite la validation de l'identité du serveur dans votre client.
Par exemple, lorsque vous utilisez le client MySQL, spécifiez l'option
--ssl-mode=VERIFY_IDENTITY
. Les autres pilotes de client MySQL disposent d'indicateurs de configuration similaires.
Étape suivante
- Gérez les certificats SSL/TLS sur votre instance Cloud SQL.
- Découvrez comment le chiffrement est géré dans Google Cloud.
- Connectez-vous à votre instance Cloud SQL à l'aide de certificats SSL/TLS.
- Découvrez en détail comment MySQL utilise SSL/TLS.