EKS Cluster의 Service Account에 IAM Role을 부여 = IRSA(IAM Roles for Service Accounts)
완벽하지는 않지만 공식 홈페이지와 다른 블로그를 참조해서 정리를 해보았다.
쿠버네티스에서 요구 사항에 맞는 IAM 역할을 생성할 수 있다. -> Pod 수준에서 세분화된 역할을 생성하여 최소 권한의 보안 원칙을 가능하게 한다. -> 클러스터에 대한 IAM OIDC 공급자를 연결 = 클러스터에는 OIDC 발급자 URL이 이미 존재
클러스터 만들면서 되어야 한다.eksctl, aws 콘솔을 이용해서 OIDC 공급자를 생성할 수 있다.
각 EKS Cluster 마다 가지고 있는 전용 OIDC Identity Provider를 나타낸다. AWS IAM에게 신뢰하는 OIDC Identity Provider로 등록(Federate)되어 있다. -> 클러스터를 생성하면 OIDC 인증기관 주소가 함께 생성되어 제공이 된다.
정상적으로 서비스 어카운트가 생성이 되면 결과물에 oidc.eks라는 결과가 Condition에 나타난다.
또한 쿠버네티스 서비스 계정에 역할이 annotaions로 달린다.
Annotiations를 기반으로 동작한다.
Private/ Public Key : AWS EKS OIDC provider와 쿠버네티스 API 서버는 동일한 Key를 공유하게 된다.
Pod Identity Webhook : API 서버로 요청을 보내면 API 서버가 Mutating Webhook에 요청 Pod가 IAM Role을 가진 Service Accout를 이용하는 경우 Pod 내부에서 Service Account에 부여된 IAM Role을 이용할 수 있도록 Spec을 변경한다.
Mutating Webhook?
쿠버네티스는 접근 제어를 3단계로 진행한다. 1 Authentication(인증) 2. Authorization(인가) 3. Admission Control(?)
Admission Control : 인증과 인가를 통과한 사용자에 한해서 Admin이 추가로 특정 행동을 제한 혹은 변경하는 작업 -> 세부 작업에 대한 지침 사항 이때 2단계를 걸쳐서 제한, 변경이 되는데 Mutata, Validate이다.
쿠버네티스 특징으로 API로 통신이 되는데 Webhook으로 Admission Control을 동작 시킬 수 있다.
MutatingWebhook : 사용자가 요청한 Req에 대해서 관리자가 임의로 값을 변경하는 작업 ValidatingWebhook : 사용자가 요청한 Req에 대해 관리자가 허용을 막는 작업-> 인증, 인가를 통과한 후 Mutat 한 뒤 변경된 내용을 Validate (검증) 후 etcd에 저장 후 작업이 이어진다.
Projected SA Token : IAM Role이 부여된 Service Account의 Token을 나타낸다.(K8s의 Service Account Token과 별개의 Token) = JWT 형태
Projected SA Token가 Pod에 있어도AssumeRoleWithWebIdentity(임시 보안 자격 증명)을 사용하기 위해서는 OIDC의 정보를 담은 JWT Token이 필요하다. 원래라면 OIDC의 ID Token(인가를 위한)이 필요한데 API 서버가 OIDC의 Private/ Public key를 가지고 있어서 직접 JWT Token을 생성해서 Pod에 주입한다.
IAM Role 부여 과정
0. EKS 클러스터의 OIDC Provider를 생성해 Private/ Public Key를 Provider와 K8s API Server가 공유한다.
1. eksctl을 이용해서 iamserivice account를 생성한다. "eksctl create iamserviceaccount"
2. Pod를 생성 할 때 service account를 넣어서 생성한다. (aws lb controller 를 배포 할떄 포함되어 있다)
3. K8s API 서버로 Pod 생성요청을 보내면 API 서버가 serviceaccount를 확인해 Pod Identity Webhook에 의해 강제로 Pod에 '부여 받는 AWS IAM Role, JWT Token의 위치, 클러스터 리전 정보'가 주입 된다. = Spec Mutate
JWT Token의 위치는 aws-iam-token 이름의 Projected SA Token Volume을 생성하고 Mount하도록 만들고 Projected SA Token으로 저장된다. (만료시간, Audience 설정도 포함)
3-1. Token을 바로 Pod에 저장될 때 API 서버에게 SA Token을 요청하고 받아서 Pod에 Projected SA Token을 저장한다.
4. Mutate된 Pod 생성 Req를 Kubelet에 API 서버가 보내서 kubelet이 Pod를 생성한다.
5. Pod가 AWS STS/IAM에게 Projected SA Token의 credential(자격증명)을 요청 하면 AWS STS/IAM은 AWS EKS OIDC Provider에게 검증을 하는데 Projected SA Token은 같은 키를 가진 API 서버가 만든 Token 이어서 검증을 성고해 자격증명을 허락한다.
AWS Loadbalancer Controller는 클러스터 내에 Pod로 배포가되어 동작하는데 Pod가 AWS 리소스인 LB를 생성하거나 지우기 위해서는 IAM Role, Policy가 필요하다.
이 때 사용되는 것이 IRAS (IAM Role for Service Account) 개념이다.
쉽게 설명하면 Pod에게 IAM Role을 부여해주는 Service Account를 만들어 접근 권한, 사용 권한을 얻는것이다.
IRAS?
우선 RBAC(Role Based Access Control)에 대해 알아야 한다. '역할기반 접근제어'라는 뜻으로 시스템 보안에서 권한이 있는 사용자들에게 시스템 접근을 통제하는 방법이다. -> RBAC는 보안에대한 부분이다.
K8S에서 접근을 제어하는 방법은 Role, RoleBinding, ServiceAccount 객체들을 이용할 수 있다.
Role이 바인딩된 ServiceAccount를 Pod에 할당함으로 Pod는 지정된 Role을 사용 할 수있다.
AWS는 IAM을 이용해 RBAC를 구현했다.
EKS에서는 Service Account에 annotation(임의의 비식별 메타데이터)를 통해서 IAM Role을 부여하고 이를 통해 Service Account를 사용하는 Service는 해당 권한을 갖는것
-> RBAC를 AWS IAM Role과 K8S ServiceAccount를 이용해서 구현한것을 IRAS라고 한다.
EKS는 사용자가 IAM 사용자를 인증받아 대상 클러스터에 kubectl 명령어로 접근 할 수 있으며 Cluster를 생성한 IAM 사용자 또는 역할의 ARN만 aws-auth ConfigMap에 추가한다. -> ConfigMap을 직접 수정 해야한다.
만약 IAM에서 EKS 관련 권한을 때려박은 사용자로 kubectl을 통해 접근하려고 하면 error: You must be logged in to the server (Unauthorized) 라는 에러가 발생한다. aws eks update-kubeconfig를 해도 마찬가지 이다.
밑의 블로그에서 EKS의 RBAC를 만드는 것과 IAM을 수동으로 묶어서 사용하는 내용이 있다.
IAM 구성 맵에 사용되는 ARN 역할의 경로를 허용하지 않습니다. aws-auth ConfigMap의 ARN(rolearn)에 경로가 포함되어 있으면 EKS는 오류를 반환한다. error: You must be logged in to the server (Unauthorized)