如何使用適用於服務帳戶的 IAM 角色 (IRSA) 功能搭配 Amazon EKS 來限制對 Amazon S3 儲存貯體的存取?
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中的 Pod 級別限制 Amazon Simple Storage Service (Amazon S3) 儲存貯體的存取。我也希望透過服務帳戶 (IRSA) 的 AWS 身分和存取管理 (IAM) 角色保留應用程式的最低權限。
解決方法
**重要事項:**在搭配 Amazon EKS 使用 IRSA 之前,您必須為叢集建立 IAM OIDC 提供者。
建立 IAM 政策和角色
1. 建立一個名為 iam-policy.json的 JSON 檔案。
以下範例政策限制了 Amazon S3 和 Amazon DynamoDB 的權限。IAM 使用者可以存取一個 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
**注意:**將您的 Amazon Resource Name (ARN) 取代為 1111122222。您也可以使用 IAM 主控台為服務帳戶建立 IAM 角色。
建立一個 Amazon EKS pod
在下列步驟中,請將 aws-cli image取代為您自己的應用程式。這可讓您檢查 Pod 是否可以採用具有正確 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 pod:
$ kubectl apply -f ./aws-cli.yaml
測試您的 Amazon EKS pod
確認您的 Pod 使用了適用於 Amazon S3 和 DynamoDB 的限制動作的正確 IAM 角色。在下列範例中, Pod 只能列出 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. 確認您的 Pod 具有 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. 確認您的 Pod 無法刪除 S3 儲存貯體 (YOUR_BUCKET):
$ kubectl exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/demo-test-file
**注意:**將 YOUR_BUCKET 取代為 S3 儲存貯體。
此命令會傳回下列「拒絕存取」錯誤,因為 Pod 沒有 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. 確認您的 Pod 具有 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. 確認您的 pod 無法刪除 DynamoDB 資料表 (YOUR_TABLE):
$ kubectl exec -it aws-cli -- aws dynamodb delete-table --table-name YOUR_TABLE
**注意:**將 YOUR_TABLE 取代為您的 DynamoDB 資料表。
此命令會傳回下列「拒絕存取」錯誤,因為 Pod 沒有 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
相關內容
- 已提問 9 個月前lg...
- 已提問 9 個月前lg...
- 已提問 1 年前lg...
- 已提問 3 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 個月前