Home
home

4장 실습 - Amazon EKS - 인증 및 인가 구성하기

1. 기본 환경 배포

이번 실습은 IAM 사용자 계정을 통해 관리 콘솔에 접근하고 액세스 키를 활용해 awscli 도구를 사용합니다.
해당 작업을 수행하지 않았다면 아래 토글을 확장해 작업을 선행하고 본격적인 실습에 들어갑니다.
IAM 사용자 생성 및 액세스 키 생성

1.1. Terraform을 통한 기본 인프라 배포

Terraform을 통한 기본 인프라 배포에 앞서 SSH 키 페어, IAM User Access Key ID, IAM User Secret Access Key를 미리 확인하고 메모해 둡니다.
Terraform으로 기본 인프라 배포
cd cnaee_class_tf/ch4
Bash
복사
# 실습 디렉터리 경로 진입
export TF_VAR_KeyName=[각자 ssh keypair] export TF_VAR_MyIamUserAccessKeyID=[각자 iam 사용자의 access key id] export TF_VAR_MyIamUserSecretAccessKey=[각자 iam 사용자의 secret access key] export TF_VAR_SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32
Bash
복사
# Terraform 환경 변수 저장
terraform init terraform plan terraform apply -auto-approve
Bash
복사
# Terraform 배포
Terraform을 통한 기본 인프라 배포가 완료되면 관리 콘솔에서 생성된 인프라들을 확인합니다.
Note: 
AWS 관리 콘솔에 로그인 할 땐 IAM 사용자 계정으로 진행합니다.

1.2. 기본 정보 확인 및 설정

Terraform 배포가 완료 후 출력되는 Output 정보에서 bastion_1_ip의 퍼블릭 IP를 확인합니다.
해당 IP로 EKS 관리용 인스턴스(myeks-bastion-1)에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.
Note:
myeks-bastion-1의 OS 변경으로 SSH 접근에 대한 계정을 ubuntu로 지정합니다.
(ssh -i ~/.ssh/XXXX.pem ubuntu@X.X.X.X)
[Bastion-1] 기본 설정 및 확인
aws eks update-kubeconfig \ --region $AWS_DEFAULT_REGION \ --name $CLUSTER_NAME
Shell
복사
# EKS 클러스터 인증 정보 업데이트
kubens default
Bash
복사
# kubens default 설정
echo $AWS_DEFAULT_REGION echo $CLUSTER_NAME echo $VPCID echo $PublicSubnet1,$PublicSubnet2,$PublicSubnet3 echo $PrivateSubnet1,$PrivateSubnet2,$PrivateSubnet3
Bash
복사
# 변수 호출 종합
eksctl get cluster
Bash
복사
# eksctl을 통한 eks cluster 정보 확인
eksctl get nodegroup \ --cluster $CLUSTER_NAME \ --name ${CLUSTER_NAME}-node-group
Bash
복사
# eksctl을 통한 노드 그룹 정보 확인
kubectl get node -owide
Bash
복사
# kubectl을 통한 노드 정보 확인
IAM_USER=$(aws iam get-user --query 'User.UserName' --output text) echo "export IAM_USER=$IAM_USER" >> /etc/profile echo $IAM_USER
Bash
복사
# 각자의 IAM User 이름 변수 선언
Note:
실습에 사용할 IAM User 이름이 가이드에 따르면 admin이겠지만, 다른 이름이라면 해당 이름으로 선언됩니다.
PublicN1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address}) PublicN2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address}) PublicN3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address}) echo "export PublicN1=$PublicN1" >> /etc/profile echo "export PublicN2=$PublicN2" >> /etc/profile echo "export PublicN3=$PublicN3" >> /etc/profile echo $PublicN1, $PublicN2, $PublicN3
Bash
복사
# 노드 IP 변수 선언
for node in $PublicN1 $PublicN2 $PublicN3; \ do \ ssh -i ~/.ssh/kp_node.pem -o StrictHostKeyChecking=no ec2-user@$node hostname; \ done
Bash
복사
# 노드에 ssh 접근 확인

2. EKS 사용자 인증 & 인가 확인 및 구성

EKS 사용자를 위한 인증 및 인가 작업을 수행합니다.

2.1. EKS 사용자 인증 및 인가 확인

[Bastion-1] krew 도구 설치 및 확인
curl -L https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz -o /root/krew-linux_amd64.tar.gz tar zxvf krew-linux_amd64.tar.gz ./krew-linux_amd64 install krew export PATH="$PATH:/root/.krew/bin" echo 'export PATH="$PATH:/root/.krew/bin"' >> /etc/profile
Bash
복사
# krew 설치
kubectl krew install access-matrix rbac-tool rolesum whoami rbac-view kubectl krew list
Bash
복사
# RBAC 관련 도구 설치 및 리스트
kubectl whoami
Bash
복사
# Kubernetes에 현재 인증된 주체의 정보 확인
kubectl access-matrix
Bash
복사
# Kubernetes 클러스터 리소스에 대한 접근 권한을 매트릭스 형태로 시각화
kubectl access-matrix --namespace default
Bash
복사
# Kubernetes 네임스페이스 리소스에 대한 접근 권한을 매트릭스 형태로 시각화
kubectl rbac-tool lookup
Bash
복사
# 모든 Subject에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rbac-tool lookup system:masters
Bash
복사
# system:masters 그룹에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rolesum -h
Bash
복사
# Subject에 대한 RBAC 정보와 리소스 권한을 시각화 (help)
kubectl rolesum -k User system:kube-proxy
Bash
복사
# 특정 User에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl rolesum -k Group system:masters
Bash
복사
# 특정 Group에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl rolesum aws-node -n kube-system
Bash
복사
# aws-node SA에 대한 RBAC 정보와 연결된 리소스의 권한 확인
echo -e "rbac-view URL http://$(curl -s ipinfo.io/ip):8800"
Bash
복사
# rbac-view 접근 URL 확인
kubectl rbac-view
Bash
복사
# Kubernetes RBAC 권한을 시각화하는 GUI 도구 실행 (2~3분 대기)
Note:
rbac-view를 실행한 후 rbac-view URL로 접근합니다.
[Bastion-1] 사용자 인증/인가 분석 - 클러스터 인증 정보 확인
aws sts get-caller-identity --query Arn
Bash
복사
# sts caller id의 ARN 확인
cat ~/.kube/config | yh
Bash
복사
# kubeconfig 정보 확인
[Bastion-1] 사용자 인증/인가 분석 - STS 임시 자격 증명 토큰
aws eks get-token --cluster-name $CLUSTER_NAME | jq
Bash
복사
# 임시 STS 토큰 확인
aws eks get-token --cluster-name $CLUSTER_NAME --debug | jq
Bash
복사
# 임시 STS 토큰 확인(디버깅)
[Bastion-1] 사용자 인증/인가 분석 - 토큰 리뷰
kubectl api-resources | grep authentication
Bash
복사
# tokenreviews api 리소스 확인
kubectl explain tokenreviews
Bash
복사
# tokenreviews api 리소스 상세 설명
TEMP_TOKEN=$(aws eks get-token --cluster-name $CLUSTER_NAME | jq -r '.status.token'); echo $TEMP_TOKEN
Bash
복사
# 임시 토큰 변수 선언
cat > token-review.yaml << EOF apiVersion: authentication.k8s.io/v1 kind: TokenReview metadata: creationTimestamp: null spec: token: ${TEMP_TOKEN} status: {} EOF cat token-review.yaml | yh
Bash
복사
# 토큰 리뷰 파일 생성 및 확인
kubectl create -f token-review.yaml -v=8
Bash
복사
# 토큰 리뷰 생성(디버깅)
[Bastion-1] 사용자 인증/인가 분석 - eks 액세스 인증 검토
aws eks describe-cluster --name $CLUSTER_NAME \ --query 'cluster.accessConfig.authenticationMode' \ --region $AWS_DEFAULT_REGION
Bash
복사
# eks 액세스 인증 모드 확인
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
aws eks list-access-entries --cluster-name $CLUSTER_NAME
Bash
복사
# eks access-entries 리스트 확인
aws eks describe-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:role/${CLUSTER_NAME}-node-group-eks-node-group | jq
Bash
복사
# node-group role에 대한 access-entry
aws eks list-associated-access-policies \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:role/${CLUSTER_NAME}-node-group-eks-node-group | jq
Bash
복사
# node-group role에 대한 access-policy
aws eks describe-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:user/${IAM_USER} | jq
Bash
복사
# 현재 eks 사용자에 대한 access-entry
aws eks list-associated-access-policies \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/${IAM_USER} | jq
Bash
복사
# 현재 eks 사용자에 대한 access-policy
kubectl rbac-tool whoami
Bash
복사
# 현재 eks 사용자에 대한 권한 확인
[Bastion-1] 사용자 인증/인가 분석 - kubernetes RBAC 확인
kubectl rbac-tool lookup system:nodes
Bash
복사
# system:nodes 그룹에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rolesum -k Group system:nodes
Bash
복사
# system:nodes 그룹에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl describe clusterrolebinding eks:node-bootstrapper
Bash
복사
# eks:node-bootstrapper ClusterRoleBinding 확인
kubectl describe clusterrole eks:node-bootstrapper
Bash
복사
# eks:node-bootstrapper ClusterRole 확인
kubectl rbac-tool lookup system:authenticated
Bash
복사
# system:authenticated 그룹에 대한 RBAC 정책을 쿼리하고 권한 관계를 시각화
kubectl rolesum -k Group system:authenticated
Bash
복사
# system:authenticated 그룹에 대한 RBAC 정보와 연결된 리소스의 권한 확인
kubectl describe clusterrolebinding system:basic-user
Bash
복사
# system:basic-user ClusterRoleBinding 확인
kubectl describe clusterrole system:basic-user
Bash
복사
# system:basic-user ClusterRole 확인
kubectl describe ClusterRole system:discovery
Bash
복사
# system:discovery ClusterRole 확인
kubectl describe ClusterRole system:public-info-viewer
Bash
복사
# system:public-info-viewer ClusterRole 확인
kubectl describe ClusterRole cluster-admin
Bash
복사
# system:public-info-viewer ClusterRole 확인

2.2. 신규 EKS 사용자의 인증 및 인가 구성 (ConfigMap 방식)

myeks-bastion-2에 신규 EKS 사용자를 위한 인증 및 인가 작업을 수행합니다.
이번에 액세스 인증 모드는 ConfigMap을 활용한 이전 방식으로 테스트합니다.
[Bastion-1] IAM 사용자 생성 및 설정
aws iam create-user --user-name testuser
Shell
복사
# testuser IAM 사용자 생성
aws iam create-access-key --user-name testuser
Bash
복사
# testuser에 프로그래밍 방식 액세스 권한 부여
aws iam attach-user-policy \ --policy-arn arn:aws:iam::aws:policy/AdministratorAccess \ --user-name testuser
Bash
복사
# testuser에 AdministratorAccess 정책을 추가
Warning:
신규 IAM 사용자인 testuser에 대한 AccessKeyID와 SecretAccessKey 값을 메모해두고 아래 실습 환경 구성 시에 활용합니다. 실습이 종료되면 해당 IAM 사용자는 반드시 삭제해 주세요. (마지막 실습 자원 삭제에 명시)
[Bastion-2] krew 도구 설치 및 확인
curl -L https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz -o /root/krew-linux_amd64.tar.gz tar zxvf krew-linux_amd64.tar.gz ./krew-linux_amd64 install krew export PATH="$PATH:/root/.krew/bin" echo 'export PATH="$PATH:/root/.krew/bin"' >> /etc/profile
Bash
복사
# krew 설치
kubectl krew install access-matrix rbac-tool rolesum whoami rbac-view
Bash
복사
# RBAC 관련 도구 설치
[Bastion-2] IAM 사용자 자격 증명 설정
aws sts get-caller-identity --query Arn
Bash
복사
# get-caller-identity 확인
aws configure
Bash
복사
# testuser 자격증명 설정
Note:
위에서 생성한 testuser에 대한 AccessKeyID와 SecretAccessKey 값을 입력합니다.
aws sts get-caller-identity --query Arn
Bash
복사
# get-caller-identity 확인
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
ls ~/.kube
Bash
복사
# .kube 디렉터리 확인
aws eks update-kubeconfig \ --name $CLUSTER_NAME \ --user-alias testuser
Bash
복사
# testuser의 EKS 클러스터 인증 정보 업데이트
cat ~/.kube/config | yh
Bash
복사
# kubeconfig 확인
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
[Bastion-1] aws-auth ConfigMap 작성
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
Bash
복사
# aws-auth에 등록된 IAM과 Kubernetes 그룹 매핑 정보 확인
eksctl create iamidentitymapping \ --cluster $CLUSTER_NAME \ --username testuser \ --group system:masters \ --arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# aws-auth에 testuser와 system:master 그룹 매핑
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
kubectl rolesum -k Group system:masters
Bash
복사
# system:masters 그룹에 대한 RBAC 정보와 연결된 리소스의 권한 확인
[Bastion-2] IAM 사용자의 kubectl 동작 확인
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
kubectl auth can-i get pods --all-namespaces kubectl auth can-i create pods --all-namespaces kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces kubectl auth can-i create ns --all-namespaces kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
kubectl rbac-tool whoami
Bash
복사
# 현재 eks testuser 사용자에 대한 권한 확인
[Bastion-1] iamidentitymapping 삭제
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
Bash
복사
# aws-auth에 등록된 IAM과 Kubernetes 그룹 매핑 정보 확인
eksctl delete iamidentitymapping \ --cluster $CLUSTER_NAME \ --arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# aws-auth에 testuser와 system:master 그룹 매핑 삭제
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
Bash
복사
# aws-auth에 등록된 IAM과 Kubernetes 그룹 매핑 정보 확인
kubectl get cm -n kube-system aws-auth -o yaml | yh
Bash
복사
# aws-auth ConfigMap 확인
[Bastion-2] kubectl 명령 수행 및 kubeconfig 삭제
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
kubectl auth can-i get pods --all-namespaces kubectl auth can-i create pods --all-namespaces kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces kubectl auth can-i create ns --all-namespaces kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
rm ~/.kube/config
Bash
복사
# kubeconfig 삭제
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도

2.3. 신규 EKS 사용자의 인증 및 인가 구성 (EKS API 방식)

myeks-bastion-2에 신규 EKS 사용자를 위한 인증 및 인가 작업을 수행합니다.
이번 액세스 인증 모드는 access-entry에 access-policy를 연결하는 신규 방식으로 테스트합니다.
[Bastion-1] access-entries와 access-policies 확인
aws eks list-access-entries --cluster-name $CLUSTER_NAME
Bash
복사
# eks access-entries 리스트 확인
aws eks list-access-policies --output table
Bash
복사
# eks access-policies 리스트 확인
aws eks describe-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:user/${IAM_USER} | jq
Bash
복사
# admin 사용자에 대한 access-entry 확인
aws eks list-associated-access-policies \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/${IAM_USER} | jq
Bash
복사
# admin 사용자에 대한 access-policy 확인
[Bastion-1] testuser의 access-entry와 access-policy 설정
aws eks create-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# testuser 사용자의 access entry 생성
aws eks list-access-entries --cluster-name $CLUSTER_NAME
Bash
복사
# eks access-entries 리스트 확인
aws eks associate-access-policy \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \ --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAdminViewPolicy \ --access-scope type=cluster
Bash
복사
# testuser 사용자의 access-policy 연결
aws eks describe-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-entry 확인
aws eks list-associated-access-policies \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-policy 확인
[Bastion-2] IAM 사용자의 kubeconfig 업데이트 및 권한 확인
aws eks update-kubeconfig \ --name $CLUSTER_NAME \ --user-alias testuser
Bash
복사
# testuser의 EKS 클러스터 인증 정보 업데이트
kubectl get node -v=6
Bash
복사
# kubectl get 명령어 시도
kubectl create ns testns -v=6
Bash
복사
# kubectl create ns 명령어 시도
kubectl auth can-i get pods --all-namespaces kubectl auth can-i create pods --all-namespaces kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces kubectl auth can-i create ns --all-namespaces kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
이번에는 access-entry에 대한 연결을 kubernetes-group으로 연결하여 커스터마이징 합니다.
[Bastion-1] kubernetes group 생성
cat <<EoF> pod-viewer-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pod-viewer-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch"] EoF kubectl apply -f pod-viewer-role.yaml
Bash
복사
# pod-viewer-role ClusterRole 생성
cat <<EoF> pod-admin-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pod-admin-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["*"] EoF kubectl apply -f pod-admin-role.yaml
Bash
복사
# pod-admin-role ClusterRole 생성
kubectl create clusterrolebinding pod-viewer-role-binding \ --clusterrole=pod-viewer-role \ --group=pod-viewer
Bash
복사
# pod-viewer-role-binding ClusterRoleBinding 생성(pod-viewer group)
kubectl create clusterrolebinding pod-admin-role-binding \ --clusterrole=pod-admin-role \ --group=pod-admin
Bash
복사
# pod-admin-role-binding ClusterRoleBinding 생성(pod-admin group)
kubectl rolesum -k Group pod-viewer kubectl rolesum -k Group pod-admin
Bash
복사
# pod-viewer와 pod-admin group에 대한 RBAC 정보와 연결된 리소스의 권한 확인
[Bastion-1] acccess-entry 생성(pod-viewer group 연결)
aws eks delete-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser
Bash
복사
# testuser 사용자의 기존 access-entry 삭제
aws eks create-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \ --kubernetes-group pod-viewer
Bash
복사
# testuser 사용자의 신규 access-entry 생성(pod-viewer group 연결)
aws eks describe-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-entry 확인
aws eks list-associated-access-policies \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-policy 확인
[Bastion-2] kubectl 권한 확인
kubectl auth can-i get pods --all-namespaces kubectl auth can-i create pods --all-namespaces kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces kubectl auth can-i create ns --all-namespaces kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인
[Bastion-1] acccess-entry 업데이트(pod-admin group 연결)
aws eks update-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::$ACCOUNT_ID:user/testuser \ --kubernetes-group pod-admin
Bash
복사
# testuser 사용자의 access-entry 업데이트(pod-admin group 연결)
aws eks describe-access-entry \ --cluster-name $CLUSTER_NAME \ --principal-arn arn:aws:iam::${ACCOUNT_ID}:user/testuser | jq
Bash
복사
# testuser 사용자에 대한 access-entry 확인
[Bastion-2] kubectl 권한 확인
kubectl auth can-i get pods --all-namespaces kubectl auth can-i create pods --all-namespaces kubectl auth can-i delete pods --all-namespaces
Bash
복사
# kubectl get/create/delete pods 권한 여부 확인
kubectl auth can-i get ns --all-namespaces kubectl auth can-i create ns --all-namespaces kubectl auth can-i delete ns --all-namespaces
Bash
복사
# kubectl get/create/delete ns 권한 여부 확인

3. EKS IRSA & Pod Identity 구성

EKS 클러스터 내에 파드가 AWS 자원을 사용하기 위한 권한을 정의하는 방식을 실습합니다.

3.1. EKS Instance Profile 확인

[Bastion-1] Instance Profile IAM 확인
aws iam list-attached-role-policies \ --role-name ${CLUSTER_NAME}-node-group-eks-node-group \ --output table
Bash
복사
# 노드의 Instance Profile에 정의된 IAM Policy 확인
aws iam get-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy | jq
Bash
복사
# IAM Role에 정의된 IAM Policy 확인(AmazonEKS_CNI_Policy)
aws iam get-policy-version \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --version-id v5 | jq
Bash
복사
# AmazonEKS_CNI_Policy 정보 확인
Note:
Instance Profile을 정의하면 노드에 구성된 모든 파드에 반영됩니다. 이는 최소 권한 부여 원칙에 위배되어 권고하지 않습니다.
[Bastion-1] Instance Profile 테스트용 파드 2대 생성 및 확인
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: eks-iam-red labels: app: same-node spec: containers: - name: red-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 --- apiVersion: v1 kind: Pod metadata: name: eks-iam-blue labels: app: same-node spec: containers: - name: blue-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl exec -it eks-iam-red \ -- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \ -- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
[Bastion-1] Instance Profile IAM Policy 추가
aws iam attach-role-policy \ --role-name ${CLUSTER_NAME}-node-group-eks-node-group \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
Bash
복사
# IAM Role에 IAM Policy 추가(s3 readonly)
aws iam list-attached-role-policies \ --role-name ${CLUSTER_NAME}-node-group-eks-node-group \ --output table
Bash
복사
# 노드의 Instance Profile에 정의된 IAM Role
kubectl exec -it eks-iam-red \ -- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \ -- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
[Bastion-1] 자원 삭제
aws iam detach-role-policy \ --role-name ${CLUSTER_NAME}-node-group-eks-node-group \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
Bash
복사
# IAM Role에 IAM Policy 해제(s3 readonly)
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제

3.2. EKS IRSA 확인

[Bastion-1] ServiceAccount 확인
kubectl get sa
Bash
복사
# default 네임스페이스의 ServiceAccount 확인
kubectl get sa -n kube-system
Bash
복사
# kube-system 네임스페이스의 ServiceAccount 확인
kubectl describe sa default
Bash
복사
# default ServiceAccount 정보 확인
[Bastion-1] IRSA 테스트용 파드 2대 생성 및 확인 - 1
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: eks-iam-red labels: app: same-node spec: containers: - name: red-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never automountServiceAccountToken: false terminationGracePeriodSeconds: 0 --- apiVersion: v1 kind: Pod metadata: name: eks-iam-blue labels: app: same-node spec: containers: - name: blue-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl get pod eks-iam-red -o yaml | yh
Bash
복사
# red 파드 설정 정보 확인
kubectl get pod eks-iam-blue -o yaml | yh
Bash
복사
# blue 파드 설정 정보 확인
kubectl exec -it eks-iam-red \ -- ls /var/run/secrets/kubernetes.io/serviceaccount kubectl exec -it eks-iam-red \ -- cat /var/run/secrets/kubernetes.io/serviceaccount/token ;echo
Bash
복사
# red 파드 토큰 정보 확인
kubectl exec -it eks-iam-blue \ -- ls /var/run/secrets/kubernetes.io/serviceaccount kubectl exec -it eks-iam-blue \ -- cat /var/run/secrets/kubernetes.io/serviceaccount/token ;echo
Bash
복사
# blue 파드 토큰 정보 확인
BLUE_SA_TOKEN=$(kubectl exec -it eks-iam-blue -- cat /var/run/secrets/kubernetes.io/serviceaccount/token); echo $BLUE_SA_TOKEN
Bash
복사
# blue 파드의 ServiceAccount 토큰 확인
echo $BLUE_SA_TOKEN | cut -d '.' -f2 | base64 -d | jq .
Bash
복사
# BLUE_SA_TOKEN jwt decode
aws eks describe-cluster --name $CLUSTER_NAME \ --query "cluster.identity.oidc.issuer" \ --output text
Bash
복사
# eks 클러스터 OIDC 공급자 URL 확인
kubectl exec -it eks-iam-red \ -- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \ -- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제
[Bastion-1] IRSA 생성
eksctl create iamserviceaccount \ --name red-sa \ --namespace default \ --cluster $CLUSTER_NAME \ --approve \ --attach-policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3ReadOnlyAccess`].Arn' --output text)
Bash
복사
# eksctl을 통한 IRSA 생성 (S3 ReadOnly)
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
Bash
복사
# eksctl을 통한 IRSA 확인
Note:
eksctl을 통해 IRSA를 생성하면 CloudFormation 스택에 의해 자원이 생성됩니다.
ROLE_NAME=$(eksctl get iamserviceaccount --cluster $CLUSTER_NAME | awk 'NR>1 {print $3}' | awk -F'/' '{print $2}'); echo $ROLE_NAME
Bash
복사
# 생성된 IAM Role 이름을 변수 선언
aws iam get-role --role-name $ROLE_NAME | jq
Bash
복사
# 생성된 IAM Role의 신뢰 관계 확인
kubectl get sa
Bash
복사
# default 네임스페이스의 ServiceAccount 확인
kubectl describe sa red-sa
Bash
복사
# red-sa ServiceAccount 정보 확인
[Bastion-1] IRSA 테스트용 파드 2대 생성 및 확인 - 2
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: eks-iam-red labels: app: same-node spec: serviceAccountName: red-sa containers: - name: red-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 --- apiVersion: v1 kind: Pod metadata: name: eks-iam-blue labels: app: same-node spec: containers: - name: blue-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl get pod eks-iam-red -o yaml | yh
Bash
복사
# red 파드 설정 정보 확인
kubectl exec -it eks-iam-red \ -- ls /var/run/secrets/eks.amazonaws.com/serviceaccount kubectl exec -it eks-iam-red \ -- cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token ;echo
Bash
복사
# red 파드 토큰 정보 확인
RED_SA_TOKEN=$(kubectl exec -it eks-iam-red -- cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token); echo $RED_SA_TOKEN
Bash
복사
# red 파드의 ServiceAccount 토큰 확인
echo $RED_SA_TOKEN | cut -d '.' -f2 | base64 -d | jq .
Bash
복사
# RED_SA_TOKEN jwt decode
kubectl exec -it eks-iam-red \ -- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \ -- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-red \ -- aws ec2 describe-instances --region ap-northeast-2
Bash
복사
# red 파드에서 ec2 조회
kubectl exec -it eks-iam-red \ -- aws ec2 describe-vpcs --region ap-northeast-2
Bash
복사
# red 파드에서 vpc 조회
[Bastion-1] 자원 삭제
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제

3.3. EKS Pod Identity 확인

[Bastion-1] pod identity agent 설치 확인
aws eks describe-addon-versions \ --addon-name eks-pod-identity-agent \ --kubernetes-version 1.30 \ --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \ --output text
Bash
복사
# Kubernetes 버전에 pod identity addon 버전 확인
eksctl get addon --cluster $CLUSTER_NAME
Bash
복사
# eks 클러스터 addon 확인
kubectl get ds eks-pod-identity-agent -n kube-system
Bash
복사
# eks-pod-identity-agent 데몬셋 확인
kubectl get ds eks-pod-identity-agent -n kube-system -o yaml | yh
Bash
복사
# eks-pod-identity-agent 데몬셋 상세 정보
kubectl get pod -l app.kubernetes.io/name=eks-pod-identity-agent -n kube-system -owide
Bash
복사
# eks-pod-identity-agent 파드 확인
for node in $PublicN1 $PublicN2 $PublicN3; \ do \ ssh -i ~/.ssh/kp_node.pem ec2-user@$node sudo ss -tnlp | grep eks-pod-identit; \ echo "-----"; \ done
Bash
복사
# eks-pod-identity-agent 파드에 오픈된 포트 정보
aws iam get-policy-version \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \ --version-id v3 | jq
Bash
복사
# Instance Profile의 IAM Role - AmazonEKSWorkerNodePolicy 확인
[Bastion-1] pod identity association 생성 및 확인
eksctl create podidentityassociation \ --cluster $CLUSTER_NAME \ --namespace default \ --service-account-name blue-sa \ --role-name ec2-eks-pod-identity-role \ --permission-policy-arns arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess \ --region $AWS_DEFAULT_REGION
Bash
복사
# eksctl을 통한 pod-identity-association 생성(EC2 ReadOnly)
eksctl get podidentityassociation --cluster $CLUSTER_NAME
Bash
복사
# pod-identity-association 확인
aws iam get-role --role-name ec2-eks-pod-identity-role | jq
Bash
복사
# 생성된 IAM Role의 신뢰 관계 확인
kubectl get sa
Bash
복사
# default 네임스페이스의 ServiceAccount 확인
kubectl create sa blue-sa kubectl get sa
Bash
복사
# blue-sa ServiceAccount 생성 후 확인
kubectl describe sa red-sa
Bash
복사
# red-sa ServiceAccount 정보 확인
kubectl describe sa blue-sa
Bash
복사
# blue-sa ServiceAccount 정보 확인
[Bastion-1] Pod Identity 테스트용 파드 2대 생성 및 확인
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: eks-iam-red labels: app: same-node spec: serviceAccountName: red-sa containers: - name: red-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 --- apiVersion: v1 kind: Pod metadata: name: eks-iam-blue labels: app: same-node spec: serviceAccountName: blue-sa containers: - name: blue-aws-cli image: amazon/aws-cli:latest command: ['sleep', '36000'] affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: same-node topologyKey: "kubernetes.io/hostname" restartPolicy: Never terminationGracePeriodSeconds: 0 EOF
Bash
복사
# red/blue 파드 생성
kubectl get pod -owide
Bash
복사
# 생성된 파드 확인(동일 노드)
kubectl get pod eks-iam-blue -o yaml | yh
Bash
복사
# blue 파드 설정 정보 확인
kubectl get mutatingwebhookconfigurations pod-identity-webhook -o yaml | yh
Bash
복사
# Pod-Identity Mutating Webhook으로 Env와 Volume 추가
kubectl exec -it eks-iam-blue \ -- env | grep AWS
Bash
복사
# blue 파드에서 env 정보 확인
kubectl exec -it eks-iam-blue \ -- ls /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/ kubectl exec -it eks-iam-blue \ -- cat /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token; echo
Bash
복사
# blue 파드 토큰 정보 확인
kubectl exec -it eks-iam-red \ -- aws s3 ls
Bash
복사
# red 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-blue \ -- aws s3 ls
Bash
복사
# blue 파드에서 s3 리스트 확인
kubectl exec -it eks-iam-red \ -- aws ec2 describe-instances --region ap-northeast-2 | grep Architecture
Bash
복사
# red 파드에서 ec2 조회
kubectl exec -it eks-iam-blue \ -- aws ec2 describe-instances --region ap-northeast-2 | grep Architecture
Bash
복사
# blue 파드에서 ec2 조회

4. 실습 환경 삭제

4장 Amazon EKS 인증 및 인가 실습 환경 삭제와 Terraform 삭제 작업 모두를 진행합니다.

4.1. 실습 자원 삭제

[Bastion-1] 실습 애플리케이션 삭제
kubectl delete pod eks-iam-red eks-iam-blue
Bash
복사
# 테스트용 파드 삭제
[Bastion-1] IRSA와 Pod Identity Association 삭제
eksctl delete iamserviceaccount \ --name red-sa \ --namespace default \ --cluster $CLUSTER_NAME
Bash
복사
# eksctl을 통한 IRSA 삭제 (S3 ReadOnly)
eksctl delete podidentityassociation \ --service-account-name blue-sa \ --namespace default \ --cluster $CLUSTER_NAME
Bash
복사
# eksctl을 통한 pod-identity-association 삭제 (EC2 ReadOnly)
[관리 콘솔] IAM 사용자 삭제
IAM → 사용자 → testuser 대상 선택 → 삭제 버튼 → testuser 입력

4.2. Terraform 자원 삭제

Terraform 자원 삭제
terraform destroy -auto-approve
Bash
복사
# terraform 자원 삭제
Warning:
Terraform 삭제 동안 터미널을 유지하고 Terraform 삭제가 완료되면 정상적으로 자원 삭제 되었는지 꼭 확인을 합니다.
여기까지 4장의 첫 번째 실습인 Amazon EKS 인증 및 인가 실습을 마칩니다.
수고하셨습니다 :)