使用 Secret Manager 处理 Cloud SQL 中的 Secret

概览

正确管理敏感信息是创建安全开发工作流的重要环节。对于 Cloud SQL,我们建议您将敏感信息存储在您在 Secret Manager 中创建的 Secret 中。Secret 可存储 API 密钥、密码、敏感信息或您用来访问机密系统的凭据。

借助 Secret Manager,您可以方便地提升安全性。您还可以对 Secret 进行版本控制,并在您的团队中共享 Secret。如需详细了解如何与您的团队共享 Secret,请参阅访问权限控制 (IAM)

本页面介绍了 4 个使用 Secret Manager 来管理用于 Cloud SQL 的 Secret 的使用场景:

准备工作

在开始使用 Secret Manager 处理 Cloud SQL 中的 Secret 之前,请先进行以下准备工作:

用户名和密码

您可以使用 Secret Manager 将 Cloud SQL 用户账号的用户名和密码存储在 Secret 中,这是一种用来管理此类敏感信息的安全可靠的方法。

首先,您必须在 Cloud SQL 中创建一个用户。在创建此用户时,您必须提供用户名和密码。如需详细了解如何在 Cloud SQL 中创建用户,请参阅创建和管理用户

创建用户后,在 Secret Manager 中创建 Secret 来存储用户名和密码。这样可以确保这些敏感信息不会丢失。如需详细了解如何在 Secret Manager 中创建和访问 Secret,请参阅创建和访问 Secret

Cloud SQL 实例

在连接到 Cloud SQL 实例时,您可以使用 Secret Manager 来管理 Secret,以创建安全的开发工作流。

首先,从您的本地计算机连接到您的 Cloud SQL 实例。在实例运行后,使用环境变量连接到该实例。与变量关联的某些值会更为敏感,例如实例连接的名称。您可以在 Secret Manager 中为每个敏感值创建一个 Secret,以便存储和管理此类敏感信息。如需详细了解如何使用环境变量连接到 Cloud SQL 实例,请参阅配置和运行示例应用

您可以直接从 Secret Manager 检索存储在 Secret 中的实例连接名称。该工作流非常灵活,可以帮助您的团队在多个应用之间共享这些敏感信息,同时又能够从一个位置集中管理这些信息。如需详细了解如何从 Secret Manager 检索 Secret,请参阅使用 Secret Manager 创建 Secret

应用需要 Secret 中存储的信息才能启动。这些信息包括与用来连接到应用的环境变量相关联的值。您的应用会在启动时访问 Secret,然后使用 Secret 来配置与 Cloud SQL 的连接。如果 Secret Manager 中更新了任何相关的 Secret,则您可能必须重启应用。

SSL/TLS 证书

如果您使用公共或专用 IP 地址来连接到 Cloud SQL 实例,则应使用传输层安全协议 (TLS) 证书来保护数据在传输过程中的安全。每个 TLS 证书都包含一个公钥证书和一个私钥。如需详细了解如何配置 TLS 证书,请参阅配置 SSL/TLS 证书

您可以将 TLS 证书、公钥证书和私钥都保存在 Secret 中,以确保它们安全无虞,并且还能够与您的团队共享这些信息。如需详细了解如何创建和访问 Secret,请参阅使用 Secret Manager 创建 Secret。如需详细了解如何共享 Secret,请参阅访问权限控制 (IAM)

灾难恢复场景

如果 Cloud SQL 中的主要实例发生故障,您可能需要将一个读取副本提升为主要实例。在读取副本成为主要实例后,您必须更新实例连接名称才能反映此提升。如果实例连接名称存储在 Secret 中,则您必须用新的主要实例的名称更新 Secret。如需了解详情,请参阅修改 Secret

如需使用 Secret Manager 进行故障切换,一种方法是将主要实例的名称存储在 Secret 中,然后将 Cloud SQL 连接器配置为每当 Secret 更新时便相应地进行更新。

您可以将以下 bash 封装容器脚本与 Cloud SQL Auth 代理结合使用,以便系统能够在实例连接名称的值更新时检测到这一行为,然后使用新值重启代理:

#!/bin/bash

SECRET_ID="my-secret-id" # TODO(developer): replace this value
REFRESH_INTERVAL=5
PORT=5432                # TODO(developer): change this port as needed

# Get the latest version of the secret and start the proxy
INSTANCE=$(gcloud secrets versions access "latest" --secret="$SECRET_ID")
cloud_sql_proxy -instances="$INSTANCE"=tcp:"$PORT" &
PID=$!

# Every 5s, get the latest version of the secret. If it's changed, restart the
# proxy with the new value.
while true; do
    sleep $REFRESH_INTERVAL
    NEW=$(gcloud secrets versions access "latest" --secret="$SECRET_ID")
    if [ "$INSTANCE" != "$NEW" ]; then
        INSTANCE=$NEW
        kill $PID
        wait $PID
        cloud_sql_proxy -instances="$INSTANCE"=tcp:"$PORT" &
        PID=$!
    fi
done

如需详细了解如何创建和访问用来存储主要实例副本的实例连接名称的 Secret,请参阅使用 Secret Manager 创建 Secret。如需详细了解如何使用 Cloud SQL Auth 代理,请参阅使用 Cloud SQL Auth 代理连接到 Cloud SQL

后续步骤