説明
impersonate 権限により、許可されたユーザー、グループ、サービスアカウントとしてリクエストを送れます。対象の主体が強い権限を持つ場合、元の権限を超える操作が可能になります。
この権限はアクセス制御と監査の解釈の両方に影響します。本番環境では厳しく制限してください。
想定される影響
- 別のユーザーやサービスアカウントの権限でリクエストを実行できます。
- 権限昇格につながる可能性があり、監査では元の要求者と代理した主体の両方を確認する必要があります。
- 侵害されたアカウントが短時間で強い権限を得るおそれがあります。
対処方法
- 一般のアカウントには
impersonateを付与しないでください。 - 必要な管理者だけに許可し、
resourceNamesなどで代理できる主体を限定してください。 - 監査ログで impersonation のリクエストを監視してください。
例
ロールを付与するバインディングは省略しています。変更後は実在する API リソースである ServiceAccount の読み取りだけを残します。一般のユーザーやグループは、取得できる Kubernetes API オブジェクトではありません。
変更前
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: impersonator-role
rules:
- apiGroups: [""]
resources: ["users", "groups", "serviceaccounts"]
verbs: ["impersonate"]
変更後
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: impersonator-role-neg
rules:
- apiGroups: [""]
resources: ["serviceaccounts"]
verbs: ["get"]
説明:
- 変更前:
impersonateにより別の主体として操作できるため、権限昇格のリスクがあります。 - 変更後: このロールでは impersonation を許可せず、ServiceAccount の読み取りだけを許可します。ほかのロールの impersonate 権限も確認してください。