Help us understand the problem. What is going on with this article?

EKSのIAMとRBACの認証・認可を試してみる

More than 1 year has passed since last update.

Qiitaさん初投稿です。仙台でインフラエンジニアをしている@abe-maです。

インフラエンジニアなので将来的にEKSを使うようになったら
たぶんクラスタアドミン的なものが担当になるなぁと思い
そのときのために事前に認証と認可について簡単に試してみることにしました。

Kubernetesは少しだけ触ったことがありますが、EKSを触るのは今回が初めてです。

期待するところ

AWSにはIAMによる認証があるので、それがKubernetesのRBACとうまく統合されて
任意のIAMユーザ・グループ・ロールに対し、Kubernetes上でやらせたいこと・やらせたくないこと
いい感じに制御できればよいなと思いました。

試してみた結果

以降は試してみた経緯をつらつらと書いているだけなので、結論から先に。

  • 確認できたこと
    • EKSではaws-authと呼ばれるConfigmapを編集して認証・認可の設定を行う
    • IAMグループを対象にはできない
    • IAMユーザおよびロールはRoleBinding/ClusterRoleBindingでターゲットになるGroupと紐付けることが出来る
    • cluster-adminロールに紐づくsystem:mastersグループをIAMユーザに関連付けてkubectlを実行
  • わかっていないこと
    • (上記のK8s上のリソースとしての)Groupの作り方

EKSにおけるIAMユーザとK8sのRBACの関係
Untitled Diagram.png

試してみます

以下、Tutorialをもとに試した結果です。

aws-auth

EKSではaws-authと呼ばれるConfigmapでIAMユーザとRBACの紐づけを行うようです。

$ kubectl get configmap --all-namespaces
NAMESPACE     NAME                                 DATA   AGE
kube-system   aws-auth                             2      4d
kube-system   extension-apiserver-authentication   5      6d
kube-system   kube-dns                             0      6d
kube-system   kube-proxy                           1      6d

AWS EKSユーザガイドでは、任意のユーザを追加する手順について以下のように記載されています。

IAM ユーザーまたはロールを Amazon EKS クラスターに追加するには

IAM グループは対象になっていません。
つまりEKSクラスタの利用者が多数になっても一つ一つのIAMユーザをaws-authに追加していく必要があるみたいです。
(あまり大規模なクラスタを組むように設計されていない香りがします)

aws-authにIAMユーザを紐付けるさいは以下のようにmapUsersにIAMユーザのARNとGroupsを記載するようです。

apiVersion: v1
data:
  mapRoles: |
    - rolearn: arn:aws:iam::11111111111:role/xxxxxxxxx
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
  mapUsers: |
    - userarn: arn:aws:iam::11111111111:user/admin
      username: admin
      groups:
        - system:masters

リストになっているので単一のユーザが複数のgroupに所属する事はできそうですが
さて、groupsとは一体何でしょうか。以下のように説明されています。

groups: A list of groups within Kubernetes to which the role is mapped.

私はここで完全にkubernetesのRoleまたはClusterRoleを記載するものだと思っていました。
(間違いです)

Roleを指定してaws-authで認証認可を設定する(失敗)

開発者のIAMユーザに対し、開発用のNameSpaceとRoleを渡すシナリオを想定しました。
aws-authにRoleを指定して紐付けようとしました(もちろん失敗します)

NameSpaceとroleの作成

$ kubectl create namespace develop-ns
namespace/develop-ns created

yamlファイルdevelop-role.yaml作成

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: develop-ns
  name: develop-role
rules:
- apiGroups: [""]
  verbs: ["*"]
  resources: ["services", "pods", "configmaps", "endpoints", "persistentvolumeclaims", "replicasets"]
$ kubectl create -f develop-role.yaml
role.rbac.authorization.k8s.io/develop-role created

できました。

$ kubectl get role --all-namespaces
NAMESPACE     NAME                                             AGE
develop-ns    develop-role                                     2m7s
kube-public   system:controller:bootstrap-signer               6d5h
kube-system   extension-apiserver-authentication-reader        6d5h
kube-system   system::leader-locking-kube-controller-manager   6d5h
kube-system   system::leader-locking-kube-scheduler            6d5h
kube-system   system:controller:bootstrap-signer               6d5h
kube-system   system:controller:cloud-provider                 6d5h
kube-system   system:controller:token-cleaner                  6d5h

aws-authに追加する

$ kubectl edit configmap aws-auth
apiVersion: v1
data:
  mapUsers: |
    - userarn: arn:aws:iam::111111111:user/develop-user
      username: develop
      groups:
        - develop-role
kind: ConfigMap

aws cliとaws-iam-authenticatorで認証

aws-iam-authenticatorをインストール後aws cliでkube configを更新する

aws eks update-kubeconfig --name <Cluster Name> --region us-east-1
Added new context arn:aws:eks:us-east-1:114514:cluster/<Cluster Name> to /Users/xxx/.kube/config

認証・認可できたか確かめる

$ kubectl get svc -n develop-ns
Error from server (Forbidden): services is forbidden: User "develop" cannot list services in the namespace "develop-ns"

一応developユーザとして認証はできているようですが、Roleによる認可ができていないみたいです。

GroupsはほんとうにKubernetes的な意味でのGroups

ここで、KubernetesのRolebindingに指定する対象として
User/ServiceAccount/Groupの3種がありますが、
aws-authに使用するGroupとはまさにこのGroupを指していると気づきました。

Groupを扱ったことはなかったため、Groupとは何か、作成方法、一覧の取得方法など調査しましたが
いまだググっても有力な記事を見つけられておらず・・・
(まともに情報あるのServiceAccountくらいなのでは)

確認できているのはcluster-adminロールに紐付けられたsystem:mastersと呼ばれるグループだけです。

$ kubectl describe clusterrolebinding cluster-admin
Name:         cluster-admin
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind   Name            Namespace
  ----   ----            ----

system:masterをaws-authに追加

apiVersion: v1
data:
  mapRoles: |
    - rolearn: arn:aws:iam::111111111111:role/Test-EKS-Cluster-NodeInstanceRole-1IYPTP58375UR
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
  mapUsers: |
    - userarn: arn:aws:iam::111111111111:user/member.test
      username: develop
      groups:
        - system:masters

開発用ユーザでkubectlを実行

$ kubectl get svc -n develop-ns
No resources found.
$ kubectl auth can-i get svc -n develop-ns
yes

認証され、動作するようになりました。

$ kubectl auth can-i delete clusterrole
yes
$ kubectl auth can-i delete node
yes
$ kubectl auth can-i delete pv
yes

cluster-adminなのでなんでもできます。

所感

兎にも角にもsystem:mastersのようなGroupの作成方法がわからないと
任意の権限をIAMユーザに紐づけできないので
EKSのユーザガイドにはこのあたりの情報を充実させてほしいと思っています
(内容的にはK8sの領域なのかもしれませんが)。  

また詳しい方おりましたら情報お待ちしております...

以上。

abe-ma
仙台でインフラエンジニアをやっているものです。趣味はお魚料理とネトゲです
opt
"INNOVATION AGENCY" を標榜するインターネット広告代理店。エンジニア組織 "Opt Techonologies" を中心にアドテクetc...に取り組んでいます。
https://opt-technologies.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした