Pod の NetworkPolicy 設定不備

Pod が NetworkPolicy の対象に含まれない場合、想定した通信制限が適用されないおそれがあります。

説明

NetworkPolicy が Pod と異なる名前空間にある場合や、podSelector が実際の Pod を選択しない場合、そのポリシーは対象 Pod に適用されません。ネットワークで保護されているように見えても、実際にはアクセスできる状態が残るおそれがあります。

ポリシーの有無だけでなく、名前空間、ラベル、対象 Pod を確認してください。適用には NetworkPolicy に対応するネットワークプラグインが必要です。また、複数のポリシーによる通信の許可範囲は併せて適用されます。

想定される影響

  • Pod 間や外部との通信が想定より広く許可される場合があります。
  • 内部サービスが保護されないまま残るおそれがあります。
  • ポリシーが宣言されていても、想定したネットワーク分離が機能しない場合があります。

対処方法

  • NetworkPolicy を保護対象の Pod と同じ名前空間に配置してください。
  • podSelector が実際の Pod のラベルと一致することを確認してください。
  • ポリシー適用後に、対象 Pod の通信が実際に制限されることをテストしてください。

例

使用する名前空間とアプリケーションイメージを別途用意してください。例の古い nginx バージョンはデプロイの推奨ではありません。

変更前

yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: app-one
  labels:
    app: shouldmatch
spec:
  containers:
    - name: nginx
      image: nginx:1.14.2
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: sample-policy
  namespace: app-another
spec:
  podSelector:
    matchLabels:
      app: shouldmatch

変更後

yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: app-safe
spec:
  containers:
    - name: app
      image: images.my-company.example/app:v4
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: sample-policy
  namespace: app-safe
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

補足:

  • 変更前: Pod とポリシーの名前空間が異なるため、このポリシーは例の Pod に適用されません。
  • 変更後: 同じ名前空間のすべての Pod に、受信・送信のデフォルト拒否を適用します。別のポリシーによる許可は有効なため、ポリシー全体を確認し、必要な DNS やアプリケーション通信を明示的に許可してください。

参考資料