デフォルトの ServiceAccount を対象にする RoleBinding

デフォルトの ServiceAccount にロールを関連付けると、意図しないワークロードにも同じ権限が渡るおそれがあります。

説明

ServiceAccount を明示していない Pod には、その名前空間のデフォルトの ServiceAccount が割り当てられます。このアカウントに RoleBinding や ClusterRoleBinding を関連付けると、権限を必要としない複数のワークロードまで利用できるようになるおそれがあります。

ワークロードごとに専用の ServiceAccount を用意し、必要な権限だけを付与してください。デフォルトの ServiceAccount は最小権限とし、不要なアプリケーション権限を追加しないでください。

想定される影響

  • 複数の Pod が意図せず同じ権限を共有する可能性があります。
  • 新しい Pod もデフォルトの ServiceAccount を通じてアクセス権を得る場合があります。
  • 主体を共有すると、権限を悪用したワークロードの特定が難しくなることがあります。

対処方法

  • デフォルトの ServiceAccount に不要な RoleBinding を関連付けないでください。
  • アプリケーション専用の ServiceAccount を作り、必要な権限だけを付与してください。
  • subjects.kind: ServiceAccount かつ subjects.name: default の対象と、その名前空間を確認してください。

例

default 名前空間に pod-reader Role が存在する前提の例です。ServiceAccount の対象は kube-system 名前空間の default アカウントなので、バインディングの名前空間と区別してください。

変更前

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
  - kind: User
    name: jane
    apiGroup: rbac.authorization.k8s.io
  - kind: ServiceAccount
    name: default
    namespace: kube-system
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

変更後

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

説明:

  • 変更前: kube-system のデフォルト ServiceAccount に default 名前空間のロールを付与するため、このアカウントを使うワークロードが権限を共有できます。
  • 変更後: このバインディングからデフォルト ServiceAccount を削除します。jane の権限と、ほかのバインディングによる許可は変わりません。

参考資料