【入門編】 Kubernetes Network Policiesによる名前空間間の通信制御 – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

Kubernetesの「全戸開放」をやめよう:ネットワークポリシーでつくる、泥棒に入られない家

こんにちは。日々、システムの守りを固める現場で汗を流しているエンジニアです。

今日は、Kubernetes(K8s)を使っている皆さんに向けて、「Pod間通信の要塞化」という少し堅苦しいけれど、実はめちゃくちゃ重要な話をします。

皆さんが住んでいるマンションを想像してみてください。エントランスのオートロックが壊れていて、誰でも廊下に入り放題、どの部屋のドアも開けっ放し……そんな状態だったら怖くないですか?実は、デフォルトのKubernetesは、まさにこの「廊下も部屋も誰でも自由に行き来できる状態」なんです。

今回は、この状態を「必要な人だけが、必要な場所に入れる」状態に変えるための魔法、ネットワークポリシーについて解説します。

—

なぜ「全許可」が危ないのか?(泥棒の視点)

攻撃者がシステムに侵入したとき、彼らがまず考えるのは「ここからどこへ行けるか?」ということです。もし、WebサーバーのPodが何らかの脆弱性で乗っ取られたとします。

もしネットワークポリシーが設定されていなければ、攻撃者はそのWebサーバーを踏み台にして、隣のデータベース(DB)へ直接攻撃を仕掛けたり、全然関係のない管理用Podを覗き見たりできてしまいます。

「家の中に泥棒が入った」とき、全ての部屋が繋がっていたら、リビングから寝室、金庫のある書斎まで全てが盗難の危機にさらされますよね。ネットワークポリシーは、各部屋の間に頑丈な鍵付きのドアを設置する作業なのです。

—

ステップ1:まずは「全遮断」というスタートライン

Kubernetesでは、一度もネットワークポリシーを適用していない名前空間(Namespace)は「全許可(Allow All)」です。まずはこれを「基本は全拒否(Deny All)」に変えるのが鉄則です。

以下の設定を適用すると、その名前空間内の通信は一切遮断されます。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: my-app # 対象の名前空間を指定
spec:
  podSelector: {} # 空にすると「すべてのPod」が対象になります
  policyTypes:
  - Ingress # 入ってくる通信を拒否
  - Egress  # 出ていく通信を拒否

これを適用した瞬間、あなたのアプリは外部とも内部とも通信できなくなります。「えっ、壊れた!?」と思うかもしれませんが、大丈夫。ここから「許可リスト」を一つずつ足していくのが、正しい要塞化の第一歩です。

—

ステップ2:最小限の通信を許可する(ホワイトリスト方式)

次に、特定のPod同士だけが会話できるように許可を与えます。例えば、「フロントエンドのPodだけが、バックエンドのAPIにアクセスできる」ように設定してみましょう。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: my-app
spec:
  podSelector:
    matchLabels:
      app: backend # 許可を受ける側のPod(バックエンド)
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend # 許可を与える側のPod(フロントエンド)
    ports:
    - protocol: TCP
      port: 8080 # APIが動いているポート番号

この設定は、「app=backend というラベルがついたPodに対して、app=frontend というラベルを持つPodからの、ポート8080への通信だけを許可する」という意味になります。

これで、たとえ別のPodが乗っ取られても、バックエンドへの不審なアクセスはブロックされます。まさに、「信頼できる相手しか入れない会員制の部屋」を作ったわけですね。

—

現場で守るべき「3つのポイント」

最後に、実務でこの設定を行う際の心構えをお伝えします。

1. 「とりあえず全部許可」を卒業する
開発中は面倒で全許可にしがちですが、本番環境では絶対に避けましょう。「通信できない」と騒ぎになったら、その時に必要なポリシーだけを追加する。この「泥臭い作業」こそが、強固なセキュリティの要です。
2. ラベル管理を厳格に
ネットワークポリシーは matchLabels でPodを識別します。ラベルが適当だと、意図しないPodまで許可してしまうミスが起きます。命名規則をしっかり決めましょう。
3. まずは検証環境でテスト
いきなり本番で全拒否ポリシーを投入すると、アプリが全滅します。必ず検証環境で「どの通信が通って、どこが遮断されたか」を確認してから進めてください。

最後に:セキュリティは「終わりのない旅」

「一度設定したら安心」という魔法の杖はありません。システムは日々進化し、Podも増え続けます。でも、こうして一歩ずつ「誰が、どこへ行くのか」を定義していく作業は、必ずあなたのシステムを強固な砦に変えてくれます。

まずは小さな名前空間から、この「鍵の取り付け」を始めてみませんか?一歩ずつ、一緒に学んでいきましょう!

コメント

タイトルとURLをコピーしました