×

TLS 安全配置文件为服务器提供了一种方法,用于规范客户端连接到服务器时可以使用哪些密码套件。这确保 OpenShift Container Platform 组件使用不允许已知不安全协议、密码套件或算法的加密库。

集群管理员可以选择为以下每个组件使用哪个 TLS 安全配置文件

  • Ingress 控制器

  • 控制平面

    这包括 Kubernetes API 服务器、Kubernetes 控制器管理器、Kubernetes 调度程序、OpenShift API 服务器、OpenShift OAuth API 服务器、OpenShift OAuth 服务器、etcd、机器配置操作符和机器配置服务器。

  • kubelet(当它充当 Kubernetes API 服务器的 HTTP 服务器时)

了解 TLS 安全配置文件

您可以使用 TLS(传输层安全)安全配置文件来定义各种 OpenShift Container Platform 组件所需的 TLS 密码套件。OpenShift Container Platform TLS 安全配置文件基于Mozilla 推荐的配置

您可以为每个组件指定以下 TLS 安全配置文件之一

表 1. TLS 安全配置文件
配置文件 描述

旧版

此配置文件适用于旧版客户端或库。此配置文件基于旧版向后兼容性推荐配置。

旧版配置文件要求最低 TLS 版本为 1.0。

对于 Ingress 控制器,最低 TLS 版本从 1.0 转换为 1.1。

中间版

此配置文件是大多数客户端的推荐配置。它是 Ingress 控制器、kubelet 和控制平面的默认 TLS 安全配置文件。此配置文件基于中间版兼容性推荐配置。

中间版配置文件要求最低 TLS 版本为 1.2。

现代版

此配置文件适用于无需向后兼容性的现代客户端。此配置文件基于现代版兼容性推荐配置。

现代版配置文件要求最低 TLS 版本为 1.3。

自定义

此配置文件允许您定义要使用的 TLS 版本和密码套件。

使用 自定义配置文件时请谨慎,因为无效的配置可能会导致问题。

使用预定义配置文件类型时,有效配置文件配置可能会在版本之间发生变化。例如,给定在 X.Y.Z 版本上部署的要使用中间版配置文件的规范,升级到 X.Y.Z+1 版本可能会导致应用新的配置文件配置,从而导致推出。

查看 TLS 安全配置文件详细信息

您可以查看以下每个组件的预定义 TLS 安全配置文件的最低 TLS 版本和密码套件:Ingress 控制器、控制平面和 kubelet。

配置文件的最低 TLS 版本和密码套件列表的有效配置可能因组件而异。

步骤
  • 查看特定 TLS 安全配置文件的详细信息

    $ oc explain <component>.spec.tlsSecurityProfile.<profile> (1)
    1 对于 <component>,请指定 ingresscontrollerapiserverkubeletconfig。对于 <profile>,请指定 oldintermediatecustom

    例如,要检查控制平面`intermediate`配置文件中包含的密码套件

    $ oc explain apiserver.spec.tlsSecurityProfile.intermediate
    示例输出
    KIND:     APIServer
    VERSION:  config.openshift.io/v1
    
    DESCRIPTION:
        intermediate is a TLS security profile based on:
        https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29
        and looks like this (yaml):
        ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 -
        TLS_CHACHA20_POLY1305_SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 -
        ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES256-GCM-SHA384 -
        ECDHE-RSA-AES256-GCM-SHA384 - ECDHE-ECDSA-CHACHA20-POLY1305 -
        ECDHE-RSA-CHACHA20-POLY1305 - DHE-RSA-AES128-GCM-SHA256 -
        DHE-RSA-AES256-GCM-SHA384 minTLSVersion: TLSv1.2
  • 查看组件的tlsSecurityProfile字段的所有详细信息

    $ oc explain <component>.spec.tlsSecurityProfile (1)
    1 对于<component>,请指定ingresscontrollerapiserverkubeletconfig

    例如,要检查 Ingress 控制器tlsSecurityProfile字段的所有详细信息

    $ oc explain ingresscontroller.spec.tlsSecurityProfile
    示例输出
    KIND:     IngressController
    VERSION:  operator.openshift.io/v1
    
    RESOURCE: tlsSecurityProfile <Object>
    
    DESCRIPTION:
         ...
    
    FIELDS:
       custom	<>
         custom is a user-defined TLS security profile. Be extremely careful using a
         custom profile as invalid configurations can be catastrophic. An example
         custom profile looks like this:
         ciphers: - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 -
         ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 minTLSVersion:
         TLSv1.1
    
       intermediate	<>
         intermediate is a TLS security profile based on:
         https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29
         and looks like this (yaml):
         ... (1)
    
       modern	<>
         modern is a TLS security profile based on:
         https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility and
         looks like this (yaml):
         ... (2)
         NOTE: Currently unsupported.
    
       old	<>
         old is a TLS security profile based on:
         https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility
         and looks like this (yaml):
         ... (3)
    
       type	<string>
         ...
    1 此处列出了intermediate配置文件的密码套件和最低版本。
    2 此处列出了modern配置文件的密码套件和最低版本。
    3 此处列出了old配置文件的密码套件和最低版本。

配置 Ingress 控制器的 TLS 安全配置文件

要为 Ingress 控制器配置 TLS 安全配置文件,请编辑IngressController自定义资源 (CR) 以指定预定义或自定义 TLS 安全配置文件。如果未配置 TLS 安全配置文件,则默认值基于为 API 服务器设置的 TLS 安全配置文件。

配置Old TLS 安全配置文件的IngressController CR 示例
apiVersion: operator.openshift.io/v1
kind: IngressController
 ...
spec:
  tlsSecurityProfile:
    old: {}
    type: Old
 ...

TLS 安全配置文件定义了 Ingress 控制器的 TLS 连接的最小 TLS 版本和 TLS 密码套件。

您可以在IngressController自定义资源 (CR) 的Status.Tls Profile下查看已配置的 TLS 安全配置文件的密码套件和最小 TLS 版本,并在Spec.Tls Security Profile下查看已配置的 TLS 安全配置文件。对于Custom TLS 安全配置文件,特定密码套件和最小 TLS 版本都列在两个参数下。

HAProxy Ingress 控制器镜像支持 TLS 1.3Modern配置文件。

Ingress 运算符还会将OldCustom配置文件的 TLS 1.0转换为1.1

先决条件
  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 编辑openshift-ingress-operator项目中的IngressController CR 以配置 TLS 安全配置文件

    $ oc edit IngressController default -n openshift-ingress-operator
  2. 添加spec.tlsSecurityProfile字段

    Custom配置文件的IngressController CR 示例
    apiVersion: operator.openshift.io/v1
    kind: IngressController
     ...
    spec:
      tlsSecurityProfile:
        type: Custom (1)
        custom: (2)
          ciphers: (3)
          - ECDHE-ECDSA-CHACHA20-POLY1305
          - ECDHE-RSA-CHACHA20-POLY1305
          - ECDHE-RSA-AES128-GCM-SHA256
          - ECDHE-ECDSA-AES128-GCM-SHA256
          minTLSVersion: VersionTLS11
     ...
    1 指定 TLS 安全配置文件类型 (OldIntermediateCustom)。默认为Intermediate
    2 为所选类型指定相应的字段
    • old: {}

    • intermediate: {}

    • custom

    3 对于custom类型,请指定 TLS 密码套件列表和最小可接受的 TLS 版本。
  3. 保存文件以应用更改。

验证
  • 验证配置文件是否已在IngressController CR 中设置

    $ oc describe IngressController default -n openshift-ingress-operator
    示例输出
    Name:         default
    Namespace:    openshift-ingress-operator
    Labels:       <none>
    Annotations:  <none>
    API Version:  operator.openshift.io/v1
    Kind:         IngressController
     ...
    Spec:
     ...
      Tls Security Profile:
        Custom:
          Ciphers:
            ECDHE-ECDSA-CHACHA20-POLY1305
            ECDHE-RSA-CHACHA20-POLY1305
            ECDHE-RSA-AES128-GCM-SHA256
            ECDHE-ECDSA-AES128-GCM-SHA256
          Min TLS Version:  VersionTLS11
        Type:               Custom
     ...

配置控制平面的 TLS 安全配置文件

要为控制平面配置 TLS 安全配置文件,请编辑APIServer自定义资源 (CR) 以指定预定义或自定义 TLS 安全配置文件。在APIServer CR 中设置 TLS 安全配置文件会将设置传播到以下控制平面组件

  • Kubernetes API 服务器

  • Kubernetes 控制器管理器

  • Kubernetes 调度器

  • OpenShift API 服务器

  • OpenShift OAuth API 服务器

  • OpenShift OAuth 服务器

  • etcd

  • 机器配置操作符

  • 机器配置服务器

如果未配置 TLS 安全配置文件,则默认 TLS 安全配置文件为Intermediate

Ingress 控制器的默认 TLS 安全配置文件基于为 API 服务器设置的 TLS 安全配置文件。

配置Old TLS 安全配置文件的APIServer CR 示例
apiVersion: config.openshift.io/v1
kind: APIServer
 ...
spec:
  tlsSecurityProfile:
    old: {}
    type: Old
 ...

TLS 安全配置文件定义了与控制平面组件通信所需的最小 TLS 版本和 TLS 密码套件。

您可以在APIServer自定义资源 (CR) 的Spec.Tls Security Profile下查看已配置的 TLS 安全配置文件。对于Custom TLS 安全配置文件,将列出具体的密码套件和最小 TLS 版本。

控制平面不支持 TLS 1.3作为最小 TLS 版本;不支持Modern配置文件,因为它需要 TLS 1.3

先决条件
  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 编辑默认APIServer CR 以配置 TLS 安全配置文件

    $ oc edit APIServer cluster
  2. 添加spec.tlsSecurityProfile字段

    Custom配置文件的APIServer CR 示例
    apiVersion: config.openshift.io/v1
    kind: APIServer
    metadata:
      name: cluster
    spec:
      tlsSecurityProfile:
        type: Custom (1)
        custom: (2)
          ciphers: (3)
          - ECDHE-ECDSA-CHACHA20-POLY1305
          - ECDHE-RSA-CHACHA20-POLY1305
          - ECDHE-RSA-AES128-GCM-SHA256
          - ECDHE-ECDSA-AES128-GCM-SHA256
          minTLSVersion: VersionTLS11
    1 指定 TLS 安全配置文件类型 (OldIntermediateCustom)。默认为Intermediate
    2 为所选类型指定相应的字段
    • old: {}

    • intermediate: {}

    • custom

    3 对于custom类型,请指定 TLS 密码套件列表和最小可接受的 TLS 版本。
  3. 保存文件以应用更改。

验证
  • 验证 TLS 安全配置文件是否已在APIServer CR 中设置

    $ oc describe apiserver cluster
    示例输出
    Name:         cluster
    Namespace:
     ...
    API Version:  config.openshift.io/v1
    Kind:         APIServer
     ...
    Spec:
      Audit:
        Profile:  Default
      Tls Security Profile:
        Custom:
          Ciphers:
            ECDHE-ECDSA-CHACHA20-POLY1305
            ECDHE-RSA-CHACHA20-POLY1305
            ECDHE-RSA-AES128-GCM-SHA256
            ECDHE-ECDSA-AES128-GCM-SHA256
          Min TLS Version:  VersionTLS11
        Type:               Custom
     ...
  • 验证 TLS 安全配置文件是否已在etcd CR 中设置

    $ oc describe etcd cluster
    示例输出
    Name:         cluster
    Namespace:
     ...
    API Version:  operator.openshift.io/v1
    Kind:         Etcd
     ...
    Spec:
      Log Level:         Normal
      Management State:  Managed
      Observed Config:
        Serving Info:
          Cipher Suites:
            TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
            TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
            TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
            TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
            TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
            TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
          Min TLS Version:           VersionTLS12
     ...
  • 验证 TLS 安全配置文件是否已在机器配置服务器 Pod 中设置

    $ oc logs machine-config-server-5msdv -n openshift-machine-config-operator
    示例输出
    # ...
    I0905 13:48:36.968688       1 start.go:51] Launching server with tls min version: VersionTLS12 & cipher suites [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256]
    # ...

配置 kubelet 的 TLS 安全配置文件

要在 kubelet 充当 HTTP 服务器时配置其 TLS 安全配置文件,请创建KubeletConfig自定义资源 (CR) 以为特定节点指定预定义或自定义 TLS 安全配置文件。如果未配置 TLS 安全配置文件,则默认 TLS 安全配置文件为Intermediate

kubelet 使用其 HTTP/GRPC 服务器与 Kubernetes API 服务器通信,该服务器向 Pod 发送命令,收集日志,并通过 kubelet 在 Pod 上运行 exec 命令。

在工作节点上配置Old TLS 安全配置文件的KubeletConfig CR 示例
apiVersion: config.openshift.io/v1
kind: KubeletConfig
 ...
spec:
  tlsSecurityProfile:
    old: {}
    type: Old
  machineConfigPoolSelector:
    matchLabels:
      pools.operator.machineconfiguration.openshift.io/worker: ""
#...

您可以在已配置节点上的kubelet.conf文件中查看已配置 TLS 安全配置文件的密码套件和最小 TLS 版本。

先决条件
  • 您已以具有cluster-admin角色的用户身份登录到 OpenShift Container Platform。

步骤
  1. 创建KubeletConfig CR 以配置 TLS 安全配置文件

    Custom配置文件的KubeletConfig CR 示例
    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-kubelet-tls-security-profile
    spec:
      tlsSecurityProfile:
        type: Custom (1)
        custom: (2)
          ciphers: (3)
          - ECDHE-ECDSA-CHACHA20-POLY1305
          - ECDHE-RSA-CHACHA20-POLY1305
          - ECDHE-RSA-AES128-GCM-SHA256
          - ECDHE-ECDSA-AES128-GCM-SHA256
          minTLSVersion: VersionTLS11
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" (4)
    #...
    1 指定 TLS 安全配置文件类型 (OldIntermediateCustom)。默认为Intermediate
    2 为所选类型指定相应的字段
    • old: {}

    • intermediate: {}

    • custom

    3 对于custom类型,请指定 TLS 密码套件列表和最小可接受的 TLS 版本。
    4 可选:为要应用 TLS 安全配置文件的节点指定机器配置池标签。
  2. 创建KubeletConfig对象

    $ oc create -f <filename>

    根据集群中工作节点的数量,等待已配置的节点逐个重启。

验证

要验证配置文件是否已设置,请在节点处于Ready状态后执行以下步骤

  1. 为已配置的节点启动调试会话

    $ oc debug node/<node_name>
  2. 在调试 shell 中将/host设置为根目录

    sh-4.4# chroot /host
  3. 查看kubelet.conf文件

    sh-4.4# cat /etc/kubernetes/kubelet.conf
    示例输出
      "kind": "KubeletConfiguration",
      "apiVersion": "kubelet.config.k8s.io/v1beta1",
    #...
      "tlsCipherSuites": [
        "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
        "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
        "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
        "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"
      ],
      "tlsMinVersion": "VersionTLS12",
    #...