建立及自訂工作負載


工作負載是由工作負載作者建立,並處理資料協作者想使用的機密資料。

工作負載作者需要準備下列資源,才能建立工作負載:

  • 應用程式:用於處理機密資料。只要建構支援所選語言的容器化映像檔,您就能以任何語言撰寫應用程式。

  • 容器化映像檔:使用 Docker 將應用程式封裝至容器化映像檔。

  • Artifact Registry 中的存放區,用於儲存 Docker 映像檔。

  • 啟動政策:設定容器映像檔,控管工作負載的執行方式,並限制惡意工作負載運算子的功能。

如要部署工作負載,工作負載運算子會根據 Confidential Space 映像檔執行機密 VM。這會從 Artifact Registry 擷取容器化映像檔並執行。

資料協作者必須驗證工作負載的認證,才能存取資料。

事前準備

為 Confidential Space 編寫工作負載時,不只是撰寫程式碼和偵錯,您也需要與資料協作者討論,評估他們的需求、設定環境、將程式碼封裝到容器化映像檔,並與工作負載運算子合作,確保所有項目都能正確部署。

與資料協作者交談

開始編寫應用程式之前,您需要與資料協作者討論他們希望您處理的私人資料。你可以詢問的問題包括:

  • 涉及的機構 ID 為何?

  • 涉及哪些專案編號?

  • 我需要存取哪些 Google Cloud 資源,以及這些資源的 ID 和名稱?

  • 是否有我需要存取的資源並非由 Google CloudIAM 管理?

  • 應用程式應如何比較及處理私人資料?

  • 輸出內容應採用哪種格式?

  • 輸出內容應儲存在何處?是否應加密?

  • 所有資料協作者看到的結果是否相同,還是輸出內容各不相同?

此外,每個資料協作者可能也有獨特的隱私權規定,您必須遵守。請務必確保工作負載不會導致任何私人資料外洩。

建構 Confidential Space 解決方案

建議您設定兩個 (或更多) 專案,並授予適當的權限,做為測試環境,就像「建立第一個 Confidential Space 環境」一文所述。盡量模仿資料協作者的專案設定。這有助於您熟悉跨專案權限,並從特定 Google Cloud 資源擷取所需資料。您也可以藉此瞭解工作負載運算子和資料協作者的角色,以及各自的職責。

在建構初期,建議您遵循下列做法:

  • 以資料協作者身分工作時,為了加快開發速度,請盡量減少認證驗證

  • 以工作負載運算子身分作業時,請在部署工作負載時使用 Confidential Space 偵錯映像檔,而非正式版。方便您以更多方式排解工作負載問題。

隨著應用程式日趨成熟,狀態也變得更容易預測,您可以透過認證驗證啟動政策,逐步鎖定解決方案,並切換至正式版 Confidential Space 映像檔。

在測試環境中正確執行工作負載後,您就可以切換至資料協作者的專案,使用實際資源但虛擬資料進行測試,向資料協作者展示所有作業的運作方式。此時,您可能會開始使用獨立工作負載運算子。

一切正常運作且輸出內容符合預期後,即可開始測試生產資料。測試完成且所有相關人員都核准結果後,工作負載即可投入正式環境。

請謹慎處理輸出內容

測試程式碼時,您可能會想透過列印至 STDOUTSTDERR 進行偵錯。如果選擇這麼做,請小心不要公開私人資料,以免其他方可透過存取記錄讀取這些資料。在程式碼開始處理正式版之前,請確認程式碼不會輸出嚴格必要以外的任何內容。

最終輸出內容也是如此。請只提供最終結果,且不得洩漏原始資料的隱私和敏感資訊。

使用 Docker 建構容器化映像檔

應用程式必須封裝成由 Docker 建構的容器化映像檔,並儲存在 Artifact Registry 中。部署工作負載時,機密空間映像檔會從 Artifact Registry 存放區提取 Docker 映像檔並執行,應用程式即可開始處理適當的專案資源。

建構 Docker 映像檔時,請注意下列事項:

其他 Linux 功能

Confidential Space 工作負載會使用 containerd 在 Linux 容器中執行。這個容器會使用預設 Linux 功能執行。

如要新增功能,可以使用 tee-added-capabilities

磁碟和記憶體限制

使用較大的開機磁碟大小時,機密空間會自動調整開機磁碟有狀態分割區的大小。 分割區大小約為開機磁碟大小減去 5 GB。

為確保機密空間檔案系統的完整性,機密空間會在記憶體中儲存磁碟完整性標記。每個磁碟位元組約會使用 1% 的記憶體負荷。舉例來說,100 GB 的磁碟需要 1 GB 的記憶體,10 TB 的磁碟則需要 100 GB 的記憶體。

請務必遵守 VM 記憶體限制。機密空間 VM 會停用交換記憶體,因此記憶體用量過多可能會導致工作負載當機。除了磁碟完整性額外負荷外,請確保所選機器支援工作負載記憶體用量。

過期的 OIDC 權杖

工作負載啟動時,系統會提供 OIDC 權杖供其使用。其中包含工作負載 VM 的已驗證認證聲明,並儲存在工作負載容器的 /run/container_launcher/attestation_verifier_claims_token 中。權杖會在 60 分鐘後失效。

如果權杖過期,系統會使用指數輪詢在背景嘗試重新整理,直到成功為止。如果重新整理失敗 (因網路問題、認證服務中斷或其他原因),工作負載程式碼必須能夠處理該失敗。

您的工作負載可以透過下列其中一種方式處理權杖重新整理失敗:

  • 忽略過期的權杖,假設初始使用後就不再需要。

  • 等待系統成功重新整理過期的權杖。

  • 結束工作負載。

記憶體內暫存掛接

Confidential Space 支援新增記憶體內暫存空間。這會使用 Confidential Space VM 中的可用記憶體。由於暫存空間使用機密 VM 的記憶體,因此與機密 VM 具有相同的完整性和機密性屬性。

您可以運用 tee-dev-shm-size 來增加工作負載的 /dev/shm 共用記憶體掛接大小。/dev/shm 大小以 KB 為單位。

您可以使用 tee-mount,以半形分號分隔的設定,在執行中的容器中指定 tmpfs 掛接。typesource 一律為 tmpfsdestination 是掛接點,會與 tee.launch_policy.allow_mount_destinations 啟動政策互動。您可以選擇指定tmpfs大小 (以位元組為單位)。預設大小為 VM 記憶體的 50%。

傳入通訊埠

根據預設,Confidential Space VM 會透過防火牆規則運作,封鎖所有連入通訊埠。使用 230600 以上版本的 Confidential Space 映像檔時,您可以在建構工作負載映像檔時,指定要在 Dockerfile 中保持開啟的連入埠。

如要開啟通訊埠,請在 Dockerfile 中新增 EXPOSE 關鍵字,以及要保持開啟的通訊埠號碼,並視需要新增 tcpudp 通訊協定。如果未指定通訊埠的通訊協定,系統會允許 TCP 和 UDP。以下範例 Dockerfile 會公開連入埠:

FROM alpine:latest
EXPOSE 80
EXPOSE 443/tcp
EXPOSE 81/udp
WORKDIR /test
COPY salary /test
ENTRYPOINT ["/test/salary"]
CMD []

視您使用的基本映像檔而定,某些連接埠可能已公開。您的 Dockerfile 只會公開其他連接埠,無法封鎖基本映像檔已開啟的連接埠。

工作負載運算子應確保公開的連接埠在虛擬私有雲防火牆中處於開啟狀態,再執行工作負載。工作負載作者可以提供連接埠號碼,也可以從 Docker 映像檔資訊中提取。

公開的連接埠會記錄在控制台中,並在使用 tee-container-log-redirect 中繼資料變數時重新導向至 Cloud Logging。

發布政策

啟動政策會覆寫工作負載運算子設定的 VM 中繼資料變數,以限制惡意動作。工作負載作者可以在建構容器映像檔時,使用標籤設定政策。

例如,在 Dockerfile 中:

LABEL "tee.launch_policy.allow_cmd_override"="true"

在 Bazel BUILD 檔案中:

container_image(
    ...
    labels={"tee.launch_policy.allow_cmd_override":"true"}
    ...
)

下表列出可用的發布政策:

政策 類型 說明

tee.launch_policy.allow_capabilities

互動對象:

布林值 (預設值為 false) 決定工作負載運算子是否能將其他 Linux 功能新增至工作負載容器。

tee.launch_policy.allow_cgroups

互動對象:

布林值 (預設值為 false) 決定是否允許工作負載容器在 /sys/fs/cgroup 中加入命名空間 cgroup 掛接點。

tee.launch_policy.allow_cmd_override

互動對象:

布林值 (預設值為 false) 判斷工作負載容器 Dockerfile 中指定的 CMD 是否可由工作負載運算子以 tee-cmd 中繼資料值覆寫。

tee.launch_policy.allow_env_override

互動對象:

以半形逗號分隔的字串 以半形逗號分隔的允許環境變數名稱字串,工作負載運算子可使用 tee-env-ENVIRONMENT_VARIABLE_NAME 中繼資料值設定這些變數。

tee.launch_policy.allow_mount_destinations

互動對象:

  • 工作負載運算子 tee-mount 中繼資料變數。
以半形冒號分隔的字串

以半形冒號分隔的字串,列出工作負載運算子可使用 tee-mount 掛接的目錄。

例如:/run/tmp:/var/tmp:/tmp

tee.launch_policy.log_redirect

互動對象:

定義的字串

如果工作負載運算子將 tee-container-log-redirect 設為 true,則決定記錄作業的運作方式。

有效值如下:

  • debugonly (預設):使用偵錯圖片時,只允許 stdoutstderr 重新導向。
  • always:一律允許 stdoutstderr 重新導向。
  • never:一律不允許 stdoutstderr 重新導向。

tee.launch_policy.monitoring_memory_allow

互動對象:

定義的字串

如果工作負載運算子將 tee-memory-monitoring-enable 設為 true,系統會決定工作負載記憶體用量監控的運作方式。

有效值如下:

  • debugonly (預設):僅在使用偵錯映像檔時,才允許監控記憶體用量。
  • always:一律允許監控記憶體用量。
  • never:一律不允許監控記憶體用量。

多次執行工作負載

為確保環境乾淨,您必須重新啟動 VM,才能重新啟動工作負載。 這會使用暫時性金鑰加密 VM 磁碟,以解決在下載及測量磁碟上的工作負載映像檔後,修改該映像檔的攻擊媒介。

這也會增加啟動時間和將工作負載映像檔拉取至每次工作負載執行等額外負擔。如果這些額外負荷對工作負載的效能影響過大,您可以將工作負載重新啟動的程式碼編寫到工作負載本身,但這麼做會增加風險。

命名空間 cgroup

預設情況下,機密空間工作負載會在沒有 cgroup 掛接的情況下執行。

如要在工作負載容器中管理 cgroup,可以使用 tee-cgroup-ns。這會在容器檔案系統中建立掛接點 /sys/fs/cgroup

可重現的容器映像檔

以可重現的方式建構容器映像檔,有助於提高各方之間的信任感。您可以使用 Bazel 建構可重現的映像檔

未由 Google Cloud IAM 管理的資源

如要存取 Google Cloud IAM 未管理的資源,工作負載必須指定自訂對象。

詳情請參閱「存取 Google Cloud IAM 未管理的資源」。

已簽署的容器映像檔

您可以使用公開金鑰簽署容器映像檔,資料協作者隨後即可使用該金鑰進行認證,而不必在 WIP 政策中指定映像檔摘要。

也就是說,資料協作者不必在每次更新工作負載時更新 WIP 政策,工作負載也能持續存取受保護的資源,不會中斷。

您可以使用 Sigstore Cosign 簽署容器映像檔。為確保 Confidential Space 可以擷取簽章,工作負載運算子必須先將簽章資訊新增至 tee-signed-image-repos 中繼資料變數,再部署工作負載。

在執行階段期間,簽章會傳送至 Confidential Space 驗證服務進行驗證。認證服務會傳回認證聲明符記,其中包含經過驗證的簽章聲明。以下是簽章聲明的範例:

"image_signatures": [
  {
    "key_id": "hexadecimal-sha256-fingerprint-public-key1",
    "signature": "base64-encoded-signature",
    "signature_algorithm": "RSASSA_PSS_SHA256"
  },
  {
    "key_id": "hexadecimal-sha256-fingerprint-public-key2",
    "signature": "base64-encoded-signature",
    "signature_algorithm": "RSASSA_PSS_SHA256",
  },
  {
    "key_id": "hexadecimal-sha256-fingerprint-public-key3",
    "signature": "base64-encoded-signature",
    "signature_algorithm": "RSASSA_PSS_SHA256",
  }
],

如要設定容器映像檔簽署,請參閱已簽署的容器映像檔 Codelab