本页面介绍了如何将实例配置为使用 SSL/TLS。您还可以详细了解 Cloud SQL 如何使用自行管理的 SSL/TLS 证书安全地连接到 Cloud SQL 实例。
概览
当您创建实例时,Cloud SQL 会自动创建一份服务器证书 (server-ca.pem
)。 我们建议您强制所有连接使用 SSL/TLS。
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”,请执行以下操作:
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 点击 SQL 导航菜单中的连接。
- 选择安全标签页。
- 从下列选项中选择一项:
- 允许未加密的网络流量(不推荐)
- 只允许 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 资源:
应用更改
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用删除防护,请在 Terraform 配置文件中将
deletion_protection
参数设置为false
。deletion_protection = "false"
- 运行以下命令并在提示符处输入
yes
,以应用更新后的 Terraform 配置:terraform apply
-
运行以下命令并在提示符处输入
yes
,以移除之前使用 Terraform 配置应用的资源:terraform destroy
REST v1
-
在使用任何请求数据之前,请先进行以下替换:
- 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
-
在使用任何请求数据之前,请先进行以下替换:
- 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 会自动创建一个服务器证书。只要此服务器证书有效,您就无需主动管理服务器证书。但是,服务器证书是有失效日期的(即 10 年);此日期过后,该证书就不再有效,客户端也无法再使用该证书与您的实例之间建立安全连接。 系统会定期通知您服务器证书即将到期。通知在失效日期前的以下天数发送:90、30、10、2 和 1。
您可以获取服务器证书的相关信息,例如该证书的创建时间和到期时间。您也可以手动创建一个新证书。
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 点击 SQL 导航菜单中的连接。
- 选择安全标签页。
- 前往管理服务器证书部分。
您可以在表中查看服务器证书的失效日期。
gcloud
- 获取有关服务证书的信息:
gcloud beta sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- 创建服务器证书:
gcloud beta sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- 将证书信息下载到本地 PEM 文件中:
gcloud beta sql ssl server-ca-certs list \ --format="value(cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- 通过将下载的文件复制到客户端宿主机上并替换现有的
server-ca.pem
文件,将所有客户端更新为使用新信息。
Terraform
如需提供服务器证书信息作为输出,请使用 Terraform 数据源:
- 将以下内容添加到 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 }
- 如要创建
server-ca.pem
文件,请运行以下命令:terraform output db_latest_ca_cert > server-ca.pem
使用加密连接
详细了解 SQL Server 如何使用加密连接。
后续步骤
- 在 Cloud SQL 实例上管理 SSL/TLS 证书。
- 详细了解在 Google Cloud 中处理加密的方式。