AWS IRSA
AWS IRSA(IAM Roles for Service Accounts)**는 Amazon EKS(Kubernetes 클러스터)에서 애플리케이션이 IAM Role을 안전하게 사용할 수 있도록 해주는 메커니즘입니다. IRSA는 Kubernetes의 **서비스 어카운트(Service Account)**와 AWS IAM Role을 연동하여, 특정 Pod가 AWS 리소스에 접근할 수 있도록 권한을 부여합니다. 이를 통해 쿠버네티스 애플리케이션이 IAM 자격 증명을 직접 관리할 필요 없이, 필요한 AWS 리소스에 안전하게 접근할 수 있습니다.
IRSA가 필요한 이유
Kubernetes에서 AWS API에 접근하기 위해서는 EC2 인스턴스 프로파일을 사용하거나, 애플리케이션에 직접 AWS 액세스 키와 시크릿 키를 제공해야 했습니다. 이러한 방식은 보안과 관리 측면에서 위험을 수반할 수 있습니다. IRSA는 이러한 문제를 해결하고, Pod 단위로 IAM Role을 부여함으로써 보다 세밀하게 권한을 관리할 수 있습니다.
IRSA의 주요 장점
AWS IRSA(IAM Roles for Service Accounts)을 사용하게 된다면 ServiceAccount 단위로 IAM Role을 부여할 수 있게 되므로 아래와 같은 장점을 갖게 됩니다.
세밀한 권한 관리: Pod별로 IAM Role을 지정하여, 애플리케이션이 필요로 하는 AWS 리소스에만 접근하도록 권한을 최소화할 수 있습니다.
보안 강화: AWS 액세스 키나 시크릿 키를 애플리케이션에 직접 전달할 필요 없이, OIDC 토큰을 사용하여 보안이 강화됩니다.
자동화된 자격 증명 관리: IAM Role을 통해 자격 증명을 자동으로 관리하며, 임시 자격 증명을 사용해 만료된 토큰을 재발급받을 수 있습니다.
멀티 테넌시 지원: 동일한 클러스터에서 실행되는 여러 애플리케이션이 각각 다른 IAM Role을 사용하여 AWS 리소스에 접근할 수 있습니다.

IRSA의 동작 방식
OIDC(OpenID Connector) Provider 생성
먼저 AWS EKS 클러스터에 OIDC 프로바이더를 연결해야 합니다. OIDC는 EKS Cluster에서 ServiceAccount와 AWS IAM 간의 신뢰를 설정하는 데 사용됩니다.
AWS EKS 클러스터는 자체적으로 OIDC 프로바이더를 운영하며, 이를 통해 IAM Role과 ServiceAccount를 연동할 수 있습니다.
AWS 관리 콘솔 또는 CLI를 사용하여 해당 클러스터의 OIDC URL을 기반으로 IAM OIDC 프로바이더를 생성합니다.
data "tls_certificate" "demo" {
url = aws_eks_cluster.demo.identity.0.oidc.0.issuer
}
data "aws_eks_cluster" "demo" {
name = aws_eks_cluster.demo.name
}
resource "aws_iam_openid_connect_provider" "demo" {
client_id_list = ["sts.amazonaws.com"]
thumbprint_list = [data.tls_certificate.demo.certificates[0].sha1_fingerprint]
url = aws_eks_cluster.demo.identity.0.oidc.0.issuer
}
IAM Role 생성 및 Trust Policy 설정
특정 Pod가 사용할 수 있는 IAM Role을 생성합니다. 이 IAM Role은 AWS 리소스에 접근할 수 있는 권한을 부여하며, OIDC 프로바이더와 신뢰 관계를 설정합니다.
IAM Role을 생성할 때, OIDC 프로바이더를 신뢰하는 신뢰 정책(trust policy)을 정의합니다. 이 정책은 ServiceAccount가 특정 Role을 사용할 수 있게 허용합니다.
IAM Role에 필요한 권한 정책(permission policy)을 추가합니다. 예를 들어, S3 버킷에 대한 읽기/쓰기 권한을 부여하려면 S3에 대한 적절한 권한을 설정합니다.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/<OIDC_PROVIDER_URL>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"<OIDC_PROVIDER_URL>:sub": "system:serviceaccount:<namespace>:<service-account-name>"
}
}
}
}
Kubernetes ServiceAccount 생성
Kubernetes에서 IAM Role을 사용할 수 있는 ServiceAccount를 생성합니다. 이 ServiceAccount는 Pod와 연관되어 AWS IAM Role을 사용하게 됩니다.
ServiceAccount를 생성할 때, 특정 IAM Role 연동하도록
eks.amazonaws.com/role-arn
어노테이션(annotation)을 추가해야 합니다. 이 어노테이션은 AWS IAM Role의 ARN(Amazon Resource Name)을 가리킵니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: my-namespace
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
Pod에 ServiceAccount 할당
ServiceAccount를 생성한 후, 해당 ServiceAccount를 사용하는 Pod를 배포합니다. Pod는 ServiceAccount를 통해 IAM Role을 사용하게 되며, AWS 리소스에 접근할 수 있는 권한을 얻게 됩니다.
Deployment나 Pod를 정의하는
spec
의serviceAccountName
필드에 위에서 생성한 ServiceAccount를 지정합니다.
apiVersion: batch/v1
kind: Job
metadata:
name: aws-cli-test-s3
namespace: my-namespace
spec:
template:
metadata:
labels:
app: aws-cli-test-s3
spec:
serviceAccountName: my-service-account
containers:
- name: aws-cli-test
image: amazon/aws-cli:latest
args: ["s3", "ls"]
restartPolicy: Never
STS 토큰 요청 및 AWS 리소스 접근
Pod가 배포되면, 해당 Pod는 Kubernetes API 서버를 통해 ServiceAccount 토큰을 요청합니다. 이 토큰은 OIDC 프로바이더를 통해 인증된 것으로 간주되며, AWS STS(Security Token Service)를 통해 임시 보안 자격 증명(Temporary Security Credentials)을 획득합니다.
STS AssumeRoleWithWebIdentity API 호출: 이 API를 통해 Pod는 OIDC 토큰을 IAM 역할에 전달하여 임시 자격 증명을 획득합니다.
AWS는 IAM 역할에 정의된 권한 정책에 따라 접근 가능한 AWS 리소스를 허용하거나 거부합니다.
Pod가 AWS 리소스에 접근
Pod는 AWS STS에서 받은 임시 자격 증명을 사용하여 S3, DynamoDB, Secrets Manager 등 AWS 리소스에 접근합니다. IAM 역할이 부여한 권한에 따라 리소스에 대한 작업을 수행할 수 있습니다.
Last updated