Kubernetesを「侵入不可能な城」にする:Pod Security Admissionで特権コンテナを締め出す方法
こんにちは!セキュリティの世界へようこそ。
普段、私たちがWebアプリケーションを開発する際、Kubernetesという強力な基盤を使っていますよね。でも、このKubernetes、実は設定を間違えると「鍵のかかっていない玄関」どころか、「泥棒にマスターキーを渡している」のと同じくらい危険な状態になることがあるんです。
今日は、Kubernetesのセキュリティの要である「Pod Security Admission(PSA)」を使って、システムを泥棒から守るための「要塞化」の基本を学んでいきましょう。
—
1. なぜ「特権コンテナ」が危ないのか?(家の鍵のたとえ)
まずは、イメージしてみてください。あなたの住んでいる家(サーバー)の中に、小さな個室(コンテナ)をたくさん作っているとします。
通常、この個室からは家の外(ホストOS)に出ることはできません。窓も鍵がかかっていますし、キッチンの包丁(OSの特権機能)にも触れません。
しかし、「特権コンテナ(Privileged Container)」というのは、「この部屋の住人は、家の玄関の鍵も金庫の鍵も開けていいですよ」という特別な許可証を持たせた状態です。
もし、この部屋の住人が悪い人(攻撃者)に乗っ取られたらどうなるでしょう?
玄関の鍵をこっそり開けられ、家中の財産(データ)が盗まれ、挙げ句の果てには家全体を乗っ取られてしまいます。これが、Kubernetesにおける「特権コンテナの実行」がどれほど危険かという理由です。
—
2. Pod Security Admission(PSA)という「最強の門番」
Kubernetesには、この「やばい権限を持ったコンテナ」を門前払いしてくれる優秀な門番がいます。それが Pod Security Admission(PSA) です。
PSAは、Pod(コンテナの集まり)が作られる前に、「このPodはルールを守っているか?」を厳しくチェックします。ルールは大きく分けて3つのレベルがあります。
1. Privileged(許可): 何でもあり。制限なし。
2. Baseline(基本): 最低限のセキュリティ。よくある設定ミスを防ぐ。
3. Restricted(制限): 最高レベルの厳しさ。本番環境はこれを目指すべき。
今回は、最も安全な Restricted を適用する方法を見ていきましょう。
—
3. 実践:名前空間(Namespace)に「厳重警戒」のラベルを貼る
Kubernetesでは、Namespaceごとに「どのレベルのセキュリティを適用するか」をラベルで指定します。これだけで、門番が自動的に動き出します。
以下のコマンドをターミナルで実行してみてください。
# 'production' という名前空間に、最高レベルの制限(Restricted)を適用する設定
kubectl label namespace production \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/enforce-version=latest
# もし違反があったら警告だけ出すモード(最初はここから始めるのがおすすめ!)
kubectl label namespace production \
pod-security.kubernetes.io/warn=restricted
これだけで、production 名前空間の中で「特権を持った怪しいコンテナ」を作ろうとすると、Kubernetesが「ダメです!その設定は許可されていません!」と止めてくれるようになります。
—
4. なぜ「Restricted」にすべきなのか?
Restricted モードを適用すると、具体的に以下のことが禁止されます。
- 特権の昇格: コンテナが自分自身の権限を無理やり上げること。
- ホストパスのマウント: ホストマシンの重要なディレクトリ(設定ファイルなど)をコンテナから直接読み書きすること。
- ルート権限での実行: コンテナの中のユーザーが、管理者(root)として動くこと。
これらは、ハッカーがサーバーに侵入した際、真っ先に狙うポイントです。ここを塞ぐだけで、攻撃の難易度は跳ね上がります。
—
5. 現場の知恵:開発者に嫌われないためのステップ
「厳しくしすぎると、開発中のアプリが動かなくなる!」という声が聞こえてきそうですね。その通りです。だからこそ、いきなり enforce(強制)するのではなく、まずは warn(警告)モードで運用しましょう。
1. まずは warn で様子見: 既存のアプリがルールに違反していないか、ログを確認する。
2. 違反を修正: 警告が出たPodの設定を見直し、権限を絞る(securityContext を適切に設定する)。
3. 最後に enforce: 安全が確認できた段階で、強制適用に切り替える。
良い設定の例(securityContext)
Podを作る際は、以下のように「権限を最小限に絞る」のがプロの作法です。
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext:
# ルート権限を使わせない
runAsNonRoot: true
# ユーザーIDを指定(一般ユーザーで動かす)
runAsUser: 1000
containers:
- name: my-app
image: my-app-image
securityContext:
# 特権モードを明示的に禁止
privileged: false
# 権限昇格をさせない
allowPrivilegeEscalation: false
—
最後に:セキュリティは「完璧」ではなく「継続」
今日学んだことは、セキュリティの第一歩です。一度設定して終わりではなく、「新しいサービスを作るときには、必ずこの門番を通す」という習慣こそが、あなたのインフラを鉄壁にします。
セキュリティは難しく考えず、「自分の家をどう守るか」という感覚で向き合ってみてください。一歩ずつ、着実に。そうすれば、あなたのKubernetes環境は、誰からも侵入されない誇り高い城になるはずです。
また次の記事で、より深い防衛術についてお話ししましょう。一緒に学んでいきましょう!
コメント