Amazon EKS에서 서비스 계정용 IAM 역할(IRSA) 기능을 사용하여 Amazon S3 버킷에 대한 액세스를 제한하려면 어떻게 해야 합니까?

4분 분량
0

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 사용자는 하나의 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 권한이 없기 때문에 다음과 같은 “Access Denied” 오류를 반환합니다.

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 권한이 없기 때문에 다음과 같은 “Access Denied” 오류를 반환합니다.

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

AWS 공식
AWS 공식업데이트됨 7달 전