第3章 ネットワークポリシー
3.1. ネットワークポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
ワークロード間のトラフィックを制限し、アプリケーションのセキュリティーを向上させるには、クラスターの NetworkPolicy オブジェクトを設定します。ネットワークポリシーは、選択された Pod に対して許可される Ingress および Egress の接続を定義し、namespace 内のアプリケーションを分離するために役立ちます。
開発者は、クラスター内の Pod へのトラフィックを制限するネットワークポリシーを定義できます。
3.1.1. ネットワークポリシーについて リンクのコピーリンクがクリップボードにコピーされました!
ワークロード間のトラフィックを制御し、ネットワークの分離を強化するには、プロジェクトの NetworkPolicy オブジェクトを設定します。ネットワークポリシーは、選択された Pod に対して許可される Ingress および Egress の接続を定義し、クラスター内のアプリケーションを保護するために役立ちます。
デフォルトで、プロジェクトのすべての Pod は他の Pod およびネットワークのエンドポイントからアクセスできます。プロジェクトで 1 つ以上の Pod を分離するには、そのプロジェクトで NetworkPolicy オブジェクトを作成し、許可する着信接続を指定します。プロジェクト管理者は独自のプロジェクト内で NetworkPolicy オブジェクトの作成および削除を実行できます。
OpenShift Container Platform 4.22 以降、OpenShift Container Platform はデフォルトで独自の namespace の一部に NetworkPolicy オブジェクトを含めるようになりました。この追加により、全体的なセキュリティーが向上し、コントロールプレーンコンポーネントがより適切に保護されます。OpenShift Container Platform がデフォルトで独自の namespace に含めている NetworkPolicy オブジェクトは変更しないでください。オブジェクトがデフォルトで含まれる namespace を確認するには、以下のコマンドを実行します。
$ oc get networkpolicies --all-namespaces
OpenShift Container Platform 4.22 リリースでは、これらのオブジェクトがすべての OpenShift Container Platform の namespace に含まれているわけではありません。今後の OpenShift Container Platform リリースでは、さらに多くの namespace にこれらのオブジェクトが含まれる可能性があります。
デフォルトで、プロジェクトのすべての 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 が以下を受け入れることを意味します。
- 同じ namespace 内の Pod からの任意のポート上の接続。
-
任意の namespace の 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 を管理する Operator は、それぞれの namespace にデフォルトの "deny-all" NetworkPolicy オブジェクトを自動的にインストールおよび維持します。
トラフィックは、次の namespace において対象を定めた "allow" ポリシーを使用して制御されます。
DNS コンポーネントの namespace (
openshift-dnsおよびopenshift-dns-operator):- Egress は API サーバーと必要な DNS ポートに制限されます。
- Ingress は重要な DNS トラフィックとメトリクスに制限されます。
Ingress コンポーネントの namespace (
openshift-ingressおよびopenshift-ingress-operator):- Egress は API サーバー、DNS ポート、およびルートエンドポイントに限定されます。
- Ingress は HTTP/HTTPS トラフィックとメトリクスに制限されます。
これらの namespace では、管理対象外またはカスタムの Pod を実行しないでください。これらの namespace は deny-by-default モデルで動作するため、これらの namespace で実行されている管理対象外コンテナーのネットワークトラフィックはブロックされます。
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 の名前を指定します。
詳細は、「ネットワークポリシーについて」を参照してください。