[K8sセキュリティ] 実践CKAD対策: NetworkPolicyでマスターするPod通信制御戦略

こんにちは!クラウドネイティブ環境でアプリケーションを開発・運用していると、「誰が私たちのサービスにアクセスできるのか?」というセキュリティの問いに直面することがよくあります。Kubernetesの基本的な哲学は「すべてのPod間の通信を許可する(Any-to-Any)」ですが、実際の運用環境では非常に危険な考え方です。

今日は、CKAD試験の必須項目であり、ゼロトラスト(Zero Trust)セキュリティの出発点であるNetworkPolicyを徹底的に掘り下げていきます。


1. NetworkPolicyとは何か?

KubernetesのNetworkPolicyは、Podグループ間のネットワークトラフィックの流れを許可するルールを定義するL3/L4ファイアウォールの役割を果たします。

主要な特徴

  • ホワイトリスト方式: 基本的にNetworkPolicyが適用された瞬間、明示されていないすべてのトラフィックは遮断されます。
  • ラベルセレクター(Label Selector)ベース: IPアドレスではなく、Podのラベルを通じて対象を指定します。これは、動的なKubernetes環境に最適化された方式です。
  • ネットワークプラグイン依存性: 重要です!NetworkPolicyをサポートするネットワークソリューション(Calico、Cilium、Weave Netなど)がクラスターにインストールされている場合にのみ、実際の遮断が機能します。

2. NetworkPolicyの主要な構成要素

NetworkPolicyのYAMLを作成する際に、必ず理解しておくべき4つの主要な領域があります。

  1. podSelector: ポリシーを適用するターゲットPodを選択します。
  2. policyTypes: このポリシーが受信トラフィック(Ingress)に関するものか、送信トラフィック(Egress)に関するものかを明示します。
  3. Ingress: 許可する受信トラフィックのソース(from)とポート(ports)を定義します。
  4. Egress: 許可する送信トラフィックの宛先(to)とポート(ports)を定義します。

3. 実践例で学ぶ通信制御

シナリオ1: 特定のPodからのリクエストのみを許可する(Ingress)

app: databaseラベルを持つPodに対して、app: backendラベルを持つPodからの5432ポートへの接続のみを許可したい場合です。

YAML

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-allow-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: database      # ポリシーを適用する対象(DB Pod)
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: backend   # 接続を許可するソース(バックエンドPod)
    ports:
    - protocol: TCP
      port: 5432         # 許可するポート

シナリオ2: すべてのトラフィックを遮断する(Default Deny)

最も安全なセキュリティ戦略は、すべての通信を遮断し、必要なものだけを開放することです。

YAML

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: default
spec:
  podSelector: {}        # ネームスペース内のすべてのPodを選択
  policyTypes:
  - Ingress
  - Egress
  # ingress/egressのサブ項目を空にすると、すべてのトラフィックが遮断されます。

4. CKAD試験で間違いやすいポイント(裏技)

試験会場で慌てないためには、以下の3つの条件を明確に区別する必要があります。

  1. podSelector vs namespaceSelector: * podSelectorのみの場合、同じネームスペース内のPodを探します。
    • 他のネームスペースのPodを許可するには、必ずnamespaceSelectorを併用する必要があります。
    1. 配列(-)の有無:
    2. YAML

    `

    from:

    • podSelector: {…}

    namespaceSelector: {…} # 1番: 2つの条件が「AND」で動作(特定のNS内の特定のPod)

    from:

    • podSelector: {…}
    • namespaceSelector: {…} # 2番: 2つの条件が「OR」で動作(現在のNSの特定のPod、または特定のNSのすべてのPod)

    `

    1. DNS確認(Egress): Podから外部への送信トラフィックを制御する際、DNSクエリ(UDP 53)を許可しないと、ドメインベースの通信が失敗します。Egressポリシーの際は必ず確認してください!

    5. 終わりに

    NetworkPolicyは単に通信を遮断するツールではなく、マイクロサービスアーキテクチャにおいてサービス間の信頼境界を設定する非常に重要な手段です。CKAD試験を準備されている方は、様々なラベルの組み合わせを通じてkubectl describe netpolの結果を分析する練習を十分に行うことをお勧めします。

    今日まとめた内容が、皆様のクラスターをより安全にする一助となれば幸いです!


Comments

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です