文档

使用 KES 进行服务器端对象加密

此过程假设您使用单台主机来运行 MinIO 和 KES 容器。有关运行 KES 的说明,请参阅KES 文档

在此过程中,您将

  1. 创建一个新的用于 SSEEK

  2. 在配置为使用KES 容器以支持 SSE单节点单驱动器模式中部署 MinIO 服务器容器。

  3. 配置自动存储桶默认SSE-KMS

对于生产编排环境,请使用 MinIO Kubernetes 运算符部署启用了 SSE 并配置为与您的KMS 一起使用的租户。

对于生产裸机环境,请参阅MinIO Linux 文档,了解有关将 MinIO 与 KES 和您的KMS 配合使用的教程。

重要

在 MinIO 部署上启用 SSE 会自动使用默认加密密钥加密该部署的后端数据。

MinIO *需要* 访问 KES 和外部 KMS 才能解密后端并正常启动。KMS **必须**维护并提供对MINIO_KMS_KES_KEY_NAME的访问权限。您以后无法禁用 KES 或在以后撤消 SSE 配置。

先决条件

确保 KES 能够访问受支持的 KMS 目标

此过程假设已安装并连接到受支持的 KMS 安装的 KES,两者都可从本地主机访问。请参阅您受支持的 KMS 目标的安装说明,以部署 KES 并将其连接到 KMS 解决方案。

KES 操作需要未密封的目标

某些受支持的 KMS 目标允许您密封或解除密封保管库实例。如果配置的 KMS 服务已密封,则 KES 将返回错误。

如果重新启动或以其他方式密封保管库实例,则 KES 无法对保管库执行任何加密操作。您必须解除密封保管库以确保正常操作。

有关是否可能需要解除密封的更多信息,请参阅您选择的 KMS 解决方案的文档。

请参阅您选择的受支持 KMSKES 文档中的配置说明。

安装 Podman 或类似的容器管理接口

此过程假设您已安装并配置为以“Rootfull”模式运行的工作Podman

“Rootless”模式可能无法提供足够的权限来以必要的安全设置运行 KES。有关更多信息,请参阅相关的“rootless”文档

部署启用服务器端加密的 MinIO 和 KES

在开始这些步骤之前,请创建以下文件夹

mkdir -P ~/minio-kes-vault/certs
mkdir -P ~/minio-kes-vault/config
mkdir -P ~/minio-kes-vault/minio

对于 Windows 主机,请使用 Windows 样式路径替换路径,例如 C:\minio-kes-vault\

先决条件

根据您选择的受支持的 KMS 目标配置,您可能需要将 kes-server.cert 作为受信任的证书颁发机构 (CA) 传递。请参考客户端文档以获取有关信任第三方 CA 的说明。

1) 创建 KES 和 MinIO 配置

  1. 创建 KES 配置文件

    使用您首选的文本编辑器创建配置文件。以下示例使用 nano

    nano ~/minio-kes-vault/config/kes-config.yaml
    

    KES 使用 YAML 格式的配置文件。以下 YAML 提供了使用 HashiCorp Vault 作为根 KMS 的最低必需字段。您必须修改此 YAML 以反映您的部署环境。

    address: 0.0.0.0:7373
    
    # Disable the root administrator identity, as we do not need that level of access for
    # supporting SSE operations.
    admin:
      identity: disabled
    
    # Specify the TLS keys generated in the previous step here
    # For production environments, use keys signed by a known and trusted Certificate Authority (CA).
    tls:
      key:  /certs/kes-server.key
      cert: /certs/kes-server.cert
    
      # Specify the path to CAs used by KES for validating client certificates
      # This can alternatively be a single CA
      # KES uses these CAs in addition to the system trust store for validating client certificates.
    
      ca: /certs/CAs/
    
    # Sets access policies for KES
    # The `minio` policy grants access to the listed APIs.
    policy:
      minio:
        allow:
        - /v1/key/create/*   # You can replace these wildcard '*' with a string prefix to restrict key names
        - /v1/key/generate/* # e.g. '/minio-'
        - /v1/key/decrypt/*
        - /v1/key/bulk/decrypt
        - /v1/key/list/*
        - /v1/status
        - /v1/metrics
        - /v1/log/audit
        - /v1/log/error
        identities:
        - MINIO_API_KEY_HASH # Replace with the hash output returned from kes identity new
    
    # Specify the connection information for the Vault server.
    # The endpoint should be resolvable from the host.
    # This example assumes that Vault is configured with an AppRole ID and
    # Secret for use with KES.
    keystore:
      vault:
        endpoint: https://HOSTNAME:8200
        engine: "/path/to/engine" # Replace with the path to the K/V Engine
        version: "v1|v2" # Specify v1 or v2 depending on the version of the K/V Engine
        approle:
          id: "VAULTAPPID"     # HashiCorp Vault AppRole ID
          secret: "VAULTAPPSECRET" # HashiCorp Vault AppRole Secret ID
          retry: 15s
        status:
          ping: 10s
        # Required if Vault uses certificates signed by an unknown CA,
        # e.g. self-signed or internal (non-globally trusted).
        # Replace this value with the full path to the Vault CA certificate.
        tls:
          ca: vault-tls-CA.cert
    
    • MINIO_IDENTITY_HASH 设置为 MinIO mTLS 证书的标识哈希值。

      以下命令计算必要的哈希值

      podman run --rm                                             \
         -v ~/minio-kes-vault/certs/certs:/certs                                \
         kes:2024-10-31T07-42-41Z tool identity of /certs/minio-kes.cert
      
    • 有关为您的 受支持的 KMS 解决方案 设置 KES 的说明,请参阅为您的所选 KMS 目标定义的附加变量。

  2. 创建 MinIO 环境文件

    使用您首选的文本编辑器创建环境文件。以下示例使用 nano

    nano ~/minio-kes-vault/config/minio
    

    此命令假设 minio-kes.certminio-kes.keykes-server.cert 证书可在指定位置访问

    MINIO_ROOT_USER=myminioadmin
    MINIO_ROOT_PASSWORD=minio-secret-key-change-me
    MINIO_VOLUMES="/mnt/data"
    
    # KES Configurations
    
    MINIO_KMS_KES_ENDPOINT=https://127.0.0.1:7373
    MINIO_KMS_KES_API_KEY=<API-key-identity-string-from-KES> # Replace with the key string for your credentials
    MINIO_KMS_KES_CAPATH=/certs/server.cert
    MINIO_KMS_KES_KEY_NAME=minio-backend-default-key
    

    注意

    • API 密钥是使用 KES 服务器进行身份验证的首选方式,因为它为 KES 服务器提供了一个简化且安全的身份验证过程。

    • 或者,指定 MINIO_KMS_KES_KEY_FILEMINIO_KMS_KES_CERT_FILE 而不是 MINIO_KMS_KES_API_KEY

      API 密钥与基于证书的身份验证互斥。指定 API 密钥变量密钥文件和证书文件变量。

    • 本网站上的文档使用 API 密钥。

    MinIO 使用 MINIO_KMS_KES_KEY_NAME 密钥执行以下加密操作

    • 加密 MinIO 后端(IAM、配置等)。

    • 如果请求不包含特定的 EK,则使用 SSE-KMS 加密对象。

    • 使用 SSE-S3 加密对象。

    minio-kes 证书仅启用 MinIO 部署和 KES 服务器之间的 mTLS。它们不会以其他方式为其他客户端连接到 MinIO 启用 TLS。

    如果根 KMS 上尚不存在此密钥,KES 会自动创建它。

2) 创建 Pod 和容器

本节中的命令创建以下资源

  • 一个 Podman Pod 以便于容器通信

  • 一个 KES 服务器容器,配置为使用所选的受支持 KMS 解决方案。

  • 一个 MinIO 服务器容器,在 单节点单驱动器模式 下运行。

sudo podman pod create  \
  -p 9000:9000 -p 9001:9001 -p 7373:7373  \
  -v ~/minio-kes-vault/certs:/certs  \
  -v ~/minio-kes-vault/minio:/mnt/minio  \
  -v ~/minio-kes-vault/config:/etc/default/  \
  -n minio-kes-vault

sudo podman run -dt  \
  --cap-add IPC_LOCK  \
  --name kes-server  \
  --pod "minio-kes-vault"  \
  -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-10-31T07-42-41Z server  \
    --auth  \
    --config=/etc/default/kes-config.yaml  \

sudo podman run -dt  \
  --name minio-server  \
  --pod "minio-kes-vault"  \
  -e "MINIO_CONFIG_ENV_FILE=/etc/default/minio"  \
  quay.io/minio/minio:RELEASE.2024-10-29T16-01-48Z server  \
    --console-address ":9001"

您可以使用以下命令验证容器的状态

# Should show three pods - one for the Pod, one for KES, and one for MinIO
sudo podman container ls

如果所有 Pod 都处于运行状态,您可以通过在浏览器中打开 http://127.0.0.1:9000 并使用 MinIO 环境文件中指定的根凭据登录来连接到 MinIO 部署。

3) 生成新的加密密钥

创建密钥之前解除 Vault 密封

如果您的所选提供商需要,您必须在创建新的加密密钥之前解除支持 KMS 实例的密封。有关更多信息,请参阅您所选 KMS 解决方案的文档。

MinIO 要求在使用该密钥执行 SSE 操作之前EK 必须存在于根 KMS 上。使用 kes key create mc admin kms key create 创建一个新的 EK 以用于 SSE

以下命令使用 kes key create 命令添加一个新的外部密钥 (EK),该密钥存储在根 KMS 服务器上,用于加密 MinIO 后端。

sudo podman run --rm  \
  -v ~/minio-kes-vault/certs:/certs  \
  -e KES_SERVER=https://127.0.0.1:7373  \
  -e KES_CLIENT_KEY=/certs/minio-kes.key  \
  -e KES_CLIENT_CERT=/certs/minio-kes.cert  \
  kes:2024-10-31T07-42-41Z key create -k my-new-encryption-key

您可以根据您的用例指定任何密钥名称,例如特定于存储桶的密钥 minio-mydata-key

4) 为存储桶启用 SSE-KMS

您可以使用 MinIO 控制台或 MinIO mc CLI 使用生成的密钥启用存储桶默认 SSE-KMS

通过在您首选的浏览器中导航到 http://127.0.0.1:9001 并使用为 MinIO 容器指定的根凭据登录来打开 MinIO 控制台。

登录后,创建一个新的存储桶并根据您的喜好命名。选择齿轮图标以打开管理视图。

选择铅笔图标,位于 加密 字段旁边,以打开配置存储桶默认 SSE 方案的模态窗口。

选择 SSE-KMS,然后输入上一步中创建的密钥的名称。

保存更改后,尝试将文件上传到存储桶。在对象浏览器中查看该文件时,请注意,在侧边栏中,元数据包含 SSE 加密方案和用于加密该对象密钥的信息。这表示对象已成功加密。

以下命令

  • 为 MinIO 部署创建一个新的 别名

  • 创建一个用于存储加密数据的新的存储桶

  • 在该存储桶上启用 SSE-KMS 加密

mc alias set local http://127.0.0.1:9000 ROOTUSER ROOTPASSWORD

mc mb local/encryptedbucket
mc encrypt set SSE-KMS encrypted-bucket-key ALIAS/encryptedbucket

使用 mc cp 或任何具有 PutObject 函数的与 S3 兼容的 SDK 将文件写入存储桶。然后,您可以对该文件运行 mc stat 以确认关联的加密元数据。