配置 SSL/TLS 证书

本页介绍了如何对实例强制使用 SSL/TLS 加密以确保所有连接均已加密。您还可以详细了解 Cloud SQL 如何使用自行管理的 SSL/TLS 证书安全地连接到 Cloud SQL 实例。

概览

当您创建实例时,Cloud SQL 会自动创建一个服务器证书。我们建议您强制所有连接使用 SSL/TLS

只有在客户端请求明确指定需要加密连接时,SQL Server 才会执行证书验证。在这种情况下,必须在客户端机器上安装服务器证书。否则,即使您在 sslMode 设置为 ENCRYPTED_ONLY 的情况下配置实例,客户端也可以随意连接,而无需对其连接字符串或证书进行任何其他更改。

如需了解详情,请参阅 SQL Server 文档中的启用与数据库引擎的加密连接部分。

如果您对实例强制执行 SSL,则该实例需要重启。更改 SSL/TLS 证书后,可能也需要重启。如果需要重启,则 Cloud SQL 会自动为您重启实例。重启实例可能会导致停机。

强制执行 SSL/TLS 加密

您可以使用 SSL 模式设置,通过以下方式强制执行 SSL 加密:

  • 允许非 SSL/非 TLS 和 SSL/TLS 连接。这是默认设置。

  • 仅允许使用 SSL/TLS 加密的连接。

如果您为 Cloud SQL 实例选择允许非 SSL/非 TLS 和 SSL/TLS 连接,则将接受 SSL/TLS 连接以及未加密的不安全连接。如果您不要求所有连接使用 SSL/TLS,则系统仍会允许未加密的连接。因此,如果您使用公共 IP 地址访问实例,我们强烈建议您对所有连接强制执行 SSL。

您可以使用 SSL/TLS 证书直接连接到实例,也可以使用 Cloud SQL Auth 代理Cloud SQL 连接器进行连接。如果您使用 Cloud SQL Auth 代理或 Cloud SQL 连接器进行连接,则连接会使用 SSL/TLS 自动加密。无论 SSL 模式设置如何,使用 Cloud SQL Auth 代理和 Cloud SQL 连接器还会自动验证客户端和服务器身份。

强制使用 SSL 可确保所有连接均已加密。

如需启用“要求使用 SSL/TLS”,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 点击 SQL 导航菜单中的连接
  4. 选择安全标签页。
  5. 从下列选项中选择一项:
    • 允许未加密的网络流量(不推荐)
    • 只允许 SSL 连接。此选项仅允许使用 SSL/TLS 加密的连接。

gcloud

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

SSL_ENFORCEMENT_MODE 替换为以下某个选项:

  • ALLOW_UNENCRYPTED_AND_ENCRYPTED 允许非 SSL/非 TLS 和 SSL/TLS 连接。此设置为默认值。
  • ENCRYPTED_ONLY 仅允许使用 SSL/TLS 加密的连接。

Terraform

如需强制执行 SSL/TLS 加密,请使用 Terraform 资源

resource "google_sql_database_instance" "sqlserver_instance" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2019_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      ssl_mode = "ENCRYPTED_ONLY"
    }
  }
  # 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
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    terraform destroy

REST v1

  1. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:项目 ID
    • SSL_ENFORCEMENT_MODE:使用以下任一选项:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED:允许非 SSL/非 TLS 和 SSL/TLS 连接。
      • ENCRYPTED_ONLY:仅允许使用 SSL/TLS 加密的连接。
    • INSTANCE_ID:实例 ID

    HTTP 方法和网址:

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

    请求 JSON 正文:

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

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

REST v1beta4

  1. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:项目 ID
    • SSL_ENFORCEMENT_MODE:使用以下任一选项:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED:允许非 SSL/非 TLS 和 SSL/TLS 连接。
      • ENCRYPTED_ONLY:仅允许使用 SSL/TLS 加密的连接。
    • INSTANCE_ID:实例 ID

    HTTP 方法和网址:

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

    请求 JSON 正文:

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

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

服务器证书

当您创建实例时,Cloud SQL 会自动创建一个服务器证书。只要此服务器证书有效,您就无需主动管理服务器证书。Cloud SQL 允许您在两种不同的证书授权机构 (CA) 层次结构之间进行选择。您选择的 CA 层次结构将成为实例的服务器 CA 模式。如果您将“按实例 CA”作为实例的服务器 CA 模式,则服务器证书的失效日期为 10 年。如果您将共享 CA 用作实例的服务器 CA 模式(预览版),则服务器证书的到期日期为 1 年。在该失效日期之后,服务器证书将失效,客户端也无法再使用该证书与您的实例建立安全连接。如果客户端配置为验证 CA 或验证服务器证书中的主机名,则该客户端与服务器证书已过期的 Cloud SQL 实例的连接将会失败。为防止客户端连接中断,请在服务器证书过期之前轮替服务器证书。系统会定期通知您服务器证书即将到期。通知在失效日期前的以下天数发送:90、30、10、2 和 1。

您可以获取服务器证书的相关信息,例如该证书的创建时间和到期时间。在到期日期之前,您可以手动创建新的付款资料。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 点击 SQL 导航菜单中的连接
  4. 选择安全标签页。
  5. 前往管理服务器证书部分。

    您可以在表中查看服务器证书的失效日期。

gcloud

对于使用自签名服务器证书的实例(实例级 CA)

  1. 如需获取服务器证书的相关信息,请使用 sql ssl server-ca-certs list 命令:
    gcloud sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
  2. 如需创建服务器证书,请使用 sql ssl server-ca-certs create 命令:
    gcloud sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
  3. 将证书信息下载到本地 PEM 文件中:
    gcloud sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
  4. 通过将下载的文件复制到客户端宿主机上并替换现有的 server-ca.pem 文件,将所有客户端更新为使用新信息。

对于使用共享 CA 颁发的服务器证书的实例预览版):

  1. 如需获取服务器证书的相关信息,请使用 beta sql ssl server-certs list 命令:
    gcloud beta sql ssl server-certs list \
       --instance=INSTANCE_NAME
  2. 如需创建服务器证书,请使用 beta sql ssl server-certs create 命令:
    gcloud beta sql ssl server-certs create \
       --instance=INSTANCE_NAME
  3. 将证书信息下载到本地 PEM 文件中:
    gcloud beta sql ssl server-certs list \
       --format="value(ca_cert.cert)" \
       --instance=INSTANCE_NAME > \
       FILE_PATH/FILE_NAME.pem
  4. 通过将下载的文件复制到客户端宿主机上并替换现有的 server-ca.pem 文件,将所有客户端更新为使用新信息。

Terraform

如需提供服务器证书信息作为输出,请使用 Terraform 数据源

  1. 将以下内容添加到 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. 如要创建 server-ca.pem 文件,请运行以下命令:
       terraform output db_latest_ca_cert > server-ca.pem
       

使用加密连接

详细了解 SQL Server 如何使用加密连接

服务器身份验证简介

服务器身份验证取决于 Cloud SQL 实例的服务器证书授权机构 (CA) 层次结构配置。

如果您的实例配置为使用每个实例的 CA,则验证 CA 也验证了服务器身份,因为每个实例都有唯一的 CA。

如果您的实例配置为使用共享 CA(预览版),则必须验证主机名以及 CA,因为服务器 CA 会在实例之间共享。

如果您使用的是按实例 CA,则只能为 Private Service Connect 实例执行基于 DNS 名称的服务器身份验证。

如果您使用的是共享 CA(预览版),则可以针对所有类型的实例(即 Private Service Connect专用服务访问和公共 IP 实例)执行基于 DNS 名称的服务器身份验证。

您可以查看实例详情,了解为 Cloud SQL 实例配置了哪个 CA 层次结构。

如需了解详情,请参阅查看实例信息或下一部分:启用服务器身份验证

启用服务器身份验证

如果您选择共享 CA 作为 Cloud SQL 实例的服务器 CA 模式(预览版),我们建议您还启用服务器身份验证。使用共享 CA 作为服务器 CA 模式的实例在服务器证书的 Subject Alternative Name (SAN) 字段中包含实例 DNS 名称。您可以使用实例查找 API 获取此 DNS 名称,并将响应用作主机名进行服务器身份验证。您需要为 DNS 名称设置 DNS 解析。

如需启用服务器身份验证,请完成以下步骤:

  1. 检索 DNS 名称。

    1. 如需查看有关 Cloud SQL 实例的摘要信息(包括实例的 DNS 名称),请使用 gcloud sql instances describe 命令:

      gcloud sql instances describe INSTANCE_NAME \
        --project=PROJECT_ID

      进行以下替换:

      • INSTANCE_NAME:Cloud SQL 实例的名称
      • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
    2. 在响应中,验证是否显示 DNS 名称。此名称采用以下模式:

      INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
      

      例如:

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

  2. 在 DNS 区域中创建 DNS 记录。如果您要进行私密连接,请在相应虚拟私有云 (VPC) 网络的专用 DNS 区域中创建 DNS 记录。

  3. 连接到 Cloud SQL for SQL Server 实例时,请将 DNS 名称或 IP 地址配置为主机名。然后,通过为 sqlcmd 指定 -N 标志或选择 SSMS 的 Encrypt Connection/Encryption 选项来启用服务器身份验证。

    其他 SQL Server 驱动程序具有类似的标志或配置。

后续步骤