ネットワーク・ポリシーによるトラフィックの制御
クラシック・クラスター
このネットワーク・ポリシー情報は、クラシック・クラスターに固有の情報です。 VPCクラスタのネットワークポリシー情報については 、「セキュリティグループによるトラフィックの制御 」を参照してください。
すべての Red Hat® OpenShift® on IBM Cloud® クラスターには、Calico という名前のネットワーク・プラグインが付属しています。 デフォルトのネットワーク・ポリシーは、クラスター内のすべてのワーカー・ノードのパブリック・ネットワーク・インターフェースを保護します。
Calico および Kubernetes を使用してクラスターのネットワーク・ポリシーを作成できます。 Kubernetes ネットワーク・ポリシーを使用して、クラスター内のポッドとの間で許可またはブロックするネットワーク・トラフィックを指定できます。 ネットワーク・ロード・バランサー (NLB) サービスへのインバウンド (ingress) トラフィックのブロックなど、より高度なネットワーク・ポリシーを設定するには、Calico ネットワーク・ポリシーを使用します。
- Kubernetes ネットワーク・ポリシー
- Kubernetes ネットワーク ポリシーは、 ポッドが他のポッドや外部エンドポイントと通信する方法を指定します。 着信ネットワーク・トラフィックと発信ネットワーク・トラフィックの両方が、プロトコル、ポート、および送信元 IP アドレスまたは宛先
IP アドレスに基づいて許可またはブロックされます。 トラフィックは、ポッドおよび名前空間ラベルに基づいてフィルタリングすることもできます。 Kubernetes のネットワークポリシーは、
oc
コマンドまたは Kubernetes APIを使用して適用できます。 - Calico ネットワーク・ポリシー
- Calico ネットワーク・ポリシー は、 Kubernetes ネットワーク・ポリシーのセットです。
calicoctl
コマンドラインを使用することで、 Calico ポリシーを適用することができます。 Calico ポリシーは、以下の機能を追加します。- Kubernetes ポッドのソースまたは宛先 IP アドレスや CIDR に関係なく、特定のネットワーク・インターフェース上のネットワーク・トラフィックを許可またはブロックします。
- 複数の名前空間にまたがるポッドのネットワーク・トラフィックを許可またはブロックします。
- Kubernetes LoadBalancer または NodePort サービスへのインバウンド・トラフィックをブロックします。
Calico は、ターゲット・リソースに転送するためにネットワーク・トラフィックが満たす必要がある特性を定義するためにワーカー・ノードのファイアウォールとして機能する Iptables ルールをセットアップすることにより、これらのポリシー (Kubernetes ネットワーク・ポリシーなど) を適用します。
OpenShift Container Platform バージョン 4 では、Calico は Kubernetes データ・ストア・ドライバーに基づいています。 詳細については 、 Calico のドキュメントを参照してください。
デフォルトの Calico ネットワーク・ポリシー
パブリック VLAN を持つクラスターが作成されると、各ワーカー・ノードとそのパブリック・ネットワーク・インターフェースに対して、HostEndpoint
ラベルを持つ ibm.role: worker_public
リソースが自動的に作成されます。 この HostEndpoint
により、ibm.role: worker_public
ラベルを選択する Calico ポリシーによって特に許可されていない限り、パブリック・ネットワーク・インターフェースとの間のすべてのトラフィックがドロップされます。
各ワーカー・ノードとそのプライベート・ネットワーク・インターフェースに対しても、HostEndpoint
ラベルを持つ ibm.role: worker_private
リソースが自動的に作成されます。 プライベート・ネットワーク・インターフェースとの間のすべてのトラフィックが許可されるように、デフォルトの allow-all-private-default
ポリシーが作成されます。 この HostEndpoint
により、クラスター・ユーザーは、ibm.role: worker_private
を選択して allow-all-private-default
よりも低い順序番号を持つ Calico ポリシーを作成することで、容易にプライベート・ネットワーク・トラフィックをさらに制限できるようになります。
これらのデフォルトの Calico ホスト・ポリシーは、すべてのパブリック・アウトバウンド・ネットワーク・トラフィックを許可し、Kubernetes NodePort、LoadBalancer、Ingress サービスなどの特定のクラスター・コンポーネントへのパブリック・インバウンド・トラフィックを許可します。 デフォルトでは、すべてのプライベート・トラフィックが allow-all-private-default
ポリシーによって許可されます。 デフォルト・ポリシーで指定されていない、インターネットからワーカー・ノードへのその他のインバウンド・ネットワーク・トラフィックはすべてブロックされます。
デフォルト・ポリシーはポッド間トラフィックに影響しません。
デフォルトのポリシーはクラスタから削除しないでください。次のクラスタマスターのリフレッシュまたはマスターの更新時に再作成されるためです。 トラフィックをさらに制限する場合は、下位の Calico ポリシーを適用してトラフィックをブロックします。 ブロック対象を完全に理解していること、およびブロックするトラフィックがクラスター・コンポーネントに必要ないことを確認してください。
クラスターに自動的に適用される、以下のデフォルトの Calico ホスト・ポリシーを確認します。
Calico ポリシー | 説明 |
---|---|
allow-all-outbound |
パブリック・ネットワークのすべてのアウトバウンド・トラフィックを許可します。 |
allow-all-private-default |
プライベート・ネットワークによるすべてのインバウンド・トラフィックおよびアウトバウンド・トラフィックを許可します。 |
allow-bigfix-port |
必要なワーカー・ノードの更新を許可するために、BigFix アプリへの着信トラフィックをポート 52311 で許可します。 |
allow-icmp |
すべての着信 ICMP パケット (ping) を許可します。 |
allow-node-port-dnat |
ネットワーク・ロード・バランサー (NLB)、Ingress アプリケーション・ロード・バランサー (ALB)、NodePort の各サービスが公開しているポッドへの、これらのサービスの着信トラフィックを許可します。 注: Kubernetes は宛先ネットワーク・アドレス変換 (DNAT) を使用してサービス要求を正しいポッドに転送するため、公開ポートを指定する必要はありません。 ホストのエンドポイント・ポリシーが Iptables で適用される前に、その転送が実行されます。 |
allow-sys-mgmt |
ワーカー・ノードを管理するために使用される特定の IBM Cloud インフラストラクチャー・システムの着信接続を許可します。 |
allow-vrrp |
ワーカー・ノード間の仮想 IP アドレスをモニターおよび移動する VRRP パケットを許可します。 |
Calico CLI のインストールおよび構成
Calico ポリシーを表示、管理、および追加するには、Calico CLI をインストールして構成します。
-
Calico コマンドを実行するクラスターのコンテキストを設定します。
-
Red Hat OpenShift バージョン 4.6 以降:
- ご使用のクラスター用の
kubeconfig
構成ファイルをダウンロードします。ibmcloud oc cluster config --cluster <cluster_name_or_ID>
DATASTORE_TYPE
環境変数をkubernetes
に設定します。export DATASTORE_TYPE=kubernetes
- ご使用のクラスター用の
-
-
企業ネットワーク・ポリシーがプロキシーまたはファイアウォールを使用して、ローカル・システムからパブリック・エンドポイントへのアクセスを禁止している場合は、Calico コマンドに対して TCP アクセスを許可します。
-
手順に従って、
calicoctl
コマンド・ライン・ツールをインストールします。-
Linux および OS X
-
ご利用のオペレーティングシステムに適合する Calico CLIのバージョンをダウンロードしてください。 OS Xの場合、ダウンロードしたファイルを開き実行できるように、 システム環境設定 > セキュリティとプライバシー > 一般に移動して手動で許可する必要がある場合があります。
-
ファイルを
/usr/local/bin
ディレクトリーに移動します。mv <filepath>/<filename> /usr/local/bin/calicoctl
-
ファイルを実行可能ファイルにします。
chmod +x /usr/local/bin/calicoctl
-
/etc/calico
ディレクトリーに古い Calico 構成ファイルcalicoctl.cfg
がないことを確認します。/etc/calico/calicoctl.cfg
ファイルが存在する場合は、削除します。
-
-
Windows
-
Calico CLIをダウンロードします。 そのファイルを保存するときに、ファイル名を
calicoctl.exe
に変更し、IBM Cloud CLI と同じディレクトリーに保存します。 このようにセットアップすると、後でコマンドを実行するとき、ファイル・パスの変更を行う手間がいくらか少なくなります。 -
KUBECONFIG
環境変数に、手順 1 で見つけたネットワーク構成ファイルを設定します。export KUBECONFIG=./.bluemix/plugins/container-service/clusters/<cluster_name>-<hash>/calicoctl.cfg
-
-
-
Calico 構成が正常に動作していることを確認します。
calicoctl get nodes
出力例
NAME 10.176.48.106 10.176.48.107 10.184.58.23 10.184.58.42 ...
Calico のプラグイン、コンポーネント、またはデフォルトの Calico 設定の変更はサポートされていません。 例えば、新しい Calico プラグイン・バージョンをデプロイしたり、Calico コンポーネント、デフォルトの IPPool
リソース、または Calico ノードのデーモン・セットまたはデプロイメントを変更したりしないでください。 代わりに、必要に応じて、Calico MTU の変更、
Calico CNI のポート・マップ・プラグインの無効化を資料の手順に従って行うことができます。
ネットワーク・ポリシーの表示
クラスターに適用される、デフォルト・ネットワーク・ポリシーおよび追加されたすべてのネットワーク・ポリシーの詳細を表示します。
始める前に、Calico CLI をインストールして構成し、Calico コマンドを実行するクラスターのコンテキストを設定します。
-
Calico ホスト・エンドポイントを表示します。
calicoctl get hostendpoint -o yaml
-
クラスター用に作成されたすべての Calico ネットワーク・ポリシーを表示します。 このリストには、どのポッドまたはホストにもまだ適用されない可能性があるポリシーが含まれています。 Calico ポリシーを適用するには、Calico ネットワーク・ポリシー内のセレクターと一致する Kubernetes ポッドまたは Calico
HostEndpoint
が存在している必要があります。ネットワークポリシーは特定の名前空間に適用されます
calicoctl get NetworkPolicy --all-namespaces -o wide
グローバルネットワークポリシーは、特定の名前空間に限定されるものではありません
calicoctl get GlobalNetworkPolicy -o wide
-
ネットワーク・ポリシーの詳細を表示します。
calicoctl get NetworkPolicy -o yaml <policy_name> --namespace <policy_namespace>
-
クラスターのすべてのグローバル・ネットワーク・ポリシーの詳細を表示します。
calicoctl get GlobalNetworkPolicy -o yaml
ネットワーク・ポリシーの追加
通常、デフォルト・ポリシーを変更する必要はありません。 拡張シナリオのみ、変更が必要な場合があります。 変更が必要であるとわかった場合は、独自のネットワーク・ポリシーを作成できます。
Kubernetes ネットワークポリシーを作成するには、 Kubernetes ネットワークポリシーのドキュメントを参照してください。
Calico ポリシーを作成するには、以下の手順を実行します。 始める前に、Calico CLI をインストールして構成し、Calico コマンドを実行するクラスターのコンテキストを設定します。
-
Calico v3 ポリシー構文を使用して構成スクリプト(
.yaml
)を作成し、 Calico ネットワークポリシー または グローバルネットワークポリシー を定義します。 これらの構成ファイルにはどのポッド、名前空間、またはホストにこれらのポリシーを適用するかを説明するセレクターが含まれます。 -
ポリシーをクラスターに適用します。 Windows システムを使用している場合は、
--config=<filepath>/calicoctl.cfg
オプションを含めます。calicoctl apply -f policy.yaml [--config=<filepath>/calicoctl.cfg]
Calico および Kubernetes ネットワーク・ポリシーは、新規接続のみをブロックし、ポリシーが適用される前に存在していた接続は中断しません。 そのため、新しいポリシーまたは変更されたポリシーを適用した後、そのポリシーが正常に機能していること、および必要以上にブロックしていないことをテストするために、以下を実行します。
-
ポリシーの影響を受ける可能性があるすべてのポッドを再始動します。 さらに良いのは、セレクタが正しく設定されておらず、想定以上に影響がある場合に備えて、すべてのポッドを再起動することです。
-
ibmcloud ks cluster master refresh -c CLUSTER-ID
を実行して、クラスター・マスター・ポッドを再始動します。 これにより、kubelet およびその他のコンポーネントからマスターへの既存の接続が中断され、強制的に再接続されます。 これにより、新規および変更されたポリシーがマスター・コンポーネントへの必要な接続をブロックするかどうかが示されます。 -
Red Hat OpenShift on IBM Cloud コンソールへの接続を試行して、ポリシーの変更によって、これらのコンポーネントが必要とする接続がブロックされないことを確認します。
NLB サービスまたは NodePort サービスへのインバウンド・トラフィックの制御
デフォルトで、Kubernetes NodePort サービス、および LoadBalancer サービスは、すべてのパブリック・クラスター・インターフェースとプライベート・クラスター・インターフェースでアプリを使用できるようにします。 ただし、Calico ポリシーを使用し、トラフィックのソースまたは宛先に基づいてサービスへの着信トラフィックをブロックすることができます。
Kubernetes NodePort サービスと LoadBalancer サービスに対して生成される DNAT Iptables ルールのため、これらのサービスを保護するためにデフォルトの Kubernetes ポリシーと Calico ポリシーを適用することは困難です。 しかし、Kubernetes がポッドにトラフィックを転送するために通常の DNAT を使用する前に、pre-DNAT ポリシーは Iptables 規則を生成して適用するため、指定されたトラフィックがアプリに到達することを防止します。
Calico pre-DNAT ネットワーク・ポリシーのいくつかの一般的な使用方法:
- プライベート・ネットワーク・ロード・バランサー・サービス (NLB) のパブリック・ノード・ポートへのトラフィックをブロックします。NLB サービスにより、NLB の IP アドレスとポート上でアプリが利用可能になり、サービスのノード・ポート上でアプリが利用可能になります。 ノード・ポートは、クラスター内のすべてのノードのすべての IP アドレス (パブリックとプライベート) でアクセス可能です。
- エッジ・ワーカー・ノードを実行しているクラスター上のパブリック・ノード・ポートへのトラフィックをブロックします。ノード・ポートをブロックすることにより、エッジ・ワーカー・ノードだけが着信トラフィックを扱うワーカー・ノードとなります。
- 特定のソース IP アドレスまたは CIDR からのトラフィックをブロックします
- 特定のソース IP アドレスまたは CIDR からのトラフィックのみ許可し、他のトラフィックをすべてブロックします
ソース IP アドレスを許可またはブロックする方法について確認するには、Calico ネットワーク・ポリシーを使用したトラフィックのブロックに関するチュートリアルをお試しください。
パブリック・ネットワーク・トラフィックまたはプライベート・ネットワーク・トラフィックを制限するための Calico ポリシーの例
クラスター・ワーカーのパブリック/プライベート・ネットワーク・トラフィックをさらに制限する Calico パブリック・ネットワーク・ポリシーのサンプル・セットが用意されています。 これらのポリシーは、クラスタの展開に必要なトラフィックを許可し、その他の特定のトラフィックをブロックします。
これらのポリシーは、すべてをブロックするためのものではなく、それ自体で必ずしもコンプライアンス要件を満たすものでもありません。 これらは開始点として意図されたものであり、お客様固有のユース・ケースに合わせて編集する必要があります。 詳しくは、 READMEを参照してください。
Red Hat OpenShift on IBM Cloud およびその他の IBM Cloud の新規ロケーションが有効になると、これらのロケーションのサブネットが Calico ポリシーに追加されます。 これらのポリシーに対する更新については、必ず GitHub リポジトリーをご覧ください。
以下のパブリックおよびプライベートネットワークポリシーセクションで、allow-egress-pods-public、allow-public-services-pods、allow-openshift-console、allow-kube-system-to-olm、allow-openshift-metrics、allow-egress-pods-private、またはallow-private-services-podsサンプルポリシーを使用することは推奨されなくなったことに注意してください。 これらのポリシーは、クラスタ内のすべてのポッドからのイグレスを制御した。 ポッド間のトラフィックを制御したい場合は、 Kubernetes NetworkPolicyを使用し、各ポッドを同じように扱うこれらの包括的なポリシーを使用する代わりに、特定の名前空間とポッドをターゲットにする必要があります。
パブリック・ネットワーク・ポリシーの適用
始める前に、Calico CLI をインストールして構成し、Calico コマンドを実行するクラスターのコンテキストを設定します。
-
IBM-Cloud/kube-samples
リポジトリーを複製します。git clone https://github.com/IBM-Cloud/kube-samples.git
-
クラスターが存在するリージョンのパブリック・ポリシー・ディレクトリーにディレクトリーを変更します。 米国南部のクラスターのコマンド例:
cd <filepath>/IBM-Cloud/kube-samples/calico-policies/public-network-isolation/us-south
-
変更する必要がないか、各ポリシーを確認します。 たとえば、
allow-ibm-ports-public.yaml
ポリシーを編集して、デフォルトの172.30.0.0/16
サブネットの代わりにクラスタのポッド・サブネットを指定する必要があるかもしれません。 また、許可しない可能性がある接続についても、これらのポリシーを確認してください。 -
使用するパブリック・ポリシーまたはプライベート・ポリシーを適用します。
calicoctl apply -f allow-ibm-ports-public.yaml calicoctl apply -f allow-public-service-endpoint.yaml calicoctl apply -f deny-all-outbound-public.yaml calicoctl apply -f allow-konnectivity.yaml
-
オプション:ワーカーノードがパブリックネットワーク上で他の IBM Cloud サービスにアクセスできるようにするには、
allow-public-services.yaml
ポリシーを適用します。 このポリシーにより、 IBM Cloud Container Registry の IP アドレスへのアクセスが可能となり、その地域でサービスが利用可能な場合は、 IBM Cloud Logs および IBM Cloud Monitoring にもアクセスできます。 他の IBM Cloud サービスにアクセスするには、それらのサービスのサブネットをこのポリシーに手動で追加する必要があります。calicoctl apply -f allow-public-services.yaml
-
ネットワークポリシーが適用されていることを確認してください。
calicoctl get NetworkPolicies -o yaml -A
-
グローバルネットワークポリシーが適用されていることを確認してください。
calicoctl get GlobalNetworkPolicies -o yaml
-
オプション:クラスタ内のポッドに適用するポリシーを使用する場合は、クラスタのすべての機能が引き続き動作することを確認するために、これらのポリシーをよくテストしてください。 たとえば、クラスタ内の Webhook を使用する場合は、ポリシーによってこれらの Webhook が Webhook を実装するポッドに必要な接続を行うことができるようにしてください。 また、 Kubernetes API を拡張するローカル以外のサービスについても、トラフィックを許可する必要があります。 このようなサービスは、
oc get apiservices
を実行して確認できます。default/openshift-apiserver
はローカルのサービスとして含まれているので、ネットワーク・ポリシーは不要であることに注意してください。
プライベート・ネットワーク・ポリシーの適用
クラスター・ワーカーのパブリック/プライベート・ネットワーク・トラフィックをさらに制限する Calico プライベート・ネットワーク・ポリシーのサンプル・セットが用意されています。 これらのポリシーは、クラスタの展開に必要なトラフィックを許可し、その他の特定のトラフィックをブロックします。
これらのポリシーは、すべてをブロックするためのものではなく、それ自体で必ずしもコンプライアンス要件を満たすものでもありません。 これらは開始点として意図されたものであり、お客様固有のユース・ケースに合わせて編集する必要があります。 詳しくは、 READMEを参照してください。
Red Hat OpenShift on IBM Cloud およびその他の IBM Cloud の新規ロケーションが有効になると、これらのロケーションのサブネットが Calico ポリシーに追加されます。 これらのポリシーに対する更新については、必ず GitHub リポジトリーをご覧ください。
始める前に、Calico CLI をインストールして構成し、Calico コマンドを実行するクラスターのコンテキストを設定します。
-
IBM-Cloud/kube-samples
リポジトリーを複製します。git clone https://github.com/IBM-Cloud/kube-samples.git
-
クラスターが存在するリージョンのプライベート・ポリシー・ディレクトリーに移動します。 米国南部のクラスターのコマンド例:
cd <filepath>/IBM-Cloud/kube-samples/calico-policies/private-network-isolation/us-south
-
変更する必要がないか、各ポリシーを確認します。 例えば、クラスターの作成時に、ポッドにプライベート IP アドレスを提供するカスタム・サブネットを指定していた場合は、その CIDR を
172.30.0.0/16
ポリシーの CIDRallow-all-workers-private.yaml
の代わりに指定する必要があります。 -
ポリシーを適用します。
calicoctl apply -f allow-all-workers-private.yaml calicoctl apply -f allow-ibm-ports-private.yaml calicoctl apply -f allow-icmp-private.yaml calicoctl apply -f allow-private-service-endpoint.yaml calicoctl apply -f allow-sys-mgmt-private.yaml calicoctl apply -f deny-all-private-default.yaml
-
オプション:作業員がプライベートネットワーク経由で IBM Cloud Container Registryにアクセスすることを許可するには、
allow-private-services.yaml
ポリシーを適用します。 プライベート・クラウド・サービス・エンドポイントをサポートする他の IBM Cloud サービスにアクセスするには、それらのサービスのサブネットをこのポリシーに手動で追加する必要があります。calicoctl apply -f allow-private-services.yaml
-
オプション: プライベート・ネットワーク・ロード・バランサー (NLB) または Ingress アプリケーション・ロード・バランサー (ALB) を使用してアプリを公開するには、
allow-vrrp-private
ポリシーを適用して VRRP プロトコルを開く必要があります。calicoctl apply -f allow-vrrp-private.yaml
Calico pre-DNAT ポリシーを作成することで、ネットワーク・サービスへのアクセスをさらに制御できます。 pre-DNAT ポリシーでは、
selector: ibm.role=='worker_private'
を使用して、ワーカーのプライベート・ホスト・エンドポイントにポリシーを適用するようにしてください。 -
ポリシーが適用されたことを確認します。
calicoctl get GlobalNetworkPolicies -o yaml
-
オプション:クラスタ内のポッドに適用するポリシーを使用する場合は、クラスタのすべての機能が引き続き動作することを確認するために、これらのポリシーをよくテストしてください。 たとえば、クラスタ内の Webhook を使用する場合は、ポリシーによってこれらの Webhook が Webhook を実装するポッドに必要な接続を行うことができるようにしてください。 また、 Kubernetes API を拡張するローカル以外のサービスについても、トラフィックを許可する必要があります。 このようなサービスは、
oc get apiservices
を実行して確認できます。default/openshift-apiserver
はローカルのサービスとして含まれているので、ネットワーク・ポリシーは不要であることに注意してください。
ポッド間のトラフィックの制御
Kubernetes ポリシーは、内部ネットワーク・トラフィックからポッドを保護します。 単純な Kubernetes ネットワーク・ポリシー を作成して、1 つの名前空間内または複数の名前空間間でアプリ・マイクロサービスを相互に分離することができます。
デフォルトでは、すべてのポッドに、クラスター内の他のすべてのポッドへのアクセス権限があります。 さらに、ポッドは、ポッド・ネットワークによって公開されるサービス (メトリック・サービス、クラスター DNS、API サーバー、クラスター内で手動で作成するサービスなど) にアクセスできます。
拒否されたトラフィックのロギング
クラスター内の特定のポッドに対する拒否されたトラフィック要求をログに記録するには、Calico ログ・ネットワーク・ポリシーを作成します。
トラフィックをアプリ・ポッドに制限するネットワーク・ポリシーをセットアップしている場合、このポリシーで許可されないトラフィック要求は拒否され、除去されます。 一部のシナリオでは、拒否されたトラフィック要求の詳細情報が必要になる場合があります。 例えば、ネットワーク・ポリシーの 1 つによって一部の異常なトラフィックが継続的に拒否されることに気付く場合があります。 潜在的なセキュリティー脅威をモニターするには、指定されたアプリ・ポッドで試行されたアクションがポリシーで拒否されるたびに記録するようにロギングをセットアップします。
このセクションでは、Kubernetes ネットワーク・ポリシーによって拒否されたトラフィックをログに記録する方法を説明します。 Calico ネットワーク・ポリシーによって拒否されたトラフィックをログに記録するには、Calico ネットワーク・ポリシー・チュートリアルのレッスン 5 を参照してください。
始める前に、Calico CLI をインストールして構成し、Calico コマンドを実行するクラスターのコンテキストを設定します。
-
着信トラフィックをブロックまたは制限する Kubernetes ネットワーク・ポリシーを作成するか、または既存のものを使用します。
-
Kubernetes ネットワーク・ポリシーを作成します。 例えば、ポッド間のトラフィックを制御するには、NGINX アプリへのアクセスを制限する
access-nginx
という名前の以下のサンプル Kubernetes ポリシーを使用します。 「run=nginx」というラベルが付いたポッドへの着信トラフィックは、「run=access」ラベルを持つポッドからのみ許可されます。 「run=nginx」アプリ・ポッドへの他の着信トラフィックはすべてブロックされます。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: run: access
-
ポリシーを適用します。
oc apply -f <policy_name>.yaml
-
-
前のステップで作成したポリシーによって拒否されたトラフィックをすべてログに記録するには、
log-denied-packets
という名前の Calico NetworkPolicy を作成します。 次の Calico ポリシーは、ステップ1で説明した例のaccess-nginx
Kubernetes ポリシーと同じポッドセレクターを使用していますが、 Kubernetes NetworkPolicy ではなく Calico NetworkPolicy であるため、構文が若干異なります。 また、すべての Kubernetes NetworkPolicy が Calico によって注文1000
として評価されるため、注文番号3000
が追加され、 Kubernetes NetworkPolicyの後に評価されるようになっています。 これらの 2 つのポリシーを適用すると、結果は以下のようになります。-
nginx ポッドに着信する新規接続は、まず Kubernetes NetworkPolicy (順序
1000
) に照らして評価されます。run=access
ラベルが付いたポッドからの接続は即時に受け入れられます。つまり、他のポリシーは評価されません。 -
run=access
ラベルのないポッド(またはポッド以外のもの)からの接続の場合、 Kubernetes NetworkPolicy は何も行わず、次に Calico がlog-denied-packets
ポリシーを評価します。 このポリシーは、nginx ポッドが存在するワーカー上の syslog にパケットを記録します。 -
その後、Calico は、接続に適用する他のポリシーがあるかどうかを検査し、ポリシーが見つからないため、パケットはドロップされます。 これは、明示的に許可されていないポリシーを持つポッドへのトラフィックがすべてドロップされるためです。
apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: log-denied-packets spec: types: - Ingress ingress: - action: Log destination: {} source: {} selector: projectcalico.org/orchestrator == 'k8s' && run == 'nginx' order: 3000
types
- この
Ingress
ポリシーは、すべての着信トラフィック要求に適用されます。 値Ingress
は、すべての着信トラフィックを表す一般用語であり、IBM Ingress ALB のみからのトラフィックを指すものではありません。ingress
- :
action
:Log
アクションは、このポリシーに一致するすべての要求のログ項目をワーカー・ノードの/var/log/syslog
パスに書き込みます。 destination
:selector
はこのポリシーを特定のラベルを持つすべてのポッドに適用するため、宛先は指定されません。source
: このポリシーは、すべてのソースからの要求に適用されます。
- :
selector
- セレクターは、元の access-nginx Kubernetes NetworkPolicy と同じトラフィックをターゲットにする必要があります。 これは Calico ポリシーであるため、
projectcalico.org/orchestrator == 'k8s'
を追加して、ポリシーのネームスペース内のすべてのポッドに適用されることを示す必要があります。また、元のrun == 'nginx'
も追加する必要があります。 order
- Calico ポリシーには、着信要求パケットに適用されるタイミングを決定する順序があります。
1000
などの下位のポリシーが最初に適用されます。 上位ポリシーは、下位ポリシーの後に適用されます。 例えば、3000
のように非常に高い優先順位を持つポリシーは、より優先順位の低いポリシーがすべて適用された後に、事実上最後に適用されます。 着信要求パケットには Iptables 規則チェーンが適用され、最初に下位ポリシーの規則との照合が試行されます。 パケットが任意の規則に一致した場合、そのパケットは受け入れられます。 ただし、パケットがどの規則にも一致しない場合、そのパケットは、最上位の Iptables 規則チェーン内の最後のルールに到達します。 このポリシーが確実にチェーン内の最後のポリシーになるように、ステップ 1 で作成したポリシーよりもずっと高い順序番号 (3000
など) を使用します。 Kubernetes NetworkPolicy は、1000
の順で適用されます。
-
-
ポリシーを適用します。 Windows マシンを使用している場合は、
--config=<filepath>/calicoctl.cfg
オプションを含めます。calicoctl apply -f log-denied-packets.yaml [--config=<filepath>/calicoctl.cfg]
-
ステップ 1 で作成したポリシーによって許可されない要求を送信して、ログ・エントリーを生成します。 例えば、ネットワーク・ポリシーによって保護されているポッドを、許可されていないポッドまたは IP アドレスから ping しようとします。
-
/var/log/syslog
パスに作成されたログ・エントリーを確認します。 プロキシー、ネットワーク・アドレス変換 (NAT)、およびその他のネットワーキング・プロセスが原因で、ログ・エントリーの DST (宛先) または SRC (送信元) の IP アドレスが予想と異なるものになる場合があります。 ログ・エントリーは、以下のようになります。Sep 5 14:34:40 <worker_hostname> kernel: [158271.044316] calico-packet: IN=eth1 OUT= MAC=08:00:27:d5:4e:57:0a:00:27:00:00:00:08:00 SRC=192.XXX.XX.X DST=192.XXX.XX.XX LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=52866 DF PROTO=TCP SPT=42962 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0
-
オプション:
/var/log/syslog
のログを IBM Cloud Logs に転送します。