メインコンテンツまでスキップ

Kubernetes RBACとの統合

前述したように、クラスターアクセス管理コントロールおよび関連APIは、Amazon EKSの既存のRBACオーソライザーを置き換えるものではありません。代わりに、Amazon EKSアクセスエントリはRBACオーソライザーと組み合わせて使用することで、AWS IAMプリンシパルにクラスターアクセスを付与しながら、Kubernetes RBACに依存して目的の権限を適用することができます。

この実習のセクションでは、Kubernetesグループを使用して詳細な権限を持つアクセスエントリを設定する方法を示します。これは、事前定義されたアクセスポリシーが過度に許容的である場合に役立ちます。実習の設定の一部として、eks-workshop-carts-teamというIAMロールを作成しました。このシナリオでは、cartsサービスのみを扱うチームに、carts名前空間内のすべてのリソースを表示する権限と、ポッドを削除する権限を提供する方法を示します。

まず、必要な権限をモデル化するKubernetesオブジェクトを作成しましょう。このRoleは、上記で概説した権限を提供します:

~/environment/eks-workshop/modules/security/cam/rbac/role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: carts
name: carts-team-role
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["delete"]
A

Role権限をcarts名前空間にのみ制限します

B

このルールは読み取り専用操作 verbs: ["get", "list", "watch"] をすべてのリソース resources: ["*"] に許可します

C

このルールは削除操作 verbs: ["delete"] をポッドのみ resources: ["pods"] に対して許可します

そしてこのRoleBindingは、Roleをcarts-teamという名前のグループにマッピングします:

~/environment/eks-workshop/modules/security/cam/rbac/rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: carts-team-role-binding
namespace: carts
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: carts-team-role
subjects:
- kind: Group
name: carts-team
apiGroup: rbac.authorization.k8s.io
A

roleRefは先ほど作成したcarts-team-role Roleを参照します

B

subjectsは、carts-teamという名前のグループがRoleに関連付けられた権限を取得することを指定します

これらのマニフェストを適用しましょう:

~$kubectl --context default apply -k ~/environment/eks-workshop/modules/security/cam/rbac

次に、カートチームのIAMロールをcarts-team Kubernetes RBACグループにマッピングするアクセスエントリを作成します:

~$aws eks create-access-entry --cluster-name $EKS_CLUSTER_NAME \
--principal-arn $CARTS_TEAM_IAM_ROLE \
--kubernetes-groups carts-team

これで、このロールが持つアクセス権をテストできます。カートチームのIAMロールを使用してコンテキストcarts-teamでクラスターに認証する新しいkubeconfigエントリをセットアップしましょう:

~$aws eks update-kubeconfig --name $EKS_CLUSTER_NAME \
--role-arn $CARTS_TEAM_IAM_ROLE --alias carts-team --user-alias carts-team

それでは、カートチームのIAMロールを使用して--context carts-teamを指定し、carts名前空間内のポッドにアクセスしてみましょう:

~$kubectl --context carts-team get pod -n carts
NAME                            READY   STATUS    RESTARTS   AGE
carts-6d4478747c-hp7x8          1/1     Running   0          3m27s
carts-dynamodb-d9f9f48b-k5v99   1/1     Running   0          15d

また、名前空間内のポッドを削除することもできるはずです:

~$kubectl --context carts-team delete pod --all -n carts
pod "carts-6d4478747c-hp7x8" deleted
pod "carts-dynamodb-d9f9f48b-k5v99" deleted

しかし、Deploymentのような他のリソースを削除しようとすると、禁止されます:

~$kubectl --context carts-team delete deployment --all -n carts
Error from server (Forbidden): deployments.apps is forbidden: User "arn:aws:sts::1234567890:assumed-role/eks-workshop-carts-team/EKSGetTokenAuth" cannot list resource "deployments" in API group "apps" in the namespace "carts"

また、別の名前空間のポッドにアクセスしようとしても、禁止されます:

~$kubectl --context carts-team get pod -n catalog
Error from server (Forbidden): pods is forbidden: User "arn:aws:sts::1234567890:assumed-role/eks-workshop-carts-team/EKSGetTokenAuth" cannot list resource "pods" in API group "" in the namespace "catalog"

これにより、Kubernetes RBACグループをアクセスエントリに関連付けて、IAMロールにEKSクラスターへの細かな権限を提供する方法を示しました。