こんにちは。現場で泥をすすりながらシステムを守り続けているセキュリティエンジニアです。
今日は、Kubernetes(K8s)という、現代の巨大なシステムを支える「魔法の城」の入り口、「APIサーバー」についてお話しします。
皆さんは、家の玄関に防犯カメラを設置していますよね? 誰がいつ入ってきたのか、怪しい動きをしていないかを確認するはずです。K8sのAPIサーバーも同じ。ここが突破されると、家の中の家具(Pod)を勝手に動かされたり、壁を壊されたり(リソース削除)してしまいます。
今日は、その「玄関の記録」をどう守るか、一緒に紐解いていきましょう。
—
1. なぜ「APIサーバー」が狙われるのか?
APIサーバーは、K8sという城の「執事」です。すべての命令はここを通ります。「新しいサーバーを作れ」「パスワードを変えろ」「このデータを外に出せ」といった指示は、すべてこの執事を通じないと実行されません。
攻撃者は、この執事を味方につけようとします。もし攻撃者が執事の鍵(権限)を盗んだら、あなたにバレないように裏でこっそりと「隠し部屋」を作ったり、機密情報を持ち出したりするでしょう。
だからこそ、「執事が誰に、どんな命令を受けたのか」を記録する「監査ログ」が、命綱になるんです。
—
2. まずは「記録」を残す:監査ポリシーの設定
まずは、執事に「どんな会話を記録すべきか」を指示するルールブックを作りましょう。これを「Audit Policy(監査ポリシー)」と呼びます。
以下のような設定ファイル(YAML形式)をAPIサーバーに読み込ませます。
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
# 機密性の高いデータ(Secretsなど)へのアクセスは全て記録する
- level: RequestResponse
resources:
- group: ""
resources: ["secrets"]
# Podの作成や変更も厳重にチェックする
- level: Metadata
resources:
- group: ""
resources: ["pods"]
# それ以外は最低限の記録でOK
- level: Metadata
omitStages:
- "RequestReceived"
この設定をAPIサーバーの起動引数に渡すことで、K8sは「誰が、いつ、どのリソースに対して、何をしたか」をJSON形式で書き出してくれるようになります。
—
3. 「泥棒」を見つけるための異常検知
ログを貯めるだけでは、ただの「日記」です。重要なのは、その中から泥棒の足跡を見つけること。
例えば、深夜3時に普段アクセスしないIPアドレスから、権限管理(RoleBinding)の変更リクエストが飛んできたら……怪しいですよね?
現場で使える「検知ポイント」の例
1. 突然の権限昇格: cluster-admin(最強の鍵)を付与する操作。
2. 謎のPod作成: 普段使わないイメージから、怪しげなコンテナを立ち上げる操作。
3. 連続するエラー(403 Forbidden): 「この鍵で開かないかな? こっちは?」と、扉をガチャガチャ回している(総当たり攻撃)の証拠です。
これらを監視するために、多くの現場では Fluentd や Loki といったツールでログを集め、Prometheus や Elasticsearch で「閾値を超えたらアラートを飛ばす」という仕組みを作ります。
—
4. 最初の第一歩:今日からできること
いきなり完璧なシステムを作るのは大変です。まずは、以下のステップから始めてみてください。
- Step 1: APIサーバーのログがどこに出力されているかを確認する(
--audit-log-pathオプションを確認)。 - Step 2:
kubectlを使って、直近のログを眺めてみる。「自分の操作がちゃんと記録されているか」を確認するだけで、大きな進歩です。 - Step 3: 「権限変更」など、絶対にやってはいけない操作ログが出たときに、Slackに通知が飛ぶような簡単なスクリプトを書いてみる。
最後に:セキュリティは「完璧」を目指さない
セキュリティの世界には「絶対」はありません。攻撃者は常に進化しています。
でも、「いつ、誰が何をしたか」さえ分かっていれば、被害を最小限に食い止めることができます。 泥棒が入ったとしても、防犯カメラの映像があれば、すぐに鍵を取り替えて、被害の範囲を特定できるからです。
「小難しい!」と感じるかもしれませんが、一歩ずつで大丈夫です。まずは執事の記録を覗いてみるところから、一緒に始めていきましょう。
次回の記事では、このログを自動的に解析して、Slackへ通知を送る「自動番犬(アラートボット)」の作り方を紹介しますね。お楽しみに!
コメント