DevOps/AWS

[AWS] EKS에서 OIDC가 적용되는 원리

IT록흐 2023. 11. 14. 01:08
반응형

 

 

OIDC란 Open ID Connect의 약자이다. 

OIDC는 OAuth 2.0 프로토콜을 기반으로 이루어지는 사용자 인증 방식을 의미한다. 

 

AWS에서 사용자란 IAM을 의미한다. 

IAM은 AWS 리소스에 대한 권한을 가지고 있다. 그러나 IAM 사용자는 리소스 권한을 유용하게 사용하지 못한다. IAM 사용자가 복잡한 EKS 클러스터를 직접 구성할 수 있을까? 못한다. 그러므로 IAM 사용자는 복잡한 작업을 대신해줄 APP을 찾아 권한을 양도하는 방식을 선택해야 한다. 

 

 

 

 

IAM 사용자는 Terraform과 같은 IaC에서 제공하는 Provider에게 AccessKey와 SecretKey를 제공하여 권한을 양도하고 EKS 환경을 대신 구성하도록 지시한다.  하지만 AccessKey와 SecretKey를 직접 양도하는 방식은 보안에 취약하다. 그래서 등장한 인증방식이 OAuth이다. 그리고 OAuth 프로토콜을 기반으로 동작하는 인증방식이 OIDC이다. 

 

 

 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

 

ALB Ingress Controller 생성을 예로 들어보자.

 

ALB Ingress Controller는 인그레스로 동작하는 AWS 로드밸런서를 생성 및 모니터링 하는 App이다. EKS 안에 Ingress Controller Pod가 생성되고 동작하려면 EKS 안에 존재하는 k8s api-server의 도움을 받아야 한다. k8s api-server는 인증된 사용자가 인가된 권한을 가지고 있어야 api를 호출해준다. 그러므로 Ingress Controller가 Ingress를 생성하고 모니터링하려면 IAM의 권한이 필요하다. 

 

OAuth 기반으로 동작하는 인증 방식은 토큰을 발행한다. IODC는 OAuth 프로토콜을 기반으로 동작하기에 원리가 비슷하다.

 

 

 

 

EKS 클러스터는 EKS OIDC 제공업체(자격증명 공급자)를 생성하여 IAM에게 OIDC ID를 제공할 수 있다.

 

그럼 AWSLoadBalancerControllerIAMPolicy 정책을 가지고 있는 IAM이 OIDC ID를 토대로 EKS 안에 ServiceAccount를 생성한다. ServiceAccount는 k8s api-server가 인증하는 OIDC ID를 소유하고 있고 인가 가능한 정책을 수행할 수 있는 Role을 부여 받는다. 그러므로 해당 Service Account로 설정되어 생성된 Ingress Controller는 k8s api-server에 접근하여 Ingress 리소스를 생성 및 모니터링 할 수 있게 된다. 

 

 

 

 

 

 IAM이 AcessKey와 SecretKey를 ALB Ingress Controller에게 직접 제공하지 않아도, ALB Ingress Controller는 그에 준하는 권한으로 Ingress 리소스를 관리할 수 있게 되는 것이다. 

 

그럼 이 과정을 명령어로 살펴보자.

아래에 나올 내용은 aws cli, eksctl, kubectl 환경이 구성되어 있음을 가정한다. 환경설정과 관련된 내용은 아래 포스팅에 정리해두었다. 

 

 

[AWS] EKS에 ALB Ingress Controller 설치하기

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS 배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전

lordofkangs.tistory.com

 

 

1) OIDC 제공업체(자격증명 공급자) 생성하기 

cluster_name=eks
oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
echo $oidc_id

 

클러스터 이름을 본인에 맞게 변경한다.

 

2)  IAM에 OIDC ID 연동하기 

eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

 

 

3) AWSLoadBalancerControllerIAMPolicy 정책 생성하기 

# IAM 정책 생성을 위한 json 파일 다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/AWSLoadBalancerController.json

# IAM 정책 생성
aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json

 

 

4) ServiceAccount 생성하기 

eksctl create iamserviceaccount \
  --cluster=your-cluster-name \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --role-name AmazonEKSLoadBalancerControllerRole \
  --attach-policy-arn=arn:aws:iam::22211111333:policy/AWSLoadBalancerControllerIAMPolicy \
  --approve

 

클러스터 이름과 22211111333을 본인에 맞게 변경한다.

 

 

5) Ingress Controller 생성하기 

helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=eks \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller

 

 

클러스터 이름을 본인에 맞게 바꾸어 준다. 

 

ServiceAccount를 위에서 생성한 것으로 설정해준다. 그럼 k8s-api는 해당 ServiceAccount를 가진 Ingress Controller의 요청을 인증 및 인가해준다. 

 

 


 

 

참고자료

 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

 

클러스터의 IAM OIDC 제공업체 생성 - Amazon EKS

EKS VPC 엔드포인트를 활성화할 경우 해당 VPC 내에서 EKS OIDC 서비스 엔드포인트에 액세스할 수 없습니다. 따라서 VPC에서 eksctl을 통해 OIDC 공급자를 생성하는 등의 작업은 작동하지 않으며 https://oid

docs.aws.amazon.com

 

OpenID(OIDC) 개념과 동작원리

등장배경 이전에는 사용자 데이터를 서비스에서 직접 관리하는 경우가 대다수였다. 하지만 해킹, 피싱등으로 인한 개인정보 유출 사건이 끊임없이 발생하자, 서비스에서 직접 사용자 데이터를

hudi.blog

 

반응형

'DevOps > AWS' 카테고리의 다른 글

[AWS] EKS에 ALB Ingress Controller 설치하기  (0) 2023.11.08
[AWS] VPC와 Subnet 이해하기 ( + CIDR )  (0) 2023.11.02