Google Cloud Secret Manager

本教程介绍如何设置使用 GCP Secret Manager 作为持久密钥存储的 KES 服务器。

K E S C l i e n t K E S S e r v e r G C P S e c r e t M a n a g e r

Google Cloud Secret Manager

The Google Cloud Secret Manager 是用于存储机密信息(如密码、访问令牌和加密密钥)的键值存储。

  1. 登录 GCP 控制台

  2. 创建一个新项目或选择一个现有项目

  3. 启用 Secret Manager 服务 (如果您的项目尚未启用)。

  4. 转到 GCP IAM 用于服务帐户 并为 KES 创建一个新的服务帐户。KES 使用此服务帐户来向 GCP 进行身份验证并访问 Secret Manager。

  5. 将一个或多个角色分配给新帐户

    如果您想快速入门,请分配 Secret Manager Admin 角色。但是,这会授予 KES 比所需更多的权限。

    或者,为 KES 创建一个新角色 ,该角色具有所需的最小权限

     secretmanager.secrets.create
     secretmanager.secrets.delete
     secretmanager.secrets.get
    
  6. 为服务帐户创建密钥 (通过 Actions - Create Key)。

    使用 JSON 密钥格式。

    GCP 允许您下载一个具有以下结构的 JSON 文件

    {
      "type":           "service_account",
      "project_id":     "<your-project-id>",
      "private_key_id": "<your-private-key-id>",
      "private_key":    "-----BEGIN PRIVATE KEY-----\n ... -----END PRIVATE KEY-----\n",
      "client_email":   "<your-service-account>@<your-project-id>.iam.gserviceaccount.com",
      "client_id":      "<your-client-id>"
    }
    

    使用此凭据文件配置 KES 以验证 Google Cloud Platform (GCP) 并访问 Secret Manager。

KES 服务器设置

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 tool 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 tool identity new --key=app.key --cert=app.cert app
    

    您可以随时计算 app 标识。

    kes tool 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:
      gcp:
        secretmanager:
          project_id: "<your-project-id>"                  # Use your GCP project ID
          credentials:
            client_email: "<your-client-email>"            # Use the client email from your GCP credentials file
            client_id: "<your-client-id>"                  # Use the client ID from your GCP credentials file
            private_key_id: "<your-private-key-id"         # Use the private key ID from your GCP credentials file
            private_key: "-----BEGIN PRIVATE KEY----- ..." # Use the private key from your GCP credentials file
    
  4. 在新窗口/标签页中启动 KES 服务器

    Linux

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

    容器

    以下说明使用 Podman 来管理容器。您也可以使用 Docker。

    根据您的部署需要修改地址和文件路径。

    sudo podman pod create  \
      -p 9000:9000 -p 9001:9001 -p 7373:7373  \
      -v ~/minio-kes-gcp/certs:/certs  \
      -v ~/minio-kes-gcp/minio:/mnt/minio  \
      -v ~/minio-kes-gcp/config:/etc/default/  \
      -n minio-kes-gcp
    
    sudo podman run -dt  \
      --cap-add IPC_LOCK  \
      --name kes-server  \
      --pod "minio-kes-gcp"  \
      -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-gcp"  \
      -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
    
  5. 在另一个窗口或标签页中,连接到服务器

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

    现在,如果您 转到 GCP Secret Manager,您应该看到一个名为 my-app-key 的密钥。

  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 服务器需要 KES 才能启用服务器端数据加密。

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

配置参考

以下部分介绍了密钥加密服务 (KES) 配置设置,以使用 Google Cloud Secret Manager 作为根 KMS 来存储外部密钥,例如用于 MinIO 服务器上的服务器端加密的密钥。

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