Configurar certificados SSL/TLS

Nesta página, veja como configurar uma instância para usar SSL/TLS. Saiba mais sobre 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 (server-ca.pem) 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.

É necessário reiniciar uma instância depois de aplicar o SSL a ela. Não é preciso reiniciar a instância depois de alterar os certificados SSL/TLS. Se uma reinicialização for necessária, isso será feito automaticamente durante o evento de atualização do SSL.

Aplicar criptografia SSL/TLS

Configurar sua instância do Cloud SQL para aceitar conexões SSL/TLS permite conexões SSL/TLS para a instância, mas conexões não criptografadas e não seguras ainda são aceitas. Se você não exigir SSL/TLS para todas as conexões, os clientes sem um certificado válido poderão se conectar. Por isso, se você estiver acessando sua instância usando um IP público, é altamente recomendável aplicar SSL a todas as conexões.

Quando a opção de exigência de SSL/TLS está ativada, é possível usar o proxy do Cloud SQL Auth ou certificados SSL/TLS para se conectar à instância do Cloud SQL. O uso do proxy do Cloud SQL Auth não exige certificados SSL/TLS, porque a conexão é criptografada independentemente da configuração.

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

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 Permitir somente conexões SSL.

gcloud

gcloud sql instances patch INSTANCE_NAME
--require-ssl
  

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 {
      require_ssl = "true"
    }
  }
  deletion_protection = "true"
}

Aplique as alterações

Para aplicar a configuração do Terraform a um projeto do Google Cloud, siga estas etapas:

  1. Inicie o Cloud Shell.
  2. Defina o projeto do Google Cloud em que a configuração do Terraform será aplicada:
        export GOOGLE_CLOUD_PROJECT=PROJECT_ID
        
  3. Crie um diretório e abra um novo arquivo. O nome do arquivo precisa ter a extensão .tf, por exemplo: main.tf:
        mkdir DIRECTORY && cd DIRECTORY && nano main.tf
        
  4. Copie a amostra para main.tf.
  5. Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
  6. Salve as mudanças pressionando Ctrl-x e depois y.
  7. Inicialize o Terraform:
    terraform init
  8. 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.

  9. 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!".

  10. 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 abaixo, faça as substituições a seguir:

    • project-id: o ID do projeto
    • 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": {"requireSsl": "true"}
      }
    }
    

    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 abaixo, faça as substituições a seguir:

    • project-id: o ID do projeto
    • 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": {"requireSsl": "true"}
      }
    }
    

    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 será necessário gerenciá-lo ativamente. No entanto, o certificado tem uma data de validade de 10 anos. Após essa data, ele não será mais válido, e os clientes não poderão usá-lo para estabelecer uma conexão segura com a instância. Você receberá 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 expira, ou criar um novo 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. Role para baixo até a seção Gerenciar certificados do servidor.

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

gcloud

  1. Receba informações sobre o certificado de serviço:
    gcloud beta sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
    
  2. Crie um certificado do servidor:
    gcloud beta 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 beta 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 por download para as máquinas host do cliente, substituindo os arquivos "server-ca.pem" atuais.

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.

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 download do client-key.pem para fazer download da chave privada para 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.

A seguir