Google Cloud Secret Manager

本教程展示如何设置一个使用KES服务器Google Cloud Secret Manager作为持久键值存储。

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

Google Cloud Secret Manager

TheGoogle Cloud Secret Manager是一个用于存储密码、访问令牌和加密密钥等机密的键值存储系统。

  1. 登录到Google Cloud console

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

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

  4. 前往Google Cloud 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密钥格式。

    Google Cloud 允许您下载具有以下结构的 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 进行身份验证并访问 Secret Manager。

KES Server 设置

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:
      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 identity of app.cert)
    
    kes server --config=server-config.yml --auth=off
    
    该命令使用--auth=off因为我们的root.certapp.cert证书是自签名的。

    容器

    以下说明使用Podmanto manage the containers. 你也可以使用 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 identity of app.cert)
    
    kes server --config=server-config.yml --auth=off
    
    该命令使用--auth=off因为我们的root.certapp.cert证书是自签名的。

    现在,如果前往 Google Cloud 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 Server 需要 KES 来启用服务器端数据加密。

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

配置参考

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

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