アクセスポリシーの関連付け
STANDARDタイプのアクセスエントリに対して、1つまたは複数のアクセスポリシーを割り当てることができます。Amazon EKSは、他のタイプのアクセスエントリに対して、クラスター内で正常に機能するために必要な権限を自動的に付与します。Amazon EKSアクセスポリシーには、IAM権限ではなく、Kubernetes権限が含まれています。アクセスポリシーをアクセスエントリに関連付ける前に、各アクセスポリシーに含まれるKubernetes権限を十分に理解しておいてください。
ラボセットアップの一環として、eks-workshop-read-onlyという名前のIAMロールを作成しました。このセクションでは、読み取り専用アクセスのみを許可する権限セットを持つEKSクラスターへのアクセスをこのロールに提供します。
まず、このIAMロールのアクセスエントリを作成しましょう:
次に、AmazonEKSViewPolicyポリシーを使用してこのプリンシパルのアクセスポリシーを関連付けることができます:
--access-scopeの値にtype=clusterを使用していることに注目してください。これにより、プリンシパルはクラスター全体に対する読み取り専用アクセスが与えられます。
次に、このロールが持つアクセス権をテストできます。まず、読み取り専用IAMロールを使用してクラスターで認証する新しいkubeconfigエントリを設定します。これはreadonlyという名前の別のkubectlコンテキストにマッピングされます。この仕組みについては、Kubernetesドキュメントで詳細を確認できます。
これで引数--context readonlyを使ってkubectlコマンドを実行し、読み取り専用IAMロールで認証できます。kubectl auth whoamiを使用してこれを確認し、正しいロールを偽装していることを確認しましょう:
ATTRIBUTE VALUE
Username arn:aws:sts::1234567890:assumed-role/eks-workshop-read-only/EKSGetTokenAuth
UID aws-iam-authenticator:1234567890:AKIAIOSFODNN7EXAMPLE
Groups [system:authenticated]
Extra: accessKeyId [AKIAIOSFODNN7EXAMPLE]
Extra: arn [arn:aws:sts::1234567890:assumed-role/eks-workshop-read-only/EKSGetTokenAuth]
Extra: canonicalArn [arn:aws:iam::1234567890:role/eks-workshop-read-only]
Extra: principalId [AKIAIOSFODNN7EXAMPLE]
Extra: sessionName [EKSGetTokenAuth]
次に、このIAMロールを使用してクラスター内のポッドにアクセスしてみましょう:
これによりクラスター内のすべてのポッドが返されるはずです。ただし、読み取り以外のアクションを実行しようとすると、エラーが発生するはずです:
Error from server (Forbidden): pods "ui-7c7948bfc8-wbsbr" is forbidden: User "arn:aws:sts::1234567890:assumed-role/eks-workshop-read-only/EKSGetTokenAuth" cannot delete resource "pods" in API group "" in the namespace "ui"
次に、ポリシーを1つ以上の名前空間に制限する方法を調査しましょう。--access-scope type=namespaceを使用して読み取り専用IAMロールのアクセスポリシーの関連付けを更新しましょう:
この関連付けは明示的にcarts名前空間へのアクセスのみを許可し、以前のクラスター全体の関連付けを置き換えます。テストしてみましょう:
NAME READY STATUS RESTARTS AGE
carts-6d4478747c-vvzhm 1/1 Running 0 5m54s
carts-dynamodb-d9f9f48b-k5v99 1/1 Running 0 15d
しかし、すべての名前空間からポッドを取得しようとすると、禁止されます:
Error from server (Forbidden): pods is forbidden: User "arn:aws:sts::1234567890:assumed-role/eks-workshop-read-only/EKSGetTokenAuth" cannot list resource "pods" in API group "" at the cluster scope
readonlyロールの関連付けを一覧表示してみましょう:
{"associatedAccessPolicies": [
{"policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy",
"accessScope": {"type": "namespace",
"namespaces": [
"carts"
]
},
"associatedAt": "2024-05-29T17:01:55.233000+00:00",
"modifiedAt": "2024-05-29T17:02:22.566000+00:00"
}
],
"clusterName": "eks-workshop",
"principalArn": "arn:aws:iam::1234567890:role/eks-workshop-read-only"
}
先述したように、同じAmazonEKSViewPolicyポリシーARNを使用したため、以前のクラスタースコープのアクセス設定を名前空間スコープのものに置き換えました。では、ui名前空間にスコープされた別のポリシーARNを関連付けてみましょう:
前回アクセス拒否されたコマンドを実行して、ui名前空間のPodを削除してみましょう:
pod "ui-7c7948bfc8-xdmnv" deleted
これで両方の名前空間へのアクセス権が得られました。関連付けられたアクセスポリシーを一覧表示してみましょう:
{"associatedAccessPolicies": [
{"policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSEditPolicy",
"accessScope": {"type": "namespace",
"namespaces": [
"ui"
]
},
"associatedAt": "2024-05-29T17:23:55.299000+00:00",
"modifiedAt": "2024-05-29T17:23:55.299000+00:00"
},
{"policyArn": "arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy",
"accessScope": {"type": "namespace",
"namespaces": [
"carts"
]
},
"associatedAt": "2024-05-29T17:01:55.233000+00:00",
"modifiedAt": "2024-05-29T17:23:28.168000+00:00"
}
],
"clusterName": "eks-workshop",
"principalArn": "arn:aws:iam::1234567890:role/eks-workshop-read-only"
}
ご覧の通り、異なるレベルのアクセス権を提供するために複数のアクセスポリシーを関連付けることが可能です。
クラスター内のすべてのPodを一覧表示しようとするとどうなるか確認してみましょう:
Error from server (Forbidden): pods is forbidden: User "arn:aws:sts::1234567890:assumed-role/eks-workshop-read-only/EKSGetTokenAuth" cannot list resource "pods" in API group "" at the cluster scope
アクセススコープがuiとcarts名前空間のみにマッピングされているため、クラスター全体へのアクセス権はまだありません。これは予想通りの結果です。
これにより、事前定義されたEKSアクセスポリシーをアクセスエントリに関連付けて、IAMロールにEKSクラスターへのアクセス権を簡単に提供する方法を示しました。