Search

IRSA

EKS Cluster 내부에서 pod에게 IAM Role권한을 주는 방식 IRSA

EKS Cluster 내부 Pod에 리소스 접근 권한을 주는 방법

EKS Cluster 내부 pod에 리소스 접근을 주는 방법에는 크게 3가지가 있다.
1.
EKS Cluster Node인 EC2에 IAM Role을 할당하여 Pod가 Node의 IAM Role을 자동으로 가져갈 수 있게 할 수 있다. 단, EC2 내부에 IMDSv1 방식을 사용할 수 있도록 허용이 되어있어야 합니다.
2.
IAM User의 Accesskey를 pod에서 사용하는 AWS SDK나 AWS CLI에 설정하는 방법입니다. 이 방법은 보안상 매우 취약하며 보안 정책상 Accesskey를 주기적으로 변경해야할 수 있기 때문에 관리도 매우 어렵.
3.
IRSA

IRSA

IRSA는 IAM Role for Service Account의 약자이다. 풀네임에서 볼 수 있듯이 kubernetes의 serviceaccount를 사용하여 pod의 권한을 IAM Role로 제어할 수 있도록 하는 기능을 말한다.
serviceaccount는 AWS의 자원이 아닌데 어떻게 IAM Role을 할당할 수 있는 걸까..
이걸 해주는게 바로 OIDC라고 부르는 OpenID Connect 이다.

ServiceAccount

서비스 어카운트(Service Account) 는 Kubernetes 의 파드에서 API 서버에 요청을 보냈을 때 이 "파드"를 식별하기 위한 리소스 이다.
파드에서 API 서버에 요청을 보내면 이 파드의 정체가 무엇인지 알아야 어떤 권한을 가지고 있는지도 알 수 있고,
이를 기반으로 파드의 요청이 권한에 맞는지를 확인하여 요청을 처리해줄지 말지를 결정할 수 있게 되는데요. 실제로 권한을 정의하고, 설정하는 부분은 Role, ClusterRole, RoleBinding, ClusterRoleBinding의 역할이고, ServiceAccount 는 이러한 권한을 적용할 수 있는 주체 중 한가지로서,
Pod에게는 신분증과 같은 인증서역할을 하게 됩니다.

OIDC

OpenID Connect는 Google 등의 IdP(ID 공급자)에 로그인할 수 있도록 지원하는 표준 인증 프로토콜이다.
권한허가 프로토콜인 OAuth 2.0 기술을 이용하여 만들어진 인증 레이어로 JSON 포맷을 이용하여 RESTful API 형식을 사용하여 인증을 하게 된다.
OIDC를 사용하면 손쉽게 외부 서비스를 통해 사용자 인증을 구현할 수 있게 됩니다.
즉, Kunernetes의 리소스와 AWS리소스 처럼 서로다른 리소스간의 인증을이 OIDC를 사용하여 손쉽게 가능

IRSA의 workflow

pod위에서 동작하는 application이 AWS S3 Buket의 list를 가져올때의 동작 흐름 예시 이다.
순서도
1.
pod위에서 동작하는 application이 AWS SDK를 사용하여 S3의 리스트를 가져오려고 합니다.
2.
이때 JWT와 IAM Role 의 ARN정보를 AWS STS에게 전달 합니다.
3.
STS는 AWS IAM에게 임시 자격증명을 줄 수 있는지 확인을 요청합니다.
4.
IAM은 IAM OIDC Provider와 통신하고, pod에 할당된 serviceaccount에 IAM Role 정보가 잘 annotate되어 있는 지 확인한 후에 IAM에게 확인 되었다는 응답을 주게 됩니다.
5.
IAM은 STS에게 권한을 줘도 된다고 응답을 주게 되고
6.
AWS STS는 pod의 AWS SDK에게 임시 자격증명을 전달합니다.
7.
최종적으로 pod의 AWS SDK는 aws s3의 리스트를 가져올 수 있게 됩니다.

IRSA를 사용하기 위해서는 아래와 같은 작업이 필요

AWS 에서 EKS cluster OICD provider 생성
AWS 에서 IAM Role 생성
K8s에서 serviceaccount 생성
k8s에서 pod에 serviceaccount 할당
eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=test-cluster --approve # Create eksctl create iamserviceaccount \ --cluster=test-cluster \ --name=test-role \ --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess \ --approve # Delete eksctl delete iamserviceaccount \ --name test-controller \ --region=ap-northeast-2 \ --namespace test \ --cluster $EKS_CLUSTER_NAME
Shell
복사