Ssoon

[6주차] EKS Security - IAM Roles for Service Accounts 본문

AWS EKS Workshop Study

[6주차] EKS Security - IAM Roles for Service Accounts

구구달스 2023. 6. 2. 06:06
CloudNet@ 팀의 AWS EKS Workshop Study 6주차 정리입니다.
#EKS Immersion Workshop 의 내용입니다.

IAM 역할 ---(연결)---> Kubernetes 서비스 계정

=> 서비스 계정은 해당 서비스 계정을 사용하는 모든 Pod의 컨테이너에 AWS 권한을 제공

=> 더 이상 Amazon EKS 노드 IAM 역할에 확장 권한을 제공할 필요가 없으므로 해당 노드의 포드가 AWS API를 호출할 수 있습니다.

=> Pod의 컨테이너에 있는 애플리케이션이 인증된 AWS 서비스에 API를 요청할 수 있습니다.

 

Service Account 에 대한 IAM roles 이 제공하는 이점

  • 최소 권한 - 서비스 계정에 대한 IAM 역할 기능을 사용하면 노드의 포드가 AWS API를 호출할 수 있도록 더 이상 노드 IAM 역할에 대한 확장 권한을 제공할 필요가 없습니다.서비스 계정에 대한 IAM 권한의 범위를 지정할 수 있으며 해당 서비스 계정을 사용하는 포드만 해당 권한에 액세스할 수 있습니다.
  • 자격 증명 분리 - 컨테이너는 컨테이너가 속한 서비스 계정과 연결된 IAM 역할에 대한 자격 증명만 검색할 수 있습니다.컨테이너는 다른 포드에 속한 다른 컨테이너를 대상으로 하는 인증 정보에 액세스할 수 없습니다.

IRSA 사용

클러스터에 대한 IAM OIDC 공급자

OpenID Connect issuer URL 검색

  • EKS cluster 는 OpenID Connect issuer URL 이 연결되어 있으며 이 URL은 IAM OIDC 공급자를 구성할 때 사용됩니다.
aws eks describe-cluster --name eksworkshop-eksctl --query cluster.identity.oidc.issuer --output text

 

 

 

 

 

 

 

클러스터에 대한 IAM OIDC 공급자 만들기

eksctl utils associate-iam-oidc-provider --cluster myeks --approve

(클러스터에 대해 이 작업을 한 번만 수행)

 

클러스터에 대해 생성된 OIDC 공급자

 

IAM 역할 생성 및 IAM 정책 연결

  • Pod 의 컨테이너에 부여할 권한을 지정하는 IAM 정책을 생성합니다.
  • 모든 S3 버킷에 대한 get list 을 허용하는 "AmazonS3ReadOnlyAccess"라는 AWS 관리형 정책을 사용합니다.
  • "AmazonS3ReadOnlyAccess" 정책에 대한 ARN을 찾습니다.
aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3ReadOnlyAccess`].Arn'

  • S3에 대한 read-only 액세스 권한을 가진 서비스 계정에 바인딩된 IAM role 을 생성합니다
eksctl create iamserviceaccount \
    --name iam-test \
    --namespace workshop \
    --cluster myeks \
    --attach-policy-arn arn\:aws\:iam::aws\:policy/AmazonS3ReadOnlyAccess \
    --approve \
    --override-existing-serviceaccounts

IAM 역할을 서비스 계정에 연결

IAM role 이 방금 만든 클러스터의 서비스 계정 iam-test에 연결되어 있음을 확인

kubectl describe sa iam-test -n workshop

 

테스트 성공 사례(목록 S3 버킷)

  • 앞서 생성한 서비스 계정이 S3 버킷을 list 할 수 있는지 확인합니다.
  • S3 버킷을 생성합니다.
aws s3 mb s3://eksworkshop-$ACCOUNT_ID-$AWS_REGION --region $AWS_REGION

명령 결과를 출력할 job-s3.yaml을 추가합니다.

mkdir IRSA

cat <<EoF> job-s3.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: eks-iam-test-s3
  namespace: workshop
spec:
  template:
    metadata:
      labels:
        app: eks-iam-test-s3
    spec:
      serviceAccountName: iam-test
      containers:
      - name: eks-iam-test
        image: amazon/aws-cli:latest
        args: ["s3", "ls"]
      restartPolicy: Never
EoF

kubectl apply -f ~/environment/irsa/job-s3.yaml

  • job-s3.yaml 을 실행하고 작업이 완료되었는지 확인합니다.
kubectl get job -l app=eks-iam-test-s3 -n workshop

  • 로그를 확인하여 명령이 성공적으로 실행되었는지 확인합니다.
kubectl logs -l app=eks-iam-test-s3 -n workshop

 

테스트 실패 사례

  • 이제 서비스 계정이 EC2 인스턴스를 list 할 수 없는지 확인합니다.
  • 명령 결과를 출력할 job-ec2.yaml을 추가합니다.
  • aws ec2 describe-instances --region ${AWS_REGION} => 이 작업은 실패해야 합니다.
cat <<EoF> job-ec2.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: eks-iam-test-ec2
  namespace: workshop
spec:
  template:
    metadata:
      labels:
        app: eks-iam-test-ec2
    spec:
      serviceAccountName: iam-test
      containers:
      - name: eks-iam-test
        image: amazon/aws-cli:latest
        args: ["ec2", "describe-instances", "--region", "${AWS_REGION}"]
      restartPolicy: Never
  backoffLimit: 0
EoF

kubectl apply -f ~/environment/irsa/job-ec2.yaml

  • job 상태를 확인합니다 (완료되지 않는 것이 정상입니다)

  • 로그를 확인합니다.

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
DescribeInstances 작업을 호출하는 동안 오류가 발생했습니다(UnauthorizedOperation): 이 작업을 수행할 수 있는 권한이 없습니다.


Comments