第3章 ネットワークポリシー
3.1. ネットワークポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
ワークロード間のトラフィックを制限し、アプリケーションのセキュリティーを向上させるには、クラスターの NetworkPolicy オブジェクトを設定します。ネットワークポリシーは、選択された Pod に対して許可される Ingress および送信接続を定義し、名前空間内のアプリケーションを分離するのに役立ちます。
開発者は、クラスター内の Pod へのトラフィックを制限するネットワークポリシーを定義できます。
3.1.1. ネットワークポリシーについて リンクのコピーリンクがクリップボードにコピーされました!
ワークロード間のトラフィックを制御し、ネットワークの分離性を向上させるには、プロジェクトの NetworkPolicy オブジェクトを設定してください。ネットワークポリシーは、選択した Pod に対して許可される Ingress および送信接続を定義し、クラスター内のアプリケーションのセキュリティーを確保するのに役立ちます。
デフォルトで、プロジェクトのすべての Pod は他の Pod およびネットワークのエンドポイントからアクセスできます。プロジェクトで 1 つ以上の Pod を分離するには、そのプロジェクトで NetworkPolicy オブジェクトを作成し、許可する着信接続を指定します。プロジェクト管理者は独自のプロジェクト内で NetworkPolicy オブジェクトの作成および削除を実行できます。
OpenShift Container Platform 4.22 以降、OpenShift Container Platform は、一部のネームスペースに NetworkPolicy オブジェクトをデフォルトで含めるようになりました。この組み込みにより、全体的なセキュリティーが向上し、コントロールプレーンのコンポーネントがより適切に保護されます。OpenShift Container Platform がデフォルトで独自のネームスペースに含めている NetworkPolicy オブジェクトは変更しないでください。オブジェクトがデフォルトで含まれる名前空間を確認するには、次のコマンドを実行します。
$ oc get networkpolicies --all-namespaces
OpenShift Container Platform 4.22 リリースでは、これらのオブジェクトはすべての OpenShift Container Platform 名前空間に含まれていません。今後の OpenShift Container Platform リリースでは、これらのオブジェクトが追加の名前空間に含まれる可能性があります。
デフォルトでは、プロジェクト内のすべての Pod は、どのネットワークエンドポイントからもアクセス可能です。
Pod が 1 つ以上の NetworkPolicy オブジェクトのセレクターと一致する場合、Pod はそれらの NetworkPolicy オブジェクトの少なくとも 1 つにより許可された接続だけを使用できます。いずれの NetworkPolicy オブジェクトにも選択されていない Pod は、完全にアクセス可能な状態を維持します。
3.1.1.1. 政策の加法性 リンクのコピーリンクがクリップボードにコピーされました!
NetworkPolicy オブジェクトは加算されるものです。つまり、複数の NetworkPolicy オブジェクトを組み合わせて複雑なネットワーク要件を満すことができます。
たとえば、同じプロジェクト内で allow-same-namespace ポリシーと allow-http-and-https ポリシーの両方を定義した場合、role=frontend ラベルを持つ Pod は、どちらかのポリシーで許可されている接続をすべて受け入れます。
これは、Pod が以下を受け入れることを意味します。
- 同じ名前空間内の Pod からの任意のポートへの接続。
-
任意のネームスペース内の Pod からのポート
80および443への接続。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-router
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress: ""
podSelector: {}
policyTypes:
- Ingress
policy-group.network.openshift.io/Ingress:"" ラベルは、OVN-Kubernetes をサポートします。
クラスターの攻撃対象領域を縮小し、予測可能なネットワーク動作を確保するために、OpenShift Container Platform は重要なネットワークコンポーネントに対して最小特権ネットワークポリシーを適用します。
クラスター DNS とクラスター Ingress を管理するオペレーターは、それぞれの名前空間にデフォルトのすべて拒否 NetworkPolicy オブジェクトを自動的にインストールおよび維持します。
トラフィックは、以下の名前空間における対象を絞った許可ポリシーを使用して制御されます。
DNS コンポーネントの名前空間 (
openshift-dnsおよびopenshift-dns-operator):- 送信は API サーバーと必要な DNS ポートに限定されます。
- イングレスは、必要不可欠な DNS トラフィックとメトリクスに限定されます。
Ingress コンポーネントの名前空間 (
openshift-Ingressおよびopenshift-ingress-operator):- 送信は API サーバー、DNS ポート、およびルーティングエンドポイントに限定されます。
- Ingress は HTTP/HTTPS トラフィックとメトリクスに限定されます。
これらの名前空間では、管理対象外の Pod やカスタム Pod を実行しないでください。これらの名前空間はデフォルトで拒否するモデルで動作するため、これらの名前空間で実行されている管理対象外のコンテナーのネットワークトラフィックはすべてブロックされます。
3.1.2. OVN-Kubernetes ネットワークプラグインによるネットワークポリシーの最適化 リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes のネットワークポリシーを最適化してフロー数を削減し、必要な場合に外部 IP トラフィックを許可する方法を説明します。
ネットワークポリシーを設計する場合は、以下のガイドラインを参照してください。
-
同じ
spec.podSelector仕様を持つネットワークポリシーの場合、ingressルールまたはegressルールを持つ複数のネットワークポリシーを使用するよりも、複数のingressルールまたはegressルールを持つ 1 つのネットワークポリシーを使用する方が効率的です。 podSelectorまたはnamespaceSelector仕様に基づくすべてのingressまたはegressルールは、number of pods selected by network policy + number of pods selected by ingress or egress ruleに比例する数の OVS フローを生成します。そのため、Pod ごとに個別のルールを作成するのではなく、1 つのルールで必要な数の Pod を選択できるpodSelectorまたはnamespaceSelector仕様を使用することが推奨されます。たとえば、以下のポリシーには 2 つのルールが含まれています。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchLabels: role: frontend - from: - podSelector: matchLabels: role: backend以下のポリシーは、上記と同じ 2 つのルールを 1 つのルールとして表現しています。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchExpressions: - {key: role, operator: In, values: [frontend, backend]}同じガイドラインが
spec.podSelector仕様に適用されます。異なるネットワークポリシーに同じingressルールまたはegressルールがある場合、共通のspec.podSelector仕様で 1 つのネットワークポリシーを作成する方が効率的な場合があります。たとえば、以下の 2 つのポリシーには異なるルールがあります。apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 spec: podSelector: matchLabels: role: db ingress: - from: - podSelector: matchLabels: role: frontend --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy2 spec: podSelector: matchLabels: role: client ingress: - from: - podSelector: matchLabels: role: frontend以下のネットワークポリシーは、上記と同じ 2 つのルールを 1 つのルールとして表現しています。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy3 spec: podSelector: matchExpressions: - {key: role, operator: In, values: [db, client]} ingress: - from: - podSelector: matchLabels: role: frontendこの最適化は、複数のセレクターを 1 つのセレクターとして表現する場合に限り適用できます。セレクターが異なるラベルに基づいている場合、この最適化は適用できない可能性があります。その場合は、ネットワークポリシーの最適化に特化して新規ラベルをいくつか適用することを検討してください。
3.1.2.1. OVN-Kubernetes の NetworkPolicy CR と外部 IP リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes では、NetworkPolicy カスタムリソース (CR) によって厳密な分離ルールが適用されます。サービスが外部 IP を使用して公開されている場合、トラフィックを許可するように明示的に設定されていない限り、ネットワークポリシーによって他の namespace からのアクセスがブロックされる可能性があります。
namespace をまたいで外部 IP へのアクセスを許可するには、必要な namespace からの Ingress を明示的に許可し、指定されたサービスポートへのトラフィックが許可されるようにする NetworkPolicy CR を作成します。必要なポートへのトラフィックを許可しなければ、アクセスが制限される可能性があります。
出力例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
annotations:
name: <policy_name>
namespace: openshift-ingress
spec:
ingress:
- ports:
- port: 80
protocol: TCP
- ports:
- port: 443
protocol: TCP
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: <my_namespace>
podSelector: {}
policyTypes:
- Ingress
ここでは、以下のようになります。
<policy_name>- ポリシーの名前を指定します。
<my_namespace>- ポリシーがデプロイされる namespace の名前を指定します。
詳細は、「ネットワークポリシーについて」を参照してください。