全部產品
Search
文件中心

Elastic Compute Service:機密計算執行個體的磁碟度量與加密保護

更新時間:Jun 12, 2026

本文介紹如何使用 CryptPilot 解決機密計算執行個體的資料落盤保護問題,通過對執行個體的根檔案系統進行可信度量以防止軟體篡改,並對雲端硬碟資料實施加密以實現落盤機密性。

機密計算執行個體(如TDX執行個體、異構機密執行個體)通過寄存器加密、記憶體加密等硬體能力保護運行時資料,但程式碼及其處理的資料通常仍儲存在雲端硬碟上,需要額外機制對落盤資料進行保護。本文介紹如何使用CryptPilot在機密計算執行個體中實現磁碟的度量與加密保護,並自主管理雲端硬碟的加密金鑰。

機密計算執行個體的磁碟保護有兩種方案,可獨立使用,也可組合使用:

  • 機密系統硬碟的度量與加密:在製作系統硬碟鏡像階段引入 dm-verity 度量,並可選疊加 LUKS2 加密。系統啟動時對 rootfs 進行完整性校正,並通過遠程證明從信任管理服務擷取解密密鑰。適用於需要對整機環境進行可信度量的情境,也可在此基礎上加密系統硬碟。

  • 機密資料盤的加密:在已啟動並執行機密計算執行個體上,對單獨的資料盤分區進行 LUKS2 加密。適用於已有業務執行個體、希望在不重做鏡像的前提下僅對部分資料盤進行加密保護的情境。

你可以根據自身情境選擇閱讀:若需要為機密執行個體製作可度量、可信啟動的系統鏡像請參閱機密系統硬碟的度量與加密;若僅需在已啟動並執行執行個體上加密部分資料盤,請參閱機密資料盤的加密

機密系統硬碟的度量與加密

機密系統硬碟組成與保護

使用CryptPilot處理後的機密系統硬碟如下所示,資料以卷(Volume)為單元組織,包含兩個重要磁碟區:

  • rootfs卷:唯讀根檔案系統。啟動時基於 Linux 核心 dm-verity對 rootfs 卷構建完整的雜湊樹,根雜湊值存入安全記憶體並記入機密執行個體的CC Eventlog,供遠程證明校正啟動鏈完整性。核心逐層校正每個資料區塊的雜湊值與預存根雜湊值的一致性,任何未經授權的篡改都會被即時檢測並阻止啟動。為保持業務相容性,系統在唯讀 rootfs 之上疊加一個可寫覆蓋層,覆蓋層的後端儲存由 delta 卷承載,臨時寫入不影響度量結果。

    對該卷的加密是可選的。若啟用,則基於 LUKS2(AES-256),由裝置隨機產生 Master Key 用於資料加解密;使用者提供的 Passphrase 經密鑰派生演算法產生 KEK,對 Master Key 加密後存於卷頭。啟動時通過遠程證明擷取 KEK 解密 Master Key,加解密均在機密執行個體的安全記憶體中完成。

  • delta卷:系統硬碟剩餘空間組成的加密卷,始終以 LUKS2 加密,承載 rootfs 可寫覆蓋層的後端資料。使用者在 rootfs 上的所有寫入操作最終都會加密落入 delta 卷。

使用流程

步驟一:準備受信任環境

受信任環境需滿足以下條件:

  • Alibaba Cloud Linux 3作業系統:製作機密系統硬碟的Cryptpilot工具依賴於Alibaba Cloud Linux 3。

  • 開通公網IP:機密計算執行個體啟動過程中會訪問Trustee伺服器以擷取解密密鑰。

  • 有足夠的空間:取決於您要製作的系統硬碟鏡像檔案的大小,建議您的環境中有超過40 GiB的空閑空間。

步驟二:製作機密系統硬碟鏡像

  1. 準備源磁碟鏡像

    在製作機密系統硬碟之前,您需要準備一個已完成業務部署的磁碟鏡像檔案。該鏡像可通過以下兩種方式擷取:

    從已有 ECS 執行個體匯出系統鏡像

    在已有的阿里雲 ECS 執行個體上部署並配置好您的業務環境,然後通過控制台或 API 將該執行個體的系統鏡像匯出為qcow2檔案。

    使用官方提供的基礎鏡像進行定製

    從阿里雲官網下載最新的 Alibaba Cloud Linux 3 基礎鏡像,並使用virt-customize工具對鏡像內容進行個人化定製(如安裝軟體包、佈建服務、添加您的業務程式等),以滿足業務需求。

    您可以訪問 Alibaba Cloud Linux 3 On-premise Image頁面,擷取最新的發行版下載連結。例如,使用以下命令下載指定版本的 QCOW2 鏡像檔案:

    curl -O -L -C - https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2
    說明
    • 僅支援 .qcow2.vhd 格式的 Alibaba Cloud Linux 3 作業系統磁碟鏡像檔案;

    • 鏡像一旦通過 cryptpilot-convert 處理後,將無法再修改其內容,因此請確保在處理前已完成所有必要的配置和定製。

  2. (可選)加固鏡像

    對於運行在機密計算環境中的執行個體,加固可有效減少攻擊面,防止不必要的服務或組件引入安全風險,提升整體安全性。

    您可以參考下文的鏡像加固章節,在鏡像定製階段完成相關操作後再執行加密。

  3. 安裝Cryptpilot並準備設定檔

    1. 安裝Cryptpilot。

      在受信任的構建環境中安裝 host 包(提供 cryptpilot-convert、cryptpilot-enhance、cryptpilot-fde-host 等製作機密系統硬碟鏡像的工具):

      sudo yum install -y cryptpilot-fde-host
    2. 查看Cryptpilot版本。

      cryptpilot-fde-host --version

      image

    3. 建立一個存放Cryptpilot設定檔的目錄。

      mkdir -p ./config_dir
    4. 寫入系統硬碟配置。

      CryptPilot支援單獨設定機密系統硬碟的rootfs卷與delta卷的加密配置,應根據業務情境 是否需要加密rootfs卷以及差異資料(在delta卷上)是否需要持久化儲存資料 兩個維度來選擇。下面列出了四種組合對應的 fde.toml 內容,請將所選儲存格的內容寫入 ./config_dir/fde.toml

      rootfs卷不加密 + delta卷不持久化

      [rootfs]
      delta_location = "disk"
      
      [delta]
      integrity = true
      [delta.encrypt.otp]

      rootfs卷不加密 + delta卷需要持久化

      [rootfs]
      delta_location = "disk-persist"
      
      [delta]
      integrity = true
      [delta.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/delta"

      rootfs卷加密 + delta卷不持久化

      [rootfs]
      delta_location = "disk-persist"
      [rootfs.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/rootfs"
      
      [delta]
      integrity = true
      [delta.encrypt.otp]

      rootfs卷加密 + delta卷需要持久化

      [rootfs]
      delta_location = "disk-persist"
      [rootfs.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/rootfs"
      
      [delta]
      integrity = true
      [delta.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/delta"
      說明
      • 使用OTP時,delta卷每次啟動自動產生新的隨機密鑰,資料在關機後即丟失,無需部署任何密鑰後端。OTP的概念詳見一次性密鑰(OTP)

      • 使用Trustee等持久化密鑰後端時,請將配置中的<trustee-ip>替換為您部署Trustee服務的執行個體公網IP地址(若已為Trustee配置HTTPS訪問,請將kbs_url中的http://替換為https://)。各密鑰擷取方式的詳細配置說明,請參見信任管理服務(Trustee)

  4. 製作機密系統硬碟鏡像檔案

    1. 製作機密系統硬碟鏡像檔案。

      • 如果您的配置是 不需要加密rootfs卷:

        sudo cryptpilot-convert --uki --in ./aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2 --out ./confidential-disk.qcow2 --config-dir ./config_dir/ --rootfs-no-encryption
      • 如果您的配置是 需要加密rootfs卷:

        sudo cryptpilot-convert --uki --in ./aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2 --out ./confidential-disk.qcow2 --config-dir ./config_dir/ --rootfs-passphrase "<rootfs卷加密金鑰>"
        說明
        • <rootfs卷加密金鑰>請與為rootfs卷上傳到密鑰後端的加密金鑰保持一致。

        • 由於delta卷的加密發生在執行個體啟動過程中,因此在建立機密系統硬碟鏡像檔案時,您不需要指定delta卷的密碼。

        • 如果您需要在系統硬碟中安裝額外的rpm包,可以使用--package選項指定rpm包的名稱或路徑。

    2. 檢查產生的鏡像。

      機密系統硬碟鏡像預設在./confidential-disk.qcow

      file ./confidential-disk.qcow2

      image

步驟三:匯入自訂鏡像並建立機密執行個體

  1. 上傳自訂鏡像到OSS

    上傳本地鏡像檔案至OSS,並擷取檔案URL,詳情請參見上傳檔案

  2. 匯入自訂鏡像

    匯入自訂鏡像時,啟動模式必須為UEFI

    image

  3. 匯入成功後,在鏡像詳情頁,修改NVMe驅動為支援

    image

步驟四:使用匯入的自訂鏡像建立機密計算執行個體

  1. 使用匯入的自訂建立TDX機密計算執行個體異構機密計算執行個體

    建立執行個體時,需要注意以下參數:

    • 鏡像:選擇已匯入的自訂鏡像,並選中機密虛擬機器

      image

    • 公網IP:選中分配公網IPv4地址,以便您的執行個體能夠訪問到Trustee服務以通過遠程證明擷取密鑰。

    • 登入憑證:選擇金鑰組

      使用Cryptpilot製作的機密系統硬碟暫不支援使用密碼方式登入。

  2. (可選)如果您部署了Trustee服務,請在其對應執行個體的安全性群組開放機密執行個體的公網IP訪問入方向8081連接埠的許可權。

    image

  3. 重啟機密計算執行個體

  4. 使用Workbench終端串連機密計算執行個體

    如果可以正常串連執行個體,說明執行個體可以正常訪問Trustee服務並通過遠程證明擷取密鑰。

步驟五:(可選)在Trustee服務中註冊參考值

如果您配置了Trustee作為密鑰的儲存後端,在執行個體的啟動過程中,會向Trustee服務發起請求擷取磁碟解密密鑰。而Trustee服務會通過遠程證明機制對執行個體中的環境進行驗證,檢查其是否運行在TEE執行個體中。在此之上,如果您還想要對所啟動並執行鏡像做驗證,則需要先將鏡像的參考值註冊到Trustee中。

  1. 使用Cryptpilot電腦密系統硬碟鏡像的參考值,並儲存在reference-value.json中。

    sudo cryptpilot-fde-host show-reference-value --disk ./confidential-disk.qcow2 | tee ./reference-value.json

    樣本輸出如下,其中466713bf9b2dacca6cd15ff4acd050712e29b4164628e01bd2495411766f36d7ba4560f62537926cf16e08480f1c1804便是該鏡像的參考值:image

  2. 匯入參考值到Trustee服務中。

    provenance=$(cat ./reference-value.json | base64 --wrap=0)
    cat << EOF > ./register-request.json
    {
        "version" : "0.1.0",
        "type": "sample",
        "payload": "$provenance"
    }
    EOF
    
    rvps-tool register --path ./register-request.json

鏡像加固

機密計算環境中,鏡像自身的安全配置直接影響整體可信性,建議在加密前對鏡像進行安全強化:

  1. 攻擊面最小化:預裝的雲端服務組件(如雲助手、監控代理)在機密計算情境下會擴大攻擊面,移除可降低被利用的風險。

  2. 資料隔離保障:未關閉的管理服務可能成為資料泄露的通道,加固可確保只有必要的服務運行。

  3. 訪問入口管控:禁用 SSH 等遠端存取以阻斷未授權登入,確保計算環境的封閉性。

加固工具說明

為簡化加固流程,我們提供了cryptpilot-enhance工具,該工具整合了鏡像安全強化的最佳實務。

說明

若您使用 ECS 執行個體快照匯出的鏡像,而非從官方源擷取的 Alibaba Cloud Linux 3 基礎鏡像從頭定製您的鏡像,則可能已預裝雲助手(Cloud Assistant)或Security Center(Server Guard Aegis),cryptpilot-enhance 工具會自動識別並卸載這些組件。

重要

經過cryptpilot-convert產生的鏡像已經固化內容,無法進行修改,因此需要在其之前運行cryptpilot-enhance。

cryptpilot-enhance支援兩種加固模式:

  • full:完全加固。移除 SSH 服務,實施最嚴格存取控制。

  • partial:部分加固。保留 SSH 服務但強制密鑰認證,適用於需遠程維護的生產環境。

包含如下加固內容:

加固模式

內容

通用加固項(兩種模式均執行)

  • 卸載阿里雲助手

  • 卸載Server Guard

  • 禁用 rpcbind 服務

  • 移除 cloud-init

  • 使用者賬戶清理

  • 清除 Bash 記錄

full 模式

  • 徹底卸載 SSH 服務

partial 模式

  • SSH 安全配置強化:

    • 禁用密碼登入:PasswordAuthentication no

    • 啟用密鑰認證:PubkeyAuthentication yes

    • 限制 root 登入方式:PermitRootLogin prohibit-password

    • 禁用高風險功能:X11Forwarding noAllowTcpForwarding no

  • 若提供公開金鑰,則注入至 root 使用者的 ~/.ssh/authorized_keys

加固工具樣本

  • 對鏡像執行完全加固:

    cryptpilot-enhance \
      --mode full \
      --image ./os-disk.qcow2
  • 對鏡像執行部分加固並注入 SSH 公開金鑰:

    cryptpilot-enhance \
      --mode partial \
      --image ./os-disk.qcow2 \
      --ssh-key ~/.ssh/id_rsa.pub

機密資料盤的加密

在機密計算情境中,除了保護整個系統硬碟,也可以僅在已啟動並執行機密執行個體上對部分資料盤分區進行加密。本章節介紹如何在機密計算執行個體內對資料盤實施 LUKS2 加密,同時實現密鑰自主管理。

加密原理

機密雲端硬碟基於Linux平台的LUKS2技術實現,提供Block Storage層級的資料加密保護能力。包含初始化與開啟兩個流程:

  • 初始化:選定一個塊裝置(如 /dev/nvme1n1p1),由安全隨機數演算法產生一個裝置唯一的 Master Key,用於 AES-256 加密。Master Key 本身由使用者提供的 Passphrase 經密鑰派生演算法產生 KEK 加密後儲存在卷頭中。

    重要

    初始化流程會抹去塊裝置上的原有資料,請謹慎處理,以免操作失誤。

  • 開啟:基於使用者提供的 Passphrase 重新派生 KEK,解密得到 Master Key,從而解鎖卷。系統將在 /dev/mapper/<卷名> 路徑建立一個虛擬塊裝置,所有寫入該裝置的資料自動加密後落盤、讀取時自動解密,加解密過程在 Linux 核心中完成,可以有效防止明文泄露到執行個體外部。

加密執行個體通過 CPU 內建的 AES 硬體加速能力降低加解密開銷。機密資料盤支援通過 AEAD 加密模式提供完整性保護,可防止攻擊者篡改密文資料,適用於大語言模型權重儲存、訓練資料集儲存等情境。加密使用的Passphrase託管在執行個體外,支援多種密鑰擷取方式,詳見附錄:密鑰擷取方式

說明
  • 僅支援加密TDX執行個體異構機密執行個體的資料盤。

  • 當雲端硬碟發生復原時,由於資料的完整性和機密性並未受到破壞,因此機密雲端硬碟方案無法協助您識別此類潛在攻擊。建議您根據安全需求,在應用程式層面進行相應的資料版本檢查,以應對此類問題。

使用流程

步驟一:準備環境

  1. 建立機密計算執行個體。

    僅支援加密TDX機密執行個體異構機密執行個體

  2. 遠端連線機密計算執行個體。

    具體操作,請參見使用Workbench登入Linux執行個體

  3. 安裝Cryptpilot。

    sudo yum install -y cryptpilot-crypt

步驟二:建立並掛載雲端硬碟

重要

加密雲端硬碟是會抹去塊裝置上的原有資料,建議您建立新的資料盤進行操作。

  1. 建立待加密的空資料盤

  2. 將建立的資料盤掛載到ECS執行個體上

  3. 初始化資料盤

    初始化資料盤時,請僅建立分區及檔案系統,不掛載檔案系統,檔案系統需要加密後再掛載。

  4. 查看掛載的雲端硬碟及分區資訊。

  5. lsblk

    顯示結果如下,表示當前ECS執行個體掛載了兩塊雲端硬碟:

    • /dev/nvme0n1:原有的系統硬碟。

    • /dev/nvme1n1:新增的資料盤,其中有2個新的空白分區(/dev/nvme1n1p1/dev/nvme1n1p2)。

    image

步驟三:建立帶有ext4檔案系統的卷

  1. 首先我們需要編寫一個設定檔/etc/cryptpilot/volumes/data0.toml檔案,該檔案定義了一個名為data0的資料卷。

    說明

    設定檔採用TOML配置語言格式,檔案名稱可以是任意以.toml結尾的文字檔,不強制與卷名稱相同。

    下面提供一些典型情境下的配置,請根據實際情況修改其中的配置欄位。

    臨時卷

    # 卷配置
    dev = "/dev/nvme1n1p1"    # 指定要使用的塊裝置,即雲端硬碟的空白分區,本樣本中/dev/nvme1n1p1使用了資料盤的第一個分區。
    volume = "data0"          # 指定卷的名稱,本樣本命名為data0。
    auto_open = false         # true表示系統啟動時會自動開啟該卷;false表示需要手動開啟卷。
    makefs = "ext4"           # 指定要建立的檔案系統類型,本樣本為ext4。
    integrity = true          # true表示啟用資料完整性支援;false表示關閉資料完整性支援。
    
    # 密鑰配置
    [encrypt.otp]             # 指定金鑰儲存區類型,這裡選擇一次性密鑰(OTP)類型。

    持久化卷(使用 Trustee)

    # 卷配置
    dev = "/dev/nvme1n1p2"        # 指定要使用的塊裝置,即雲端硬碟的空白分區,本樣本中 /dev/nvme1n1p2 使用了資料盤的第2個分區。
    volume = "data0"              # 指定卷的名稱,本樣本命名為 data0。
    auto_open = false             # true 表示系統啟動時會自動開啟該卷;false 表示需要手動開啟卷。
    makefs = "ext4"               # 指定要建立的檔案系統類型,本樣本為 ext4。
    integrity = true              # true 表示啟用資料完整性支援;false 表示關閉資料完整性支援。
    
    # 密鑰配置(通過 Trustee KBS 擷取)
    [encrypt.kbs]
    kbs_url = "http://<trustee-ip>:8081/api"               # 將<trustee-ip>替換為Trustee 執行個體的公網 IP 位址
    key_uri = "kbs:///default/local-resources/data0"       # KBS 中儲存 data0 卷密鑰的資源 URI

    持久化卷(使用阿里雲 KMS)

    # 卷配置
    dev = "/dev/nvme1n1p2"        # 指定要使用的塊裝置,即雲端硬碟的空白分區,本樣本中/dev/nvme1n1p2使用了資料盤的第一個分區。
    volume = "data0"              # 指定卷的名稱,本樣本命名為data0。
    auto_open = false             # true表示系統啟動時會自動開啟該卷;false表示需要手動開啟卷。
    makefs = "ext4"               # 指定要建立的檔案系統類型,本樣本為ext4。
    integrity = true              # true表示啟用資料完整性支援;false表示關閉資料完整性支援。
    
    # 密鑰配置
    [encrypt.kms]                 # 指定金鑰儲存區類型,這裡選擇Key Management Service(KMS)類型。
    secret_name = "confidential_cloud_disk_passphrase"   # KMS執行個體中儲存的憑據的名稱,即之前樣本中的confidential_cloud_disk_passphrase。
    # 應用身份憑證內容檔案(clientKey_****.json檔案)中的內容
    client_key = '''
    {
      "KeyId": "KAAP.b183152a-c3bf-43ae-9399-a101607b****",
      "PrivateKeyData": "MIIJ0wIBAzCCCZ8GCSqGSIb3DQE****"
    }
    '''
    client_key_password = "258372e962f5204ce648bc66243f****"    # 憑證口令檔案(clientKey_****_Password.txt檔案)中的內容
    kms_instance_id = "kst-bjj67d004a85ykq80****"               # KMS執行個體ID
    # KMS執行個體CA認證檔案(PrivateKmsCA_kst-******.pem檔案)中的內容
    kms_cert_pem = """
    -----BEGIN CERTIFICATE-----
    MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCSqGSIb3DQEBCwUAMH****
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MIID3zCCAsegAwIBAgIJAO8qnQyTy8/kMA0GCSqGSIb3DQEBCwUAMH****
    -----END CERTIFICATE-----
    """
  2. 查看卷狀態。

    sudo cryptpilot-crypt show data0

    可以看到data0卷的配置資訊:

    • Initialized 列:顯示該卷是否需要初始化,如果是臨時卷則不需要初始化,如果是持久化卷則需要初始化。

    • Opened 顯示該卷並未開啟。

      image

  3. 初始化卷

    sudo cryptpilot-crypt init data0
  4. 開啟卷

    sudo cryptpilot-crypt open data0
  5. 檢查卷對應的虛擬設備。

    sudo file -Ls /dev/mapper/data0

    卷在被開啟後,將建立一個虛擬塊裝置,其路徑為:/dev/mapper/<卷的名稱>

    image

  1. 掛載檔案系統並查看掛載結果。

    1. data0卷掛載到/mnt/data0路徑上。

      sudo mkdir -p /mnt/data0
      sudo mount -t ext4 /dev/mapper/data0 /mnt/data0
    2. 查看掛載結果。

      mount | grep data0
      ls -la /mnt/data0/

      回顯結果如下所示,表示卷被成功掛載,且裡面是一個空的ext4檔案系統。

      image

  2. 關閉卷。

    重要
    • 本樣本中使用的是一次性密鑰(OTP)模型,卷被關閉後,其中儲存的機密資料將完全丟失。

    • 關閉卷之前請停止讀寫該卷的業務進程,並取消卷上的檔案系統掛載,確保該卷沒有被佔用。

    1. 取消掛載。

      sudo umount /mnt/data0
    2. 關閉卷。

      sudo cryptpilot-crypt close data0

      image

步驟四:配置執行個體啟動時自動開啟卷

  1. 修改設定檔。

    對於需要自動開啟的卷,修改其設定檔中的auto_open欄位的值為trueimage

  2. (條件可選)對於持久化的卷,需要先手動運行sudo cryptpilot-crypt init <卷名稱>初始化後,才能在執行個體啟動時自動開啟卷。

  3. 啟動並設定開機自啟動cryptpilot服務。

    重要

    每次修改cryptpilot配置後,都需要啟動並設定開機自啟動cryptpilot服務,才能確保自動開啟卷功能生效。

    sudo systemctl enable --now cryptpilot.service
  4. 重啟執行個體

  5. 查看卷狀態。

    sudo cryptpilot-crypt show

    回顯如下所示,表示卷被自動開啟。image

附錄:密鑰擷取方式

CryptPilot 通過 Provider 機制對接不同的密鑰來源,將"如何加解密磁碟"和"密鑰從哪兒取"解耦。本節集中介紹 OTP、Trustee(KBS)、阿里雲 KMS 和外部程式(exec)四種方式,供前面機密系統硬碟與機密資料盤章節引用。

密鑰擷取方式

provider類型

持久化能力

是否需要遠程證明

典型情境

OTP(一次性密鑰)

otp

否(關機即丟失)

臨時資料盤、swap 分區

Trustee

kbs

是(基於 TEE 遠程證明允許存取密鑰)

自建密鑰後端 + 強可信計算需求

阿里雲 KMS

kms

希望採用雲上託管的密鑰管理能力

exec(外部程式)

exec

取決於外部程式

取決於外部程式

進階使用者自訂密鑰擷取流程

在前文的卷配置樣本中,您可以根據實際選型,將 [encrypt.xxx] 段替換為本節介紹的某一種 Provider 配置。

一次性密鑰(OTP)

適用範圍

  • 機密資料盤——臨時卷:每次重新開啟卷時都將產生不同的隨機密鑰,關機後卷中資料完全丟失。適用於臨時資料盤或交換分區(swap)。

  • 不適用於機密系統硬碟以及任何需要在關機後保留資料的持久化卷。

配置樣本

在卷的 toml 配置中加入:

[encrypt.otp]

無需任何額外參數,CryptPilot 在開啟卷時會自動產生一個安全的臨時金鑰組卷進行初始化與解密。

信任管理服務(Trustee)

Trustee是一個開源的信任管理服務,由遠程證明服務(AS)、參考值服務(RVPS)和Key Management Service(KBS)組成。在該方案中,加密金鑰存放在 KBS 中,CryptPilot 開啟卷時通過 KBS 拉取密鑰;KBS 會根據預設策略對執行個體發起遠程證明,證明通過後才允許存取密鑰。

Trustee 既適用於機密系統硬碟(強可信計算情境下作為推薦密鑰後端),也適用於機密資料盤的持久化卷。

步驟一:部署 Trustee 服務

  1. 在受信任的環境中(例如一台單獨的 ECS 執行個體),安裝 Trustee 軟體包:

    sudo yum install -y trustee
  2. (可選)配置 HTTPS 訪問。如需通過 HTTPS 訪問,編輯 /etc/trustee/gateway.yml,填入您的 TLS 認證配置:

    server:
      insecure_http: false
      tls:
        cert_file: "<https認證.pem檔案路徑>"
        key_file: "<https認證私密金鑰檔案路徑>"
      # 其它配置...
  3. 在 Alibaba Cloud Linux 3 執行個體上,可以通過 systemd 啟動 Trustee 服務:

    sudo systemctl restart trustee

    Trustee 正常運行後,會在本機監聽 8081 連接埠

步驟二:配置遠程證明驗證策略

Trustee 會對機密執行個體中的 TEE 硬體環境、檔案系統、程式、配置等進行檢查並給出檢查結果。您需要根據安全等級要求配置 /opt/trustee/kbs/policy.rego 中的允許存取策略。

  • 機密系統硬碟情境(推薦:嚴格策略):要求遠程證明四個維度(硬體、配置、可執行檔、檔案系統)的可信值均 <= 32。具體策略與參考值的產生方式參見前文機密系統硬碟使用流程中的「步驟三:製作機密系統硬碟鏡像」(在Trustee服務中註冊參考值)。

  • 機密資料盤情境(最簡策略:僅校正硬體):為簡化使用,可僅檢查四個維度中的硬體維度,即檢測是否為合法的 TEE 硬體環境。將 /opt/trustee/kbs/policy.rego 修改為如下預設配置:

    預設遠程證明策略配置

    package policy
    
    import rego.v1
    
    default allow = false
    
    # ---------------------------
    # Resource path helpers
    # ---------------------------
    resource_path := data["resource-path"]
    path_parts := split(resource_path, "/")
    
    is_repo(name) if { count(path_parts) == 3; path_parts[0] == name }
    is_type(t)    if { count(path_parts) == 3; path_parts[1] == t }
    is_tag(tag)   if { count(path_parts) == 3; path_parts[2] == tag }
    
    # ---------------------------
    # Default decision
    # ---------------------------
    
    allow if {
            # cpu0 must exist
            s := input.submods["cpu0"]
            # cpu0 must carry a trustworthiness vector
            tv := s["ear.trustworthiness-vector"]
            # and it must pass the hardware check
            tv["hardware"] <= 32
    }
說明

如需更嚴格的多維度驗證,請查閱 /opt/trustee/attestation-service/policies/opa/default.rego,並參考 參考值配置文檔遠程證明配置文檔完成參考值設定。

步驟三:上傳卷加密金鑰到 KBS

  1. 建立金鑰儲存區目錄(KBS 預設使用 /opt/trustee/kbs/repository/default/):

    sudo mkdir -p /opt/trustee/kbs/repository/default/local-resources/
  2. 產生加密金鑰

    sudo yum install -y openssl
    openssl rand -base64 40

    image

  3. 將之前產生的隨機密鑰寫入本地資源檔,例如對名為 data0 的卷:

    sudo sh -c 'echo -n "<data0卷加密金鑰>" > /opt/trustee/kbs/repository/default/local-resources/data0'

    其中 <data0卷加密金鑰> 請替換為前面產生的隨機密鑰。對應的 KBS 資源標識為 kbs:///default/local-resources/data0,後續在 CryptPilot 卷配置中通過該 URI 引用。

步驟四:在卷配置中引用 KBS

[encrypt.kbs]
# Trustee 執行個體的 HTTP(S) URL
kbs_url = "http://<trustee-ip>:8081/api"
# 在 KBS 中的資源 URI,格式 `kbs:///<repo>/<type>/<tag>`
key_uri = "kbs:///default/local-resources/data0"
# (可選)KBS HTTPS 訪問的根憑證,PEM 格式;不指定則使用系統根 CA
kbs_root_cert = """
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
"""

步驟五:在機密執行個體中安裝遠程證明依賴

為了使能機密執行個體中的遠程證明能力並訪問 Trustee 擷取密鑰,需要確保在機密執行個體中安裝了對應硬體的 attestation-agent組件:

yum install -y attestation-agent

systemctl enable attestation-agent
systemctl start attestation-agent

阿里雲 KMS

阿里雲 KMS 是雲上的Key Management Service,適合希望將密鑰託管在阿里雲、無需自建密鑰後端的情境。在該方案中,加密金鑰以"通用憑據"的形式存放在 KMS 中,CryptPilot 在開啟卷時通過 KMS 執行個體擷取該密鑰。

步驟一:建立阿里雲KMS執行個體,並建立一個通用憑據

  1. 購買和啟用KMS執行個體

  2. 說明
    • 機密雲端硬碟對所建立KMS執行個體的密鑰管理類型沒有限制,您可以按照安全需求按需選擇。本文樣本選擇軟體密鑰管理類型的KMS執行個體。

    • 該KMS執行個體須與ECS執行個體在同一Virtual Private Cloud中。

  3. 建立一個軟體密鑰

  4. 建立一個通用憑據

    • 憑據名稱:根據執行個體填寫,本樣本為confidential_cloud_disk_passphrase

    • 設定憑據值:選擇純文字,輸入上一步產生的隨機密鑰。

    • 加密主要金鑰:選擇上一步建立的軟體密鑰。

    image

  5. 建立應用存取點,並擷取KMS執行個體CA認證

    請確保已經獲得以下內容:

    • 應用身份憑證內容(ClientKeyContent):檔案名稱預設為clientKey_****.json。

    • 憑證口令(ClientKeyPassword):檔案名稱預設為clientKey_****_Password.txt。

    • KMS執行個體CA認證:檔案名稱預設為PrivateKmsCA_kst-******.pem。

步驟二:在卷配置中引用 KMS

以下設定檔中的配置資訊,請根據實際情況修改。

[encrypt.kms]
# KMS 執行個體 ID
kms_instance_id = "kst-bjj67d004a85ykq80****"
# KMS 執行個體中通用憑據的名稱
secret_name = "confidential_cloud_disk_passphrase"
# 應用身份憑證檔案 clientKey_****.json 的內容
client_key = '''
{
  "KeyId": "KAAP.XXXXXXXXX",
  "PrivateKeyData": "XXXXXXXXX"
}'''
# 憑證口令檔案 clientKey_****_Password.txt 的內容
client_key_password = "258372e962f5204ce648bc66243f****"
# KMS 執行個體 CA 憑證 PrivateKmsCA_kst-******.pem 的內容
kms_cert_pem = """
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
"""

外部程式(exec)

exec Provider 允許 CryptPilot 在開啟卷時調用任意外部程式,並將該程式的標準輸出作為卷的解密密鑰。該方式 面向進階使用者,可用於自訂密鑰擷取流程,例如對接企業內部的 HSM、Vault、自研 KMS、遠程下發服務等。

說明

由於密鑰擷取的安全性完全取決於外部程式及其運行環境,請確保該程式自身具備充分的存取控制與可信來源。

配置樣本

下面的樣本使用 echo 程式產生一個固定密碼,僅作配置形式示範——生產環境中請勿使用固定密碼

[rootfs]
delta_location = "disk"

[rootfs.encrypt.exec]
command = "echo"
args = ["-n", "AAAaaawewe222"]

[delta]
integrity = true

[delta.encrypt.exec]
command = "echo"
args = ["-n", "AAAaaawewe222"]

CryptPilot 在開啟卷時會執行 command 指定的程式(帶 args 參數),並將其 標準輸出 作為卷的解密密鑰使用。