工作負載是由工作負載作者建立,並處理資料協作者想使用的機密資料。
工作負載作者需要整合下列資源,才能建立工作負載:
應用程式:用於處理機密資料。您可以選擇任何語言編寫應用程式,但前提是必須建構支援該語言的容器化映像檔。
Artifact Registry 中的存放區,用於儲存 Docker 映像檔。
啟動政策:在容器映像檔上設定,控管工作負載的執行方式,並限制惡意工作負載運算子的功能。
如要部署工作負載,工作負載運算子會根據Confidential Space 映像檔執行機密 VM。這會從 Artifact Registry 擷取容器化映像檔並執行。
資料協作者必須先驗證工作負載的認證,才能存取資料。
事前準備
為 Confidential Space 編寫工作負載不只是撰寫程式碼和偵錯,您還需要與資料協作者討論,評估他們的需求、設定環境、將程式碼封裝到容器化映像檔,以及與工作負載運算子合作,確保所有項目都能正確部署。
與資料協作者討論
開始編寫應用程式前,請先與資料協作者討論他們希望您處理的私人資料。您可以詢問以下問題:
涉及的機構 ID 為何?
涉及哪些專案編號?
我需要存取哪些 Google Cloud 資源,以及這些資源的 ID 和名稱?
是否有我需要存取的資源並非由 Google CloudIAM 管理?
您想使用哪項認證服務?Google Cloud Attestation 還是 Intel Trust Authority?
應用程式應如何比較及處理私人資料?
輸出內容應採用哪種格式?
輸出內容應儲存在何處?是否應加密?
所有資料協作者看到的結果都一樣,還是輸出內容各不相同?
此外,每位資料協作者可能也有獨特的隱私權規定,您必須遵守。請務必確保工作負載不會洩漏任何私人資料。
建構 Confidential Space 解決方案
建議您設定兩個 (或更多) 專案,並授予適當權限,做為測試環境,如「建立第一個 Confidential Space 環境」一文所述。請盡量模仿資料協作者的專案設定。這有助於您熟悉跨專案權限,並從特定 Google Cloud 資源擷取所需資料。您也可以藉此瞭解工作負載運算子和資料協作者的角色,以及他們的職責。
在早期建構階段,觀察下列做法很有幫助:
擔任資料協作者時,請盡量減少認證驗證,以加快開發速度。
擔任工作負載運算子時,請在部署工作負載時使用 Confidential Space 偵錯映像檔,而非正式版。這樣一來,您就能以更多方式排解工作負載問題。
隨著應用程式日趨成熟,狀態也變得更容易預測,您可以透過認證驗證和啟動政策,逐步鎖定解決方案,並切換至正式環境的 Confidential Space 映像檔。
在測試環境中正確執行工作負載後,您就可以切換至資料協作者的專案,使用真實資源但虛擬資料進行測試,向資料協作者展示一切運作方式。此時,您可能會開始與獨立工作負載運算子合作。
一切運作正常且輸出結果符合預期後,即可開始測試生產資料。測試完成且所有相關人員簽署結果後,工作負載即可投入生產。
請謹慎處理輸出內容
測試程式碼時,您可能會想透過列印至 STDOUT 或 STDERR 進行偵錯。如果選擇這麼做,請小心不要公開私人資料,以免其他方可透過存取記錄讀取這些資料。在程式碼開始處理正式版之前,請確認程式碼不會輸出嚴格必要內容以外的任何項目。
最終輸出內容也是如此。請只提供最終結果,且不得洩漏原始資料的隱私和敏感資訊。
使用 Docker 建構容器化映像檔
應用程式必須封裝成由 Docker 建構的容器化映像檔,並儲存在 Artifact Registry 中。部署工作負載時,Confidential Space 映像檔會從 Artifact Registry 存放區擷取 Docker 映像檔並執行,應用程式即可開始處理適當的專案資源。
建構 Docker 映像檔時,請注意下列事項:
其他 Linux 功能
Confidential Space 工作負載會在 Linux 容器中執行,並使用 containerd。這個容器會使用預設 Linux 功能執行。
如要新增功能,可以使用 tee-added-capabilities。
磁碟和記憶體限制
使用較大的開機磁碟大小時,Confidential Space 會自動調整開機磁碟有狀態分割區的大小。分割區大小約為開機磁碟大小減去 5 GB。
為確保 Confidential Space 檔案系統的完整性,Confidential Space 會在記憶體中儲存磁碟完整性標記。每個磁碟位元組約會使用 1% 的記憶體負荷。舉例來說,100 GB 的磁碟需要 1 GB 的記憶體,10 TB 的磁碟則需要 100 GB 的記憶體。
請務必遵守 VM 記憶體限制。Confidential Space VM 會停用交換記憶體,因此記憶體用量過多可能會導致工作負載當機。確認所選機器除了磁碟完整性負擔外,也支援工作負載的記憶體用量。
記憶體內暫存掛接
Confidential Space 支援新增記憶體內暫存空間。這會使用 Confidential Space VM 中的可用記憶體。由於暫存空間會使用 Confidential VM 的記憶體,因此與 Confidential VM 具有相同的完整性和機密性。
您可以運用 tee-dev-shm-size 來增加工作負載的 /dev/shm 共用記憶體掛接大小。/dev/shm 大小以 KB 為單位。
您可以使用 tee-mount,以半形分號分隔的設定,在執行中的容器中指定 tmpfs 掛接點。type 和 source 一律為 tmpfs。destination 是掛接點,會與 tee.launch_policy.allow_mount_destinations 啟動政策互動。您可以選擇以位元組為單位指定 tmpfs 大小。預設大小為 VM 記憶體的 50%。
傳入連接埠
根據預設,機密空間 VM 會使用防火牆規則封鎖所有連入連接埠。使用 230600 以上版本的機密空間映像檔時,您可以在建構工作負載映像檔時,指定要保持開啟的連入連接埠。Dockerfile
如要開啟通訊埠,請將 EXPOSE 關鍵字新增至 Dockerfile,並一併新增要保持開啟的通訊埠號碼,以及選用的 tcp 或 udp 通訊協定。如果未指定通訊埠的通訊協定,系統會允許 TCP 和 UDP。以下是公開傳入通訊埠的 Dockerfile 範例:
FROM alpine:latest
EXPOSE 80
EXPOSE 443/tcp
EXPOSE 81/udp
WORKDIR /test
COPY salary /test
ENTRYPOINT ["/test/salary"]
CMD []
視您使用的基本映像檔而定,部分連接埠可能已公開。Dockerfile 只會公開額外連接埠,無法封鎖基礎映像檔已開啟的連接埠。
工作負載運算子應確保在執行工作負載前,VPC 防火牆中已開啟公開的連接埠。連接埠號碼可由工作負載作者提供,或從 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"}
...
)
下表列出可用的啟動政策:
| 政策 | 類型 | 說明 |
|---|---|---|
|
互動對象:
|
布林值 (預設值為 false) |
決定工作負載運算子是否能將其他 Linux 功能新增至工作負載容器。 |
|
互動對象:
|
布林值 (預設值為 false) |
決定工作負載容器是否可在 /sys/fs/cgroup 掛接命名空間
cgroup。
|
|
互動對象:
|
布林值 (預設值為 false) |
決定工作負載運算子是否能使用
tee-cmd 中繼資料值,覆寫工作負載容器 Dockerfile 中指定的
CMD。 |
|
互動對象:
|
以半形逗號分隔的字串 |
以半形逗號分隔的允許環境變數名稱字串,工作負載運算子可使用
tee-env-ENVIRONMENT_VARIABLE_NAME
中繼資料值設定這些變數。
|
|
互動對象:
|
以半形冒號分隔的字串 |
以半形冒號分隔的字串,內含工作負載運算子可使用 例如: |
|
互動對象:
|
定義的字串 |
如果工作負載運算子將
有效值如下:
|
|
互動對象:
|
定義的字串 |
如果工作負載運算子將
有效值如下:
|
多次執行工作負載
如要重新執行工作負載,工作負載運算子必須重新啟動 VM 執行個體。這會在盡可能乾淨的環境中啟動工作負載,並使用新的暫時金鑰加密 VM 執行個體的磁碟。
重新啟動可解決攻擊向量,也就是在下載及測量工作負載映像檔後,修改磁碟上的映像檔。不過,這也會增加啟動時間,以及將工作負載映像檔拉入每次工作負載執行作業等額外負擔。如果這些額外負擔對工作負載的效能影響過大,您可以將工作負載重新啟動編碼到工作負載本身,但這麼做會增加風險。
命名空間 cgroup
根據預設,Confidential Space 工作負載會在沒有 cgroup 掛接的情況下執行。
如要在工作負載容器中管理 cgroup,可以使用 tee-cgroup-ns。這個中繼資料鍵會指示 VM 執行個體在容器檔案系統的 /sys/fs/cgroup 建立掛接點。
可重現的容器映像檔
以可重現的方式建構容器映像檔,有助於提高各方之間的信任感。您可以使用 Bazel 建構可重現的映像檔。
不受 Google Cloud IAM 管理的資源
如要存取 Google Cloud IAM 未管理的資源,工作負載必須指定自訂目標對象。
詳情請參閱「存取未由 Google Cloud IAM 管理的資源」。
已簽署的容器映像檔
您可以使用公開金鑰簽署容器映像檔,資料協作者隨後即可使用該金鑰進行驗證,而不必在 WIP 政策中指定映像檔摘要。
也就是說,資料協作者不必在每次更新工作負載時更新 WIP 政策,工作負載也能持續存取受保護的資源,不會中斷。
您可以使用 Sigstore Cosign 簽署容器映像檔。如要讓 Confidential Space 擷取簽章,工作負載運算子必須先將簽章資訊新增至 tee-signed-image-repos 中繼資料變數,再部署工作負載。
在執行階段,簽章會傳送至驗證服務進行驗證。驗證服務會傳回驗證聲明權杖,其中包含經過驗證的簽章聲明。以下是簽章聲明範例:
"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",
}
]
如要設定容器映像檔簽署,請參閱已簽署的容器映像檔程式碼實驗室。