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

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

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

使用 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 建立的函式無法使用 Autokey。

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 Encrypter/Decrypter」

    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。只有具備「擁有者」(roles/owner) 或「Cloud KMS 管理員」(roles/cloudkms.admin) 角色的 IAM 成員,才能授予或撤銷 Cloud KMS 資源的存取權。

為 Cloud Run 服務設定 CMEK

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

控制台

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

    前往 Cloud Run

  2. 從選單中選取「服務」,然後按一下「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後點選「Edit and deploy new revision」(編輯及部署新修訂版本)

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

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

    圖片

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

        • 選取「手動輸入金鑰」,以「projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME」格式輸入專案中的密鑰。

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

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

      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_ACTIONshut-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_ACTIONshut-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. 從選單中選取「服務」,然後按一下「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後點選「Edit and deploy new revision」(編輯及部署新修訂版本)

  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. 在右側的詳細資料面板中,安全設定會列在「安全性」分頁下方。

gcloud

  1. 使用下列指令:

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

以來源為準的部署作業額外設定

Cloud Run 來源部署函式需要額外的建構步驟。為確保這個步驟符合 CMEK 規定,您必須完成下列事項:

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

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

  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 替換成服務網址。部署完成後,您可以在主控台使用者介面中找到這個網址,容器網址會顯示在「網址:」文字旁邊。

  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,然後重新部署服務。

後續步驟