7.6. IPsec 暗号化の設定
IPsec を有効にすると、ノード間の内部 Pod 間のクラスタートラフィックと、Pod とクラスター外部の IPsec エンドポイント間の外部トラフィックの両方を暗号化できます。OVN-Kubernetes クラスターネットワーク上のノード間のすべての Pod 間ネットワークトラフィックが、トランスポートモード の IPsec で暗号化されます。
IPsec はデフォルトで無効にされています。クラスターのインストール中またはインストール後に IPsec を有効にできます。クラスターのインストールの詳細は、OpenShift Container Platform インストールの概要 を参照してください。
OpenShift Container Platform クラスター上の IPsec には次のサポート制限があります。
- OpenShift Container Platform 4.15 に更新する前に、IPsec を無効にする必要があります。IPsec を無効にせずに更新すると、Pod 間通信が中断される可能性があるという既知の問題があります。(OCPBUGS-43323)
- IBM Cloud® では、IPsec は NAT-T のみをサポートします。このプラットフォームでは、Encapsulating Security Payload (ESP) はサポートされていません。
- クラスターが Red Hat OpenShift Container Platform の Hosted Control Plane を使用している場合、IPsec は、Pod 間のトラフィックや外部ホストへのトラフィックの IPsec 暗号化でサポートされません。
- 1 つ以上のネットワークインターフェイスが Open vSwitch (OVS) に接続されている場合、ネットワークインターフェイスでの ESP ハードウェアオフロードの使用はサポートされません。クラスターに対して IPsec を有効にすると、OVS に接続されたインターフェイスで IPsec が使用されるようになります。デフォルトでは、OpenShift Container Platform は、OVS に接続されたすべてのインターフェイスで ESP ハードウェアオフロードを無効にします。
- OVS に接続されていないネットワークインターフェイスに対して IPsec を有効にした場合、クラスター管理者は、OVS に接続されていない各インターフェイスで ESP ハードウェアオフロードを手動で無効にする必要があります。
次のリストは、IPsec ドキュメントの主要なタスクの概要を示しています。
- クラスターのインストール後に IPsec を有効または無効にする
- クラスターと外部ホスト間のトラフィックの IPsec 暗号化を設定する
- IPsec が異なるノード上の Pod 間のトラフィックを暗号化することを確認する
7.6.1. 動作モード
OpenShift Container Platform クラスターで IPsec を使用する場合、以下の動作モードから選択できます。
Mode | 説明 | デフォルト |
---|---|---|
| トラフィックは暗号化されません。これはクラスターのデフォルトです。 | はい |
| Pod 間のトラフィックが、「Pod 間の IPsec によって暗号化されるネットワークトラフィックフローのタイプ」の説明のとおりに暗号化されます。IPsec に必要な設定手順を完了すると、外部ノードへのトラフィックを暗号化できます。 | いいえ |
| IPsec に必要な設定手順を完了すると、外部ノードへのトラフィックを暗号化できます。 | いいえ |
7.6.2. 前提条件
外部ホストへのトラフィックを暗号化するために IPsec をサポートする場合は、次の前提条件が満たされていることを確認してください。
-
OVN-Kubernetes ネットワークプラグインが、ローカルゲートウェイモード (
ovnKubernetesConfig.gatewayConfig.routingViaHost=true
) で設定されている。 NMState Operator がインストールされている。この Operator は、IPsec 設定を指定するために必要です。詳細は、Kubernetes NMState Operator を参照してください。
注記NMState Operator は、Google Cloud Platform (GCP) で IPsec を設定する場合にのみサポートされます。
-
ブタンツール (
butane
) がインストールされている。Butane をインストールするには、Butane のインストール を参照してください。
これらの前提条件は、証明書をホストの NSS データベースに追加するために、および外部ホストと通信するように IPsec を設定するために必要です。
7.6.3. IPsec が有効になっている場合のネットワーク接続要件
OpenShift Container Platform クラスターのコンポーネントが通信できるように、マシン間のネットワーク接続を設定する必要があります。すべてのマシンではクラスターの他のすべてのマシンのホスト名を解決できる必要があります。
プロトコル | ポート | 説明 |
---|---|---|
UDP |
| IPsec IKE パケット |
| IPsec NAT-T パケット | |
ESP | 該当なし | IPsec Encapsulating Security Payload (ESP) |
7.6.4. Pod 間のトラフィックの IPsec 暗号化
Pod 間のトラフィックの IPsec 暗号化は、次のセクションで、暗号化される Pod 間のトラフィック、使用される暗号化プロトコルの種類、および X.509 証明書の処理の仕組みを説明します。以下のセクションは、クラスターと外部ホスト間の IPsec 暗号化には適用されません。この種の暗号化は、特定の外部ネットワークインフラストラクチャーに合わせて手動で設定する必要があります。
7.6.4.1. Pod 間の IPsec によって暗号化されるネットワークトラフィックフローのタイプ
IPsec を有効にすると、Pod 間の以下のネットワークトラフィックフローのみが暗号化されます。
- クラスターネットワーク上の複数の異なるノードの Pod 間のトラフィック
- ホストネットワークの Pod からクラスターネットワーク上の Pod へのトラフィック
以下のトラフィックフローは暗号化されません。
- クラスターネットワーク上の同じノードの Pod 間のトラフィック
- ホストネットワーク上の Pod 間のトラフィック
- クラスターネットワークの Pod からホストネットワークの Pod へのトラフィック
暗号化されていないフローと暗号化されていないフローを以下の図に示します。
7.6.4.2. 暗号化プロトコルおよび IPsec モード
使用する暗号化は AES-GCM-16-256
です。整合性チェック値 (ICV) は 16
バイトです。鍵の長さは 256
ビットです。
使用される IPsec モードは トランスポートモード です。これは、元のパケットの IP ヘッダーに Encapsulated Security Payload (ESP) ヘッダーを追加してパケットデータを暗号化することで、エンドツーエンドの通信を暗号化するモードです。OpenShift Container Platform は現在、Pod 間通信に IPsec Tunnel モード を使用したり、サポートしたりしません。
7.6.4.3. セキュリティー証明書の生成およびローテーション
Cluster Network Operator (CNO) は、暗号化用に IPsec によって使用される自己署名の X.509 認証局 (CA) を生成します。各ノードの証明書署名要求 (CSR) は、CNO によって自動的に満たされます。
この CA は 10 年間有効です。個別のノード証明書は 5 年間有効で、4 年半が経過すると自動的にローテーションされます。
7.6.5. 外部トラフィックの IPsec 暗号化
OpenShift Container Platform は、TLS 証明書を使用した外部ホストへのトラフィックの IPsec 暗号化をサポートします。TLS 証明書は管理者が提供する必要があります。
7.6.5.1. サポート対象のプラットフォーム
この機能は次のプラットフォームでサポートされています。
- ベアメタル
- Google Cloud Platform (GCP)
- Red Hat OpenStack Platform (RHOSP)
- VMware vSphere
Red Hat Enterprise Linux (RHEL) ワーカーノードがある場合、これらのプラットフォームは外部トラフィックの IPsec 暗号化をサポートしません。
クラスターが Red Hat OpenShift Container Platform の Hosted Control Plane を使用している場合、外部ホストへのトラフィックを暗号化するための IPsec の設定はサポートされません。
7.6.5.2. 制限事項
次の禁止事項が遵守されていることを確認してください。
- 外部トラフィックの IPsec を設定する場合、IPv6 設定は現在 NMState Operator によってサポートされません。
-
提供する証明書バンドル内の証明書共通名 (CN) には、接頭辞
ovs_
を指定できません。この名前は、各ノードのネットワークセキュリティーサービス (NSS) データベース内の Pod 間の IPsec CN 名と競合する可能性があるためです。
7.6.6. IPsec 暗号化の有効化
クラスター管理者は、Pod 間の IPsec 暗号化、およびクラスターと外部 IPsec エンドポイント間の IPsec 暗号化を有効にすることができます。
次のいずれかのモードで IPsec を設定できます。
-
Full
: Pod 間のトラフィックおよび外部トラフィックの暗号化 -
External
: 外部トラフィックの暗号化
Pod 間のトラフィックに加えて外部トラフィックの暗号化を設定する必要がある場合は、「外部トラフィックの IPsec 暗号化の設定」の手順も完了する必要があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてクラスターにログインしている。 -
クラスター MTU のサイズを
46
バイト減らして、IPsec ESP ヘッダーにオーバーヘッドを設けている。
手順
IPsec 暗号化を有効にするには、次のコマンドを入力します。
$ oc patch networks.operator.openshift.io cluster --type=merge \ -p '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "ipsecConfig":{ "mode":<mode> }}}}}'
ここでは、以下のようになります。
mode
-
外部ホストへのトラフィックのみを暗号化するには
External
を指定します。Pod 間のトラフィックを暗号化し、必要に応じて外部ホストへのトラフィックを暗号化するにはFull
を指定します。デフォルトでは、IPsec は無効になっています。
- オプション: 外部ホストへのトラフィックを暗号化する必要がある場合は、「外部トラフィックの IPsec 暗号化の設定」の手順を実行します。
検証
OVN-Kubernetes データプレーン Pod の名前を見つけるには、次のコマンドを入力します。
$ oc get pods -n openshift-ovn-kubernetes -l=app=ovnkube-node
出力例
ovnkube-node-5xqbf 8/8 Running 0 28m ovnkube-node-6mwcx 8/8 Running 0 29m ovnkube-node-ck5fr 8/8 Running 0 31m ovnkube-node-fr4ld 8/8 Running 0 26m ovnkube-node-wgs4l 8/8 Running 0 33m ovnkube-node-zfvcl 8/8 Running 0 34m
次のコマンドを実行して、クラスターで IPsec が有効になっていることを確認します。
注記クラスター管理者は、IPsec が
Full
モードで設定されている場合に、クラスター上の Pod 間で IPsec が有効になっていることを確認できます。この手順では、クラスターと外部ホストの間で IPsec が機能しているかどうかは検証されません。$ oc -n openshift-ovn-kubernetes rsh ovnkube-node-<XXXXX> ovn-nbctl --no-leader-only get nb_global . ipsec
ここでは、以下のようになります。
<XXXXX>
- 前の手順の Pod の文字のランダムなシーケンスを指定します。
出力例
true
7.6.7. 外部トラフィックの IPsec 暗号化の設定
クラスター管理者は、IPsec を使用して外部トラフィックを暗号化するには、PKCS#12 証明書の提供を含め、ネットワークインフラストラクチャーに IPsec を設定する必要があります。この手順では Butane を使用してマシン設定を作成するため、butane
コマンドがインストールされている必要があります。
マシン設定を適用した後、Machine Config Operator はクラスター内の影響を受けるノードを再起動し、新しいマシン設定をロールアウトします。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
ローカルコンピューターに
butane
ユーティリティーがインストールされている。 - NMState Operator がクラスターにインストールされている。
-
cluster-admin
権限を持つユーザーとしてクラスターにログインしている。 - IPsec エンドポイント用の既存の PKCS#12 証明書と PEM 形式の CA 証明書があります。
-
クラスターで
Full
またはExternal
モードの IPsec が有効になっている。 -
OVN-Kubernetes ネットワークプラグインが、ローカルゲートウェイモード (
ovnKubernetesConfig.gatewayConfig.routingViaHost=true
) で設定されている。
手順
NMState Operator ノードネットワーク設定ポリシーを使用して IPsec 設定を作成します。詳細は、IPsec VPN 実装としての Libreswan を参照してください。
IPsec エンドポイントであるクラスターノードの IP アドレスを特定するために、次のコマンドを入力します。
$ oc get nodes
次の例のように、NMState Operator のノードネットワーク設定ポリシーを含む
ipsec-config.yaml
という名前のファイルを作成します。NodeNetworkConfigurationPolicy
オブジェクトの概要は、The Kubernetes NMState project を参照してください。NMState IPsec トランスポート設定の例
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: ipsec-config spec: nodeSelector: kubernetes.io/hostname: "<hostname>" 1 desiredState: interfaces: - name: <interface_name> 2 type: ipsec libreswan: left: <cluster_node> 3 leftid: '%fromcert' leftrsasigkey: '%cert' leftcert: left_server leftmodecfgclient: false right: <external_host> 4 rightid: '%fromcert' rightrsasigkey: '%cert' rightsubnet: <external_address>/32 5 ikev2: insist type: transport
- 1
- ポリシーを適用するホスト名を指定します。このホストは、IPsec 設定の左側のホストとして機能します。
- 2
- ホスト上に作成するインターフェイスの名前を指定します。
- 3
- クラスター側の IPsec トンネルを終端するクラスターノードのホスト名を指定します。この名前は、提供した PKCS#12 証明書の SAN
[Subject Alternate Name]
と一致する必要があります。 - 4
- 外部ホスト名 (
host.example.com
など) を指定します。この名前は、提供した PKCS#12 証明書の SAN[Subject Alternate Name]
と一致する必要があります。 - 5
- 外部ホストの IP アドレス (
10.1.2.3/32
など) を指定します。
NMState IPsec トンネル設定の例
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: ipsec-config spec: nodeSelector: kubernetes.io/hostname: "<hostname>" 1 desiredState: interfaces: - name: <interface_name> 2 type: ipsec libreswan: left: <cluster_node> 3 leftid: '%fromcert' leftmodecfgclient: false leftrsasigkey: '%cert' leftcert: left_server right: <external_host> 4 rightid: '%fromcert' rightrsasigkey: '%cert' rightsubnet: <external_address>/32 5 ikev2: insist type: tunnel
- 1
- ポリシーを適用するホスト名を指定します。このホストは、IPsec 設定の左側のホストとして機能します。
- 2
- ホスト上に作成するインターフェイスの名前を指定します。
- 3
- クラスター側の IPsec トンネルを終端するクラスターノードのホスト名を指定します。この名前は、提供した PKCS#12 証明書の SAN
[Subject Alternate Name]
と一致する必要があります。 - 4
- 外部ホスト名 (
host.example.com
など) を指定します。この名前は、提供した PKCS#12 証明書の SAN[Subject Alternate Name]
と一致する必要があります。 - 5
- 外部ホストの IP アドレス (
10.1.2.3/32
など) を指定します。
IPsec インターフェイスを設定するために、次のコマンドを入力します。
$ oc create -f ipsec-config.yaml
次の証明書ファイルを提供して、各ホストのネットワークセキュリティーサービス (NSS) データベースに追加します。これらのファイルは、後続の手順で Butane 設定の一部としてインポートされます。
-
left_server.p12
: IPsec エンドポイントの証明書バンドル -
ca.pem
: 証明書に署名した認証局
-
証明書をクラスターに追加するためのマシン設定を作成します。
コントロールプレーンとワーカーノードの Butane 設定ファイルを作成するには、次のコマンドを入力します。
$ for role in master worker; do cat >> "99-ipsec-${role}-endpoint-config.bu" <<-EOF variant: openshift version: 4.16.0 metadata: name: 99-${role}-import-certs labels: machineconfiguration.openshift.io/role: $role systemd: units: - name: ipsec-import.service enabled: true contents: | [Unit] Description=Import external certs into ipsec NSS Before=ipsec.service [Service] Type=oneshot ExecStart=/usr/local/bin/ipsec-addcert.sh RemainAfterExit=false StandardOutput=journal [Install] WantedBy=multi-user.target storage: files: - path: /etc/pki/certs/ca.pem mode: 0400 overwrite: true contents: local: ca.pem - path: /etc/pki/certs/left_server.p12 mode: 0400 overwrite: true contents: local: left_server.p12 - path: /usr/local/bin/ipsec-addcert.sh mode: 0740 overwrite: true contents: inline: | #!/bin/bash -e echo "importing cert to NSS" certutil -A -n "CA" -t "CT,C,C" -d /var/lib/ipsec/nss/ -i /etc/pki/certs/ca.pem pk12util -W "" -i /etc/pki/certs/left_server.p12 -d /var/lib/ipsec/nss/ certutil -M -n "left_server" -t "u,u,u" -d /var/lib/ipsec/nss/ EOF done
前の手順で作成した Butane ファイルをマシン設定に変換するには、次のコマンドを入力します。
$ for role in master worker; do butane -d . 99-ipsec-${role}-endpoint-config.bu -o ./99-ipsec-$role-endpoint-config.yaml done
マシン設定をクラスターに適用するには、次のコマンドを入力します。
$ for role in master worker; do oc apply -f 99-ipsec-${role}-endpoint-config.yaml done
重要Machine Config Operator (MCO) は各マシン設定プール内のマシンを更新するときに、各ノードを 1 つずつ再起動します。外部 IPsec 接続が使用可能になる前に、すべてのノードが更新されるまで待つ必要があります。
以下のコマンドを実行してマシン設定プールのステータスを確認します。
$ oc get mcp
正常に更新されたノードには、
UPDATED=true
、UPDATING=false
、DEGRADED=false
のステータスがあります。注記デフォルトで、MCO はプールごとに一度に 1 つのマシンを更新するため、移行にかかる合計時間がクラスターのサイズと共に増加します。
IPsec マシン設定が正常にロールアウトされたことを確認するために、次のコマンドを入力します。
IPsec マシン設定が作成されたことを確認します。
$ oc get mc | grep ipsec
出力例
80-ipsec-master-extensions 3.2.0 6d15h 80-ipsec-worker-extensions 3.2.0 6d15h
IPsec 拡張機能がコントロールプレーンノードに適用されていることを確認します。
$ oc get mcp master -o yaml | grep 80-ipsec-master-extensions -c
予想される出力
2
IPsec 拡張機能がワーカーノードに適用されていることを確認します。
$ oc get mcp worker -o yaml | grep 80-ipsec-worker-extensions -c
予想される出力
2
関連情報
- nmstate IPsec API の詳細は、IPsec Encryption を参照してください。
7.6.8. 外部 IPsec エンドポイントの IPsec 暗号化の無効化
クラスター管理者は、外部ホストへの既存の IPsec トンネルを削除できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてクラスターにログインしている。 -
クラスターで
Full
またはExternal
モードの IPsec が有効になっている。
手順
次の YAML を使用して、
remove-ipsec-tunnel.yaml
という名前のファイルを作成します。kind: NodeNetworkConfigurationPolicy apiVersion: nmstate.io/v1 metadata: name: <name> spec: nodeSelector: kubernetes.io/hostname: <node_name> desiredState: interfaces: - name: <tunnel_name> type: ipsec state: absent
ここでは、以下のようになります。
name
- ノードネットワーク設定ポリシーの名前を指定します。
node_name
- 削除する IPsec トンネルが存在するノードの名前を指定します。
tunnel_name
- 既存の IPsec トンネルのインターフェイス名を指定します。
IPsec トンネルを削除するために、次のコマンドを入力します。
$ oc apply -f remove-ipsec-tunnel.yaml
7.6.9. IPsec 暗号化の無効化
クラスター管理者は、IPsec 暗号化を無効にすることができます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてクラスターにログインする。
手順
IPsec 暗号化を無効にするには、次のコマンドを入力します。
$ oc patch networks.operator.openshift.io cluster --type=merge \ -p '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "ipsecConfig":{ "mode":"Disabled" }}}}}'
-
オプション: IP パケットの IPsec ESP ヘッダーからのオーバーヘッドがなくなるため、クラスター MTU のサイズを
46
バイト増やすことができます。
7.6.10. 関連情報
- Red Hat Enterprise Linux (RHEL) 9 での IPsec を使用した VPN の設定
- Butane のインストール
- OVN-Kubernetes Container Network Interface (CNI) ネットワークプラグインについて
- クラスターネットワークの MTU 変更
- ネットワーク [operator.openshift.io/v1] API