📘

aws-auth と Access Entry の違いまとめ

2025/01/04に公開

EKS には2025年現在 aws-auth ConfigMap と Access Entry 2つの認証方式があります。aws-auth ConfigMap は廃止がアナウンスされており、各社で Access Entry への移行が進められています。それぞれの特徴についてまとめました。

TL;DR

  • aws-auth
    • ConfigMap を設定して IAM/RBAC を紐づけ
  • Access Entry
    • EKS API で設定が完結
    • Access Policy という抽象化層
    • IAM と Access Policy を紐づけ

aws-auth

以下のような ConfigMap を設定することで AWS IAM と k8s RBAC を紐づける仕組みです。

apiVersion: v1
data:
  mapRoles: |
    []
  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::11111111:user/hoge
      username: hoge
kind: ConfigMap

AWS IAM でログインするだけでシームレスに k8s API を実行できる点と、権限も柔軟に設定することができるのが特徴になります。上記の設定例では system:masters (何でも出来る権限)を割り当てていますが、より権限を狭めた別の Grop を割り当てることもできます。

AWS と k8s のユーザを個別に管理しなくてすむのは便利な一方、単一の ConfigMap ですべての IAM/RBAC の紐づけを管理しているため、ユーザを追加しようとして設定をミスると権限管理全体が壊れて EKS クラスタへアクセスできなる可能性があります。

k8s の権限設定をするために k8s API を実行する必要があるという、鶏卵問題のような状況を解決しつつ、より使いやすいインターフェースを提供しているのが後述する Access Entry になります。

Access Entry

k8s の認証・認可設定を EKS API で完結する仕組みです。

以下で aws-auth の時に出した例と同じ設定内容になります。

$ aws eks create-access-entry \
      --cluster-name test-cluster \
      --principal-arn arn:aws:iam::11111111:user/hoge
$ aws eks associate-access-policy \
      --cluster-name test-cluster \
      --principal-arn arn:aws:iam::11111111:user/hoge \
      --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy
      --access-scope type=cluster

access-policy がポイントです。access-policy とは AWS が用意した k8s の権限セットで IAM と紐づけることができます(IAM ポリシーと似ていますが IAM の権限は含まれていません)。これによって RBAC を一切触らずに k8s の権限設定を行うことが出来るようになっています。

どの access-policy が何の k8s 権限を持っているかは公式ドキュメントでまとめられています。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/access-policies.html#access-policy-permissions

ちなみに access-policy ではカバーしきれない細かな権限設定もできるようになっており、以下のように k8s group を IAM に直接紐づけることもできます(つまり access-policy と k8s group を併用できます)。

$ aws eks create-access-entry \
    --cluster-name test-cluster \
    --principal-arn arn:aws:iam::11111111:user/hoge
    --kubernetes-group hoge

まとめ

aws-auth、Access Entry の何れも「IAM 認証したユーザ(またはロール)で k8s API を実行できるようにする」という点は同じです。

異なる点は認証ユーザに対してどのように権限を付与するかという認可の方法です。aws-auth は RBAC を使って IAM と k8s API を紐づけているのに対し、Access Entry では access-policy を使うことで AWS の世界のみで認可までを完結しているのが違いになります。これが Access Entry の特徴だと言えます。

補足

aws-auth と Access Entry は併用して利用することができます。

この場合、どちらで認証しているかを確認したくなるケースがあると思いますが、監査ログから確認できます。

以下 CloudWatch Logs Insights を使った確認例です。

fields @timestamp, userAgent, requestMethod, @message
| filter userAgent like "kubectl"
| sort @timestamp desc

aws-auth の場合

"annotations": {
  "authorization.k8s.io/decision": "allow",
  "authorization.k8s.io/reason": ""
}

Access Entry の場合

"annotations": {
  "authorization.k8s.io/decision": "allow",
  "authorization.k8s.io/reason": "EKS Access Policy: allowed by ClusterRoleBinding \"arn:aws:iam::11111111:user/hoge+arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy\" of ClusterRole \"arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy\" to User \"XXXXXXXXXXXXXX\""
}

参考記事

Discussion