設定密鑰 (第 1 代)

您可以使用 Secret Manager 安全地儲存 API 金鑰、密碼和其他機密資訊。本指南說明如何設定 Cloud Run 函式,以便存取儲存在 Secret Manager 中的機密資料。

本文件將說明兩種讓函式可存取密鑰的方法:

  • 將密鑰掛接為磁碟區。這樣一來,函式就能以檔案形式使用機密資料。如果您以卷的方式參照密鑰,函式每次從磁碟讀取檔案時,都會存取 Secret Manager 中的密鑰值。因此,如果您想參照最新版本的密鑰,而非已固定的密鑰版本,將掛接點掛接為磁碟區會是個不錯的策略。如果您打算實作密鑰輪替,這個方法也相當實用。

  • 將密鑰傳遞為環境變數。環境變數值會在執行個體啟動時解析,因此如果您使用這個方法,建議您參照已固定版本的機密金鑰,而非參照最新版本的機密金鑰。

如要進一步瞭解如何使用 Secret Manager,請參閱 Secret Manager 簡介。如要瞭解如何建立及存取密鑰,請參閱「建立密鑰」。

事前準備

  1. Enable the Secret Manager API.

    Enable the API

  2. 如果您尚未在 Secret Manager 中建立密鑰,請按照「 建立密鑰」一文的說明操作。

授予密鑰存取權

您的函式可存取與函式位於同一專案中的機密資料,以及位於其他專案中的機密資料。如要存取密鑰,必須將密鑰存取權授予函式的執行階段服務帳戶。

根據預設,Cloud Run 函式會使用 App Engine 預設服務帳戶,透過 Secret Manager 進行驗證。如要用於正式環境,Google 建議您將函式設為使用使用者管理的服務帳戶進行驗證,並指派最少許可的角色組合,以完成該函式的任務。

如要搭配 Cloud Run 函式使用 Secret Manager,請將 roles/secretmanager.secretAccessor 角色指派給與函式相關聯的服務帳戶:

  1. 前往 Google Cloud 控制台的 Secret Manager 頁面:
    前往 Secret Manager 頁面

  2. 勾選機密金鑰旁的核取方塊。

  3. 如果資訊面板尚未開啟,請按一下「Show Info Panel」來開啟面板。

  4. 在資訊面板中,按一下「新增主體」

  5. 在「新增主體」欄位中,輸入函式用於身分的服務帳戶。函式的服務帳戶為下列其中一種:

  6. 在「Select a role」(請選擇角色) 下拉式選單中,依序選擇「Secret Manager」和「Secret Manager Secret Accessor」

準備函式以存取密鑰

您可以透過兩種方式讓函式使用機密資料:

  • 將密鑰做為環境變數傳遞。
  • 將密鑰掛接為磁碟區。

環境變數

如要使用環境變數讓函式可存取機密資料,請按照下列步驟操作:

  1. 在函式部署期間設定執行階段環境變數
  2. 環境變數中,讓機密資料可供函式存取
  3. 在執行階段透過程式輔助存取環境變數。

將密鑰掛接為磁碟區

如要將密鑰掛接為磁碟區,請按照下列步驟操作:

  1. 建立包含密鑰的檔案。

  2. 請選擇未使用的非系統目錄 (例如 /mnt/secrets) 做為機密金鑰的掛接路徑。除了機密金鑰及其版本之外,該目錄中所有先前存在的檔案或子目錄,在機密金鑰掛載後都會變成無法存取的狀態。

  3. 將密鑰做為掛接的磁碟區讓函式可存取

  4. 在執行階段,以程式輔助方式讀取檔案內容,以便存取機密值。

舉例來說,如果已將機密資料掛載至 /mnt/secrets/secret1,則函式必須讀取這個檔案。以下是使用 Node.js 同步讀取檔案的範例:

fs.readFileSync('/mnt/secrets/secret1')

讓函式可存取密鑰

如要從函式參照密鑰,您必須先讓函式能夠存取密鑰。您可以使用 Google Cloud 控制台或 Google Cloud CLI,讓新或現有函式存取機密:

主控台

如要讓函式存取密鑰,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
    前往「Cloud Run 函式」頁面

  2. 按一下要存取機密金鑰的函式名稱。

  3. 按一下 [編輯]

  4. 按一下「Runtime, build ...」展開進階設定選項。

  5. 按一下「安全性和映像檔存放區」開啟分頁。

  6. 點選「新增密鑰參照」,為函式設定密鑰。

  7. 選取要開放存取的密鑰。如有需要,請建立密鑰

    • 如要參照與函式位於同一專案中的密鑰,請按照下列步驟操作:

      1. 從下拉式清單中選取機密金鑰。
    • 如要參照其他專案中的密鑰,請按照下列步驟操作:

      1. 確認專案的服務帳戶已獲得密鑰的存取權

      2. 選取「手動輸入密鑰」

      3. 請按照下列格式輸入密鑰的資源 ID:

        projects/PROJECT_ID/secrets/SECRET_NAME

        更改下列內容:

        • PROJECT_ID:機密金鑰所在專案的 ID。

        • SECRET_NAME:Secret Manager 中的密鑰名稱。

  8. 選取密鑰的參照方法。您可以將密鑰掛接為磁碟區,或將密鑰公開做為環境變數。

    • 如要將密鑰掛接為磁碟區,請按照下列步驟操作:

      1. 選取「掛接為磁碟區」

      2. 在「Mount path」欄位中,輸入此機密金鑰的掛載路徑。這是所有密鑰版本的所在目錄。

      3. 在「Path1」Path1欄位中,輸入要掛載的檔案名稱。這個名稱會與上一個步驟中的掛載路徑串連,形成用於掛載機密的完整掛載路徑。

      4. 從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。

      5. 您可以按一下「+ 新增」,定義其他路徑和要掛載的此密鑰版本,藉此掛載此密鑰的其他版本。

    • 如要將密鑰做為環境變數公開,請按照下列步驟操作:

      1. 選取「Exposed as environment variable」

      2. 在「Name1」Name1欄位中輸入環境變數的名稱。

      3. 從「Version1」Version1下拉式選單中,選取要參照的密鑰版本。

      4. 您可以按一下「+ 新增」,定義其他環境變數和要儲存的此 Secret 版本,藉此向函式公開此 Secret 的其他版本。

  9. 按一下 [完成]

  10. 點選「下一步」

  11. 按一下 [Deploy] (部署)

函式的程式碼現在可以參照機密金鑰。

gcloud

如要讓函式存取機密,請輸入下列任一指令。

  • 如要將密鑰掛接為磁碟區,請輸入下列指令:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
    

    更改下列內容:

    • FUNCTION_NAME:函式名稱。

    • RUNTIME:執行函式的執行階段

    • SECRET_FILE_PATH:機密金鑰的完整路徑。例如 /mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是掛載路徑,latest 是密鑰路徑。您也可以分別指定掛載和密鑰路徑:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET:Secret Manager 中的密鑰名稱。

    • VERSION:要使用的 Secret 版本。例如 1latest

    --set-secrets 旗標會覆寫任何現有的 Secret。如要保留函式現有的秘密,請改用 --update-secrets 旗標。

  • 如要將密鑰公開做為環境變數,請輸入下列指令:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
    

    更改下列內容:

    • FUNCTION_NAME:函式名稱。

    • RUNTIME:執行函式的執行階段

    • ENV_VAR_NAME:環境變數的名稱。

    • SECRET:Secret Manager 中的密鑰名稱。

    • VERSION:要使用的 Secret 版本。例如 1latest

    --set-secrets 旗標會覆寫任何現有的 Secret。如要保留函式現有的秘密,請改用 --update-secrets 旗標。

  • 如果函式的服務帳戶已獲准存取該機密,您就可以參照其他專案中的機密。如要參照其他專案中的密鑰,請使用密鑰的資源路徑:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
    

    更改下列內容:

    • FUNCTION_NAME:函式名稱。

    • SECRET_RESOURCE_PATH:位於其他專案中的機密資料資源路徑。資源路徑採用下列格式:

      projects/PROJECT_ID/secrets/SECRET_NAME

      更改下列內容:

      • PROJECT_ID:機密金鑰所在專案的 ID。

      • SECRET_NAME:Secret Manager 中的密鑰名稱。

    • RUNTIME:執行函式的執行階段

    • SECRET_FILE_PATH:機密金鑰的完整路徑。例如 /mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是掛載路徑,latest 是密鑰路徑。您也可以分別指定掛載和密鑰路徑:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET:Secret Manager 中的密鑰名稱。

    • VERSION:要使用的 Secret 版本。例如 1latest

  • 您可以一次更新多個機密金鑰。請使用半形逗號分隔每個密鑰的設定選項。下列指令會更新一個已掛載為磁碟區的密鑰,以及另一個以環境變數形式公開的密鑰。

    如要更新現有機密資料,請輸入下列指令:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \
    SECRET_FILE_PATH=SECRET:VERSION'
    

    更改下列內容:

    • FUNCTION_NAME:函式名稱。

    • RUNTIME:執行函式的執行階段

    • ENV_VAR_NAME:環境變數的名稱。

    • SECRET:Secret Manager 中的密鑰名稱。

    • VERSION:要使用的 Secret 版本。例如 1latest

    • SECRET_FILE_PATH:機密金鑰的完整路徑。例如 /mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是掛載路徑,latest 是密鑰路徑。您也可以分別指定掛載和密鑰路徑:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

從函式中移除密鑰

您可以使用 Google Cloud 主控台或 gcloud CLI 從函式中移除密鑰:

主控台

  1. 前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
    前往「Cloud Run 函式」頁面

  2. 按一下函式的名稱,即可移除其中一個密鑰。

  3. 按一下 [編輯]

  4. 按一下「Runtime, build and connections settings」,展開進階設定選項。

  5. 按一下「安全性和映像檔存放區」,開啟安全性分頁。

  6. 將游標懸停在要移除的機密金鑰上,然後按一下 「刪除」

  7. 點選「下一步」

  8. 按一下 [Deploy] (部署)

gcloud

您可以從函式中移除所有機密資料,或是指定要移除的一或多個機密資料:

  • 如要移除所有機密資料,請執行下列指令:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --clear-secrets
    

    更改下列內容:

    • FUNCTION_NAME:函式名稱。

    • RUNTIME:執行函式的執行階段

    函式中的所有機密資料都會清除。

  • 如要指定要移除的 Secret 清單,請使用 --remove-secrets 標記。下列指令會移除已掛接為磁碟區的一個密鑰,以及以環境變數形式公開的另一個密鑰:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
    

    更改下列內容:

    • FUNCTION_NAME:函式名稱。

    • RUNTIME:執行函式的執行階段

    • ENV_VAR_NAME:環境變數的名稱。

    • SECRET_FILE_PATH:機密金鑰的完整路徑。例如 /mnt/secrets/primary/latest,其中 /mnt/secrets/primary/ 是掛載路徑,latest 是密鑰路徑。您也可以分別指定掛載和密鑰路徑:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    系統會從函式中移除指定的密鑰。

查看函式可存取的密鑰

您可以使用 Google Cloud 控制台或 gcloud CLI 查看函式可存取哪些密鑰:

主控台

  1. 前往 Google Cloud 控制台的「Cloud Run 函式」頁面:
    前往「Cloud Run 函式」頁面

  2. 按一下函式的名稱,查看可用的機密金鑰。

  3. 按一下 [編輯]

  4. 按一下「Runtime, build and connections settings」,展開進階設定選項。

  5. 按一下「安全性」開啟安全性分頁。

「安全性」分頁會列出函式可存取的密鑰。

gcloud

如要查看函式可用的 Secret,請使用 gcloud functions describe 指令:

gcloud functions describe FUNCTION_NAME

FUNCTION_NAME 替換為函式名稱。

後續步驟