Configurar certificados SSL/TLS

Esta página descreve como aplicar a criptografia SSL/TLS a uma instância para garantir que todas as conexões sejam criptografadas. Saiba como o Cloud SQL usa certificados SSL/TLS autogerenciados para se conectar a instâncias do Cloud SQL com segurança.

Visão geral

O Cloud SQL cria um certificado de servidor automaticamente quando você cria a instância. Recomendamos que você imponha todas as conexões para usar SSL/TLS.

Para validar a identidade do cliente/servidor usando certificados SSL/TLS, você precisa criar um certificado do cliente e fazer o download dos certificados para a máquina host do cliente MySQL.

Se você aplicar o SSL em uma instância, ela precisará ser reiniciada. Uma reinicialização também pode ser necessária depois que você alterar os certificados SSL/TLS. Quando uma reinicialização é necessária, o Cloud SQL reinicia a instância automaticamente para você. A reinicialização de uma instância pode gerar inatividade.

Aplicar criptografia SSL/TLS

Use a configuração modo SSL para aplicar a criptografia SSL das seguintes maneiras:

  • Permita conexões SSL/TLS e não SSL/não TLS. O certificado do cliente não foi verificado para conexões SSL/TLS. Esse é o padrão.

  • Permitir apenas conexões criptografadas com SSL/TLS. O certificado do cliente não foi verificado para conexões SSL.

  • Permitir apenas conexões criptografadas com SSL/TLS e com certificados de cliente válidos.

Se você selecionar Permitir conexões não SSL/não TLS e SSL/TLS para a instância do Cloud SQL, serão aceitas tanto as conexões SSL/TLS quanto as não criptografadas e não seguras. Se você não exigir SSL/TLS para todas as conexões, ainda serão permitidas conexões não criptografadas. Por esse motivo, se você estiver acessando a instância usando um IP público, recomendamos que aplique SSL a todas as conexões.

É possível se conectar diretamente às instâncias usando certificados SSL/TLS ou usando o proxy de autenticação do Cloud SQL ou os conectores do Cloud SQL. Se você se conectar usando o proxy do Cloud SQL Auth ou os conectores do Cloud SQL, as conexões serão criptografadas automaticamente com SSL/TLS. Com o proxy do Cloud SQL Auth e os conectores do Cloud SQL, as identidades de cliente e servidor também são verificadas automaticamente, independentemente da configuração do modo SSL.

Para ativar a solicitação de SSL/TLS, faça o seguinte:

Console

  1. No console do Google Cloud, acesse a página Instâncias do Cloud SQL.

    Acesse Instâncias do Cloud SQL

  2. Para abrir a página Visão geral de uma instância, clique no nome da instância.
  3. Clique em Conexões no menu de navegação do SQL.
  4. Selecione a guia Segurança.
  5. Selecione uma destas opções:
    • Permitir tráfego de rede não criptografado (não recomendado)
    • Permitir somente conexões SSL. Essa opção só permite conexões que usam criptografia SSL/TLS. Os certificados não são validados.
    • Exigir certificados do cliente confiáveis. Essa opção só permite conexões de clientes que usam um certificado válido do cliente e têm criptografia SSL.

gcloud

   gcloud sql instances patch INSTANCE_NAME \
   --ssl-mode=SSL_ENFORCEMENT_MODE
  

Substitua SSL_ENFORCEMENT_MODE por uma das seguintes opções:

  • ALLOW_UNENCRYPTED_AND_ENCRYPTED permite conexões não SSL/não TLS e SSL/TLS. Para conexões SSL, o certificado do cliente não é verificado. Esse é o valor padrão.
  • ENCRYPTED_ONLY só permite conexões criptografadas com SSL/TLS. O certificado do cliente não foi verificado para conexões SSL.
  • TRUSTED_CLIENT_CERTIFICATE_REQUIRED só permite conexões criptografadas com SSL/TLS e com certificados de cliente válidos.
  • Para mais informações, consulte Configurações do Cloud SQL para MySQL.

Terraform

Para aplicar a criptografia SSL/TLS, use um recurso do Terraform:

resource "google_sql_database_instance" "mysql_instance" {
  name             = "mysql-instance"
  region           = "asia-northeast1"
  database_version = "MYSQL_8_0"
  settings {
    tier = "db-f1-micro"
    ip_configuration {
      # The following SSL enforcement options only allow connections encrypted with SSL/TLS and with
      # valid client certificates. Please check the API reference for other SSL enforcement options:
      # https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1beta4/instances#ipconfiguration
      ssl_mode = "TRUSTED_CLIENT_CERTIFICATE_REQUIRED"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

Aplique as alterações

Para aplicar a configuração do Terraform em um projeto do Google Cloud, conclua as etapas nas seções a seguir.

Preparar o Cloud Shell

  1. Inicie o Cloud Shell.
  2. Defina o projeto padrão do Google Cloud em que você quer aplicar as configurações do Terraform.

    Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

Preparar o diretório

Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz.

  1. No Cloud Shell, crie um diretório e um novo arquivo dentro dele. O nome do arquivo precisa ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o arquivo é chamado de main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se você estiver seguindo um tutorial, poderá copiar o exemplo de código em cada seção ou etapa.

    Copie o exemplo de código no main.tf recém-criado.

    Se preferir, copie o código do GitHub. Isso é recomendado quando o snippet do Terraform faz parte de uma solução de ponta a ponta.

  3. Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
  4. Salve as alterações.
  5. Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.
    terraform init

    Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção -upgrade:

    terraform init -upgrade

Aplique as alterações

  1. Revise a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expectativas:
    terraform plan

    Faça as correções necessárias na configuração.

  2. Para aplicar a configuração do Terraform, execute o comando a seguir e digite yes no prompt:
    terraform apply

    Aguarde até que o Terraform exiba a mensagem "Apply complete!".

  3. Abra seu projeto do Google Cloud para ver os resultados. No console do Google Cloud, navegue até seus recursos na IU para verificar se foram criados ou atualizados pelo Terraform.

Excluir as alterações

Para excluir as mudanças, faça o seguinte:

  1. Para desativar a proteção contra exclusão, no arquivo de configuração do Terraform, defina o argumento deletion_protection como false.
    deletion_protection =  "false"
  2. Para aplicar a configuração atualizada do Terraform, execute o comando a seguir e digite yes no prompt:
    terraform apply
  1. Remova os recursos aplicados anteriormente com a configuração do Terraform executando o seguinte comando e inserindo yes no prompt:

    terraform destroy

REST v1

  1. Antes de usar os dados da solicitação, faça as seguintes substituições:

    • PROJECT_ID: o ID do projeto
    • SSL_ENFORCEMENT_MODE: Use uma das seguintes opções:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED: permite conexões não SSL/não TLS e SSL/TLS. Para conexões SSL, o certificado do cliente não é verificado. Esse é o valor padrão.
      • ENCRYPTED_ONLY: só permite conexões criptografadas com SSL/TLS.
      • TRUSTED_CLIENT_CERTIFICATE_REQUIRED: só permite conexões criptografadas com SSL/TLS e com certificados do cliente válidos.
    • INSTANCE_ID: o ID da instância

    Método HTTP e URL:

    PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID

    Corpo JSON da solicitação:

    
    {
      "settings": {
        "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"}
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

REST v1beta4

  1. Antes de usar os dados da solicitação, faça as seguintes substituições:

    • PROJECT_ID: o ID do projeto
    • SSL_ENFORCEMENT_MODE: Use uma das seguintes opções:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED: permite conexões não SSL/não TLS e SSL/TLS. Para conexões SSL, o certificado do cliente não é verificado. Esse é o valor padrão.
      • ENCRYPTED_ONLY: só permite conexões criptografadas com SSL/TLS.
      • TRUSTED_CLIENT_CERTIFICATE_REQUIRED: só permite conexões criptografadas com SSL/TLS e com certificados do cliente válidos.
    • INSTANCE_ID: o ID da instância

    Método HTTP e URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID

    Corpo JSON da solicitação:

    {
      "settings": {
        "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"}
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

Certificados do servidor

O Cloud SQL cria um certificado de servidor automaticamente quando você cria a instância. Desde que o certificado do servidor seja válido, não é necessário gerenciá-lo ativamente. O Cloud SQL permite selecionar entre duas hierarquias de autoridades certificadoras (ACs) diferentes. A hierarquia de AC selecionada se torna o modo de AC do servidor da instância. Se você estiver usando a AC por instância como o modo de AC do servidor para sua instância, os certificados do servidor terão uma data de validade de 10 anos. Se você estiver usando uma AC compartilhada como o modo de AC do servidor da sua instância (Visualização), o certificado do servidor terá uma data de validade de um ano. Após a data de validade, o certificado do servidor não é mais válido, e os clientes não podem mais estabelecer uma conexão segura com a instância usando esse certificado. Se um cliente estiver configurado para verificar a AC ou o nome do host no certificado do servidor, as conexões desse cliente com instâncias do Cloud SQL com certificados de servidor expirados vão falhar. Para evitar interrupções nas conexões do cliente, alterne o certificado do servidor antes que ele expire. Você recebe notificações periódicas avisando que a expiração do certificado do servidor está se aproximando. As notificações são enviadas no número de dias a seguir antes da data de expiração: 90, 30, 10, 2 e 1.

É possível receber informações sobre o certificado do servidor, como quando ele foi criado e quando ele expira. Antes da data de validade, é possível criar uma nova manualmente.

Console

  1. No console do Google Cloud, acesse a página Instâncias do Cloud SQL.

    Acesse Instâncias do Cloud SQL

  2. Para abrir a página Visão geral de uma instância, clique no nome da instância.
  3. Clique em Conexões no menu de navegação do SQL.
  4. Selecione a guia Segurança.
  5. Acesse a seção Gerenciar certificados do servidor.

    Veja a data de validade do certificado do servidor na tabela.

gcloud

Para instâncias que usam certificados de servidor autoassinados (AC por instância):

  1. Para receber informações sobre o certificado do servidor, use o comando sql ssl server-ca-certs list:
    gcloud sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
  2. Para criar um certificado do servidor, use o comando sql ssl server-ca-certs create:
    gcloud sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
  3. Faça o download das informações do certificado para um arquivo PEM local:
    gcloud sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
  4. Atualize todos os clientes para usar as novas informações. Basta copiar o arquivo transferido para as máquinas host do cliente, substituindo os arquivos server-ca.pem.

Para instâncias que usam certificados de servidor emitidos por uma AC compartilhada (Visualização):

  1. Para saber mais sobre o certificado do servidor, use o comando beta sql ssl server-certs list:
    gcloud beta sql ssl server-certs list \
       --instance=INSTANCE_NAME
  2. Para criar um certificado do servidor, use o comando beta sql ssl server-certs create:
    gcloud beta sql ssl server-certs create \
       --instance=INSTANCE_NAME
  3. Faça o download das informações do certificado para um arquivo PEM local:
    gcloud beta sql ssl server-certs list \
       --format="value(ca_cert.cert)" \
       --instance=INSTANCE_NAME > \
       FILE_PATH/FILE_NAME.pem
  4. Atualize todos os clientes para usar as novas informações. Basta copiar o arquivo transferido para as máquinas host do cliente, substituindo os arquivos server-ca.pem.

Terraform

Para fornecer informações de certificado de servidor como saída, use uma fonte de dados do Terraform:

  1. Adicione o seguinte ao seu arquivo de configuração do 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
       }
       
  2. Para criar o arquivo server-ca.pem, execute o seguinte comando:
       terraform output db_latest_ca_cert > server-ca.pem
       

Certificados de cliente

Criar um novo certificado do cliente

Você pode criar até dez certificados do cliente em cada instância. Para criar certificados do cliente, você precisa ter o papel Cloud SQL Admin do IAM.

Confira algumas informações importantes sobre os certificados do cliente:

  • Se você perder a chave privada de um certificado, vai precisar criar uma nova. Não é possível recuperar a antiga.
  • Por padrão, o certificado do cliente tem uma data de validade de 10 anos.
  • Você não será notificado quando os certificados do cliente estiverem prestes a expirar.
  • Sua instância do Cloud SQL precisa estar no estado de execução para criar um certificado SSL.

Console

  1. No console do Google Cloud, acesse a página Instâncias do Cloud SQL.

    Acesse Instâncias do Cloud SQL

  2. Para abrir a página Visão geral de uma instância, clique no nome da instância.
  3. Clique em Conexões no menu de navegação do SQL.
  4. Selecione a guia Segurança.
  5. Clique em Criar certificado do cliente.
  6. Na caixa de diálogo Criar um certificado do cliente, adicione um nome exclusivo.
  7. Clique em Criar.
  8. Na primeira seção da caixa de diálogo Novo certificado SSL criado, clique em Fazer o download do arquivo client-key.pem para transferir a chave privada em um arquivo chamado client-key.pem.
  9. Na segunda seção, clique em Fazer download do client-cert.pem para fazer o download do certificado do cliente para um arquivo chamado client-cert.pem.
  10. Na terceira seção, clique em Fazer download do server-ca.pem para fazer download do certificado do servidor para um arquivo chamado server-ca.pem.
  11. Clique em Fechar.

gcloud

  1. Crie um certificado do cliente usando o comando ssl client-certs create:

    gcloud sql ssl client-certs create CERT_NAME client-key.pem \
    --instance=INSTANCE_NAME
  2. Recupere a chave pública do certificado recém-criado e copie-o no arquivo client-cert.pem com o comando ssl client-certs describe:

    gcloud sql ssl client-certs describe CERT_NAME \
    --instance=INSTANCE_NAME \
    --format="value(cert)" > client-cert.pem
  3. Copie o certificado do servidor no arquivo server-ca.pem usando o comando instances describe:

    gcloud sql instances describe INSTANCE_NAME \
    --format="value(serverCaCert.cert)" > server-ca.pem

Terraform

Para criar um certificado do cliente, use um recurso do Terraform:

resource "google_sql_ssl_cert" "mysql_client_cert" {
  common_name = "mysql_common_name"
  instance    = google_sql_database_instance.mysql_instance.name
}

REST v1

  1. Crie um certificado SSL/TLS e insira um nome exclusivo para ele nesta instância:

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • project-id: o ID do projeto
    • instance-id: o ID da instância
    • client-cert-name: o nome do certificado do cliente

    Método HTTP e URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/sslCerts

    Corpo JSON da solicitação:

    {
      "commonName" : "client-cert-name"
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

  2. Copie todo o conteúdo do certificado que está entre aspas (mas sem copiar as aspas) da resposta para os arquivos locais, da seguinte maneira:
    1. Copie serverCaCert.cert para server-ca.pem.
    2. Copie clientCert.cert para client-cert.pem.
    3. Copie certPrivateKey para client-key.pem.
  3. Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • project-id: o ID do projeto
    • instance-id: o ID da instância
    • activation-policy: a política de ativação é ALWAYS ou NEVER

    Método HTTP e URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/restart

    Corpo JSON da solicitação:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "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

  1. Crie um certificado SSL/TLS e insira um nome exclusivo para ele nesta instância:

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • project-id: o ID do projeto
    • instance-id: o ID da instância
    • client-cert-name: o nome do certificado do cliente

    Método HTTP e URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/sslCerts

    Corpo JSON da solicitação:

    {
      "commonName" : "client-cert-name"
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

  2. Copie todo o conteúdo do certificado que está entre aspas (mas sem copiar as aspas) da resposta para os arquivos locais, da seguinte maneira:
    1. Copie serverCaCert.cert para server-ca.pem.
    2. Copie clientCert.cert para client-cert.pem.
    3. Copie certPrivateKey para client-key.pem.
  3. Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • project-id: o ID do projeto
    • instance-id: o ID da instância
    • activation-policy: a política de ativação é ALWAYS ou NEVER

    Método HTTP e URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/restart

    Corpo JSON da solicitação:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "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"
    }
    

Neste momento, você tem:

  • Um certificado do servidor salvo como server-ca.pem.
  • Um certificado de chave pública do cliente salvo como client-cert.pem.
  • Uma chave privada de cliente salva como client-key.pem.

Dependendo da ferramenta que você usa para se conectar, esses três itens são especificados de modo diferente. Por exemplo, ao conectar usando o cliente do MySQL, esses três arquivos são os valores para as opções de comando --ssl-ca, --ssl-cert e --ssl-key, respectivamente. Para ver uma conexão de amostra usando o cliente MySQL e SSL/TLS, consulte Como se conectar com o cliente MySQL.

Sobre a verificação de identidade do servidor

A verificação de identidade do servidor depende da configuração da autoridade certificadora (AC) do servidor da sua instância do Cloud SQL.

Se a instância estiver configurada para usar a AC por instância, a verificação da AC também verifica a identidade do servidor, já que cada instância tem uma AC exclusiva.

Se a instância estiver configurada para usar a AC compartilhada (Prévia), a verificação do nome de host e da AC será necessária para a verificação de identidade do servidor, já que as ACs do servidor são compartilhadas entre as instâncias.

Se você tiver uma AC por instância, só poderá realizar a verificação de identidade do servidor com base no nome DNS para instâncias do Private Service Connect.

Se você tiver uma AC compartilhada (pré-lançamento), poderá realizar a verificação de identidade do servidor com base no nome DNS para todos os tipos de instâncias, ou seja, Private Service Connect, Acesso a serviços privados e instâncias de IP público.

É possível conferir qual hierarquia de AC está configurada para uma instância do Cloud SQL abrindo os detalhes da instância.

Para mais informações, consulte Conferir informações da instância ou a seção a seguir, Ativar a verificação de identidade do servidor.

Ativar a verificação de identidade do servidor

Se você selecionar ACs compartilhadas como o modo de AC do servidor da sua instância do Cloud SQL (Visualização), recomendamos que você também ative a verificação de identidade do servidor. As instâncias que usam a AC compartilhada como o modo de AC do servidor contêm o nome DNS da instância no campo "Nome alternativo do assunto" (SAN, na sigla em inglês) do certificado do servidor. É possível receber esse nome de DNS usando a API de pesquisa de instância e a resposta como um nome de host para a verificação da identidade do servidor. É necessário configurar a resolução de DNS para o nome DNS.

Para ativar a verificação de identidade do servidor, siga estas etapas:

  1. Extraia o nome do DNS.

    1. Para conferir informações resumidas sobre uma instância do Cloud SQL, incluindo o nome DNS da instância, use o comando gcloud sql instances describe:

      gcloud sql instances describe INSTANCE_NAME \
        --project=PROJECT_ID

      Faça as seguintes substituições:

      • INSTANCE_NAME: o nome da instância do Cloud SQL
      • PROJECT_ID: o ID ou o número do projeto do Google Cloud que contém a instância
    2. Na resposta, verifique se o nome DNS é exibido. Esse nome tem o seguinte padrão:

      INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
      

      Exemplo:

      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.

  2. Crie o registro DNS em uma zona DNS. Se você estiver se conectando de forma particular, crie o registro DNS em uma zona de DNS particular na rede VPC correspondente.

  3. Ao se conectar à instância do Cloud SQL para MySQL, configure o nome DNS como o nome do host. Em seguida, ative a verificação de identidade do servidor no cliente.

    Por exemplo, ao usar o cliente MySQL, especifique a flag --ssl-mode=VERIFY_IDENTITY. Outros drivers de cliente do MySQL têm flags de configuração semelhantes.

A seguir