Translated message

A translation of this page exists in English.

OpenShift Container Platform での TLS 設定

更新 -

免責事項: 以下に示す外部の Web サイトへのリンクは、お客様の利便性のみを目的として提供しています。Red Hat はリンクの内容を確認しておらず、コンテンツまたは可用性について責任を負わないものとします。外部の Web サイトへのリンクを含めることは、Web サイトまたはそれらの法的主体、製品またはサービスについて Red Hat が承認したことを意味するものではありません。お客様は、外部サイトまたはコンテンツの使用 (または信頼) によって生じる損失または費用について、Red Hat が責任を負わないことに同意するものとします。

はじめに

このドキュメントは、OpenShift Container Platform 3 と 4 の TLS 設定オプションの比較と概要を説明することを目的としています。可能な場合は、TLS の最新バージョンである 1.3 を使用することを推奨します。

TLS 1.3 では、ハンドシェイクプロトコルへの大きな変更を含む TLS 仕様の大幅な改訂が行われており、パフォーマンスとセキュリティーの改善点がいくつかあります。一部の OpenShift バージョンおよびコンポーネントでは、TLS 1.3 はまだサポートされていません。そのようなコンポーネントについては、利用できる最もセキュアな TLS 1.2 のオプションを代わりに使用するように OpenShift コンポーネントを設定できます。ただし、1 つの TLS 接続に、互換性のあるクライアントとサーバーの両方が必要です。サーバー側コンポーネントで古い暗号スイートを無効にすると、古いクライアントが接続できなくなるおそれがあります。以下に説明する設定オプションは、実稼働環境に適用する前に、すべて十分にテストしてください。

TLS 1.2 暗号スイート

1 つの暗号スイートは、鍵交換 (Kx) 方式、鍵交換認証 (Au) 方式 (証明書鍵タイプ)、一括暗号化 (Enc) 方式、およびメッセージ認証 (Mac) 方式を定義したものです。セットを TLS 1.2 暗号スイートに限定することは、出発点としては適切です。そうするだけで、CBC (Lucky13/CVE-2013-0169 に対して脆弱) や DES/3DES (Sweet32/CVE-2016-2183 に対して脆弱) など、既知の脆弱な暗号プリミティブを含む以前のバージョンの暗号スイートが除外されるためです。

ただし、TLS 1.2 暗号スイートには、TLS 1.3 でサポートされなくなった方式を含んでいるものがいくつかあります。つまり、鍵交換用の RSA 方式やメッセージ認証用の AEAD 以外の方式などです。

TLS 1.2 Cipher Suites

ECDHE-ECDSA-AES256-GCM-SHA384  Kx=ECDH  Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384  Kx=ECDH    Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-CHACHA20-POLY1305  Kx=ECDH  Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-RSA-CHACHA20-POLY1305  Kx=ECDH    Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256  Kx=ECDH  Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256  Kx=ECDH    Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-SHA256  Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-SHA256  Kx=ECDH   Au=RSA  Enc=AES(128)  Mac=SHA256
AES256-GCM-SHA384      Kx=RSA   Au=RSA  Enc=AESGCM(256) Mac=AEAD
AES128-GCM-SHA256      Kx=RSA   Au=RSA  Enc=AESGCM(128) Mac=AEAD
AES256-SHA256          Kx=RSA   Au=RSA  Enc=AES(256)  Mac=SHA256
AES128-SHA256          Kx=RSA   Au=RSA  Enc=AES(128)  Mac=SHA256
DHE-RSA-AES256-GCM-SHA384  Kx=DH    Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-CHACHA20-POLY1305  Kx=DH    Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256  Kx=DH    Au=RSA  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES256-SHA256  Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
DHE-RSA-AES128-SHA256  Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256

(一括暗号化に AES CCM を使用する暗号スイートは、RHEL7 の Go crypto/tls または OpenSSL ではサポートされていないため、上記から除外されています)

鍵交換用の RSA 方式は、Forward Secrecy を提供しないため、TLS 1.3 から削除されました。したがって、鍵交換に RSA を使用する暗号スイートは、使用を避ける必要があります。

メッセージの整合性のために AEAD 以外のアルゴリズムを使用する暗号スイートは、TLS 1.3 ではサポートされなくなったため、使用を避ける必要があります。

上記の非推奨の方式を使用しない、TLS 1.2 でサポートされている暗号スイートは、次のものだけです。

ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-CHACHA20-POLY1305
ECDHE-RSA-CHACHA20-POLY1305
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-CHACHA20-POLY1305
DHE-RSA-AES128-GCM-SHA256

ただし、いくつか注意点があります。

  • 一括暗号化用の CHACHA20/POLY1305 は、RHEL7 の OpenSSL ではサポートされていません。

  • 鍵交換用の DHE (つまり非楕円曲線 DH) は Go crypto/tls ではサポートされていません。

これらの暗号スイートを除外すると、次のものが残ります。

ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-GCM-SHA256

このリストは、TLS 1.3 とサポートされていない暗号スイートが除外されている Mozilla の Intermediate リスト と同等です。

上記の暗号スイートは、TLS 1.3 で使用可能なものと同じプリミティブ を使用するため、Perfect Forward Secrecy と強力な一括暗号化を提供し、メッセージの整合性のために AEAD を使用します。有効な暗号スイートを上記のセットのものに限定することで、既知の脆弱性 (Sweet32Lucky13 など) を持つ TLS 接続の確立を防ぐことができます。ただし、TLS 1.3 には他にもセキュリティーの強化点がいくつかあるため (「付録」を参照)、上記の TLS 1.2 暗号スイートを使用しても、TLS 1.3 と同等のセキュリティーが提供されるわけではありません。

次の暗号スイートは TLS 1.3 で新しく追加されたものです。このプロトコル仕様でサポートされている選択肢は、次のものだけです。

TLS 1.3 Cipher Suites

TLS_AES_256_GCM_SHA384         Kx=any   Au=any  Enc=AESGCM(256)          Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 Kx=any     Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256       Kx=any     Au=any  Enc=AESGCM(128)          Mac=AEAD
TLS_AES_128_CCM_SHA256       Kx=any     Au=any  Enc=AESCCM(128)          Mac=AEAD

TLS 1.3 の新しい暗号スイートは、定義が異なり、認証タイプ (RSA など) や鍵交換メカニズム (DHE や ECHDE など) が指定されていませんが、これらのアルゴリズムはサポートされています [0][1]

TLS 設定

以下の手順では、暗号スイート名を OpenSSL 名から IANA 名に変換する必要があることに注意してください (例: ECDHE-RSA-AES256-GCM-SHA384TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 になります)。

OpenShift 3.11

OpenShift 3.11 は、Go バージョン 1.12 で追加された TLS 1.3 をサポートしていません。OpenShift 3.11 のコアコンポーネントは、Go バージョン 1.10 を使用してビルドされています。OpenShift 3.11 で使用される HAProxy ルーターは、Go で記述されていませんが、RHEL7 に同梱されているバージョンの OpenSSL を使用しています。この OpenSSL も TLS 1.3 をサポートしていません。

マスター

/etc/origin/master/master-config.yaml を編集し、必要な暗号スイートを指定します。

 servingInfo:
    …
    minTLSVersion: VersionTLS12
    cipherSuites:  
    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

次に、マスターサービスを再起動します。

$ /usr/local/bin/master-restart api api && /usr/local/bin/master-restart controllers controllers

ここで行われた TLS の変更は、Etcd インスタンスにも適用されます。

How to set ciphers and TLS version for OpenShift Container Platform

Web コンソール

$ oc edit configmap webconsole-config -n  openshift-web-console
  ...
 servingInfo:
    …
    minTLSVersion: VersionTLS12
    cipherSuites:  
    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

ノード

Kubelet (ポート 10248、10250)

$ oc edit configmap node-config-infra -n  openshift-node
  ...
 servingInfo:
    …
    minTLSVersion: VersionTLS12
    cipherSuites:  
    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

マスター、インフラ、およびコンピュートノードの ConfigMap を、それぞれ個別に編集する必要があります。

ルーター

ルーターには、OpenSSL 暗号スイート名を使用する必要があります。ルーターの HAProxy は、Go で記述されておらず、OpenSSL を使用しているため、Go crypto/tls パッケージ でサポートされていない 2 つの暗号スイートを (必要に応じて) 再度追加することもできます。

OCP 3.11 のルーターは、すべての RHEL7 ベースの製品と同様に、TLS 1.3 をサポートしていないバージョンの OpenSSL を使用します。

$ oc edit deploymentconfig router -n default
...
    - name: ROUTER_CIPHERS
      value: ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256
    - name: SSL_MIN_VERSION
      value: TLSv1.2
...

上記の設定は、クラスターの ルーター にのみ適用されます。また、ルーター設定の変更との互換性について、個々のサービスを確認する必要があります。バックエンドサーバーコンポーネントでも同様の変更が必要になる可能性があるためです (edge termination かパススルーかによって異なります)。

Router Cipher Suite

TLS Cipher Suites

ルーターの TLS 設定の変更は、現在、ルーターのメトリクスに使用されるポート 1936 には影響しません。

etcd

etcd (ポート 2379、9977-9) はマスター設定の変更を継承します。

Specifying TLS ciphers for etcd

OpenShift 4

OpenShift 4 は、バージョン 4.2 以降、Go 1.12 を使用してビルドされているため、ほとんどのコンポーネントで TLS 1.3 がサポートされています。Openshift 4.6 より前では、ルーターは HAProxy を使用していましたが、RHEL7 の OpenSSL はまだ TLS 1.3 をサポートしていません。それ以降のバージョンでは、ルーターは RHEL に基づいており、TLS 1.3 をサポートしています。

OCP 4 - マスター

本稿執筆時点では、最新バージョンの OpenShift 4 (4.7) は TLS 1.3 をサポートしており、API サーバー (ポート 6443) は “Intermediate” TLS セキュリティープロファイルを使用するように設定されています。このプロファイルには、既知の脆弱性のない TLS 1.3 および 1.2 の縮小された暗号スイートが含まれています。API サーバーをこれ以上設定する必要はありませんが、次のドキュメントで説明されている設定を使用することで設定を行うことができます。

APIServer [config.openshift.io/v1]

TLS 1.2:
    ECDHE-RSA-AES256-GCM-SHA384
    ECDHE-RSA-CHACHA20-POLY1305
    ECDHE-RSA-AES128-GCM-SHA256
TLS 1.3:
    TLS_AES_256_GCM_SHA384
    TLS_CHACHA20_POLY1305_SHA256
    TLS_AES_128_GCM_SHA256

その他の内部サービス、つまり kube-controller (ポート 10257) と kube-scheduler (ポート 10259) は、わずかに拡張された暗号スイートのセットを使用します。ただし、これらは OpenShift Container Platform バージョン 4.8.2 より前では設定できません。バージョン 4.8.2 で、暗号スイートの設定が可能になり、よく知られたセキュアな暗号スイートのみがデフォルトで有効になる変更が導入されました。

OCP 4 - Web コンソール

OpenShift Container Platform 4.7 以前では、Web コンソールで TLS を設定することはできません。バージョン 4.5.13 で、古い脆弱な暗号スイートが非推奨になり、OpenShift の一般的なデフォルト設定のセキュアなセットを使用する変更が導入されました。

OCP 4 - ノード

Kubelet (ポート 10248、10250)

$ oc label machineconfigpool worker custom-kubelet=tls-ciphers
$ oc label machineconfigpool master custom-kubelet=tls-ciphers
$ oc create -f kubeletconfig.yaml
apiVersion: machineconfiguration.openshift.io/v1
kind: KubeletConfig
metadata:
  name: tls-ciphers
spec:
  machineConfigPoolSelector:
    matchLabels:
      custom-kubelet: tls-ciphers
  kubeletConfig:
    tlsCipherSuites:
    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

Recommended host practices

kubelet については、Kubernetes 1.19 および OpenShift 4.6 より前のバージョンでは、TLS 1.3 暗号スイートを設定で宣言することはできません。それにもかかわらず、設定で宣言された TLS 1.2 暗号スイートに加えて、TLS 1.3 暗号スイートが kubelet に対して 有効になります

OCP 4 - ルーター

OpenShift 4.6 より前では、ルーターは強化された TLS 1.2 暗号スイートのセットを使用します (HAProxy ルーターは RHEL7 の OpenSSL に依存していたため、TLS 1.3 はサポートされていませんでした)。

ECDHE-RSA-AES128-GCM-SHA256              
ECDHE-RSA-AES256-GCM-SHA384          
DHE-RSA-AES128-GCM-SHA256                
DHE-RSA-AES256-GCM-SHA384

ただし、以下の方法でさらにカスタマイズすることも可能です (例示のために 2 つの暗号スイートを除外しています)。

$ oc edit ingresscontroller default -n openshift-ingress-operator
spec:
  tlsSecurityProfile:
    type: Custom
    custom:
    ciphers:
    - ECDHE-ECDSA-AES128-GCM-SHA256
    - ECDHE-RSA-AES128-GCM-SHA256
    minTLSVersion: VersionTLS12

OpenShift 4.6 以降では、ルーターは RHEL8 に基づいており、TLS 1.3 をサポートしています。

Ingress Operator in OpenShift Container Platform

OCP 4 - etcd

ポート 9977-9、2379、2380

OpenShift Container Platform 4.6 以前では、etcd に対して TLS を設定できません。バージョン 4.6.16 で、古い脆弱な暗号スイートが非推奨になり、OpenShift の一般的なデフォルト設定のセキュアなセットを使用する変更が導入されました。

OCP 4 - マシン設定サーバー

ポート 22623-4

OpenShift Container Platform バージョン 4.8.2 より前のマシン設定サーバーでは、TLS は設定できません。バージョン 4.8.2 で、よく知られたセキュアな暗号スイートのみがデフォルトで有効になる変更が導入されました。

OCP 4 - ノードエクスポーター

ポート 9100-9101

OpenShift Container Platform バージョン 4.6.1 より前のバージョンでは、Node Exporter に対して TLS を設定できません。バージョン 4.6.1 で、よく知られたセキュアな暗号スイートのみがデフォルトで有効になる変更が導入されました。

OCP 4 - Kube RBAC Proxy

ポート 9192

OpenShift Container Platform バージョン 4.8.2 より前のバージョンでは、Kube RBAC プロキシーに対して TLS を設定できません。バージョン 4.8.2 で、よく知られたセキュアな暗号スイートのみがデフォルトで有効になる変更が導入されました。

付録

TLS 1.3 のその他のセキュリティー改善

  • TLS 1.3 で脆弱なプリミティブが削除される (例: RC4、SHA1、MD5)

    OpenShift ではサポートされなくなりました。

  • CBC モード暗号スイートの削除

    例: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA、TLS_RSA_WITH_AES_128_CBC_SHA、DES-CBC3-SHA

  • ChangeCipherSpec メッセージがハンドシェイクで使用されない

    TLS 1.3 では必要ありません (以前の TLS バージョンとの互換性を確保する場合を除く)。このメッセージには既知のセキュリティー問題はありませんが、以前は CVE-2014-0224 の脆弱性を許していました。

  • 圧縮のネゴシエーションなし

  • 鍵更新メカニズム

    セッションの再ネゴシエーションに代わるものです。OpenShift では、クライアントセッションの再ネゴシエーションがデフォルトで無効になっています。

  • PKCS#1 v1.5 パディングの削除

    これは RSA 鍵交換にのみ適用されます。RSA 鍵交換を使用する暗号スイートを無効にすると、これは適用されません。

  • いくつかの DHE グループの削除

    カスタムグループがサポートされなくなりました。TLS 1.3 では次の曲線がサポートされます。

    X25519、prime256v1、secp384r1 Modern compatibility

  • DSA 証明書はサポートされなくなりました。

    OpenShift ではデフォルトでサポートされていません。

  • ダウングレード防止機能

  • ハンドシェイク中の拡張の暗号化

  • 新しく改善されたセッション再開機能

  • ECC の新しい曲線: Curve 25519 と Curve 448

その他の参考資料

Changes coming to TLS: Part One

Changes coming to TLS: Part Two

Comments