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을 부여할 수 있게 되므로 아래와 같은 장점을 갖게 됩니다.

  1. 세밀한 권한 관리: Pod별로 IAM Role을 지정하여, 애플리케이션이 필요로 하는 AWS 리소스에만 접근하도록 권한을 최소화할 수 있습니다.

  2. 보안 강화: AWS 액세스 키나 시크릿 키를 애플리케이션에 직접 전달할 필요 없이, OIDC 토큰을 사용하여 보안이 강화됩니다.

  3. 자동화된 자격 증명 관리: IAM Role을 통해 자격 증명을 자동으로 관리하며, 임시 자격 증명을 사용해 만료된 토큰을 재발급받을 수 있습니다.

  4. 멀티 테넌시 지원: 동일한 클러스터에서 실행되는 여러 애플리케이션이 각각 다른 IAM Role을 사용하여 AWS 리소스에 접근할 수 있습니다.

IRSA의 동작 방식

  1. 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
}
  1. IAM Role 생성 및 Trust Policy 설정

특정 Pod가 사용할 수 있는 IAM Role을 생성합니다. 이 IAM Role은 AWS 리소스에 접근할 수 있는 권한을 부여하며, OIDC 프로바이더와 신뢰 관계를 설정합니다.

  1. IAM Role을 생성할 때, OIDC 프로바이더를 신뢰하는 신뢰 정책(trust policy)을 정의합니다. 이 정책은 ServiceAccount가 특정 Role을 사용할 수 있게 허용합니다.

  2. 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>"
      }
    }
  }
}
  1. 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>
  1. Pod에 ServiceAccount 할당

ServiceAccount를 생성한 후, 해당 ServiceAccount를 사용하는 Pod를 배포합니다. Pod는 ServiceAccount를 통해 IAM Role을 사용하게 되며, AWS 리소스에 접근할 수 있는 권한을 얻게 됩니다.

  • Deployment나 Pod를 정의하는 specserviceAccountName 필드에 위에서 생성한 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
  1. 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 리소스를 허용하거나 거부합니다.

  1. Pod가 AWS 리소스에 접근

Pod는 AWS STS에서 받은 임시 자격 증명을 사용하여 S3, DynamoDB, Secrets Manager 등 AWS 리소스에 접근합니다. IAM 역할이 부여한 권한에 따라 리소스에 대한 작업을 수행할 수 있습니다.

Last updated