文档

为 MinIO 启用多域 TLS

MinIO 支持使用 Transport Layer Security (TLS) 1.2+ 对入站和出站流量进行加密。

MinIO Operator 支持通过以下方式为 MinIO 租户启用 TLS:

  • 使用 Kubernetes Cluster Signing Certificates 自动下发 TLS

  • 使用 Kubernetes secret 指定用户自有 TLS

  • 使用 cert-manager 管理 TLS 证书

MinIO Operator 支持在 部署修改 MinIO 租户时挂载用户指定的 TLS 证书。

这些自定义证书支持 Server Name Indication (SNI),即 MinIO server 会根据客户端指定的主机名决定使用哪张证书。 例如,你可以生成由组织内首选 Certificate Authority (CA) 签发的证书,并将其挂载到 MinIO 租户上。 信任该 CA 的应用可以连接到 MinIO 租户,并完整校验其 TLS 证书。

MinIO 会自动检测配置目录或默认目录中的 TLS 证书,并在启用 TLS 的情况下启动。

MinIO server 支持多张 TLS 证书,server 会使用 Server Name Indication (SNI) 来识别在响应客户端请求时应当使用哪张证书。 当客户端使用特定主机名连接时,MinIO 会通过 SNI 选择与该主机名匹配的 TLS 证书。

本文说明如何为 MinIO 启用多域 TLS。 关于单域 TLS,请参见 TODO。

前提条件

访问 MinIO 集群

你必须能够访问 Kubernetes 集群,并且 kubectl 配置中具备对应的管理权限。

本过程假设你的权限足以在 Kubernetes 集群中部署或修改 MinIO 相关资源,包括但不限于 pod、statefulset、replicaset、deployment 和 secret。

本过程使用 mc 对 MinIO 集群执行操作。 请在一台可通过网络访问该集群的机器上安装 mc。 关于下载和安装 mc,请参见 mc Installation Quickstart

本过程还假设你已经为 MinIO 集群配置了 alias

同时假设你拥有对每台 MinIO 主机 server 的 SSH 或类似 shell 级别的管理访问权限。

TLS 证书

请准备 MinIO 所需的 TLS 证书,并确保其使用 受支持的密码套件

关于支持的租户 TLS 配置,请参见 Kubernetes 上的 MinIO TLS

请按你偏好的方式准备证书,例如通过组织内部 Certificate Authority,或使用 Digicert、Verisign 等知名公共提供商。

你也可以使用 openssl 或 MinIO 的 certgen 工具创建自签名证书。

例如,以下命令会生成一个自签名证书,其中包含与 MinIO Server 主机关联的一组 IP 和 DNS Subject Alternative Name (SAN):

certgen -host "localhost,minio-*.example.net"

关于证书生成和放置方式的更完整说明,请参见 Baremetal 上的 MinIO TLS

步骤

MinIO Operator 支持通过三种方式管理 MinIO 租户上的 TLS 证书:

  • MinIO 自动生成 TLS 证书

  • 用户指定的 TLS 证书

  • cert-manager 管理的 TLS 证书

你也可以部署未启用 TLS 的 MinIO 租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.requestAutoCertTenantSpec.certConfig 字段。

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看这些字段及其当前配置(如果已配置)。

  2. 按需创建或修改租户 YAML,设置 requestAutoCertcertConfig 的值。 例如:

    spec:
       requestAutoCert: true
       certConfig:
         commonName: "CN=MinioTenantCommonName"
         organizationName: "O=MyOrganizationName"
         dnsNames:
           - 'minio-tenant.domain.tld'
           - '*.kubernete.cluster.dns.path.tld'
    

    spec.certConfig.dnsNames 应包含 TLS 证书所覆盖的 SAN 列表。

    创建或修改租户资源时,可参考 Kustomize Tenant base YAML 作为基线模板。

  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.externalCertsCecret 字段

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看该字段当前配置(如果已配置)。

  2. 创建或修改租户 YAML,使其引用适当的 cert-manager 资源。

    例如,以下租户 YAML 片段引用了一个名为 myminio-tls 的 cert-manager 资源:

    apiVersion: minio.min.io/v2
    kind: Tenant
    metadata:
    name: myminio
    namespace: minio-tenant
    spec:
       ## Disable default tls certificates.
       requestAutoCert: false
       ## Use certificates generated by cert-manager.
       externalCertSecret:
          - name: default-domain
            type: cert-manager.io/v1
          - name: internal-domain
            type: cert-manager.io/v1
          - name: external-domain
            type: cert-manager.io/v1
    
  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

以下步骤同时适用于使用 Kustomize 的新建和现有 MinIO 部署:

  1. 检查 Tenant CRD 中的 TenantSpec.externalCertSecret 字段。

    对于现有 MinIO 租户,请检查用于创建租户的 Kustomize 资源,并查看该字段当前配置(如果已配置)。

  2. 创建或修改租户 YAML,使其引用一个类型为 kubernetes.io/tls 的 secret:

    例如,以下租户 YAML 片段为 MinIO 租户可接受连接的每个域名引用了两份 TLS secret:

    apiVersion: minio.min.io/v2
    kind: Tenant
    metadata:
    name: myminio
    namespace: minio-tenant
    spec:
       ## Disable default tls certificates.
       requestAutoCert: false
       ## Use certificates generated by cert-manager.
       externalCertSecret:
       - name: domain-certificate-1
       type: kubernetes.io/tls
       - name: domain-certificate-2
       type: kubernetes.io/tls
    
  3. 应用新的 Kustomization 模板

    一旦应用这些更改,MinIO Operator 会使用更新后的配置自动重新部署该租户。

MinIO Server 会为每个节点搜索 TLS 私钥和证书,并使用这些凭据启用 TLS。 MinIO 会在发现并验证证书后自动启用 TLS。 搜索位置取决于你的 MinIO 配置:

默认情况下,MinIO server 会在以下目录中查找每个节点的 TLS 私钥和证书:

${HOME}/.minio/certs

其中 ${HOME} 是运行 MinIO Server 进程的用户主目录。 如果 ${HOME}/.minio/certs 目录不存在,你可能需要手动创建它。

对于由 systemd 管理的部署,该路径必须对应运行 MinIO 进程的 USER。 如果该用户没有主目录,请改用 Custom Path 选项。

你可以通过 minio server --certs-dir-S 参数指定 MinIO server 搜索证书的路径。

例如,以下命令片段指示 MinIO 进程使用 /opt/minio/certs 目录存放 TLS 证书。

minio server --certs-dir /opt/minio/certs ...

运行 MinIO service 的用户 必须 对该目录拥有读写权限。

请将证书放入 /certs 目录,并为 MinIO 需要呈现 TLS 证书的每个附加域名在 /certs 下创建一个子目录。 虽然 MinIO 对目录名称没有强制要求,但建议将子目录命名为对应域名,以便人工识别。 请将该域名的 TLS 私钥和公钥证书放入对应子目录中。

/path/to/certs
   private.key
   public.crt
   s3-example.net/
      private.key
      public.crt
   internal-example.net/
      private.key
      public.crt