Closed8

kube-api-server authorization(RBAC)

ishii1648ishii1648

EKS だと Node,RBAC,Webhook が渡されてる。認証モードは EKS API と ConfigMap を設定(多分 EKS API Only でも同じ設定な気がする。ConfigMap Only があった時代は RBAC だけでも良かったはず)(Node はなんであるのか不明)

❯ aws logs get-log-events --log-group-name /aws/eks/test-cluster/cluster --log-stream-name $LOG_STREAM_NAME | jq -r '.events[].message' | grep authorization-mode
I0105 16:43:02.944275      11 flags.go:64] FLAG: --authorization-mode="[Node,RBAC,Webhook]"

https://kubernetes.io/docs/reference/access-authn-authz/authorization/#authorization-modules

ishii1648ishii1648

例えば EKS で以下のような ConfigMap を設定している場合どのように処理されるのか?

❯ k get cm aws-auth -n kube-system -oyaml
apiVersion: v1
data:
  mapRoles: |
    []
  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::1111111111:user/ishii
      username: ishii
kind: ConfigMap
ishii1648ishii1648

ここでユーザ情報を渡してルールマッチするか評価している
https://github.com/kubernetes/kubernetes/blob/70d3cc986aa8221cd1dfb1121852688902d3bf53/plugin/pkg/auth/authorizer/rbac/rbac.go#L75-L78

ユーザ情報の interface はこんな感じ(getUser() という名前だが group 等も含まれている)

今回の例だと GetName() で ishii が GetGroups() で ["system:masters"] が返ってくるはず

ishii1648ishii1648

ClusterRolebindings(or RoleBindings)を for 文で回して、リクエストから渡ってきたユーザ情報(aws-auth を使っている場合は case rbacv1.GroupKind: に合致)が ClusterRolebinding の subjects.name と一致しているかをチェックしている
https://github.com/kubernetes/kubernetes/blob/70d3cc986aa8221cd1dfb1121852688902d3bf53/pkg/registry/rbac/validation/rule.go#L281-L304

今回の例だと以下にマッチする

❯ k get clusterrolebindings.rbac.authorization.k8s.io cluster-admin -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "134"
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:masters
このスクラップは6ヶ月前にクローズされました