【テクニカル・上級編】KubernetesのRBAC(ロールベースアクセス制御)の設計と監査 – アプリケーションセキュリティ & 安全な開発防御ガイド

Kubernetes RBACの深淵:権限昇格を許さない「最小権限」の設計思想

KubernetesのRBACは、多くのエンジニアにとって「設定すれば終わり」のチェックリストに過ぎない。しかし、現場でインシデント対応を繰り返す我々から見れば、RBACの不備は、攻撃者がクラスタを掌握するための「特急券」に他ならない。

特に、ClusterRoleを安易に使い、ワイルドカード(“)を付与したサービスアカウントが、Podのセキュリティコンテキストをすり抜けてホストノードにまで干渉する事例は後を絶たない。本稿では、表面的な設定ガイドを超え、攻撃者の視点から見た「RBACの脆弱性」と、それを封じ込めるためのアーキテクチャ設計について論じる。

—

1. なぜ「権限昇格」は起きるのか:攻撃者の視点

攻撃者がKubernetesクラスタに侵入した際、まず確認するのはkubectl auth can-i --listである。ここでpatchやcreate権限がPodやSecretに対して与えられていれば、勝負は決したも同然だ。

攻撃シナリオ:トークンの抽出と昇格

攻撃者が狙うのは、過剰な権限を持つPodからマウントされているServiceAccountのトークンだ。これを用いてAPIサーバーを叩き、より権限の強いPodを起動してホストのプロセス空間にアクセスしたり、ClusterRoleBindingを操作して自らの権限を恒久化させる。

この根本原因は、「リソース」と「アクション」を紐付けるRBACの構造が、実行時のコンテキスト(どのノードで動いているか、どのネットワーク空間にいるか)を考慮していないことにある。

—

2. 最小権限の鉄則:RoleとBindingの厳密な分離

ClusterRoleは強力だが、その影響範囲はクラスタ全体に及ぶ。namespaceを跨ぐ必要がない限り、例外なくRoleとRoleBindingを使用すべきだ。

以下は、特定のPodに対して「Podのステータス参照」のみを許可し、他のいかなる操作も拒否する最小権限の定義例である。

最小権限のRole定義
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader-role
rules:

  • apiGroups: [“”]

resources: [“pods”]
verbs: [“get”, “list”] # 最小限の動作のみ許可(deleteやpatchは排除)
—
特定のServiceAccountへのバインディング
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: production
subjects:

  • kind: ServiceAccount

name: app-runner-sa # アプリ用SA
namespace: production
roleRef:
kind: Role
name: pod-reader-role
apiGroup: rbac.authorization.k8s.io

ここで重要なのは、verbsの選定だ。listはノード上のすべてのPod情報を抽出できるため、状況によっては慎重に扱う必要がある。さらに、特定のPodリソースに対してはresourceNamesフィールドを指定し、操作可能な対象をさらに絞り込むのが「防衛の極意」だ。

—

3. 権限昇格リスクの監査と自動検知

手動の監査は限界がある。KubernetesのRBAC設定は、静的なYAML解析だけでなく、APIサーバーの監査ログ(Audit Logs)との照合が必要だ。

監査すべき3つのポイント

1. bind権限の監視: rbac.authorization.k8s.ioグループのclusterrolebindingsに対してcreateやupdateを行う権限を誰が持っているか。
2. impersonate権限の排除: usersやserviceaccountsを偽装する権限は、管理者以外には絶対に与えてはならない。
3. 匿名アクセス: system:anonymousがクラスタ内で何らかの権限を持っていないか。

これらの監査には、OPA (Open Policy Agent) や Kyverno を導入し、CI/CDパイプラインに「RBAC構成のバリデーション」を組み込むことが不可欠だ。

Kyvernoによるポリシー例:過剰権限の禁止
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-clusterrole-wildcards
spec:
validationFailureAction: Enforce
rules:

  • name: forbid-wildcard-verbs

match:
resources:
kinds: [“ClusterRole”]
validate:
message: “ClusterRoleでのワイルドカード利用は禁止されています。”
pattern:
rules:

  • verbs: [“!”] # ” を禁止する

—

4. チーフホワイトハッカーからの提言:境界の再定義

最後に、より高いレイヤの防衛について述べる。今後、耐量子暗号(PQC)の普及や、LLMによるインフラ自動化が加速するにつれ、RBACだけで防御する時代は終わる。

我々は今、「ゼロトラスト・ネットワーキング」と「RBAC」を統合するステージにいる。Pod間通信をmTLSで制御し、APIサーバーへのアクセスにはIDプロバイダ(OIDC)を介した動的な短命トークンを利用する。

「権限は付与するものではなく、必要になった瞬間に生成し、用が済めば即座に無効化するもの」。この哲学をKubernetesインフラに実装できた時、初めてあなたのクラスタは堅牢と言える。

設定ファイルの一つひとつに「なぜこの権限が必要なのか?」という問いを立てろ。その疑念こそが、サイバー攻撃を未然に防ぐ最強の盾となる。

コメント

タイトルとURLをコピーしました