如何將服務帳戶的 IAM 角色 (IRSA) 功能與 Amazon EKS 搭配使用,來限制對 Amazon S3 儲存貯體的存取?
上次更新日期:2022 年 8 月 19 日
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 的 pod 層級限制對 Amazon Simple Storage Service (Amazon S3) 儲存貯體的存取。我還希望使用服務帳戶的 AWS Identity and Access Management (IAM) 角色 (IRSA) 讓應用程式保持最低權限。
解決方案
重要提示:在將 IRSA 與 Amazon EKS 搭配使用之前,您必須為您的叢集建立一個 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
注意:將 1111122222 替換為您的 Amazon 資源名稱 (ARN)。您還可以使用 IAM 主控台為您的服務帳戶建立 IAM 角色。
建立 Amazon EKS pod
在以下步驟中,將您自己的應用程式替換為 aws-cli 映像。這可讓您檢查您的 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 使用正確的 IAM 角色,該角色可對 Amazon S3 和 DynamoDB 執行的動作存在限制。在以下範例中,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