32
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kubernetes3Advent Calendar 2018

Day 13

EKSでIAMユーザをアクセスコントロール (RBAC)

Posted at

Kubernetes3 Advent Calendar 2018 に空きがあったのでぶっこんでみました。

EKSでIAMユーザ or ロールによるRBACについて、AWSのドキュメントでは分かりにくかったので、まとめときます。

概要

EKSでは、IAMユーザー、もしくはIAMロールにRBACによる制限を適用できます。(IAMグループにはできないっぽい)
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html

ここにあるとおり、aws-authというConfigMap を編集して、IAMユーザorロールをgroupsに紐付けるという手順で行うようです。
この groups については、上のドキュメントでは system:masterしか書かれていないので分かりにくいですが、k8sの方でロールを紐づけたgroupsを作成するようです。

上のドキュメントにもある、管理者に適用されるsystem:masterというgroupsはk8sの中で、cluster-admin に紐付けるられているようです。

$ kubectl describe clusterrolebinding cluster-admin                                                           [14:52:54]
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
  ----   ----            ---------
  Group  system:masters

要はIAMのポリシーではなく、k8sのロールで管理すると。

手順

EKSクラスタ、kubectl、aws-cli、aws-iam-authenticatorとかのセットアップはできてることを前提としています。

管理者側設定

IAMユーザをつくる

まず、制限を適用したいIAMユーザをつくります。(割愛)

IAMユーザにポリシーを適用

aws eks update-kubeconfigが実行できればいいみたいです。
とりあえず最低限これでいけそうです。

policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "eks:UpdateClusterVersion",
                "eks:DescribeCluster",
                "eks:ListClusters"
            ],
            "Resource": "*"
        }
    ]
}

これのポリシーをつくってユーザに適用します。

IAMユーザのキーを発行

このへんも割愛。

k8s RBAC設定

stg というnamespece上のPodの確認だけできる stg-user-group という名前のグループを作る場合はこんな感じになります。

stg-user-group.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: stg
  name: stg-user-role
rules:
- apiGroups: [""]
  verbs: ["get", "list"]
  resources: ["pods"]

---

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: stg-user-group
  namespace: stg
subjects:
- kind: Group
  name: stg-user-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: stg-user-role

これを適用します。

$ kubectl apply -f stg-user-group.yaml

configmap/aws-authの編集

kubectl editconfigmap/aws-authを編集します。

$EDITOR=vim kubectl edit -n kube-system configmap/aws-auth

IAMロールにグループを紐付けるときは、

  mapRoles: |
    - rolearn: arn:aws:iam::xxxxxxxxxxx:role/admin
      username: admin
      groups:
        - グループ名

IAMユーザにグループを紐付けるときは、

  mapUsers: |
    - rolearn: arn:aws:iam::xxxxxxxxxxx:role/user
      username: user
      groups:
        - グループ名

のように追記します。

自分の環境ではこんな感じです。
adminというIAMロールに管理者権限のsystem:mastersを割り当て、develop-userというIAMユーザに制限を適用したstg-user-groupを割り当てています。

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::xxxxxxxxxxx:role/testcluster-nodegroup-0-NodeInstanceRole-xxxxxxxxxxx
      username: system:node:{{EC2PrivateDNSName}}
    - rolearn: arn:aws:iam::xxxxxxxxxxx:role/admin
      username: admin
      groups:
        - system:masters
  mapUsers: |
    - userarn: arn:aws:iam::xxxxxxxxxxx:user/develop-user
      username: develop
      groups:
        - stg-user-group
kind: ConfigMap
metadata:
  creationTimestamp: 2018-12-21T02:52:20Z
  name: aws-auth
  namespace: kube-system
  resourceVersion: "613101"
  selfLink: /api/v1/namespaces/kube-system/configmaps/aws-auth
  uid: 6f79ec33-04cb-11e9-9c8e-xxxxxxxxxxx

制限ユーザのセットアップ

発行したIAMキーをセットアップ

キーですが、EKSでkubectl使うときは$AWS_ACCESS_KEY_IDとかの変数ではうまく動かないかもしれないので、 ~/.aws/credentialsで指定したほうがよさそうです。
https://stackoverflow.com/questions/53266960/how-do-you-get-kubectl-to-log-in-to-an-aws-eks-cluster

$ aws configure

kubeconfigを取得

$ aws eks update-kubeconfig --name (クラスタ名) --region ap-northeast-1

動作確認

namespece stgではPODの情報が見れます。

$ kubectl get pod -n stg
NAME                     READY     STATUS    RESTARTS   AGE
nginx-64f497f8fd-d5ltm   1/1       Running   0          10s

stg以外のnamespaceでは失敗します。

$ kubectl get pod -n prod
Error from server (Forbidden): pods is forbidden: User "develop" cannot list pods in the namespace "prod"

stgでもcreateは失敗します。

$ kubectl apply -f test-pod.yaml -n stg
Error from server (Forbidden): error when creating "test-pod.yaml": pods is forbidden: User "develop" cannot create pods in the namespace "stg"

まとめ

EKSでのRBACによる制限のポリシーはIAMポリシーではなく、k8sのロールで管理します。
そのうちEKSのドキュメントにちゃんと書かれるのではないかと・・・

32
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?