Overview
오늘은 IRSA(IAM Roles for Service Accounts)에 대해서 공부해보려고 한다.
클러스터 내부에 있는 Pod가 다른 리소스들에 대한 권한을 얻는 것은 K8S의 자체 기능이며, 관련된 리소스로는 Role, RoleBinding, ClusterRole, ClusterRoleBinding과 ServiceAccount가 있다.
아래의 포스팅을 참고하길 바란다.
2023.05.10 - [Container Orchestration/Kubernetes] - Kuberntes Service Account란?
2023.04.19 - [Container Orchestration/Kubernetes] - Kubernetes API Server, Group / RBAC란?
AWS IRSA(IAM Roles for Service Accounts)란?
AWS IRSA(IAM Roles for Service Accounts)는 AWS EKS(Elastic Kubernetes Service)에서 관리하는 Kubernetes 클러스터에서 실행되는 파드에서 ServiceAccount를 사용하여 AWS 서비스에 대한 액세스 권한을 부여하는 방법이다.
그렇다면 ServiceAccount는 AWS의 자원이 아닌데 어떻게 IAM Role을 할당할 수 있는 걸까?
바로 OIDC라고 부르는 OpenID Connect와 STS라고 부르는 Security Token Service가 해당 기능을 수행해준다.
Service Account란?
Kubernetes Service Account는 쿠버네티스 클러스터 내에서 실행되는 팟(Pod)이 API 서버와 상호 작용할 수 있도록 권한을 부여하는 데 사용되는 자격증명이다. 서비스 어카운트는 특정 네임스페이스(namespace)에 속하며, 자동으로 생성되거나 사용자가 직접 생성할 수 있다.
AWS 에서 IAM Role 생성 + K8S에서 serviceaccount 생성
eksctl create iamserviceaccount --cluster=test-cluster --name=test-role --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess --approve --profile <aws profile>
OIDC(OpenID Connect)란?
OIDC는 인증 서버에서 수행한 인증을 기반으로 앱이 최종 사용자의 신원을 확인할 수 있도록 하는 인증 프로토콜인 OpenID Connect의 약자이다.
OAuth 2.0 기술을 이용하여 만들어진 인증 레이어로 JSON 포맷을 이용하여 RESTful API 형식으로 인증을 하게 된다.
OpenID Connect는 OAuth 2.0 프로토콜 위에 구축되어 인증 서버가 리소스 소유자 또는 최종 사용자의 승인을 받아 타사 애플리케이션에 대한 액세스 토큰을 발급할 수 있다. 애플리케이션은 액세스 토큰을 사용하여 최종 사용자를 대신하여 API에 인증할 수 있으며, OIDC는 OAuth 2.0을 확장하여 ID 토큰을 도입하여 인증을 추가한다.
EKS OIDC 생성
eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=test-cluster --approve
EKS OIDC 조회
aws eks describe-cluster --name luxon --query "cluster.identity.oidc.issuer" --output text --profile <profile> --region <region>
https://oidc.eks.<region>.amazonaws.com/id/554xxxxxxxxxxxxxxxxxxxxxxxxxxx
AWS STS(Security Token Service)란?
AWS 리소스에 접근할 수 있는 권한에 대해 임시자격 증명을 가져오도록 하는 서비스이다.
AWS IRSA Workflow
아래의 Workflow는 Pod에서 동작하는 Application이 AWS S3 Bucket list를 가져올때의 예시이다.
물론 EKS 내부의 다른 리소스들에 접근할 수 있는 권한 (EKS → EKS)이 있다는 가정다.
해당 권한은 보통 Kubernetes RBAC(Role-Based Access Control)로 설정한다.
- JWT와 IAM Role 의 ARN정보를 AWS STS에게 전달 한다.
- STS는 AWS IAM에게 임시 자격증명을 줄 수 있는지 확인을 요청한다.
- IAM은 IAM OIDC Provider와 통신하고, Pod에 할당된 ServiceAccount에 IAM Role 정보가 Annotate되어 있는 지 확인한 후에 IAM에게 확인 되었다는 응답을 주게 된다.
- IAM은 STS에게 권한을 줘도 된다고 응답을 주게 된다.
- AWS STS는 Pod의 AWS SDK에게 임시 자격증명을 전달합니다.
- 최종적으로 Pod의 AWS SDK는 AWS S3의 리스트를 가져올 수 있게 된다.
JWT란?
JWT는 JSON 웹 토큰(JSON Web Token)의 약자로 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 표준(RFC 7519)이다. 디지털 서명되어 있으므로 확인하고 신뢰할 수 있다.
JWT는 비밀(HMAC 알고리즘 포함) 또는 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명한다.
Reference
https://aws.amazon.com/ko/blogs/containers/diving-into-iam-roles-for-service-accounts/
https://kim-dragon.tistory.com/279
https://channel.io/ko/blog/tech-aws-cross-accounts-irsa
https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html
https://clarkshim.tistory.com/418
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_credentials_temp.html
'AWS' 카테고리의 다른 글
AWS Ingress Annotations 정리 (0) | 2024.11.07 |
---|---|
AWS Assume Role이란? (0) | 2024.11.04 |
AWS VPC란? (0) | 2023.04.07 |
AWS Cloudfront란? / Canary 및 Blue-Green 배포 (0) | 2023.04.03 |
AWS Secrets Manager란?(OAuth, SSO) (0) | 2023.04.01 |