こんにちは。現場で泥臭いインシデント対応を繰り返していると、「完璧な城壁なんて存在しない」という事実に突き当たります。でも、だからこそ「泥棒が一番嫌がる家」を作ることはできる。今日は、そんなお話をしましょう。
Kubernetes(K8s)という巨大な城を管理する際、「API Server」という門番の守りを固める話です。
—
1. 家の鍵を全員に配っていませんか?
想像してみてください。あなたは巨大なマンションの管理人です。全住人に「マンション中のあらゆる部屋に入れるマスターキー」を配っていたらどうなるでしょう? 一人でもうっかり鍵を落としたら、マンション全体が泥棒の遊び場になってしまいますよね。
Kubernetesにおける「RBAC(Role-Based Access Control)」と「ServiceAccount(サービスアカウント)」は、まさにこの「鍵の管理」です。
本来、アプリケーションには「自分の部屋(特定のNamespace)だけ掃除できればいい」という権限があれば十分です。しかし、設定をサボると、全能のマスターキーをアプリに渡してしまっているケースが後を絶ちません。これが攻撃者にとっての「一番の狙い目」なんです。
—
2. 攻撃者はどうやって「鍵」を盗むのか
攻撃者は、あなたの作ったWebアプリに小さな穴(脆弱性)を見つけると、そこから侵入します。そして、ポッド(アプリが動くコンテナ)の中に置かれている「自動マウントされたトークン」を盗み出します。
このトークンこそが「マンションの鍵」です。もしこの鍵に「クラスタ全体の情報を読み取る」なんて権限がついていたら、攻撃者は一瞬であなたのインフラの地図を手に入れ、データベースや他の機密情報を探し始めます。
—
3. 「最小権限」という最強の防犯対策
では、どう守ればいいのか? 答えはシンプルです。「必要最小限の権限しか与えないこと」。
ステップ1:不要なトークンの自動マウントをオフにする
Kubernetesは親切心から、すべてのポッドにAPIを叩ける鍵を勝手に渡してしまいます。これ、実はほとんどのアプリには不要なんです。まずはこれを止めましょう。
# deployment.yaml の例
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
# トークンの自動マウントを明示的に無効化する
automountServiceAccountToken: false
containers:
- name: my-app-container
image: my-app:latest
これだけで、攻撃者がコンテナに侵入しても「手ぶら」の状態を作れます。泥棒が家に入っても、金庫はおろかタンスの中身すら見つけられない状態にする、最高の手口ですね。
ステップ2:必要な権限だけを「Role」で定義する
どうしてもAPI Serverと話す必要があるアプリには、マスターキーではなく「特定の部屋の鍵」を渡します。
# 読み取り専用権限を定義する例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # コアAPIグループ
resources: ["pods"] # ポッドの情報だけ
verbs: ["get", "list"] # 読み取りだけ許可
このように、verbs(何ができるか)を細かく制限することで、万が一鍵が盗まれても被害を最小限に食い止められます。
—
4. 現場からのアドバイス:定期的な「棚卸し」を
セキュリティ対策に「一度設定したら終わり」はありません。時間が経つと、開発の都合で権限がどんどん大きくなっていく「権限肥大化」が起こります。
kubectl get clusterrolebindingsを叩いて、cluster-admin(最強の権限)を持っている人が多すぎないか確認する。- 「本当にこのアプリはAPI Serverと話す必要があるのか?」と自分に問いかける。
これらを習慣にするだけで、あなたのクラスタの堅牢性は劇的に向上します。
—
最後に:完璧を目指さず、強固を目指そう
セキュリティは「ゼロか百か」ではありません。「いかに攻撃者のコストを上げさせるか」というゲームです。鍵をかけ、不要な扉を塞ぎ、見張りを立てる。当たり前のことを一つずつ積み重ねるだけで、あなたのクラスタは攻撃者にとって「割に合わない、面倒な標的」になります。
まずは今日、あなたのポッドの automountServiceAccountToken がどうなっているか、確認することから始めてみませんか?
一歩ずつ、一緒に強固な城を築いていきましょう!
コメント