Azure 金鑰保存庫

本教學說明如何設定 KES 伺服器,以使用 Azure 金鑰保存庫 作為持續性金鑰儲存區

K E S C l i e n t K E S S e r v e r A z u r e K e y V a u l t

Azure 金鑰保存庫

Azure 金鑰保存庫是一項受管理的 KMS 服務,提供可供 KES 使用的機密儲存區。

作為外部應用程式,您必須在 Azure Active Directory 中註冊 KES,並具備用戶端認證,才能在 Azure 金鑰保存庫中儲存和存取機密。

  1. Active Directory 服務

    • 導覽至 Azure Active Directory 並選取 應用程式註冊

      Step 1

      Step 1

    • 選取 新增註冊

  2. 註冊 KES 應用程式

    為應用程式命名,例如 KES-Demo,並註冊它。完成後,Azure 會顯示您新註冊應用程式的一些詳細資料。

    Step 3

    記下下列欄位以供稍後使用

    • 應用程式 (用戶端) ID
    • 目錄 (租用戶) ID

    這些欄位包含全域唯一識別碼 (UUID),類似於 c3b7badf-cd2b-4297-bece-4de5f2e575f6

  3. 建立用戶端機密

    • 選取 新增憑證或機密
    • 指派名稱,例如 KES-Demo
    • 選取到期日

    Azure 會建立具有所選描述和到期日的新機密。KES 需要此機密才能向 Azure 金鑰保存庫進行驗證。

    請務必複製機密值。它可能不會再次顯示。

    Step 5

  4. 應用程式摘要

    導覽回應用程式概觀,並檢查 Azure 是否顯示應用程式有一個機密。

    Step 6

    您應該擁有下列資訊

    • 應用程式 (用戶端) ID

      在我們的範例圖片中,為 c3b7badf-cd2b-4297-bece-4de5f2e575f6

    • 目錄 (租用戶) ID

      在我們的範例圖片中,為 41a37d4e-b3c4-49f4-b330-1114fb0271c8

    • 新建立機密的值

      在我們的範例圖片中,為 -.j4XP6Sa7E39.KWn-SL~Dgbz~H-H-TPxT

  5. 新增金鑰保存庫原則

    導覽至金鑰保存庫的 存取原則 索引標籤,並選取 新增存取原則 以建立金鑰保存庫原則。

    Step 7

    定義 KES 伺服器可以執行的金鑰保存庫作業。選取下列五個 機密權限

    • 取得
    • 列出
    • 設定
    • 刪除
    • 清除

    Step 8

  6. 將原則指派給主體

    選取主體或授權的應用程式。

    如果應用程式本身是主體,則不需要授權的應用程式。或者,選取使用者或群組作為主體,並選取新註冊的 KES Azure 應用程式作為授權的應用程式。

    在本教學中,我們將主體設定為我們新增的機密。搜尋應用程式的名稱 (KES-Demo) 或新增應用程式 ID。

    Step 6

  7. 原則摘要

    Azure 會顯示與我們註冊的 KES 應用程式相關聯的新存取原則。

    Step 7

    請務必在導覽至其他地方之前 儲存

KES 伺服器設定

  1. 產生 KES 伺服器私密金鑰和憑證

    KES 伺服器需要 TLS 私密金鑰和憑證。KES 伺服器是 預設安全,並且只能在 TLS 環境下執行。本教學為了簡化起見,使用自我簽署憑證。

    以下命令會產生新的 TLS 私密金鑰 (private.key) 和針對 IP 127.0.0.1 及 DNS 名稱 localhost 發行的自我簽署 X.509 憑證 (public.crt)

    $ kes identity new --ip "127.0.0.1" localhost
    
      Private key:  private.key
      Certificate:  public.crt
      Identity:     2e897f99a779cf5dd147e58de0fe55a494f546f4dcae8bc9e5426d2b5cd35680
    
    如果您已經有來自 WebPKI 或內部 CA 的 TLS 私密金鑰和憑證,則可以改用它們。請記住調整 tls 設定區段。
  2. 產生用戶端認證

    使用以下命令,產生新的 TLS 私密/公開金鑰組,供用戶端應用程式用於存取 KES 伺服器

    $ kes identity new --key=client.key --cert=client.crt MyApp
    
      Private key:  client.key
      Certificate:  client.crt
      Identity:     02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b
    

    身分 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267bclient.crt 中公開金鑰的唯一指紋。您可以隨時重新計算指紋

    $ kes identity of client.crt
    
      Identity:  02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b
    
  3. 設定 KES 伺服器

    建立 KES 伺服器組態檔config.yml。確保原則區段中的身分與您的 client.crt 身分相符。

    address: 0.0.0.0:7373 # Listen on all network interfaces on port 7373
    
    admin:
      identity: disabled  # We disable the admin identity since we don't need it in this guide 
    
    tls:
      key: private.key    # The KES server TLS private key
      cert: public.crt    # The KES server TLS certificate
    
    policy:
      my-app: 
        allow:
        - /v1/key/create/my-key*
        - /v1/key/generate/my-key*
        - /v1/key/decrypt/my-key*
        identities:
        - 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b # Use the identity of your client.crt
    
    keystore:
         azure:
           keyvault:
             endpoint: "https://kes-test-1.vault.azure.net"    # Use your KeyVault instance endpoint.
             credentials:
               tenant_id: ""      # The ID of the tenant the client belongs to - e.g: "41a37d4e-b3c4-49f4-b330-1114fb0271c8".
               client_id: ""      # The ID of the client                       - e.g: "c3b7badf-cd2b-4297-bece-4de5f2e575f6".
               client_secret: ""  # The value of the client secret             - e.g: "-.j4XP6Sa7E39.KWn-SL~Dgbz~H-H-TPxT".
    
  4. 啟動 KES 伺服器

    Linux

    kes server --config config.yml --auth off
    
    Linux 交換保護

    在 Linux 環境中,KES 可以使用 mlock syscall,防止作業系統將記憶體中的資料寫入磁碟 (交換)。這可以防止洩漏敏感資料。

    使用以下命令,允許 KES 使用 mlock syscall,而無需使用 root 權限執行

    sudo setcap cap_ipc_lock=+ep $(readlink -f $(which kes))
    

    啟動具有記憶體保護的 KES 伺服器執行個體

    kes server --config config.yml --auth off --mlock
    

    容器

    下列指示使用 Podman 來管理容器。您也可以使用 Docker。

    根據您的部署需求修改位址和檔案路徑。

    sudo podman pod create  \
      -p 9000:9000 -p 9001:9001 -p 7373:7373  \
      -v ~/minio-kes-azure/certs:/certs  \
      -v ~/minio-kes-azure/minio:/mnt/minio  \
      -v ~/minio-kes-azure/config:/etc/default/  \
      -n minio-kes-azure
    
    sudo podman run -dt  \
      --cap-add IPC_LOCK  \
      --name kes-server  \
      --pod "minio-kes-azure"  \
      -e KES_SERVER=https://127.0.0.1:7373  \
      -e KES_CLIENT_KEY=/certs/kes-server.key  \
      -e KES_CLIENT_CERT=/certs/kes-server.cert  \
      quay.io/minio/kes:2024-01-11T13-09-29Z server  \
        --auth  \
        --config=/etc/default/kes-config.yaml  \
    
    sudo podman run -dt  \
      --name minio-server  \
      --pod "minio-kes-azure"  \
      -e "MINIO_CONFIG_ENV_FILE=/etc/default/minio"  \
      quay.io/minio/minio:RELEASE.2024-01-31T20-20-33Z server  \
        --console-address ":9001"
    

    您可以使用以下命令來驗證容器的狀態。該命令應顯示三個 Pod,一個用於 Pod、一個用於 KES,另一個用於 MinIO。

    sudo podman container list
    

KES CLI 存取

  1. 設定 KES_SERVER 端點

    下列環境變數指定 KES CLI 應連線的伺服器

    export KES_SERVER=https://127.0.0.1:7373
    
  2. 定義用戶端認證

    下列環境變數設定用戶端用來連線至 KES 伺服器的存取認證

    export KES_CLIENT_CERT=client.crt
    
    export KES_CLIENT_KEY=client.key
    
  3. 測試組態

    執行我們在上面指派之原則允許的任何 API 作業。

    例如,建立金鑰

    kes key create my-key-1
    

    使用金鑰來產生新的資料加密金鑰

    kes key dek my-key-1
    

    結果類似於以下內容

    {
      plaintext : UGgcVBgyQYwxKzve7UJNV5x8aTiPJFoR+s828reNjh0=
      ciphertext: eyJhZWFkIjoiQUVTLTI1Ni1HQ00tSE1BQy1TSEEtMjU2IiwiaWQiOiIxMTc1ZjJjNDMyMjNjNjNmNjY1MDk5ZDExNmU3Yzc4NCIsIml2IjoiVHBtbHpWTDh5a2t4VVREV1RSTU5Tdz09Iiwibm9uY2UiOiJkeGl0R3A3bFB6S21rTE5HIiwiYnl0ZXMiOiJaaWdobEZrTUFuVVBWSG0wZDhSYUNBY3pnRWRsQzJqWFhCK1YxaWl2MXdnYjhBRytuTWx0Y3BGK0RtV1VoNkZaIn0=
    }
    

搭配 MinIO 伺服器使用 KES

MinIO 伺服器需要 KES 才能啟用伺服器端資料加密。

請參閱適用於 MinIO 的 KES 指示指南,以取得將新的 KES 伺服器與 MinIO 伺服器搭配使用所需的其他步驟。

組態參考

以下章節說明金鑰加密服務 (KES) 的組態設定,以便使用 Azure Key Vault 作為根 KMS 來儲存外部金鑰,例如用於 MinIO 伺服器端加密的金鑰。

MinIO 伺服器需要擴充的權限
MinIO 伺服器 RELEASE.2023-02-17T17-52-43Z 開始,MinIO 需要擴充的 KES 權限才能運作。本節中的範例組態包含所有必要的權限。

參考