使用客戶自行管理的加密金鑰

根據預設,Cloud Run 會加密靜態的客戶內容。Cloud Run 會處理加密作業,您不必採取任何其他動作。這個選項稱為「Google 預設加密」

如果您想控制加密金鑰,可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),並搭配使用 CMEK 整合服務,包括 Cloud Run。使用 Cloud KMS 金鑰可讓您控制金鑰的保護等級、位置、輪替時間表、使用權限和存取權,以及加密範圍。使用 Cloud KMS 還可讓您查看稽核記錄,並控管金鑰生命週期。您可以在 Cloud KMS 中控制及管理用來保護資料的對稱金鑰加密金鑰 (KEK),而非由 Google 擁有及管理這些金鑰。

使用 CMEK 設定資源後,存取 Cloud Run 資源的體驗就會類似使用 Google 預設加密功能。如要進一步瞭解加密選項,請參閱「客戶管理的加密金鑰 (CMEK)」。

如要瞭解如何使用 gcloud functions 指令或 Cloud Functions v2 API 建立的函式,透過 CMEK 保護資料,請參閱「使用 CMEK 保護資料」。

請注意下列事項:

  • 檔案中繼資料 (例如路徑) 不會加密。
  • Cloud Run 服務的中繼資料 (例如名稱或環境變數) 並非使用提供的金鑰加密,而是使用 Google-owned and Google-managed encryption key加密。
  • 在執行階段,記憶體和檔案內容不會加密。
  • 如果停用 CMEK,使用該金鑰的現有 Cloud Run 修訂版本新執行個體將無法啟動。
  • 如果 CMEK 遭到停用,除非使用新的有效金鑰,否則無法部署新的 Cloud Run 修訂版本。

使用 Cloud KMS Autokey 的 CMEK

您可以手動建立 CMEK 來保護 Cloud Run 資源,也可以使用 Cloud KMS Autokey。使用 Autokey 時,系統會在 Cloud Run 建立資源時視需要產生金鑰環和金鑰。如果尚未建立使用金鑰進行加密和解密作業的服務代理,系統會為這些代理人建立這些代理人,並授予必要的 Identity and Access Management (IAM) 角色。詳情請參閱「Autokey 總覽」。

如要手動設定 CMEK,請參閱「為 Cloud Run 服務設定 CMEK」。

如要使用 Autokey 設定 CMEK,請參閱「使用 Autokey」。

使用 gcloud functions 指令或 Cloud Functions v2 API 建立的函式無法使用自動鍵。

Cloud KMS 配額和 Cloud Run

您可以將 CMEK 設為可用的任一防護等級,以指示執行加密編譯作業的方式。在 Cloud Run 中使用 CMEK 時,專案可以使用 Cloud KMS 密碼編譯要求配額。舉例來說,使用 CMEK 加密的存放區每次上傳或下載時,都會消耗這些配額。

使用 CMEK 金鑰進行加密和解密作業會對 Cloud KMS 配額造成以下影響:

  • 在 Cloud KMS 中產生的軟體 CMEK 金鑰不會消耗 Cloud KMS 配額。
  • 對於硬體 CMEK 金鑰 (有時稱為 Cloud HSM 金鑰),加密和解密作業會計入包含金鑰的專案中 Cloud HSM 配額
  • 對於外部 CMEK 金鑰 (有時稱為 Cloud EKM 金鑰),加密和解密作業會計入包含金鑰的專案中 Cloud EKM 配額

詳情請參閱「Cloud KMS 配額」。

受 CMEK 影響的自動調度資源行為

使用客戶代管的加密金鑰時,Cloud Run 服務的預期自動調整大小可能會受到影響。舉例來說,在金鑰作業期間與外部金鑰管理系統聯繫時,啟動新執行個體的延遲時間可能會增加。

下表列出使用 CMEK 後可能發生的行為變化:

CMEK 相關作業 自動調度資源行為
金鑰已停用/刪除/撤銷 新執行個體無法啟動。
無法連線至外部金鑰管理工具 如果可重試主要要求,重試期間不會關閉任何執行個體,也不會啟動任何新執行個體。擴大規模的速度可能會比預期慢。
如果無法重試主要要求,系統就不會啟動新執行個體,並在等待一段時間後關閉執行中的執行個體。
超出 KMS 配額 如果超過這個配額,系統會記錄 RESOURCE_EXHAUSTED 錯誤,且不會啟動新的執行個體。您可以要求提高配額來解決這個問題。

事前準備

允許 Cloud Run 存取金鑰

如要為 Cloud Run 使用 CMEK,請執行下列步驟:

  1. 將 Artifact Registry 設為使用 CMEK

  2. 參考 Artifact Registry 的 Docker 快速入門建立 Docker 存放區,並將映像檔推送至該存放區。

  3. 使用現有的 Cloud KMS 對稱金鑰,或建立新的對稱金鑰

  4. 如要讓 Cloud Run 存取金鑰,請將 Cloud KMS CryptoKey Encrypter/Decrypter 角色授予 Cloud Run 服務代理人:

    控制台

    1. 前往「Cryptographic Keys」(加密編譯金鑰) 頁面

    2. 按一下金鑰的金鑰環,開啟金鑰清單頁面。

    3. 選取金鑰,然後在右側的「權限」分頁中,按一下「新增主體」

    4. 在「New principals」欄位中,複製 Cloud Run 服務代理程式的電子郵件地址。其後綴如下:

      service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com.

    5. 在「請選擇角色」欄位中,選取「Cloud KMS CryptoKey 加密者/解密者」

    6. 點選「儲存」

    gcloud

    使用下列 gcloud kms 指令:

    gcloud kms keys add-iam-policy-binding KEY_NAME \
    --keyring=KEYRING \
    --location=LOCATION \
    --member serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
    --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

    取代:

    • KEY_NAME 改為金鑰的名稱。
    • KEYRING 替換為金鑰環的名稱。
    • LOCATION 改為您的區域名稱。
    • PROJECT_NUMBER 您要部署 Cloud Run 服務的專案編號。

    您必須具備管理Google Cloud 專案中 Cloud KMS 資源的權限,才能授予 IAM 角色 roles/cloudkms.cryptoKeyEncrypterDecrypter。只有具有「Owner」(roles/owner) 或「Cloud KMS Admin」(roles/cloudkms.admin) 角色的 IAM 成員,才能授予或撤銷 Cloud KMS 資源的存取權。

為 Cloud Run 服務設定 CMEK

任何設定變更都會建立新的修訂版本。除非您明確做出更新,否則後續的修訂版本也會自動取得這個設定。

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從選單中選取「Services」(服務),然後按一下「Deploy container」(部署容器),即可設定新的服務。如果您要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」

  3. 如果您要設定新服務,請填寫初始服務設定頁面,然後按一下「容器、磁碟區、網路與安全性」展開服務設定頁面。

  4. 按一下「安全性」分頁標籤。

    圖片

    • 在「加密」下方:
      1. 選取「Cloud KMS 金鑰」
      2. 在「金鑰類型」中,選取「Cloud KMS」
      3. 從「選取 Cloud KMS 金鑰」選單中,選擇下列任一選項:
        • 如果您需要使用其他專案的金鑰,請選取「切換專案」。如果專案的服務帳戶可以存取金鑰,用於加密和解密作業,您就可以參照其他專案中的金鑰。

        • 選取「手動輸入金鑰」,然後使用以下格式輸入專案的密鑰:projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME

        如要從您有權存取的其他專案複製及貼上資源名稱,請按照下列步驟操作:

        • 前往「Cryptographic keys」(加密編譯金鑰) 頁面
        • 按一下金鑰環。
        • 選取所選金鑰環名稱,然後按一下「動作」
        • 從選單中選取「Copy resource name」,然後貼到上一個步驟的「Key resource name」欄位。

      4. 在「金鑰撤銷動作」選單中,選擇下列任一選項:
        • 禁止新增容器執行個體:在 CMEK 金鑰撤銷後,不會啟動新的執行個體。

        • 盡快關閉:在 CMEK 金鑰撤銷後,系統不會啟動新的執行個體,並關閉現有執行個體。

        • 自訂關機延遲時間:指定服務關閉前延遲的時間長度 (以小時為單位)。

  5. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

如要為服務設定金鑰,請使用下列任一指令:

gcloud run deploy SERVICE \
--image IMAGE_URL \
--key KEY \
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS
gcloud run services update SERVICE --key KEY
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS

取代

  • SERVICE 改為您的服務名稱。
  • IMAGE_URL 與容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用的是 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的形狀為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • KEY,其中包含完整的鍵名稱,格式如下:projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  • KEY_REVOCATION_ACTION 搭配 shut-downprevent-new,具體取決於您的金鑰撤銷偏好設定
  • SHUTDOWN_HOURS 與服務在撤銷後關閉前延遲的時間數小時。

YAML

  1. 如果您要建立新服務,請略過這個步驟。如果您要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 將下列 CMEK 註解更新為所需值:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/encryption-key: projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
            run.googleapis.com/post-key-revocation-action-type: KEY_REVOCATION_ACTION
            run.googleapis.com/encryption-key-shutdown-hours: SHUTDOWN_HOURS
          name: REVISION

    取代

    • SERVICE 改為 Cloud Run 服務名稱。
    • PROJECT_NAME 與建立金鑰的專案名稱。
    • LOCATION 與建立金鑰的位置。必須與 Cloud Run 服務位置相符。
    • KEYRING_NAME 替換為金鑰環的名稱。
    • KEY_NAME 替換為金鑰名稱。
    • KEY_REVOCATION_ACTION 搭配 shut-downprevent-new,具體取決於您的金鑰撤銷偏好設定
    • SHUTDOWN_HOURS 與服務在撤銷後關閉前延遲的時間數小時。
    • REVISION 並使用新的修訂版本名稱,或刪除該版本 (如有)。如果您提供新的修訂版本名稱,則該名稱必須符合下列條件:
      • 開頭為 SERVICE-
      • 只能包含小寫英文字母、數字和 -
      • 結尾不是 -
      • 長度不得超過 63 個半形字元
  3. 使用下列指令,將服務替換為新設定:

    gcloud run services replace service.yaml

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_service 資源。

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE"
  location = "europe-west1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    encryption_key = "projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME"
  }
}

取代:

  • SERVICE 改為 Cloud Run 服務名稱。
  • PROJECT_NAME 與建立金鑰的專案名稱。
  • LOCATION 與建立金鑰的位置。必須與 Cloud Run 服務位置相符。
  • KEYRING_NAME 替換為金鑰環的名稱。
  • KEY_NAME 替換為金鑰名稱。

使用 Autokey

如果您尚未啟用,請啟用 Cloud KMS Autokey

任何設定變更都會建立新的修訂版本。除非您明確做出更新,否則後續的修訂版本也會自動取得這個設定。

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從選單中選取「Services」(服務),然後按一下「Deploy container」(部署容器),即可設定新的服務。如果您要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」

  3. 如果您要設定新服務,請填寫初始服務設定頁面,然後按一下「容器、磁碟區、網路與安全性」展開服務設定頁面。

  4. 按一下「安全性」分頁標籤。

    圖片

    • 在「加密」下方:
      1. 從「金鑰類型」選單中,選取「使用 Autokey 的 Cloud KMS」
      2. 按一下「索取金鑰」
      3. 按一下 [建立]。

        建立資源後即會顯示金鑰詳細資料。

      4. 在「金鑰撤銷動作」選單中,選擇下列任一選項:
        • 禁止新增容器執行個體:在撤銷 CMEK 後,系統不會啟動任何新執行個體。

        • 盡快關閉:在 CMEK 撤銷後,系統不會啟動新的執行個體,並關閉現有的執行個體。

        • 自訂關機延遲時間:指定服務關閉前延遲的時間長度 (以小時為單位)。

  5. 按一下 [Create] (建立) 或 [Deploy] (部署)

查看安全性設定

如要查看 Cloud Run 服務目前的安全性設定,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 按一下您感興趣的服務,開啟「服務詳細資料」頁面。

  3. 按一下「Revisions」(修訂版本) 分頁標籤。

  4. 在右側的詳細資料面板中,安全性設定會列在「Security」分頁下方。

gcloud

  1. 使用下列指令:

    gcloud run services describe SERVICE
  2. 在傳回的設定中找出安全性設定。

以來源為基礎的部署作業的其他設定

Cloud Run 原始碼部署作業函式需要額外的建構步驟。為確保此步驟符合 CMEK 規定,您必須執行下列操作:

  1. 建立自己的 CMEK 加密 Cloud Storage 值區。詳情請參閱 Cloud Storage 的 CMEK 說明文件

  2. 將原始碼上傳至 CMEK 加密的儲存空間值區,做為壓縮的封存檔案。

  3. 建立您自己的 CMEK 加密 Artifact Registry 存放區。詳情請參閱 Artifact Registry 的 CMEK 說明文件。這個存放區會儲存建構程序產生的構件。

  4. 部署函式,使用 --source--image 旗標傳遞建構資源。

    gcloud run deploy FUNCTION \
        --key KEY \
        --source CUSTOM_BUCKET_WITH_SOURCE_CODE \
        --image CUSTOM_AR_REPOSITORY \
        --function FUNCTION_ENTRYPOINT \
        --base-image BASE_IMAGE \
        --region REGION

取代:

  • FUNCTION 改為您要部署的函式名稱。您可以將這個參數完全省略,這樣系統會提示您輸入名稱。

  • KEY,其中包含完整的鍵名稱,格式如下:projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME

  • CUSTOM_BUCKET_WITH_SOURCE_CODE 與儲存原始碼的 Cloud Storage 位置 URI。請使用下列格式:gs://BUCKET_NAME/PATH_TO_SOURCE

  • CUSTOM_AR_REPOSITORY,其中包含 Artifact Registry 存放區的 URI,格式為 REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY_NAME/PACKAGE_NAME

  • FUNCTION_ENTRYPOINT 與原始碼中函式的進入點。這是 Cloud Run 在函式執行時執行的程式碼。這個標記的值必須是來源程式碼中存在的函式名稱或完全限定的類別名稱。

  • BASE_IMAGE 與函式的基礎映像檔環境。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「執行階段基礎映像檔」。

  • REGION 與您要部署函式的 Google Cloud 區域。例如:europe-west1

此外,如果您使用 Eventarc 觸發函式,請熟悉 Eventarc 的 CMEK 設定。特別是,在這種情況下,如果要完全符合規定,就必須加密對應於所用事件類型的管道。

測試 CMEK 撤銷

如要確認 CMEK 保護措施是否運作,您可以停用用於為服務啟用 CMEK 的金鑰,然後嘗試叫用服務:

  1. 執行下列指令,確認服務是否可供存取:

    curl SERVICE_URL

    SERVICE_URL 替換成服務網址。部署完成後,您可以在主控台 UI 中找到這個資訊:容器網址會顯示在「網址:」文字旁邊。

  2. 停用金鑰版本

  3. 等待您指定的 SHUTDOWN_HOURS 數量。如果您未指定關閉服務的時間數,請重新啟用金鑰,並編輯或重新部署服務,將值設為至少一小時。如果您已部署原始碼,請嘗試查看原始碼。嘗試應該會失敗。

  4. 等待您設定的 SHUTDOWN_HOURS 時間長度後,請重新執行下列指令,確認無法再存取服務:

     curl SERVICE_URL
     

  5. 確認金鑰版本已停用後,請啟用金鑰

瞭解稽核記錄和錯誤訊息

如果您負責監控稽核記錄,其中一項工作可能就是驗證 Cloud Run 服務中的 CMEK 作業。在這種情況下,您需要瞭解相關的稽核記錄。

如果您負責解決及修正 Cloud Run 服務的執行階段錯誤,可能需要排解 Cloud Run 服務運作期間記錄的 CMEK 相關錯誤。

以下各節將提供上述任務所需的資訊。

稽核記錄

KMS 稽核記錄會為使用金鑰執行的每項作業提供稽核記錄。對於啟用 CMEK 的 Cloud Run 服務,Cloud Run 會新增 Cloud Run 專屬的呼叫端內容,詳細說明系統為何存取客戶金鑰。下表列出稽核記錄中可能會看到的內容:

存取金鑰的原因 說明
Decrypting CMEK-encrypted layer during container clone start. 只要啟動新的例項,系統就會記錄。
Encrypting a newly created data-encryption-key w/ the customer-managed-encryption-key. 在部署支援 CMEK 的服務時記錄,其中資料加密金鑰會由 CMEK 包裝。
Decrypting an existing encrypted data-encryption-key, under the same customer-managed-encryption-key, to be used to encrypt container contents. 當新例項啟動時會記錄,這需要解密映像檔。
Performing an encrypt operation on dummy data to check the customer-managed-encryption-key status and access. 只要有鍵的驗證檢查 (定期執行),系統就會記錄。
Performing a decrypt operation on dummy data to check the customer-managed-encryption-key status and access. 只要有鍵的驗證檢查 (定期執行),系統就會記錄。

如要進一步瞭解稽核記錄格式和內容,請參閱 KMS 稽核記錄頁面。

錯誤訊息

請注意,外部金鑰管理工具提供的錯誤訊息會直接傳送至服務的 Cloud Run 記錄檔

下表列出您可能會看到的 CMEK 相關錯誤訊息,以及相關說明和可能的解決方法。

訊息 說明
User's service account does not have CMEK decrypter permission. Service account: %s 解決方法:允許服務存取金鑰
User's KMS operation quota has been exceeded. CMEK key: %s 支援 CMEK 的服務已超過 KMS 配額。解決方法:要求提高 KMS 配額
User's CMEK key has been disabled. CMEK key: %s CMEK 已遭撤銷。解決方法:變更服務的 CMEK,然後重新部署服務。
User's CMEK key has been destroyed. CMEK key: %s 已刪除 CMEK。解決方法:變更服務的 CMEK,然後重新部署服務。
User's CMEK key has been scheduled for deletion. CMEK Key: %s 系統已排定刪除 CMEK。解決方法:變更服務的 CMEK,然後重新部署服務。

後續步驟