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も増え続けます。でも、こうして一歩ずつ「誰が、どこへ行くのか」を定義していく作業は、必ずあなたのシステムを強固な砦に変えてくれます。
まずは小さな名前空間から、この「鍵の取り付け」を始めてみませんか?一歩ずつ、一緒に学んでいきましょう!
コメント