MinIO 部署上的 KES

本教學將說明如何設定 KES 伺服器,然後將 MinIO 部署設定為 KES 用戶端,以進行物件加密。

M i n I O K E S S e r v e r K M S
僅供測試

本教學著重於簡單的 KES 伺服器設定。我們使用本機檔案系統作為金鑰儲存庫,並省略 KMS 整合。

在生產環境中,請選擇任何符合您需求的支援 KMS 實作。

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
    
    現有的金鑰和憑證
    如果您已經有 TLS 私密金鑰和憑證,例如來自 WebPKI 或內部憑證授權單位,您可以使用它們來取代。請記得調整 tls 組態區段。
  2. 產生 MinIO 認證

    MinIO 需要認證才能存取 KES 伺服器。以下命令會從提供的 TLS 私密/公開金鑰對產生雜湊的身分識別

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

    身份識別碼 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267bclient.crt 中公開金鑰的唯一指紋。使用此 API 金鑰識別碼來驗證 MinIO 用戶端對 KES 伺服器的連線。

    您可以隨時從同一個憑證重新計算此識別碼

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

    此程序提供一組基本步驟,可能需要大幅修改以符合您的目標。有關針對特定金鑰管理系統供應商設定 KES 伺服器的詳細說明,請參閱支援目標的整合頁面。

    建立 KES 伺服器設定檔:config.yml。請確保 policy 區段中的識別碼與您的 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/minio-*
        - /v1/key/generate/minio-*
        - /v1/key/decrypt/minio-*
        identities:
        - 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b # Use the identity of your client.crt
    
    keystore:
      fs:
        path: ./keys # Choose a directory for the secret keys
    
  4. 啟動 KES 伺服器

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

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

    使用以下命令允許 KES 使用 mlock 系統呼叫,而無需以 root 權限執行

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

    啟動具有記憶體保護的 KES 伺服器實例

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

MinIO 伺服器設定

在以下步驟 2-6 中定義的環境變數可以定義為 MinIO 伺服器環境變數檔案的一部分。

  1. 安裝 MinIO

    您可以下載靜態二進位檔案,或遵循MinIO 快速入門指南

    有關在其他拓撲(例如多個磁碟機或多個節點)上設定 MinIO 伺服器的更詳細說明,請參閱安裝文件

    選擇您的作業系統的標籤,以查看特定作業系統的快速入門。

  2. 設定 MINIO_KMS_KES_ENDPOINT

    此環境變數會告知 MinIO 要存取哪個 KES 伺服器

    export MINIO_KMS_KES_ENDPOINT=https://127.0.0.1:7373
    
  3. 設定 MinIO 用戶端憑證

    這些環境變數設定 MinIO 用來存取 KES 伺服器的存取憑證

    export MINIO_KMS_KES_CERT_FILE=client.crt
    
    export MINIO_KMS_KES_KEY_FILE=client.key
    
  4. 設定 MinIO 預設金鑰

    此環境變數設定 MinIO 在其 S3 用戶端未指定加密金鑰時要使用的預設金鑰。

    export MINIO_KMS_KES_KEY_NAME=minio-default-key
    
    如果此金鑰不存在,MinIO 會自動建立。
  5. 信任 KES 伺服器憑證

    如果 KES 伺服器使用受信任憑證授權單位發出的憑證,則此步驟為可選步驟。

    當使用自我簽署憑證時,MinIO 無法驗證 KES 伺服器憑證。此環境變數會手動建立信任關係。

    export MINIO_KMS_KES_CAPATH=public.crt
    

    在此情況下,public.crt 是 KES 伺服器的公開憑證。

  6. 設定 MinIO 根憑證

    export MINIO_ROOT_USER=minio
    export MINIO_ROOT_PASSWORD=minio123
    
  7. 啟動 MinIO 伺服器

    在啟動 MinIO 伺服器之前必須先執行 KES 伺服器。MinIO 伺服器在啟動過程中需要存取 KES 伺服器。
    minio server /data
    

加密儲存桶

使用 PutBucketEncryption S3 API 在特定儲存桶上啟用伺服器端加密。這可以使用MinIO 用戶端完成。

  1. 建立金鑰

    有關完整參考,請參閱 mc admin kms key 文件

    mc admin kms key create <alias> minio-key-name
    

    minio-key-name 替換為您要用於金鑰的名稱。

  2. 設定儲存桶

    使用 mc encrypt set 將伺服器端加密設定新增至您的儲存桶。

    例如

    mc encrypt set sse-kms minio-key-name <alias>/my-bucket
    

    minio-key-name 替換為您在上一個步驟中建立的金鑰名稱。

參考資料