はじめに
Amazon EKSでRBACを利用したdeveloper
の認可設定をする方法をまとめます。
IAMグループに所属するIAMユーザーに、EKSクラスターの任意のNamespaceへのアクセス許可を付与します。
Mac環境を想定しています。
admin
に関してはEKSでRBACを利用したadminの認証・認可を設定をするを参考にしてください。
実行環境の準備
-
AWS CLIの設定
AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。 -
EKSクラスタの構築
Macでeksctlを利用してAmazon EKSのクラスターを構築するを参考にしてください。 -
EKSのコンテキストの設定
MacにてAmazon EKSの設定をするを参考にしてください。
IAMロールの作成
-
IAMロールを作成する
※このIAMロールはEKSへのアクセス許可に利用します。
※今回はロール名をakane-dev-eks-developer-role
にしています。export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) DEV_ASSUME_ROLE_POLICY=$(echo -n '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::'; echo -n "${ACCOUNT_ID}"; echo -n ':root" } } ] }') aws iam create-role \ --role-name akane-dev-eks-developer-role \ --assume-role-policy-document "${DEV_ASSUME_ROLE_POLICY}"
-
IAMロール用のポリシーを作成する
※このIAMポリシーはKESのコンテキスト設定時にAWS CLIでaws eks update-kubeconfig
が利用できるようにします。
※今回はポリシー名をakane-dev-eks-developer-role-policy
にしています。export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) DEV_ROLE_POLICY=$(echo -n '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "eks:DescribeCluster", "Resource": "arn:aws:eks:*:'; echo -n "${ACCOUNT_ID}"; echo -n ':cluster/*" } ] }') aws iam create-policy \ --policy-name akane-dev-eks-developer-role-policy \ --policy-document "${DEV_ROLE_POLICY}"
-
IAMロール用のポリシーをIAMロールにアタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam attach-role-policy \ --role-name akane-dev-eks-developer-role \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-role-policy
IAMグループの作成
-
IAMグループを作成する
※今回はロール名をakane-dev-eks-developer-group
にしています。aws iam create-group --group-name akane-dev-eks-developer-group
-
IAMグループ用のポリシーを作成する
※今回はポリシー名をakane-dev-eks-developer-group-policy
にしています。
※このポリシーが先ほど作成したIAMロールを委任(AssumeRole)します。export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) DEV_GROUP_POLICY=$(echo -n '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::'; echo -n "${ACCOUNT_ID}"; echo -n ':role/akane-dev-eks-developer-role" } ] }') aws iam create-policy \ --policy-name akane-dev-eks-developer-group-policy \ --policy-document "${DEV_GROUP_POLICY}"
-
IAMグループ用のポリシーをIAMグループにアタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam attach-group-policy \ --group-name akane-dev-eks-developer-group \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-group-policy
環境設定
※事前にKubernetesクラスターのコンテキストの設定をします。
-
akane-namespace.yaml
を作成するakane-namespace.yamlapiVersion: v1 kind: Namespace metadata: name: akane
-
akane-developer-role.yaml
を作成するakane-developer-role.yamlkind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-akane-developer-role namespace: akane rules: - apiGroups: - "" - "apps" - "batch" - "extensions" resources: - "configmaps" - "cronjobs" - "deployments" - "events" - "ingresses" - "jobs" - "pods" - "pods/attach" - "pods/exec" - "pods/log" - "pods/portforward" - "secrets" - "services" verbs: - "create" - "delete" - "describe" - "get" - "list" - "patch" - "update"
-
akane-role-developer-binding.yaml
を作成するakane-role-developer-binding.yamlkind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-akane-developer-role-binding namespace: akane subjects: - kind: User name: dev-akane-developer-user roleRef: kind: Role name: dev-akane-developer-role apiGroup: rbac.authorization.k8s.io
-
クラスターに適用する
kubectl apply -f akane-namespace.yaml kubectl apply -f akane-developer-role.yaml kubectl apply -f akane-developer-role-binding.yaml
-
aws-auth ConfigMap を更新して、IAM ロールを許可する
※クラスター名を設定します。export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) eksctl create iamidentitymapping \ --cluster ${クラスター名} \ --arn arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-developer-role \ --username dev-akane-developer-user
-
クラスターで管理されているすべての ID のリストを取得する
eksctl get iamidentitymapping --cluster ${クラスター名}
IAMユーザーの作成
-
IAMユーザーを作成する
※今回はユーザー名をeks-akane-developer
にしています。aws iam create-user --user-name eks-akane-developer
-
IAMユーザーをIAMグループにアタッチする
aws iam add-user-to-group \ --user-name eks-akane-developer \ --group-name akane-dev-eks-developer-group
-
IAMユーザーのアクセスキーを作成する
aws iam create-access-key --user-name eks-akane-developer | tee /tmp/eks-akane-developer.json
AWS CLIのAssumeロールの設定
-
~/.aws/config
の設定export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) mkdir -p ~/.aws cat << EoF >> ~/.aws/config [profile eks-akane-developer] role_arn=arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-developer-role source_profile=eks-akane-developer EoF
-
~/.aws/credentials
の設定
※アクセスキー
とシークレットキー
を設定する。
※AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。cat << EoF >> ~/.aws/credentials [eks-akane-developer] aws_access_key_id=$(jq -r .AccessKey.AccessKeyId /tmp/eks-akane-developer.json) aws_secret_access_key=$(jq -r .AccessKey.SecretAccessKey /tmp/eks-akane-developer.json) EoF
-
Credentialsを切り替える
export AWS_PROFILE=eks-akane-developer
-
Credentialsの切り替えを確認する
※Arnにassumed-role
と記載される。aws sts get-caller-identity
-
コンテキストを切り替える
※クラスター名を設定します。aws eks update-kubeconfig --region ap-northeast-1 --name ${クラスタ名}
developerの権限確認
-
Namespace
akane
の認可確認
※yes
と表示される。kubectl auth can-i create deploy -n akane kubectl auth can-i delete deploy -n akane
-
Namespace
default
の認可確認
※no
と表示される。kubectl auth can-i create deploy kubectl auth can-i delete deploy
クリーンアップ
-
Credentialsを切り替える
※プロファイル名
を設定する。export AWS_PROFILE=${プロファイル名}
-
aws-auth ConfigMap から削除する
※クラスター名を設定します。export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) eksctl delete iamidentitymapping \ --cluster ${クラスター名} \ --arn arn:aws:iam::${ACCOUNT_ID}:role/akane-dev-eks-developer-role
-
クラスターから削除する
kubectl delete -f akane-developer-role-binding.yaml kubectl delete -f akane-developer-role.yaml kubectl delete -f akane-namespace.yaml
-
IAMユーザーをIAMグループからデタッチする
aws iam remove-user-from-group \ --user-name eks-akane-developer \ --group-name akane-dev-eks-developer-group
-
IAMユーザーのアクセスキーを削除する
aws iam delete-access-key \ --user-name eks-akane-developer \ --access-key-id "$(jq -r .AccessKey.AccessKeyId /tmp/eks-akane-developer.json)"
-
IAMユーザーのアクセスキーのファイルを削除する
rm -f /tmp/eks-akane-developer.json
-
IAMユーザーを削除する
aws iam delete-user --user-name eks-akane-developer
-
IAMグループ用のポリシーをIAMグループからデタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam detach-group-policy \ --group-name akane-dev-eks-developer-group \ --policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-group-policy"
-
IAMグループ用のポリシーを削除する
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam delete-policy \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-group-policy
-
IAMグループを削除する
※今回はロール名をakane-dev-eks-developer-group
にしています。aws iam delete-group --group-name akane-dev-eks-developer-group
-
IAMロール用のポリシーをIAMロールからデタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam detach-role-policy \ --role-name akane-dev-eks-developer-role \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-role-policy
-
IAMロール用のポリシーを削除する
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam delete-policy \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-eks-developer-role-policy
-
IAMロールを削除する
aws iam delete-role \ --role-name akane-dev-eks-developer-role
参考
WHAT IS RBAC?
Using RBAC Authorization
クラスターへの IAM ユーザーおよびロールアクセスを有効にする
Manage IAM users and roles
Identity and Access Management