はじめに

Kubernetes では、認可を通常 RBAC(Role-Based Access Control)で管理します。

  • ユーザー:従業員(例:Jane)。
  • Role:特定のアクセス権を持つ キーカード(例:「サーバールームに入れる」「ドキュメントを読める」)。
  • RoleBinding:従業員に キーカードを渡す 操作。

RBAC が重要なのは、クラスターへのアクセスが認証だけで決まるわけではないためです。ユーザーの身元が確認された後も、そのユーザーが実行できる操作をシステムが判断する必要があります。

この実験では、セキュリティ責任者として次の作業を行います。

  • 物を見ることはできても、変更はできない「ビジターパス」(Role)を作成します。
  • このパスを jane というユーザーに割り当てます。
  • Jane がクラスター内を確認できる一方、変更しようとすると拒否されることを検証します。

Role を定義する

まず、権限のセットを作成します。ここでは「読み取り専用」の Role を作成します。この Role では、Pod を list および get(読み取り)できますが、Pod の create や delete はできません。

RBAC は Kubernetes の認可の仕組みであり、認証の仕組みではありません。認証は「あなたは誰ですか?」という問いに答えます。認可は「あなたに何が許可されていますか?」という問いに答えます。この実験では、特定のリソースタイプに対して許可する操作を verb として明示的に定義し、2 番目の問いに取り組みます。

role.yaml という名前のファイルを作成します。

nano role.yaml

次の YAML を貼り付けます。この定義により、pods に対して get、watch、list 操作を実行できる Role が作成されます。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
  - apiGroups: [""] ## "" indicates the core API group
    resources: ["pods"]
    verbs: ["get", "watch", "list"]

Ctrl+X、Y、Enter の順に押して保存し、終了します。

次に、このキーカードをクラスターに反映(「apply」)します。

kubectl apply -f role.yaml

Role が存在することを確認します。

kubectl get roles

出力に pod-reader が表示されます。

Role をバインドする

これで、キーカード(pod-reader)と従業員(jane)が用意できました。しかし、Jane にはまだキーカードが渡されていません。両者を関連付けるために RoleBinding が必要です。

Role は、バインドによって参照されるまで、単独では何の権限も付与しません。この分離は意図的なものです。管理者は、再利用可能な権限のまとまりを一度定義し、それを必要に応じて異なるユーザー、グループ、サービスアカウントに割り当てられます。

rolebinding.yaml という名前のファイルを作成します。

nano rolebinding.yaml

次の内容を貼り付けます。これは「pod-reader Role をユーザー jane にバインドする」という意味です。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
  - kind: User
    name: jane ## The employee
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader ## The key card
  apiGroup: rbac.authorization.k8s.io

Ctrl+X、Y、Enter の順に押して保存し、終了します。

バインドを適用します。

kubectl apply -f rolebinding.yaml

これで、Jane に default Namespace の読み取り専用アクセスを正式に付与できました。

アクセスを確認する

どのようにテストすればよいでしょうか。Jane としてログアウトしてログインし直す必要はありません。Kubernetes では、--as フラグを使ってユーザーを「なりすまし」、権限をテストできます。

これは実用的な管理手法です。実際のユーザーや自動化用アカウントにアクセス権を渡す前に、ユーザーをシミュレートして権限を確認すれば、より安全に権限を検証できます。クラスターに不要な副作用を発生させずに、意図した設定になっているかを確認できます。

まず、Jane が Pod を一覧表示できることを確認します。

kubectl auth can-i list pods --as jane

出力は yes になります。

特定の Pod の詳細を取得できるかどうかも確認できます。

kubectl auth can-i get pods --as jane

この出力も yes になります。

これで、RoleBinding が正しく機能していることを確認できました。キーカードがドアの読み取り機で機能しています。

制限を確認する

セキュリティでは、できないこと も重要です。Jane に付与されているのは pod-reader Role だけなので、変更操作は厳密に禁止されているはずです。

これは、最小権限 の原則を実践したものです。広範なアクセス権を付与してユーザーが慎重に操作することを期待するのではなく、タスクに必要な最小限の権限から始め、実際に運用上の必要性が生じた場合だけ権限を追加します。

Jane が Pod を作成できるか確認します。

kubectl auth can-i create pods --as jane

出力は no になります。

Jane が Pod を削除できるか確認します。

kubectl auth can-i delete pods --as jane

出力は no になります。

Jane が実際にこれらのコマンドを実行しようとすると、API サーバーは「Forbidden」エラーを返してリクエストを拒否します。これにより、クラスターが保護され、最小権限 の原則に従っていることを確認できます。

まとめ

この実験では、RBAC を使用してクラスターを保護しました。

次の作業を完了しました。

  1. 限定された読み取り専用権限を持つ Role(「キーカード」)を作成しました。
  2. RoleBinding を作成し、そのキーカードをユーザー jane に渡しました。
  3. jane が確認はできるものの、変更はできないことを検証しました。

これは、Kubernetes におけるマルチユーザーセキュリティの基礎です。全員に完全な管理者アクセスを決して与えないでください。