Posted at

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

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を編集します。

bash:

$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のドキュメントにちゃんと書かれるのではないかと・・・