Azure Key Vault

本教程说明如何设置 KES 服务器以使用 Azure Key Vault 作为持久密钥存储

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 Key Vault

Azure Key Vault 是一种托管的 KMS 服务,提供可由 KES 使用的密钥存储。

作为外部应用程序,您必须在 Azure Active Directory 中注册 KES,并拥有客户端凭据以在 Azure Key Vault 中存储和访问密钥。

  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 Key Vault 进行身份验证。

    确保复制密钥值。它可能不会再次显示。

    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. 添加 Key Vault 策略

    导航到 Key Vault 的 **访问策略** 选项卡,然后选择 **添加访问策略** 以创建 Key Vault 策略。

    Step 7

    定义 KES 服务器可以执行哪些 Key Vault 操作。选择以下五个 密钥权限

    • 获取
    • 列出
    • 设置
    • 删除
    • 清除

    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系统调用来阻止操作系统将内存数据写入磁盘(交换)。这可以防止敏感数据泄露。

    使用以下命令允许 KES 使用mlock系统调用,而无需以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=
    }
    

将 KES 与 MinIO 服务器一起使用

MinIO 服务器需要 KES 才能启用服务器端数据加密。

有关将新的 KES 服务器与 MinIO 服务器一起使用所需的额外步骤,请参阅KES for MinIO 指南

配置参考

以下部分描述了密钥加密服务 (KES) 配置设置,以使用 Azure Key Vault 作为根 KMS 来存储外部密钥,例如在 MinIO 服务器上用于服务器端加密的密钥。

MinIO 服务器需要扩展权限
MinIO 服务器 RELEASE.2023-02-17T17-52-43Z开始,MinIO 需要扩展的 KES 权限才能实现功能。本节中的示例配置包含所有必需的权限。

参考