- [실습] 2. EKS 인증/인가 - EC2 Instance Profile(IAM Role)에 맵핑된 k8s rbac 확인 해보기2024년 04월 13일
- yeongki0944
- 작성자
- 2024.04.13.:06
1. 노드 mapRoles 확인
# 노드 IP 확인 및 PrivateIP 변수 지정 N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=us-east-1a -o jsonpath={.items[0].status.addresses[0].address}) N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=us-east-1b -o jsonpath={.items[0].status.addresses[0].address}) N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=us-east-1c -o jsonpath={.items[0].status.addresses[0].address}) echo "export N1=$N1" >> /etc/profile echo "export N2=$N2" >> /etc/profile echo "export N3=$N3" >> /etc/profile echo $N1, $N2, $N3 # 노드 보안그룹 ID 확인 NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text) aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32 aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.200/32 # 워커 노드 SSH 접속 for node in $N1 $N2 $N3; do ssh -o StrictHostKeyChecking=no ec2-user@$node hostname; done for node in $N1 $N2 $N3; do ssh ec2-user@$node hostname; done
# 노드에 STS ARN 정보 확인 : Role 뒤에 인스턴스 ID! for node in $N1 $N2 $N3; do ssh ec2-user@$node aws sts get-caller-identity --query Arn; done
# aws-auth 컨피그맵 확인 >> system:nodes 와 system:bootstrappers 의 권한은 어떤게 있는지 찾아보세요! # username 확인! 인스턴스 ID? EC2PrivateDNSName? kubectl describe configmap -n kube-system aws-auth
# Get IAM identity mapping(s) eksctl get iamidentitymapping --cluster $CLUSTER_NAME
2. awscli 파드를 추가하고, 해당 노드(EC2)의 IMDS 정보 확인 : AWS CLI v2 파드 생성
# awscli 파드 생성 cat <<EOF | kubectl create -f - apiVersion: apps/v1 kind: **Deployment** metadata: name: awscli-pod spec: **replicas: 2** selector: matchLabels: app: awscli-pod template: metadata: labels: app: awscli-pod spec: containers: - name: awscli-pod image: **amazon/aws-cli** command: ["tail"] args: ["-f", "/dev/null"] terminationGracePeriodSeconds: 0 EOF
# 파드 생성 확인 kubectl get pod -owide
# 파드 이름 변수 지정 APODNAME1=$(kubectl get pod -l app=awscli-pod -o jsonpath={.items[0].metadata.name}) APODNAME2=$(kubectl get pod -l app=awscli-pod -o jsonpath={.items[1].metadata.name}) echo $APODNAME1, $APODNAME2
# awscli 파드에서 EC2 InstanceProfile(IAM Role)의 ARN 정보 확인 kubectl exec -it $APODNAME1 -- aws sts get-caller-identity --query Arn kubectl exec -it $APODNAME2 -- aws sts get-caller-identity --query Arn
# awscli 파드에서 EC2 InstanceProfile(IAM Role)을 사용하여 AWS 서비스 정보 확인 >> 별도 IAM 자격 증명이 없는데 어떻게 가능한 것일까요? # > 최소권한부여 필요!!! >>> 보안이 허술한 아무 컨테이너나 탈취 시, IMDS로 해당 노드의 IAM Role 사용 가능! kubectl exec -it $APODNAME1 -- **aws ec2 describe-instances --region ap-northeast-2 --output table --no-cli-pager** kubectl exec -it $APODNAME2 -- **aws ec2 describe-vpcs --region ap-northeast-2 --output table --no-cli-pager**
# EC2 메타데이터 확인 : IDMSv1은 Disable, IDMSv2 활성화 상태, IAM Role - [링크](<https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html>) kubectl exec -it $APODNAME1 -- bash
# 파드에 bash shell 에서 실행 curl -s <http://169.254.169.254/> -v
# 파드에 bash shell 에서 실행 - Token 요청 curl -s -X PUT "<http://169.254.169.254/latest/api/token>" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" ; echo curl -s -X PUT "<http://169.254.169.254/latest/api/token>" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" ; echo
# 파드에 bash shell 에서 실행 - Token을 이용한 IMDSv2 사용 TOKEN=$(curl -s -X PUT "<http://169.254.169.254/latest/api/token>" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") echo $TOKEN curl -s -H "X-aws-ec2-metadata-token: $TOKEN" –v <http://169.254.169.254/> ; echo curl -s -H "X-aws-ec2-metadata-token: $TOKEN" –v <http://169.254.169.254/latest/> ; echo curl -s -H "X-aws-ec2-metadata-token: $TOKEN" –v <http://169.254.169.254/latest/meta-data/iam/security-credentials/> ; echo
# 파드에 bash shell 에서 실행 - 위에서 출력된 IAM Role을 아래 입력 후 확인 curl -s -H "X-aws-ec2-metadata-token: $TOKEN" –v <http://169.254.169.254/latest/meta-data/iam/security-credentials/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-1DC6Y2GRDAJHK> ## 출력된 정보는 AWS API를 사용할 수 있는 어느곳에서든지 Expiration 되기전까지 사용 가능
# 파드에서 나오기 exit
다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)