Amazon EKS でサービスアカウントの IAM ロール (IRSA) 機能を使用して Amazon S3 バケットへのアクセスを制限する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) のポッドレベルでAmazon Simple Storage Service (Amazon S3) バケットへのアクセスを制限したいです。また、サービスアカウント (IRSA) の AWS Identity and Access Management (IAM) ロールを使用して、アプリケーションに必要な最小限の権限を維持したいと考えています。
解決策
**重要:**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 イメージに置き換えます。これにより、ポッドが指定された 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" }
名前空間を指定する場合は、名前空間引数 (-n) をすべての kubectl コマンドに追加します。YOUR_NAMESPACE を自分の名前空間に置き換えます。
$ kubectl -n YOUR_NAMESPACE exec -it aws-cli -- aws sts get-caller-identity
2. ポッドに S3 バケット ([YOUR_BUCKET]) に対する [s3:ListBuckets] 権限があることを確認します。
$ kubectl exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET
メモ:[YOUR_BUCKET] を S3 バケットに置き換えます。
出力:
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
関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 7ヶ月前lg...
- 質問済み 4年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前
- AWS公式更新しました 2ヶ月前