TT Lab
はじめる
学ぶ 学習パス コース

KCSA — Kubernetesセキュリティアソシエイト

フレームワークは答えではなく質問のリストだ

TT Labで続きを見る

一言でいうと

CIS・NSA/CISA・MITRE ATT&CKは、互いに競合する標準ではなく、役割の異なる道具です。 CISは設定のチェックリスト、NSA/CISAは設計ガイド、ATT&CKは攻撃者の行動の辞書です。 そして、この3つを実際の証拠につなぐのが監査ログです。

なぜ必要なのか

「うちのクラスターは安全か」に答えるには、基準が必要です。基準がなければ、点検は人によって違い、 昨年と今年を比較することもできず、外部に説明することもできません。

フレームワークの価値は、網羅性と共通言語です。見落としを減らし、異なる組織が同じ言葉を 使えるようにします。ただし、フレームワークが「この通りにすれば安全です」と言ってくれるわけではありません。 質問の一覧であって、正解集ではありません。

どう動くのか

CIS Kubernetes Benchmark: 設定チェックリスト

各項目が「この設定はこの値になっているか」を問う、具体的なチェックリストです。コントロールプレーンのファイル権限、 apiserverのフラグ、etcdの設定、コントローラーマネージャー/スケジューラー、kubelet、ポリシーまで、領域ごとに分かれています。

CISを使うときの注意点は、マネージドクラスター(EKS/GKE/AKS)には、かなりの項目が適用されないことです。 コントロールプレーンのファイルにアクセスできないからです。そのため、マネージド向けの別のベンチマークが用意されています。 「項目をいくつ通過したか」という数字よりも、各項目がなぜあるのかを理解することが、試験でも現場でも重要です。

NSA/CISA Kubernetes Hardening Guidance: 設計ガイド

チェックリストではなく、「このように設計せよ」という記述式のガイドです。5つの軸にまとめられます。

  1. Podセキュリティ: 非root実行、イミュータブルなファイルシステム、イメージスキャン、アドミッションポリシー
  2. ネットワークの分離と強化: ネームスペースの分離、NetworkPolicy、コントロールプレーンへのアクセス制限、保存時・転送時の暗号化
  3. 認証と認可: 匿名の無効化、強力なユーザー認証、RBACの最小権限
  4. ログの監査: 監査ログの有効化、ログのクラスター外への送出、アラートの構成
  5. アップグレードと設定管理: 定期的なパッチ、不要なコンポーネントの削除、定期的な脆弱性の点検

CISが「この値は正しいか」を問うなら、NSA/CISAは「この構造は正しいか」を問います。両者は補完関係にあります。

MITRE ATT&CK for Containers: 攻撃者の行動の辞書

防御者の視点ではなく、攻撃者が実際に行う行動を、戦術(Tactic)と技術(Technique)として一覧にしたものです。 コンテナのマトリクスにおける戦術の流れは、おおよそ次のとおりです。

초기 접근 → 실행 → 지속성 → 권한 상승 → 방어 회피 → 자격증명 접근
        → 탐색 → 측면 이동 → 영향

このコードブロックの韓国語は、順に、初期アクセス、実行、永続化、権限昇格、防御回避、認証情報アクセス、探索、ラテラルムーブメント、影響という戦術の名前です。

ここに含まれる代表的な技術は、前のモジュールで見たものとそのまま重なります。 公開されたAPIを通じた初期アクセス、コンテナのデプロイを通じた実行、特権コンテナを通じた脱出、 コンテナAPIを通じた認証情報アクセス、クラスターのリソースの探索です。

ATT&CKの使いどころは、検知の設計です。「私たちはこの技術を検知できるか」を技術単位で問えば、 ログの収集とアラートルールが具体化します。CISが予防の側なら、ATT&CKは検知の側です。

監査ログ: 3つのフレームワークを証拠につなぐもの

コンプライアンスにおいて、監査ログが果たす役割は3つです。

  1. 証明: 「私たちはこの統制を運用している」ことを、記録で示します
  2. 調査: インシデントが起きたときに、何があったのかを再構成します
  3. 検知: 進行中の攻撃のシグナルを見つけます

Kubernetesの監査ポリシーは、4つのレベルで記録量を調整します。

レベル 記録する内容
None 記録しない
Metadata リクエスト元・動作・リソース・時刻。本文なし
Request メタデータ + リクエスト本文
RequestResponse メタデータ + リクエスト + レスポンス本文

SecretのようなリソースにRequestResponseを設定すると、監査ログそのものがシークレットの漏えい経路になります。 そのため実務のポリシーでは、通常、Secret/ConfigMapはMetadataでしか残さず、RBACオブジェクトの変更のような 機微なものはRequestResponseで残します。

そして、何を残すかと同じくらい重要なのが、拒否(deny)を残すかです。 権限の探索は、失敗の繰り返しとしてしか現れません。短時間に1つの主体が、異なる対象に何十回も 拒否されるパターンが、そのまま列挙の試みのフィンガープリントです。拒否を記録しなければ、そのシグナルは存在しません。 逆方向も役に立ちます。デプロイ後に拒否ログが突然消えたなら、チェック自体がなくなった可能性を 疑う必要があります。

最後に、ログはクラスターの外へ送る必要があります。侵害されたクラスターの中のログは消されるかもしれず、 Podもすでになくなっているかもしれません。

現場での姿

著者のブログが示したRBAC監査の手順は、CISの項目を実際のクエリに置き換えた好例です。

ここで強調したいのは、周期が決まっていることです。コンプライアンスが1回の点検ではなく、 運用のルーティンだという意味です。

ワイルドカード権限についての著者の論拠も、そのまま引用に値します。 resources: ["*"]やverbs: ["*"]を使うと、現在はもちろん、将来追加されるリソースに対しても 無制限のアクセスを許可することになります。「いまは安全だから大丈夫」という反論を、正確に断ち切る論理です。

ポリシーエンジンの運用原則も、コンプライアンスの観点から読むとよいでしょう。 Policy as Codeで管理し、変更前に必ずdryrunで影響を評価し、障害時の緊急復旧手順を 事前に準備します。そして著者の最後の一文です。「RBACとポリシーエンジンは技術的な道具ですが、 これを効果的に運用するには、組織のアクセス制御ガバナンスと連携する必要があります。」

次のラボですること

最後のラボでは、クラスター全体のRBAC監査を自分で実行します。 *権限を持つClusterRoleを探して一覧にし、escalate・bind・impersonateを持つものを 検知し、kubectl auth can-i --list --as=でServiceAccountの実効権限を確認し、 最小権限のRoleを新しく作成して望むことだけができ、残りはできないことを測定で証明したうえで、 その根拠をまとめた監査レポートを書きます。