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 を使用します。有効な暗号スイートを上記のセットのものに限定することで、既知の脆弱性 (Sweet32、Lucky13 など) を持つ 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-SHA384 は TLS_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 かパススルーかによって異なります)。
ルーターの 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
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
Comments