AWS Secrets Manager

AWS Secrets Manager 充当密码、访问令牌和加密密钥等密钥的键值存储。AWS 使用 AWS Key Management Service (AWS-KMS) 对这些密钥进行加密。

本教程介绍如何设置使用 AWS Secrets Manager 作为持久密钥存储的 KES 服务器,该存储由 AWS-KMS 保护。

K E S C l i e n t K E S S e r v e r A W S S e c A r W e S t - s K - M M S a n a g e r

AWS Secrets Manager

先决条件
您需要一个 AWS 访问密钥和 AWS 秘密密钥对,该密钥对具有足够的 IAM 策略 权限来创建、检索和删除 AWS Secrets Manager 中的密钥。
  1. 创建 AWS 访问/秘密密钥对

    • 转到 AWS 控制台

    • 创建一个新用户

      有关添加新 AWS 用户的详细信息,请参阅 AWS 文档

    • 使用“编程访问”类型创建新的访问密钥/秘密密钥对

  2. 附加 AWS 策略

    将策略或策略附加到新用户,以授予对 AWS Secrets Manager 和 AWS-KMS 的访问权限。

    您的 AWS IAM 用户需要具有以下权限

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1578498399136",
          "Action": [
            "secretsmanager:CreateSecret",
            "secretsmanager:DeleteSecret",
            "secretsmanager:GetSecretValue",
            "secretsmanager:ListSecrets"
          ],
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Sid": "Stmt1578498562539",
          "Action": [
            "kms:Decrypt",
            "kms:DescribeKey",
            "kms:Encrypt"
          ],
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }
    
    此示例策略允许访问所有 KMS 和 SecretsManager 资源。您可以通过指定一个AWS ARN作为Resource而不是*来限制访问权限。
    AWS 提供了预定义的策略(SecretsManagerReadWriteAWSKeyManagementServicePowerUser)。但是,这些策略授予的权限超出了实际需求。

KES 服务器设置

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

    首先,我们需要为 KES 服务器生成一个 TLS 私钥和证书。KES 服务器默认情况下是安全的,只能在 TLS 环境下运行。为了简便起见,这里使用自签名证书。

    以下命令将生成一个新的 TLS 私钥/公钥对,以及一个用于 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
    
    如果您已经拥有 TLS 私钥和证书,例如来自 WebPKI 或内部 CA,您可以使用它们代替。请记住稍后调整 tls 配置部分。
  2. 生成客户端凭据

    以下命令将生成一个新的 TLS 私钥/公钥对

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

    Identityclient.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:
         aws:
           secretsmanager:
             endpoint: secretsmanager.us-east-2.amazonaws.com  # Use the SecretsManager in your region.
             region:   us-east-2                               # Use your region
             kmskey:   ""                                      # Your AWS-KMS master key (CMK) - optional.
             credentials:
               accesskey: "" # Your AWS Access Key
               secretkey: "" # Your AWS Secret Key
    
  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
    

KES CLI 访问

  1. 设置 KES_SERVER 端点

    此环境变量告诉 KES CLI 应该连接到哪个服务器。

    $ export KES_SERVER=https://127.0.0.1:7373
    
  2. 使用客户端凭据

    以下环境变量设置 KES CLI 用于与 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 来启用服务器端数据加密。

请参阅 用于 MinIO 的 KES 指导手册,了解将新 KES 服务器与 MinIO 服务器一起使用所需的额外步骤。

配置参考

以下部分介绍了用于将 AWS Secrets Manager 和 AWS Key Management System 作为根 KMS 来存储外部密钥(例如用于 MinIO 服务器上的服务器端加密的密钥)的 Key Encryption Service (KES) 配置设置。

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