EKS - IAM Role과 Kubernetes ServiceAccount를 연결하는 과정 (+IRSA)
개요
IRSA(IAM Roles for Service Accounts)는 AWS EKS 환경에서 사용되는 보안 기능입니다.
1.
정의
•
Kubernetes Service Account와 AWS IAM Role을 연결하는 기능입니다
•
Pod가 AWS 리소스에 접근할 때 필요한 권한을 제어하는 메커니즘입니다
2.
작동 방식
•
Pod가 AWS 리소스에 접근이 필요할 때 Service Account에 연결된 IAM Role을 사용합니다
•
이 과정에서 AssumeRoleWithWebIdentity API가 호출되어 임시 보안 자격 증명을 받습니다
3.
장점
•
Pod 레벨에서 세분화된 권한 제어가 가능합니다
•
AWS 자격 증명을 직접 관리할 필요가 없어 보안성이 향상됩니다
•
Kubernetes와 AWS IAM 통합으로 권한 관리가 단순화됩니다
4.
구현 방법
•
Service Account의 annotation에 IAM Role ARN을 설정하는 것만으로 기본 설정이 완료됩니다
•
추가적인 클러스터 설정이 필요할 수 있습니다
연결 과정
EKS(Amazon Elastic Kubernetes Service)에서 IAM Role과 Kubernetes ServiceAccount를 연결하는 과정
•
아래와 같이 add on 형식으로 cloud formation 스택이 생성됩니다.
eksctl create iamserviceaccount \
--cluster=eks-cluster \
--name acryl-actions \
--namespace datahub \
--attach-policy-arn=arn:aws:iam::xxx:policy/xxxx \
--override-existing-serviceaccounts \
--approve \
--region=ap-northeast-2
Python
복사
•
eksctl을 사용하여 IAM ServiceAccount를 생성합니다
•
-cluster: 대상 EKS 클러스터 지정
•
-name: ServiceAccount 이름 지정
•
-namespace: Kubernetes 네임스페이스 지정
•
-attach-policy-arn: 연결할 IAM 정책 ARN 지정
◦
미리 service account에서 사용할 iam 정책을 만들어놓아야합니다.
•
-override-existing-serviceaccounts: 기존 ServiceAccount가 있다면 덮어쓰기
•
-approve: 자동 승인
eksctl get iamserviceaccount --cluster cluster-name --namespace datahub --region ap-northeast-2
Python
복사
•
생성된 IAM ServiceAccount의 상태를 확인합니다
•
EKS 클러스터, 네임스페이스, 리전을 지정하여 조회
•
arn을 반환함
aws iam get-role-policy --role-name eksctl-de-cluster-ServiceRole-xxxxx --policy-name AirflowServiceAccountPolicy
Python
복사
•
IAM Role에 연결된 정책 내용을 확인합니다
pod가 쿠버네티스 service account에 설정한 IAM Role을 사용하려면 2가지 설정이 필요합니다.
1.
EKS OIDC idenity provider 생성
2.
AWS IAM Role TrustRelationship 설정
위와 같이 eksctl create iamserviceaccount을 통해 생성된 role은 oidc와 assume-role(신뢰 관계)를 자동으로 탑재하게 됩니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::********:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/********"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-2.amazonaws.com/id/********:aud": "sts.amazonaws.com",
"oidc.eks.ap-northeast-2.amazonaws.com/id/********:sub": "system:serviceaccount:datahub:acryl-datahub-actions"
}
}
}
]
}
SQL
복사
자세한 내용은 위 글을 읽으면 oidc와 신뢰관계가 eks에서 어떻게 작동하는지 알 수 있습니다.
서비스 어카운트를 생성할 차례입니다.
이제 annotation에 아래와 같이 role의 arn을 명시해줍니다.
# 서비스 어카운트 YAML
apiVersion: v1
kind: ServiceAccount
metadata:
name: acryl-datahub-actions
namespace: datahub
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxx:role/eksctl-de-xxx-addon-iamserviceaccount-dat-Role1-xxx
Python
복사
•
ServiceAccount의 YAML 정의
•
annotations에 IAM Role ARN이 지정되어 있음
•
이 annotation을 통해 Kubernetes Pod가 해당 IAM Role의 권한을 사용할 수 있게 됨
kubectl get serviceaccount -n datahub
Python
복사
•
생성된 ServiceAccount를 확인합니다
•
n datahub: datahub 네임스페이스의 ServiceAccount 조회
kubectl describe serviceaccount acryl-datahub-actions -n datahub
Python
복사
•
생성된 ServiceAccount의 상세 정보를 확인합니다
•
annotations, secrets 등의 정보 확인 가능