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 使用的密钥存储库。

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

  1. Active Directory 服务

    • Navigate toAzure 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访问策略选项卡和选择添加访问策略Create Key Vault policies.

    Step 7

    定义 KES 服务器可以执行的 Key Vault 操作。 选择以下五个Secret permissions:

    • 获取
    • 列表
    • Set
    • 删除
    • 清除

    Step 8

  6. 为主体分配策略

    选择一个主体或已授权的应用程序。

    如果应用程序本身是主体,则无需授权应用程序。 或者,选择用户或组作为主体,并选择新注册的KES Azure应用程序作为授权应用程序。

    对于本教程,我们将主体设置为我们添加的密钥。 搜索应用程序的名称(KES-Demo) 或添加应用程序 ID。

    Step 6

  7. 策略摘要

    Azure 显示与我们的已注册 KES 应用程序关联的新访问策略。

    Step 7

    确保你保存在导航到其他位置之前。

KES Server Setup

  1. 生成 KES 服务器私钥和证书

    KES服务器需要TLS私钥和证书。 KES服务器是一个默认安全并且只能通过 TLS 运行。 本教程为简化起见使用自签名证书。

    以下命令生成一个新的 TLS 私钥(private.key) 和一个自签名的 X.509 证书 (public.crt) 为该 IP 地址签发127.0.0.1和 DNS 名称localhost:

    $ 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
    

    身份02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b是公钥的唯一指纹client.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 Swap Protection

    在 Linux 环境中,KES 可以使用mlocksyscall 防止操作系统将内存中的数据写入磁盘(交换)。 这可以防止敏感数据泄露。

    使用以下命令允许 KES 使用mlock未以运行权限进行的系统调用rootprivileges:

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

    启动一个具有内存保护功能的 KES 服务器实例:

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

    容器

    以下说明使用Podmanto manage the containers. 你也可以使用 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. SetKES_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 Server 需要 KES 来启用服务器端数据加密。

查看MinIO KES 操作指南有关将新的 KES 服务器与 MinIO 服务器配合使用所需的额外步骤。

配置参考

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

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

参考文献