使用 Secret Manager 處理 Cloud SQL 中的機密資料

總覽

正確管理私密資訊是建立安全開發工作流程的必要環節。如果是 Cloud SQL,建議您將敏感資訊片段儲存為在 Secret Manager 中建立的密鑰。密鑰包括 API 金鑰、密碼、機密資訊或憑證,可用於存取機密系統。

Secret Manager 不僅方便好用,還能提升安全性。您也可以為密鑰套用版本控管,並與團隊共用。如要進一步瞭解如何與團隊共用密鑰,請參閱「存取權控管 (IAM)」。

本頁說明使用 Secret Manager 管理 Cloud SQL 密鑰的四個應用情境:

事前準備

開始使用 Secret Manager 處理 Cloud SQL 中的密鑰前,請先完成下列步驟:

使用者名稱及密碼

使用 Secret Manager 將 Cloud SQL 使用者帳戶的使用者名稱和密碼儲存為密鑰,是管理這類機密資訊的安全可靠方式。

首先,您必須在 Cloud SQL 中建立使用者。建立這類使用者時,您必須提供使用者名稱和密碼。如要進一步瞭解如何在 Cloud SQL 中建立使用者,請參閱「建立及管理使用者」一文。

建立使用者後,請在 Secret Manager 中建立密鑰,儲存使用者名稱和密碼。確保不會遺失這類私密資訊。如要進一步瞭解如何在 Secret Manager 中建立及存取密鑰,請參閱「建立及存取密鑰」。

Cloud SQL 執行個體

連線至 Cloud SQL 執行個體時,您可以使用 Secret Manager 管理密鑰,建立安全開發工作流程。

首先,請從本機電腦連線至 Cloud SQL 執行個體。執行個體啟動後,請使用環境變數連線至執行個體。與變數相關聯的某些值較為敏感,例如執行個體連線名稱。您可以針對每個值在 Secret Manager 中建立密鑰,以便儲存及管理這項資訊。如要進一步瞭解如何使用環境變數連線至 Cloud SQL 執行個體,請參閱「設定及執行範例應用程式」。

您可以直接從 Secret Manager 擷取儲存為密鑰的執行個體連線名稱。這項功能提供彈性的工作流程,可協助團隊在多個應用程式中分享這類機密資訊,並從集中位置管理資訊。如要進一步瞭解如何從 Secret Manager 擷取密鑰,請參閱「使用 Secret Manager 建立密鑰」。

應用程式需要密鑰中的資訊才能啟動。這項資訊包括與環境變數相關聯的值,這些變數用於連線至應用程式。應用程式啟動時會存取密鑰,然後使用密鑰設定與 Cloud SQL 的連線。如果 Secret Manager 中有任何相關密鑰更新,您可能必須重新啟動應用程式。

SSL/TLS 憑證

如果您使用公開或私人 IP 位址連線至 Cloud SQL 執行個體,則應使用傳輸層安全標準 (TLS) 憑證,確保資料在傳輸時受到保護。每個 TLS 憑證都包含公開金鑰憑證和私密金鑰。如要進一步瞭解如何設定 TLS 憑證,請參閱「設定 SSL/TLS 憑證」。

您可以將 TLS 憑證、公開金鑰憑證和私密金鑰儲存為密鑰,確保安全無虞並與團隊共用。如要進一步瞭解如何建立及存取密鑰,請參閱「使用 Secret Manager 建立密鑰」。如要進一步瞭解如何共用密鑰,請參閱「存取權控管 (IAM)」。

災難復原情境

如果 Cloud SQL 中的主要執行個體發生故障,您可以將唯讀備用資源推送為主要執行個體。唯讀備用資源升級為主要執行個體後,您必須更新執行個體連線名稱,如果執行個體連線名稱儲存在密鑰中,則必須使用新主要執行個體的名稱更新密鑰。詳情請參閱編輯密鑰

如要使用 Secret Manager 進行容錯移轉,其中一種方法是將主要執行個體的名稱儲存在密碼中,然後設定 Cloud SQL 連接器,在密碼更新時一併更新。

您可以搭配使用下列 Bash 包裝函式指令碼和 Cloud SQL Auth Proxy,偵測執行個體連線名稱的值何時更新,然後使用新值重新啟動 Proxy:

#!/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 Manager 建立密鑰」。如要進一步瞭解如何使用 Cloud SQL 驗證 Proxy,請參閱使用 Cloud SQL 驗證 Proxy 連線至 Cloud SQL

後續步驟