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이다.
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 환경이 구성되어 있음을 가정한다. 환경설정과 관련된 내용은 아래 포스팅에 정리해두었다.
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의 요청을 인증 및 인가해준다.
참고자료
'DevOps > AWS' 카테고리의 다른 글
[AWS] EKS에 ALB Ingress Controller 설치하기 (0) | 2023.11.08 |
---|---|
[AWS] VPC와 Subnet 이해하기 ( + CIDR ) (0) | 2023.11.02 |