説明
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 の権限と、ほかのバインディングによる許可は変わりません。