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

4분 분량
0

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

AWS 공식
AWS 공식업데이트됨 2년 전