ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [EKS] IRSA를 활용하여 pod에 IAM 할당하기 #2
    k8s 2020. 7. 27. 00:36

    지난 포스트에서 쿠버네티스 노드에 IAM을 부여할 경우 (해당 노드에) 배포되어 있는 모든 파드가 동일한 권한을 갖게 되며 이는 보안상 적절하지 않다고 얘기했습니다. (그림으로 표현하자면 아래와 같을 겁니다.)

    노드에 IAM 할당


    지난 포스트에서는 IRSA가 대략적으로 어떻게 동작하는지 설명하였으니 오늘은 실습 위주의 포스트를 작성하려고 합니다. 아래 그림과 같이 파드 A, 파드 B를  동일한 노드에 배포하고 파드 A만 S3에 접근 가능한 환경을 구성해보려고 합니다.

    파드에 IAM 할당

    - Requirements

    아래 2개의 패키지를 로컬에 설치 후 명령어가 정상적으로 수행될 수 있게끔 설정해야 합니다. (이 부분은 생략합니다.)

    • eksctl
    • aws-cli

     

    - EKS 클러스터 생성

    테스트를 위한 test-cluster를 생성

    $ eksctl create cluster test-cluster
    .. 로그 생략 ..
    [✔]  EKS cluster "test-cluster" in "ap-northeast-2" region is ready

     

    - IAM Identity provider 생성

    test-cluster의 OpenID Connect provider URL을 이용하여 IAM의 Identity provider를 생성 

    $ eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=test-cluster --approve

     

    - IAM Role 및 serviceAccount 생성

    IRSA를 활용을 위해 IAM Role과 쿠버네티스 리소스인 serviceAccount를 생성

    $ eksctl create iamserviceaccount --cluster=test-cluster --name=test-role --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess --approve

    생성된 serviceAccount와 IAM Role는 아래와 같이 확인 가능

    ## ServiceAccount 확인
    $ kubectl get sa test-role -o jsonpath="{$.metadata.annotations.eks\.amazonaws\.com/role-arn}"
    arn:aws:iam::{{ AWS_ACCOUNT_ID }}:role/eksctl-test-cluster-addon-iamserviceaccount-Role1-1W4EESHQN5CZW

    ## IAM Role 및 권한 확인
    $ aws iam list-attached-role-policies --role-name=eksctl-test-cluster-addon-iamserviceaccount-Role1-1W4EESHQN5CZW

     

    - 파드 배포

    iam 권한이 필요한 파드 A에 serviceAccountName 설정을 추가하여 배포하고 파드 B는 이 설정을 생략하고 배포

    + pod-a.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pod-a
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: pod-a
      template:
        metadata:
          labels:
            app: pod-a
        spec:
          containers:
            - name: ubuntu
              image: ubuntu:latest
              imagePullPolicy: Always
              command: [ "/bin/bash", "-c", "--" ]
              args: [ "while true; do sleep 30; done;" ]
          # serviceAccount 설정을 통해 IAM 사용 가능
          serviceAccountName: test-role
          nodeSelector:
            kubernetes.io/hostname: ip-192-168-59-173.ap-northeast-2.compute.internal

    + pod-b.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pod-b
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: pod-b
      template:
        metadata:
          labels:
            app: pod-b
        spec:
          containers:
            - name: ubuntu
              image: ubuntu:latest
              imagePullPolicy: Always
              command: [ "/bin/bash", "-c", "--" ]
              args: [ "while true; do sleep 30; done;" ]
          nodeSelector:
            kubernetes.io/hostname: ip-192-168-59-173.ap-northeast-2.compute.internal

    (배포는 생략)

    - 파드 aws cli 설치 후 테스트 진행

    동일한 노드에 2개의 파드가 배포된 걸 확인
    pod-a에서는 s3 명령어 정상 수행
    pod-b에서는 권한이 없어서 에러 발생

     

    위와 같은 방식 파드 별로 IAM 권한을 할당하여 조금 더 안전한 EKS 클러스터를 구성할 수 있습니다.

    'k8s' 카테고리의 다른 글

    [EKS] IRSA를 활용하여 pod에 IAM 할당하기 #1  (1) 2020.07.11
    taint와 toleration을 활용한 scheduling  (1) 2020.07.06

    댓글

Designed by Tistory.