Amazon EKS에서 서비스 계정용 IAM 역할(IRSA) 기능을 사용하여 Amazon S3 버킷에 대한 액세스를 제한하려면 어떻게 해야 합니까?
Amazon Elastic Kubernetes Service(Amazon EKS)의 포드 수준에서 Amazon Simple Storage Service(Amazon S3) 버킷의 액세스를 제한하려고 합니다. 또한 서비스 계정용 AWS ID 및 액세스 관리(IAM)(IRSA) 역할을 사용하여 애플리케이션에 대한 최소 권한을 유지하려고 합니다.
해결 방법
중요: 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
참고: 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" }
네임스페이스를 지정하는 경우, 모든 kubectl 명령에 네임스페이스 인수(-n)를 추가합니다. 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

관련 콘텐츠
- 질문됨 3달 전lg...
- 질문됨 3달 전lg...
- 질문됨 2년 전lg...
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 일 년 전