Entrust KeyControl

Entrust KeyControl是一个专有的KMS,KES支持使用它来存储密钥。

K E S C l i e n t K E S S e r v e r E n t r u s t K e y C o n t r o l

前提条件

本程序基于Entrust KeyControl v10.1编写和测试。 所提供的说明可能适用于其他KeyControl版本。 本程序假设您已具备Entrust产品的使用经验,并遵循其文档、最佳实践和其他已发布材料来部署KeyControl服务。

有关设置 Entrust KeyControl 集群的说明,请参阅 Entrust 文档:

设置 Entrust KeyControl

在设置 KES 服务器之前,请先在 KeyControl 中完成以下部分以添加新的 Vault、Box 以及一个或多个用户。

创建一个新的保险库

使用具有根级权限的用户登录到您的KeyControl集群(例如,secroot) 并创建一个新的PASMvault.

创建类似以下内容的条目:

  • 类型: PASM

  • 名称: minio

  • 描述保险库的可选附加信息,或留空。

  • 管理员名称用于管理保险库的用户名。

    注意:此用户拥有对 Vault 的完全访问权限。

  • 管理员邮箱保管库管理员的电子邮件地址

    注意:KeyControl 会向此电子邮件地址发送一次性密码以访问保险库。 您需要在下一步中使用此密码。

根据 KeyControl 或您自己的指南进行其他必要的设置。 您可以将名称和描述设置为更符合您的 MinIO 部署需求,或根据您自己的指南进行设置。

访问新的 Vault

  1. 访问 Vault URL。

    此 URL 应随一次性密码一同出现在电子邮件中。 您也可以从 KeyControl 的 Vault 选项卡中找到该 URL。

  2. 使用管理员用户名和通过电子邮件发送的一次性密码来访问 Vault。

创建一个新的 Box

KeyControl 将密钥存储在 Vault 内的 Box 中。 添加一个 Box 来存储您的密钥。

按照提示进行操作,并输入类似以下内容:

  • 名称框的描述性名称,例如MinIO租户名称。
  • 描述有关框中密钥的可选附加信息。
  • Secret Expiration留空。
  • Secret Checkout Duration留空。
  • 密钥轮换持续时间留空。

根据 KeyControl 或您自己的指南进行其他必要录入。

附加 'Vault User' 角色策略

KeyControl 使用基于角色的访问控制。 添加一个策略,其中包含Vault User角色并将策略附加到 KES 使用的用户账户。

按照提示进行操作,并输入类似以下内容:

  • 名称KES 服务。
  • 描述策略的可选详细描述。
  • 角色Vault 用户角色。
  • 用户KeyControl 账户 KES 用于访问密钥。
  • Box从下拉菜单中选择您在上一步中添加的方框。
  • Secrets所有密钥。

根据 KeyControl 或您自己的指南进行其他必要录入。

KES Server Setup

在创建新的保险库、保险库内的box以及KeyControl中的用户访问策略后,您可以设置KES服务器。

生成 KES 服务器私钥和证书

为您的 KES 服务器生成 TLS 私钥和证书。 如果您已有要用于 KES 服务器的 TLS 证书或正在运行的 KES 服务器,可以跳过此步骤。

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

kes identity new --key private.key --cert public.crt --ip "127.0.0.1" --dns localhost

输出类似于以下内容:

Your API key:

   kes:v1:APvbt/zbiewXNB+EwciOT+I21peq0odFYCwkJX8mMCxM

This is the only time it is shown. Keep it secret and secure!

Your Identity:

   1d1f89ad528a3bbb8fd64252d443c993f5a4d679b074d5bad49785e02ec38199

The identity is not a secret. It can be shared. Any peer
needs this identity in order to verify your API key.

The generated TLS private key is stored at: private.key
The generated TLS certificate is stored at: public.crt

The identity can be computed again via:

    kes identity of kes:v1:APvbt/zbiewXNB+EwciOT+I21peq0odFYCwkJX8mMCxM
    kes identity of public.crt

生成一个新的API密钥

客户端应用程序需要凭据才能访问 KES 服务器。 以下命令用于生成新的 API 密钥。

kes identity new

生成的密钥类似于:

Your API key:

   kes:v1:AOlQZJRMYZeOioGk0ubYBMSFt1w6Hh1QZl3zG4PQxK/g

This is the only time it is shown. Keep it secret and secure!

Your Identity:

   eb559798a2fbcc3efbf036bed11108116e63f293324abdfe7574249ef5e56b36

The identity is not a secret. It can be shared. Any peer
needs this identity in order to verify your API key.

The identity can be computed again via:

    kes identity of kes:v1:AOlQZJRMYZeOioGk0ubYBMSFt1w6Hh1QZl3zG4PQxK/g

配置 KES 服务器

创建 KES 服务器配置文件:config.yml确保策略部分中的身份标识与您的 API 密钥身份标识一致。

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:
    - eb559798a2fbcc3efbf036bed11108116e63f293324abdfe7574249ef5e56b36 # Use the identity of your API key
   
keystore:
     entrust:
       keycontrol:
         endpoint: "https://keycontrol.my-org.com"    # Use your KeyControl instance endpoint.
         vault_id: ""                                 # The Vault ID - e.g: "e30497c1-bff7-4e81-beb7-fb35c4b7410c".
         box_id:   ""                                 # The Box name or ID - e.g: "tenant-1".
         credentials:
           username: ""                               # KeyControl username - e.g: "kes-tenant-1@my-org.com".
           password: ""                               # Password of KeyControl user

启动 KES 服务器

使用您创建的 YAML 文件启动 KES 服务器实例。

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

KES CLI 访问

  1. 设置KES_SERVEREndpoint.

    以下环境变量指定了 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. 测试配置。

    执行KES服务器配置文件中定义的策略所允许的任何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 服务器配合使用所需的额外步骤。

配置参考

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

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

参考文献