ネットワーク・ポリシーによるトラフィックの制御
定番のクラスター
このネットワーク・ポリシー情報は、クラシック・クラスターに固有の情報です。 VPCクラスタについては、 「Understanding Secure by Default cluster VPC networking 」を参照してください。
IBM Cloud® Kubernetes Service クラスターごとにネットワーク・プラグイン Calico が備わっています。 デフォルトのネットワーク・ポリシーは、クラスター内のすべてのワーカー・ノードのパブリック・ネットワーク・インターフェースを保護します。
Calico および Kubernetes を使用してクラスターのネットワーク・ポリシーを作成できます。 Kubernetes ネットワーク・ポリシーを使用して、クラスター内のポッドとの間で許可またはブロックするネットワーク・トラフィックを指定できます。 ネットワーク・ロード・バランサー (NLB) サービスへのインバウンド (ingress) トラフィックのブロックなど、より高度なネットワーク・ポリシーを設定するには、Calico ネットワーク・ポリシーを使用します。
- Kubernetes ネットワーク・ポリシー
- Kubernetes ネットワークポリシーでは、ポッドが他のポッドや外部エンドポイントとどのように通信できるかを規定します。 着信ネットワーク・トラフィックと発信ネットワーク・トラフィックの両方が、プロトコル、ポート、および送信元 IP アドレスまたは宛先
IP アドレスに基づいて許可またはブロックされます。 トラフィックは、ポッドおよび名前空間ラベルに基づいてフィルタリングすることもできます。 Kubernetes のネットワークポリシーは、
kubectlコマンドまたは Kubernetes APIを使用して適用できます。 - Calico ネットワーク・ポリシー
- Calico ネットワーク・ポリシー は、 Kubernetes ネットワーク・ポリシーのセットです。 「
calicoctl」コマンドラインを使用すると、 Calico のポリシーを適用できます。 Calico ポリシーは、以下の機能を追加します。- Kubernetes ポッドのソースまたは宛先 IP アドレスや CIDR に関係なく、特定のネットワーク・インターフェース上のネットワーク・トラフィックを許可またはブロックします。
- 複数の名前空間にまたがるポッドのネットワーク・トラフィックを許可またはブロックします。
- Kubernetes LoadBalancer または NodePort サービスへのインバウンド・トラフィックをブロックします。
Calico は、ターゲット・リソースに転送するためにネットワーク・トラフィックが満たす必要がある特性を定義するためにワーカー・ノードのファイアウォールとして機能する Iptables ルールをセットアップすることにより、これらのポリシー (Kubernetes ネットワーク・ポリシーなど) を適用します。
デフォルトの Calico および Kubernetes ネットワーク・ポリシー
パブリック 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 パケットを許可します。 |
Kubernetes ダッシュボードへのアクセスを制限するデフォルトの Kubernetes ポリシーも作成されます。 Kubernetes ポリシーはホスト・エンドポイントには適用されませんが、代わりにポッド・レベルで適用され、すべてのクラシックと VPC のクラスターに適用されます。
| Kubernetes ポリシー | 説明 |
|---|---|
dashboard-metrics-scraper |
Kubernetes 1.20 以降: kube-system 名前空間で提供されます。すべてのポッドに対し、Kubernetes ダッシュボード・メトリック・スクレイパーへのアクセスをブロックします。 このポリシーでは、Kubernetes ダッシュボードはダッシュボード・メトリックへのアクセスを妨げられません。 さらに、このポリシーは、IBM Cloud コンソールや kubectl proxy を使用してダッシュボード・メトリックにアクセスすることには影響しません。 ポッドがダッシュボード・メトリック・スクレイパーへのアクセスを必要とする場合は、dashboard-metrics-scraper-policy: allow ラベルを持つ名前空間にそのポッドをデプロイします。 |
kubernetes-dashboard |
kube-system 名前空間で提供されます。すべてのポッドに対し、Kubernetes ダッシュボードへのアクセスをブロックします。 このポリシーは、IBM Cloud コンソールや kubectl proxy を使用してダッシュボードにアクセスすることには影響しません。 ダッシュボードへのアクセスを必要とするポッドの場合は、kubernetes-dashboard-policy: allow ラベルを持つ名前空間にそのポッドをデプロイします。 |
Calico CLI のインストールおよび構成
Calico ポリシーを表示、管理、および追加するには、Calico CLI をインストールして構成します。
-
Calico コマンドを実行するクラスターのコンテキストを設定します。
-
Kubernetes バージョン 1.19 以降:
- ご使用のクラスター用の
kubeconfig構成ファイルをダウンロードします。ibmcloud ks 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 と同じディレクトリーに保存します。 このようにセットアップすると、後でコマンドを実行するとき、ファイル・パスの変更を行う手間がいくらか少なくなります。 -
環境変数をクラスターの構成ファイルに設定します。
export KUBECONFIG=./.bluemix/plugins/container-service/clusters/<cluster_name>-<hash>/kube-config.yaml
-
-
-
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 ネットワークポリシー または グローバルネットワークポリシーを定義します。 これらの構成ファイルにはどのポッド、名前空間、またはホストにこれらのポリシーを適用するかを説明するセレクターが含まれます。バージョン 1.29 以降でプロビジョニングされた新しいクラスターについては、
globalnetworkpolicies.crd.projectcalico.org(gnp)およびhostendpoints.crd.projectcalico.org(hep)の短縮名はサポートされていません。 ただし、クラスタをバージョン 1.29 以降にアップグレードした場合でも、短縮名は引き続きサポートされます。 -
ポリシーをクラスターに適用します。 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 およびその他のコンポーネントからマスターへの既存の接続が中断され、強制的に再接続されます。 これにより、新規および変更されたポリシーがマスター・コンポーネントへの必要な接続をブロックするかどうかが示されます。 -
Kubernetes のダッシュボードに接続を試みて、ポリシーの変更によってこれらのコンポーネントに必要な接続がブロックされていないことを確認してください。
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を参照してください。
IBM Cloud Kubernetes Service およびその他の IBM Cloud の新規ロケーションが有効になると、これらのロケーションのサブネットが Calico ポリシーに追加されます。 これらのポリシーの更新情報については、必ず GitHub リポジトリをウォッチする をご確認ください。
なお、「 パブリックネットワークポリシーの適用 」および「 プライベートネットワークポリシーの適用 」の各セクションに記載されている、allow-egress-pods-public、allow-public-services-pods、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 calicoctl apply -f allow-k8s-master-to-dashboard.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 を拡張するローカル以外のサービスに対するトラフィックも許可する必要があります。 こうしたサービスは、
kubectl get apiservicesを実行して見つけることができます。
プライベート・ネットワーク・ポリシーの適用
クラスター・ワーカーのパブリック/プライベート・ネットワーク・トラフィックをさらに制限する Calico プライベート・ネットワーク・ポリシーのサンプル・セットが用意されています。 これらのポリシーにより、クラスタの展開に必要なトラフィックは許可され、その他の特定のトラフィックはブロックされます。
これらのポリシーは、すべてをブロックするためのものではなく、それ自体で必ずしもコンプライアンス要件を満たすものでもありません。 これらは開始点として意図されたものであり、お客様固有のユース・ケースに合わせて編集する必要があります。 詳しくは、 READMEを参照してください。
IBM Cloud Kubernetes Service およびその他の 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.yamlCalico pre-DNAT ポリシーを作成することで、ネットワーク・サービスへのアクセスをさらに制御できます。 pre-DNAT ポリシーでは、
selector: ibm.role=='worker_private'を使用して、ワーカーのプライベート・ホスト・エンドポイントにポリシーを適用するようにしてください。 -
ポリシーが適用されたことを確認します。
calicoctl get GlobalNetworkPolicies -o yaml -
オプション:クラスタ内のポッドに適用するポリシーを使用する場合は、クラスタのすべての機能が引き続き動作することを確認するために、これらのポリシーをよくテストしてください。 たとえば、クラスタ内の Webhook を使用する場合は、ポリシーによってこれらの Webhook が Webhook を実装するポッドに必要な接続を行うことができるようにしてください。 また、 Kubernetes API を拡張するローカル以外のサービスに対するトラフィックも許可する必要があります。 こうしたサービスは、
kubectl get apiservicesを実行して見つけることができます。
ポッド間のトラフィックの制御
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 ``` 2. ポリシーを適用します。 ```sh {: pre} kubectl apply -f <policy_name>.yaml ``` - Kubernetes ネットワーク・ポリシーを作成します。 例えば、ポッド間のトラフィックを制御するには、NGINX アプリへのアクセスを制限する
-
前のステップで作成したポリシーによって拒否されたトラフィックをすべてログに記録するには、
log-denied-packetsという名前の Calico NetworkPolicy を作成します。 以下の Calico ポリシーは、手順1で説明した例「access-nginxKubernetes 」と同じPodセレクタを使用していますが、 Kubernetes NetworkPolicy ではなく、 Calico NetworkPolicy であるため、構文が若干異なります。 また、すべての Kubernetes NetworkPolicy が Calico によって注文1000として評価されるため、注文番号3000が追加され、 Kubernetes NetworkPolicyの後に評価されるようになっています。 これらの 2 つのポリシーを適用すると、結果は以下のようになります。- nginx ポッドに着信する新規接続は、まず Kubernetes NetworkPolicy (順序
1000) に照らして評価されます。run=accessラベルが付いたポッドからの接続は即時に受け入れられます。つまり、他のポリシーは評価されません。 run=accessラベルを持たないPod(またはPod以外のもの)から接続が行われた場合、 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 ``` - nginx ポッドに着信する新規接続は、まず Kubernetes NetworkPolicy (順序
types- この
Ingressポリシーは、すべての着信トラフィック要求に適用されます。 値Ingressは、すべての着信トラフィックを表す一般用語であり、IBM Ingress ALB のみからのトラフィックを指すものではありません。ingress:action:Logアクションは、このポリシーに一致するすべての要求のログ項目をワーカー・ノードの/var/log/syslogパスに書き込みます。 :destination:selectorはこのポリシーを特定のラベルを持つすべてのポッドに適用するため、宛先は指定されません。 :source: このポリシーは、すべてのソースからの要求に適用されます。 selector- セレクターは、元の access-nginx Kubernetes NetworkPolicy と同じトラフィックをターゲットにする必要があります。 これは Calico ポリシーであるため、元の
run == 'nginx'に加え、projectcalico.org/orchestrator == 'k8s'を含めて、このポリシーがポリシーのネームスペース内のすべてのポッドに適用されることを明示する必要があります。 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 または外部の syslog サーバーに転送します。