Configurar um nome DNS personalizado para uma instância do Cloud SQL

Esta página descreve como configurar um nome de Sistema de Nomes de Domínio (DNS) personalizado para sua instância do Cloud SQL.

Visão geral

É possível configurar uma instância do Cloud SQL para que seus aplicativos possam se conectar usando um nome DNS personalizado gerenciado pela sua organização. Se você quiser usar um nome DNS personalizado para se conectar a uma instância do Cloud SQL em vez de usar um endereço IP, configure um nome alternativo do assunto (SAN, na sigla em inglês) personalizado. É possível configurar um SAN personalizado ao criar ou atualizar uma instância.

Ao adicionar um nome DNS personalizado como uma configuração SAN personalizada à sua instância, o Cloud SQL insere o nome DNS personalizado no campo SAN do certificado do servidor da instância. Essa personalização permite que você use o nome DNS personalizado com a validação de nome de host com segurança. É possível adicionar uma lista separada por vírgulas de até três nomes DNS personalizados à configuração SAN personalizada. Por motivos de segurança, só é possível usar uma configuração SAN personalizada apenas para instâncias que você configurar com CUSTOMER_MANAGED_CAS_CA como o modo de AC do servidor.

Depois de configurar o nome DNS personalizado para sua instância, você poderá usar esse nome DNS personalizado para conectar seus clientes ou aplicativos de banco de dados, incluindo conectores de linguagem do Cloud SQL e o proxy de autenticação do Cloud SQL.

Fluxo de trabalho

Para configurar um nome DNS personalizado para uma instância, faça o seguinte:

  1. Crie uma instância configurada com a AC gerenciada pelo cliente.
  2. Adicione valores SAN personalizados à instância. Os valores SAN personalizados são inseridos no campo SAN do certificado do servidor da instância.
  3. Determine o endereço IP da instância.
  4. Crie registros DNS personalizados para sua instância.
  5. Conecte-se à instância usando o nome DNS personalizado.

Antes de começar

Antes de configurar um nome DNS personalizado para sua instância, verifique se você tem os papéis e permissões necessários.

Se você estiver criando uma nova instância do Cloud SQL, para usar o SAN personalizado, a instância também precisará usar uma autoridade certificadora (AC) gerenciada pelo cliente para o modo de AC do servidor.

Criar uma instância com valores SAN personalizados

Para criar uma instância com valores SAN personalizados, use o seguinte comando gcloud sql instances create:

gcloud

gcloud sql instances create "INSTANCE_NAME" \
  --database-version=DATABASE_VERSION \
  --project=PROJECT_ID \
  --region=REGION \
  --server-ca-mode=CUSTOMER_MANAGED_CAS_CA \
  --server-ca-pool=projects/PROJECT_ID_CAS/locations/REGION/caPools/CA_POOL_ID
  --custom-subject-alternative-names=CUSTOM_DNS_NAME

Faça as seguintes substituições:

  • INSTANCE_NAME pelo nome da instância do Cloud SQL que você quer criar.
  • DATABASE_VERSION pelo enum da versão da instância do Cloud SQL que você quer criar.
  • PROJECT_ID pelo ID do projeto em que você planeja criar as instâncias do Cloud SQL.
  • PROJECT_ID_CAS pelo ID do projeto em que você criou seu CA_POOL_ID. Esse projeto pode ser igual ou diferente de onde você quer criar a instância do Cloud SQL.
  • REGION pela região em que você criou o pool de ACs. É preciso criar a instância na mesma região do pool de ACs.
  • CA_POOL_ID pelo ID do pool de ACs que você criou.
  • CUSTOM_DNS_NAME com até três nomes DNS personalizados, separados por vírgulas e sem espaços entre os valores. Por exemplo, develop.example.com,test.example.com,production.example.com.

Terraform

Para criar uma instância com valores SAN personalizados, use um recurso do Terraform. O exemplo a seguir também cria recursos de pré-requisito para a nova instância.

resource "google_project_service_identity" "default" {
  provider = google-beta
  service  = "sqladmin.googleapis.com"
}

resource "random_string" "default" {
  length  = 10
  special = false
  upper   = false
}

resource "google_privateca_ca_pool" "default" {
  name     = "customer-ca-pool-${random_string.default.result}"
  location = "asia-northeast1"
  tier     = "DEVOPS"
  publishing_options {
    publish_ca_cert = false
    publish_crl     = false
  }
}

# This is required for setting up customer managed CAS (Certificate Authority Service) instances.
resource "google_privateca_certificate_authority" "default" {
  pool                                   = google_privateca_ca_pool.default.name
  certificate_authority_id               = "my-certificate-authority"
  location                               = "asia-northeast1"
  lifetime                               = "86400s"
  type                                   = "SELF_SIGNED"
  deletion_protection                    = false # set to "true" in production
  skip_grace_period                      = true
  ignore_active_certificates_on_deletion = true
  config {
    subject_config {
      subject {
        organization = "my organization"
        common_name  = "my certificate authority name"
      }
    }
    x509_config {
      ca_options {
        is_ca = true
      }
      key_usage {
        base_key_usage {
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
          server_auth = false
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
}

resource "google_privateca_ca_pool_iam_member" "default" {
  ca_pool = google_privateca_ca_pool.default.id
  role    = "roles/privateca.certificateRequester"

  member = "serviceAccount:${google_project_service_identity.default.email}"
}

resource "google_sql_database_instance" "default" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2022_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      # The following server CA mode lets the instance use customer-managed CAS CA to issue server certificates.
      # https://cloud.google.com/sql/docs/sqlserver/admin-api/rest/v1beta4/instances#ipconfiguration
      server_ca_mode                   = "CUSTOMER_MANAGED_CAS_CA"
      server_ca_pool                   = google_privateca_ca_pool.default.id
      custom_subject_alternative_names = ["customSan.test.com"]
    }
  }
}

Adicionar ou atualizar valores SAN personalizados para uma instância

Para adicionar ou atualizar valores SAN personalizados para uma instância atual, faça o seguinte:

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --custom-subject-alternative-names=CUSTOM_DNS_NAME

Faça as seguintes substituições:

  • INSTANCE_NAME pelo nome da instância do Cloud SQL que você quer atualizar.
  • CUSTOM_DNS_NAME com até três nomes DNS personalizados, separados por vírgulas e sem espaços entre os valores. Por exemplo, develop.example.com,new-test.example.com,production.example.com.

Terraform

Para atualizar uma instância que já tem valores SAN personalizados, use um recurso do Terraform.

resource "google_sql_database_instance" "default" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2022_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      # The following server CA mode lets the instance use customer-managed CAS CA to issue server certificates.
      # https://cloud.google.com/sql/docs/sqlserver/admin-api/rest/v1beta4/instances#ipconfiguration
      server_ca_mode                   = "CUSTOMER_MANAGED_CAS_CA"
      server_ca_pool                   = google_privateca_ca_pool.default.id
      custom_subject_alternative_names = ["customSan.test.com"]
    }
  }
}

Limpar todos os valores SAN personalizados de uma instância

Para limpar todos os valores SAN personalizados de uma instância, faça o seguinte:

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --clear-custom-subject-alternative-names

Substitua INSTANCE_NAME pelo nome da instância do Cloud SQL que você quer atualizar.

Criar registros DNS personalizados

Antes de se conectar à instância usando o nome DNS personalizado com seus clientes e aplicativos, configure o mapeamento entre o nome DNS e o endereço IP. Esse mapeamento é conhecido como resolução de DNS. Se você estiver se conectando de forma particular, então crie o registro DNS em uma zona de DNS particular na nuvem privada virtual (VPC, na sigla em inglês) correspondente.

Para criar registros DNS personalizados para sua instância, faça o seguinte:

  1. Recupere o endereço IP da sua instância. Execute este comando:

    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 número do projeto do Google Cloud projeto que contém a instância
  2. Na resposta, procure o campo ipAddresses:.

    Exemplo:

    ipAddresses:
    - ipAddress: 192.0.2.4
      type: PRIVATE
    

    É possível recuperar o endereço IP particular de uma instância configurada para acesso a serviços particulares, Private Service Connect ou ambos.

  3. Adicione dois registros DNS a uma zona de DNS usada pelo seu aplicativo. É possível usar um servidor DNS gerenciado por você ou a zona particular do Cloud DNS usada pelo seu aplicativo.

    • Crie um registro A para o endereço IP da instância
    • Crie um registro TXT que contenha o nome da conexão da instância.

    Os clientes de banco de dados padrão usam o registro A para pesquisar o endereço IP e fazer a conexão. Os conectores de linguagem do Cloud SQL e o proxy de autenticação do Cloud SQL usam o registro TXT para pesquisar o nome da conexão da instância.

    Por exemplo, a string de conexão da sua instância é my-project:region:my-instance, mas você quer se conectar usando o nome DNS prod-db.mycompany.example.com. Se o endereço IP da instância na rede da sua empresa for 192.0.2.4, crie os seguintes registros DNS:

    Record type: A
    Name: prod-db.mycompany.example.com
    Value: 192.0.2.4
    TTL: 600
    
    Record type: TXT
    Name: prod-db.mycompany.example.com
    Value: my-project:region:my-instance
    TTL: 600
    

Conectar-se a uma instância usando um nome DNS personalizado

Ao se conectar à instância do Cloud SQL para SQL Server, configure o nome DNS personalizado como o nome do host. Em seguida, ative a verificação de identidade do servidor especificando a flag -N para sqlcmd ou selecionando a opção Encrypt Connection/Encryption do SSMS.

Outros drivers do SQL Server têm flags ou configurações semelhantes.

Se você estiver se conectando a uma instância particular do Cloud SQL de uma rede externa, será necessário configurar a instância do Cloud SQL e a rede de nuvem privada virtual (VPC) para permitir conexões externas e permitir que o Cloud DNS se comunique com sistemas locais. Para mais informações sobre essa configuração, consulte Conectar-se de uma origem externa e Configurar o DNS para sistemas locais.

Limitações

  • Não é possível adicionar mais de três nomes DNS como valores SAN personalizados ao certificado do servidor de uma instância do Cloud SQL.
  • O comprimento máximo de um nome DNS que pode ser adicionado ao certificado como um valor SAN personalizado para uma instância é de 253 caracteres.
  • Os nomes DNS adicionados ao certificado de uma instância não podem ter caracteres curinga (*) ou pontos finais. Por exemplo, test.example.com. não é permitido.
  • Os nomes DNS precisam ser válidos, conforme especificado pela RFC 1034.
  • Só é possível especificar valores SAN personalizados para instâncias CUSTOMER_MANAGED_CAS_CA.

A seguir