Thales CipherTrust Manager(前身为 Gemalto KeySecure)

本教程展示如何设置一个使用KES服务器Thales CipherTrust Manager实例(前身为 Gemalto KeySecure)作为持久且安全的密钥存储。

K E S C l i e n t K E S S e r v e r C i p h e r T r u s t M a n a g e r

本指南假设您已有一个正在运行的CipherTrust Manager实例。 该指南已通过CipherTrust Manager测试验证。k170v版本2.0.0和 Gemalto KeySecurek170v版本1.9.11.10.0.

CipherTrust Manager 设置

要连接到您的 CipherTrust Manager 实例,请通过ksctlCLI 你需要一个config.yaml类似于文件:

KSCTL_URL: <your-keysecure-endpoint>
KSCTL_USERNAME: <your-user/admin-name>
KSCTL_PASSWORD: <your-user/admin-password>
KSCTL_VERBOSITY: false
KSCTL_RESP: json
KSCTL_NOSSLVERIFY: true
KSCTL_TIMEOUT: 30
请确保使用正确的值KSCTL_URL, KSCTL_USERNAMEKSCTL_PASSWORD如果您的 CipherTrust Manager 实例已配置了受您机器信任的 TLS 证书,那么您也可以设置KSCTL_NOSSLVERIFY: false.
  1. 为 KES 创建一个新群组

    ksctl groups create --name KES-Service
    
  2. 为群组创建新用户

    这会打印一个包含 a 的 JSON 对象user_id后续步骤所需。 如果您已有现有用户想要分配给KES-Servicegroup,跳过此步骤并继续执行 3。
    ksctl users create --name <username> --pword '<password>'
    
  3. 将用户分配到KES-Service在步骤1中创建的组

    ksctl groups adduser --name KES-Service --userid "<user-ID>"
    

    用户ID在创建用户时显示。 否则,请通过以下方式获取ID:ksctl users list命令。

    用户ID类似于:local|8791ce13-2766-4948-a828-71bac67131c9.

  4. 制定一项关于KES-Servicegroup

    创建一个名为的文本文件kes-policy.json授予成员KES-Servicegroup创建, 读取删除权限。 文件内容应类似于以下内容:

    {                                                                                          
      "allow": true,
      "name": "kes-policy",
      "actions":[
          "CreateKey",
          "ExportKey",
          "ReadKey",
          "DeleteKey"
      ],
      "resources": [
          "kylo:kylo:vault:secrets:*"
      ]
    }
    

    This policy allows KES to create, fetch and delete master keys. If you want to prevent KES from e.g. deleting master keys omit the删除键动作。

    同样,您可以通过以下方式限制 KES 可以访问的主密钥:resources定义。

    使用以下命令通过上面创建的文件来创建策略。

    ksctl policy create --jsonfile kes-policy.json
    
  5. 将策略附加到KES-Servicegroup

    创建一个名为kes-attachment.json根据策略附件规范:

    {                                                                                          
       "cust": {
          "groups": ["KES-Service"]
       }
    }
    

    使用以下命令来附加kes-policyKES-Servicegroup:

    ksctl polattach create -p kes-policy -g kes-attachment.json
    
  6. 为 KES 服务器创建一个刷新令牌,用于获取短期身份验证令牌。

    以下命令返回一个新的刷新令牌:

    ksctl tokens create --user <username> --password '<password>' --issue-rt | jq -r .refresh_token
    

    替换<username><password>使用属于该组成员的用户的凭据KES-Servicegroup.

    该命令输出一个类似于以下内容的刷新令牌:

    CEvk5cdHLG7si05LReIeDbXE3PKD082YdUFAnxX75md3jzV0BnyHyAmPPJiA0
    

KES Server Setup

KES服务器需要一个TLS私钥和证书。

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

对于生产环境,我们强烈建议使用受信任证书颁发机构签名的证书。 这可以是您的内部CA,也可以是公共CA,例如Let’s Encrypt.
  1. 为 KES 服务器生成 TLS 私钥和证书

    以下命令生成一个新的TLS私钥server.key以及一个自签名的 X.509 证书server.cert这是为该IP地址签发的127.0.0.1和 DNS 名称localhost(作为 SAN)。 根据您的设置自定义命令。

    kes identity new --server --key server.key --cert server.cert --ip "127.0.0.1" --dns localhost
    

    任何其他用于 X.509 证书生成的工具也同样适用。 例如,您可以使用openssl:

    openssl ecparam -genkey -name prime256v1 | openssl ec -out server.key
    
    openssl req -new -x509 -days 30 -key server.key -out server.cert \
        -subj "/C=/ST=/L=/O=/CN=localhost" -addext "subjectAltName = IP:127.0.0.1"
    
  2. 为应用程序创建私钥和证书

    kes identity new --key=app.key --cert=app.cert app
    

    你可以计算app随时更改身份。

    kes identity of app.cert
    
  3. 创建配置文件 server-config.yml

    address: 0.0.0.0:7373
    root:    disabled  # We disable the root identity since we don't need it in this guide 
    
    tls:
      key:  server.key
      cert: server.cert
    
    policy:    
      my-app: 
        allow:
        - /v1/key/create/my-app*
        - /v1/key/generate/my-app*
        - /v1/key/decrypt/my-app*
        identities:
        - ${APP_IDENTITY}
    
    keystore:
      gemalto:
        keysecure:
          endpoint: ""  # The REST API endpoint of your KeySecure instance - e.g. https://127.0.0.1
          credentials:
            token:  ""  # Your refresh token
            domain: ""  # Your domain. If empty, defaults to root domain.
            retry:  15s
          tls:
            ca: "" # Optionally, specify the certificate of the CA that issued the KeySecure TLS certificate.
    

    使用您已刷新的令牌。

  4. 在新窗口/标签页中启动 KES 服务器:

    export APP_IDENTITY=$(kes identity of app.cert)
    
    kes server --config=server-config.yml --auth=off
    
    该命令使用--auth=off因为我们的root.certapp.cert证书是自签名的。

    如果启动服务器失败并出现类似错误信息:

    x509: certificate is not valid for any names, but wanted to match <your-endpoint>
    

    那么您的 CipherTrust Manager 实例将提供一个既没有通用名称(主题)也没有主题备用名称(SAN)的 TLS 证书。 此类证书是无效的。 请更新您的 CipherTrust Manager 实例的 TLS 证书。

    您可以通过以下方式分析证书:openssl x509 -text -noout <certificate>

  5. 在另一个窗口或标签页中,连接到服务器

    export KES_CLIENT_CERT=app.cert
    export KES_CLIENT_KEY=app.key
    kes key create -k my-app-key
    
    export APP_IDENTITY=$(kes identity of app.cert)
    
    kes server --config=server-config.yml --auth=off
    
    该命令使用--auth=off因为我们的root.certapp.cert证书是自签名的。
  6. 从先前创建的密钥派生并解密数据密钥my-app-key

    kes key derive -k my-app-key
    {
      plaintext : ...
      ciphertext: ...
    }
    
    kes key decrypt -k my-app-key <base64-ciphertext>
    

使用 KES 与 MinIO 服务器

MinIO Server 需要 KES 来启用服务器端数据加密。

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

配置参考

以下部分介绍了使用泰雷兹 CipherTrust Manager(前身为 Gemalto KeySecure)作为根 KMS 存储外部密钥的 Key Encryption Service (KES) 配置设置,例如用于 MinIO 服务器端加密的密钥。

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