Chuyển đến nội dung chính

レッスン4:RBACとKubernetesセキュリティ

ロールベースアクセス制御(RBAC)、ServiceAccount、NetworkPolicy、 Pod Security StandardsとSecurityContext。Kubernetesクラスターのセキュリティ。

RBAC認可モデル — Subject、RoleBinding、Role、Rules

1. RBAC — ロールベースアクセス制御

RBACは誰(User、Group、ServiceAccount)がどのリソース(resources)に対して何(verbs)ができるかを、namespaceまたはクラスターレベルで制御します。

RBAC Flow:
Subject (Who?)    →    Role/ClusterRole (What?)    →    RoleBinding (Links)

  User "alice"          Role "pod-reader"              RoleBinding
  ServiceAccount        - get pods                     alice → pod-reader
  Group "devs"          - list pods                    (in namespace "dev")
                        - watch pods
オブジェクトスコープ使用場面
RoleNamespace1つのnamespace内の権限
ClusterRoleCluster-wideクラスター全体またはnamespaceに属さないリソース(nodes)の権限
RoleBindingNamespaceRoleまたはClusterRoleを1つのnamespace内のSubjectに紐付け
ClusterRoleBindingCluster-wideClusterRoleをクラスター全体のSubjectに紐付け

試験のポイント: RoleBindingでClusterRoleを特定のnamespaceに紐付けることができます。これはクラスター全体の権限を付与せずに権限テンプレートを再利用する方法です。試験によく出ます!

2. ServiceAccount

各PodにはServiceAccountを関連付けることができます。ServiceAccountのトークンは自動的に/var/run/secrets/kubernetes.io/serviceaccount/にマウントされます。PodはこのトークンでKubernetes APIを呼び出します。

Default ServiceAccount flow:
  Pod → ServiceAccount → RBAC Role → API Server

例: PrometheusがPodメトリクスを読み取る必要がある場合:
  ServiceAccount: prometheus-sa
  ClusterRole: pod-metrics-reader (verbs: get, list, watch)
  ClusterRoleBinding: prometheus-sa → pod-metrics-reader

3. NetworkPolicy

デフォルトでは、クラスター内のすべてのPodが相互通信可能です。NetworkPolicyはPodセレクター、namespaceセレクター、またはIPブロックに基づいてingress/egressトラフィックを制限します。

❌ Default (no NetworkPolicy): All pods talk to all pods
✅ With NetworkPolicy:
   frontend → backend (allowed)
   frontend → database (BLOCKED)
   backend → database (allowed)

試験のポイント: NetworkPolicyはCNIプラグインがサポートしている場合のみ有効です(Calico、Cilium、Weave)。FlannelはNetworkPolicyをサポートしません。ポリシーがなければ→全許可。1つでもポリシーがあれば→選択されたトラフィックはデフォルト拒否。

4. Pod Security Standards

Kubernetesは3つのPod Security Standardsを定義しています(v1.25からPodSecurityPolicyを置き換え):

プロファイル制限レベル用途
Privileged制限なしシステム/インフラワークロード(kube-system)
Baseline明らかな権限エスカレーションを防止一般的なワークロード
Restricted最大限のハードニング準拠セキュリティ重視のアプリ

5. SecurityContext

SecurityContextはPodまたはコンテナレベルでセキュリティを構成します:

セキュリティ設定意味
runAsNonRoot: trueコンテナはUID 0で実行不可
runAsUser: 1000UID 1000でコンテナを実行
readOnlyRootFilesystem: trueファイルシステムは読み取り専用(書き込みはvolumeを使用)
allowPrivilegeEscalation: falseプロセスの権限エスカレーションを禁止
capabilities.drop: ["ALL"]すべてのLinux capabilitiesを削除

6. チートシート

試験の質問回答
PodがK8s APIを呼び出す必要がある場合は?ServiceAccount
1つのnamespace内でユーザー権限を制限するには?Role + RoleBinding
Pod間のネットワークトラフィックを制限するには?NetworkPolicy
NetworkPolicyが機能するために何が必要?サポートするCNIプラグイン(Calico、Cilium)
Privileged → Restricted、Pod Securityには?Pod Security Admission

7. 練習問題

Q1: アプリケーションPodが自身のnamespace内のPodをリストするためにKubernetes APIにアクセスする必要があります。クラスター管理者は何を作成すべきですか?

  • A) すべてのnamespace用のClusterRoleとClusterRoleBinding
  • B) ServiceAccountとRole(list pods)とRoleBinding ✓
  • C) APIサーバー用のLoadBalancerタイプのService
  • D) APIサーバーの認証情報を含むConfigMap

解説:PodにはServiceAccount、そのnamespace内で「list pods」を許可するRole、およびそれらを紐付けるRoleBindingが必要です。ClusterRoleを使用するとすべてのnamespaceにアクセス権を過剰に付与することになります。

Q2: NetworkPolicyがPodに適用されています。どのルールにも明示的に一致しないトラフィックのデフォルトの動作は何ですか?

  • A) すべてのトラフィックが許可される(デフォルト許可)
  • B) トラフィックはログに記録されるがブロックされない
  • C) Podセレクターに一致するトラフィックは拒否され、その他のトラフィックは通過する ✓
  • D) Podとの間のすべてのトラフィックが拒否される

解説:NetworkPolicyがPodを選択すると(podSelector経由)、そのポリシータイプ(ingress/egress)で明示的に許可されていないすべてのトラフィックは拒否されます。選択されていないPodは影響を受けず、完全な接続性を維持します。

Q3: ホストへの特権アクセスを必要とするシステムレベルコンポーネントには、どのPod Security Standardsプロファイルを使用すべきですか?

  • A) Restricted
  • B) Baseline
  • C) Privileged ✓
  • D) SystemAdmin

解説:PrivilegedプロファイルはPodに制限を設けず、すべてのcapabilitiesを許可します。システム/インフラコンポーネント向けです。Baselineは既知の権限エスカレーションを防止し、Restrictedは最大限のハードニングを適用します。