Amazon EKS でサービスアカウントの IAM ロール (IRSA) 機能を使用して、Amazon S3 バケットへのアクセスを制限するにはどうすればよいですか?
最終更新日: 2021 年 10 月 11 日
Amazon Elastic Kubernetes Service (Amazon EKS) のポッドレベルで Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを制限したいと考えています。また、サービスアカウントの AWS Identity and Access Management (IAM) ロール (IRSA) を使用して、アプリケーションに対して最小限の特権を保持したいと考えています。
解決方法
重要: Amazon EKS で IRSA を使用する前に、クラスター用の IAM OIDC プロバイダーを作成する必要があります。
IAM ポリシーとロールを作成する
1. iam-policy.json という名前の JSON ファイルを作成します。
次のポリシー例では、Amazon S3 および Amazon DynamoDB のアクセス許可を制限しています。IAM ユーザーは、1 つの S3 バケットにアクセスし、特定の DynamoDB テーブルにアクセスできます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListAndDescribe",
"Effect": "Allow",
"Action": [
"dynamodb:List*",
"dynamodb:Describe*"
],
"Resource": "arn:aws:dynamodb:*:*:table/YOUR_TABLE"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::YOUR_BUCKET"
},
{
"Sid": "List",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::YOUR_BUCKET/*"
}
]
}
注: YOUR_TABLE を自分のテーブルに置き換えます。YOUR_NAMESPACE を自分の名前空間に置き換えます。
2. YOUR-IAM-POLICY という名前の IAM ポリシーを作成します。
$ aws iam create-policy \
--policy-name YOUR-IAM-POLICY \
--policy-document file://iam-policy.json
注: YOUR-IAM-POLICY を自分のポリシー名に置き換えます。
3. IAM コンソールを使用してサービスアカウントの IAM ロールを作成し、その IAM ロールでサービスアカウントに注釈を付けます。または、eksctl を使用して、サービスアカウントの IAM ロールを作成します。例:
$ eksctl create iamserviceaccount \
--name YOUR-SERVICEACCOUNT \
--namespace YOUR-NAMESPACE \
--cluster YOUR-CLUSTER \
--attach-policy-arn arn:aws:iam::1111122222:policy/YOUR-IAM-POLICY \
--approve
注: 1111122222 を Amazon リソースネーム (ARN) に置き換えてください。IAM コンソールを使用して、サービスアカウントの IAM ロールを作成することもできます。
Amazon EKS ポッドを作成します。
次の手順では、独自のアプリケーションを aws-cli image に置き換えます。これにより、ポッドが正しい IAM アクセス許可を持つ指定された IAM ロールを引き受けることができるかどうかを確認できます。
1. aws-cli-pod.yaml という名前の YAML ファイルを作成します。例:
apiVersion: v1
kind: Pod
metadata:
name: aws-cli
namespace: YOUR_NAMESPACE
spec:
serviceAccountName: YOUR_SERVICEACCOUNT
containers:
- name: aws-cli
image: amazon/aws-cli:latest
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
注: YOUR_NAMESPACE を自分の名前空間に置き換えます。SERVICE_ACCOUNT を自分の Kubernetes サービスアカウント名に置き換えます。
2. 次のように、Amazon EKS クラスターを作成します。
$ kubectl apply -f ./aws-cli.yaml
Amazon EKS ポッドをテストする
ポッドが Amazon S3 および DynamoDB の制限アクションで正しい IAM ロールを使用していることを確認します。次の例では、ポッドは S3 バケット (YOUR_BUCKET) と DynamoDB テーブル (YOUR_TABLE) のみを一覧表示できます。
1. 認証情報を使用している IAM ロールを見つけます。
$ kubectl exec -it aws-cli -- aws sts get-caller-identity
出力:
{
"UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-1111122222",
"Account": "111122223333",
"Arn": "arn:aws:sts::111122223333:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-1111122222"
}
2. ポッドに S3 バケット (YOUR_BUCKET) に対する s3:ListBuckets アクセス許可があることを確認します。
$ kubectl exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET
注: YOUR_BUCKET を自分の IRSA に置き換えてください。
出力:
2021-09-28 09:59:22 269 demo-test-file
3. ポッドが S3 バケット (YOUR_BUCKET) を削除できないことを確認します。
$ kubectl exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/demo-test-file
注: YOUR_BUCKET を自分の S3 バケットに置き換えてください。
ポッドに s3: DeleteObject アクセス許可がないため、コマンドは次の「アクセスが拒否されました」エラーを返します。
delete failed: s3://YOUR_BUCKET/demo-test-file An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
command terminated with exit code 1
4. ポッドに DynamoDB テーブル (YOUR_TABLE) に対する dynamodb:List アクセス許可があることを確認します。
$ kubectl exec -it aws-cli -- aws dynamodb describe-table --table-name YOUR_TABLE
注: YOUR_TABLE を自分の DynamoDB テーブルに置き換えてください。
出力:
{
"Table": {
"AttributeDefinitions": [
{
"AttributeName": "demo",
"AttributeType": "S"
}
],
"TableName": "YOUR_TABLE",
"KeySchema": [
{
"AttributeName": "demo",
"KeyType": "HASH"
}
],
"TableStatus": "ACTIVE",
"CreationDateTime": "2021-09-28T10:05:53.599000+00:00",
"ProvisionedThroughput": {
"NumberOfDecreasesToday": 0,
"ReadCapacityUnits": 5,
"WriteCapacityUnits": 5
},
"TableSizeBytes": 0,
"ItemCount": 0,
"TableArn": "arn:aws:dynamodb:eu-west-1:000000000000:table/YOUR_TABLE",
"TableId": "42bd1238-e042-4016-b6b2-77548939c101"
}
}
5. ポッドが DynamoDB テーブル (YOUR_TABLE) を削除できないことを確認します。
$ kubectl exec -it aws-cli -- aws dynamodb delete-table --table-name YOUR_TABLE
注: YOUR_TABLE を自分の DynamoDB テーブルに置き換えてください。
ポッドに dynamodb:DeleteTable アクセス許可がないため、コマンドは次の「アクセスが拒否されました」エラーを返します。
An error occurred (AccessDeniedException) when calling the DeleteTable operation: User: arn:aws:sts::1111122222:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1U7NRNSEC/botocore-session-1632822777 is not authorized to perform: dynamodb:DeleteTable on resource: arn:aws:dynamodb:eu-west-1: 1111122222:table/MyTable
command terminated with exit code 254