使用 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 中建立及存取 Secret,請參閱「建立及存取 Secret」。

Cloud SQL 執行個體

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

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

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

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

SSL/TLS 憑證

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

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

災難復原情境

如果 Cloud SQL 中的主要執行個體故障,您可以將唯讀副本升級為主要執行個體。唯讀副本成為主要執行個體後,您必須更新執行個體連線名稱,反映這項升級。如果執行個體連線名稱儲存在密鑰中,則必須以新的主要執行個體名稱更新密鑰。詳情請參閱「編輯密鑰」。

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

您可以搭配 Cloud SQL Auth Proxy 使用下列 bash 包裝函式指令碼,偵測執行個體連線名稱的值何時更新,然後使用新值重新啟動 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,請參閱「使用 Secret Manager 建立 Secret」。如要進一步瞭解如何使用 Cloud SQL Auth Proxy,請參閱「使用 Cloud SQL Auth Proxy 連線至 Cloud SQL」。

後續步驟