동작 : 사용자/애플리케이션 → k8s 사용 시 ⇒ 인증은 AWS IAM, 인가는 K8S RBAC


(스터디원분중 박준희 님이 정리해주셨다)
핵심은 인증은 AWS IAM, 인가는 K8S RBAC에서 처리한다는 것
내용이 이해하기 좀 어려우니.. 반복해서 읽어보도록 해야겠다.
kubectl krew install access-matrix rbac-tool rbac-view rolesum

cluster role이 찾아보기 불편한데 플러그인 툴을 받아서 쉽게 찾아볼 수 있다
위 사진은 system:master라는 그룹이 어떤 scope인지, 연결된 role은 뭔지 표현해준다.

kubectl rbac-view


요런 페이지 확인이 가능하다

kubectl 명령 → aws eks get-token → EKS Service endpoint(STS)에 토큰 요청 ⇒ 응답값 디코드(Pre-Signed URL 이며 GetCallerIdentity..)

cat ~/.kube/config | yh
config에서 User exec 를 보면 인증 처리를 하는 부분이 보인다.
이전엔 툴을 설치하여 진행했지만 cli 1.16 버전 이후에는 내장되어 있다.

aws eks get-token help
aws eks get-token --cluster-name $CLUSTER_NAME | jq
aws eks get-token --cluster-name $CLUSTER_NAME | jq -r '.status.token'
토큰값을 HS384 → HS256 순으로 디코드해본 후 payload값을 디코드해보면

이런 값을 볼 수 있다
참고로 Webhook token authenticator 는 aws-iam-authenticator 를 사용한다.
tokenreviews api 리소스 확인


tokenreviews api 리소스를 보니 사용자에 대한 토큰 인증을 하는 역할이며 이것을 webhook token authentication으로 처리한다고 나와있음
kubectl api-resources | grep Webhook

사용자 인증을 쿠버네티스 api가 하지 않고 토큰리뷰로 aws iam으로 보냈는데
그때 동작하는것이 validationwebhook
validation은 통과할지 말지 판단. iam 사용자가 없으면 통과를 할 수 없음
kubectl get validatingwebhookconfigurations

kubectl get cm -n kube-system aws-auth -o yaml | kubectl neat | yh
aws-auth 컨피그맵 내 내용을 보면
mapRoles 쿠버네티스 eks를 사용하는 주체가 user 말고도 aws iam role도 가능하다
eks 관리형 노드가 최초 프로비저닝할때 eks 쿠버네티스 api를 사용해야함
그 때 사용하는 신원처리는 node에 있는 role로 함
kubernetes-admin은 공식적으로 감춰둠
왜냐하면 arn은 eks를 설치한 iam user, 이것을 날려버릴경우 복구가..불가능해서 이지 않을까(추정)

user 생성후 프로그래밍 방식 액세스 권한 부여
aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess --user-name testuser
testuser 사용자에 정책을 추가
aws sts get-caller-identity --query Arn

get-caller-identity 확인

EC2 IP 확인 : myeks-bastion-EC2-2 PublicIPAdd 확인

get-caller-identity 확인
kubectl get node -v6
ls ~/.kube
eksctl create iamidentitymapping --cluster ACCOUNT_ID:user/testuser
auth configmap을 편집해주는 명령어다
teatuser를 쿠버네티스의 system:master에 매핑해줘
(user의 arn정보와 함께)

kubectl 사용 확인
kubectl ns default
kubectl get node -v6

cat ~/.kube/config | yh

kubectl ns default
kubectl get node -v6

kubectl edit cm -n kube-system aws-auth



kubectl get node -v6
kubectl api-resources -v5

차단됨..
testuser IAM 맵핑 삭제
eksctl delete iamidentitymapping --cluster ACCOUNT_ID:user/testuser
Get IAM identity mapping(s)
eksctl get iamidentitymapping --cluster $CLUSTER_NAME
kubectl get cm -n kube-system aws-auth -o yaml | yh





..주기적으로 acm을 삭제해주고 실습을 하면 잘 됐는데
왜 안될까여ㅠㅠ..

ec2 가 가지고 있는 Iam role의 정보를 모두 확인할 수 있는 취약한 웹 사이트..
command injection 이니 삽입하고, 지우면서 조작해볼 수 있다

[projected](https://kubernetes.io/docs/concepts/storage/volumes/#projected) Volume to mount several existing volume sources into the same directory. Currently, secret, configMap, downwardAPI, and serviceAccountToken volumes can be projected.serviceAccountToken is not a volume type.Package these files into secrets:
kubectl create secret generic user --from-file=./username.txt
kubectl create secret generic pass --from-file=./password.txt


projected volume을 쓰면 token의 만료기간과 audiance를 사용 가능하다

MutatingWebhook은 사용자가 요청한 request에 대해서 관리자가 임의로 값을 변경하는 작업입니다.ValidatingWebhook은 사용자가 요청한 request에 대해서 관리자기 허용을 막는 작업입니다.- iss: 토큰 발행자
- sub: 사용자를 구분하기 위한 유니크한 구분자
- email: 사용자의 이메일
- iat: 토큰이 발행되는 시간을 Unix time으로 표기한 것
- exp: 토큰이 만료되는 시간을 Unix time으로 표기한 것
- aud: ID Token이 어떤 Client를 위해 발급된 것인지.
실습
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-test1
spec:
containers:
- name: my-aws-cli
image: amazon/aws-cli:latest
args: ['s3', 'ls']
restartPolicy: Never
automountServiceAccountToken: false
EOF
서비스 어카운트 토큰 옵션을 끔(자동배포 옵션 off)

eks-iam-test1 pod error 임을 확인 가능

cloudtrail listbuckets 정보를 보면
accessdenied 오류코드 뱉는 것이 있다

실습2
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-test2
spec:
containers:
- name: my-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
restartPolicy: Never
EOF
pod2 생성

serviceaccount 옵션을 끄지 않아 volume이 생긴것을 확인 가능

모두 러닝중
kubectl exec -it eks-iam-test2 -- aws s3 ls

에러 .. 토큰정보를 쫒아가보면

토큰 oidc 프로바이더의 정보를 jwt 에서 확인 가능
실습3 https://github.com/aws/amazon-eks-pod-identity-webhook/ : This webhook is for mutating pods that will require AWS IAM access
eksctl create iamserviceaccount \
--name my-sa \
--namespace default \
--cluster $CLUSTER_NAME \
--approve \
--attach-policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==AmazonS3ReadOnlyAccess].Arn' --output text)
IRSA의 목적은 단 하나 pod가 aws 의 서비스를 사용하려고 할 때

IRSA 하나 셋팅할때마다 cloudformation에서 iam role을 만든다
매핑된 권한을 연결시켜주고
신뢰관계 형성
IAM 역할 (s3)

신뢰관계

federation 이 aws 입장에선 다른 인증기관
이 인증기관은 k8s의 OIDC 공급자 url 주소로 형성되어있다.
eksctl get iamserviceaccount --cluster $CLUSTER_NAME

awsloadbalancer pod가 저 role을 쓸 수 있다 이해할것


annotaion 확인
POD 에서 AWS CLI 사용 확인


👏🏻👏🏻👏🏻 ls 조회 성공
그런데

ec2는 나오지 않음 권한이 없기때문
** 파드에 볼륨 마운트 2개 확인

** aws-iam-token 볼륨 정보 확인 : JWT 토큰이 담겨져있고, exp, aud 속성이 추가되어 있음
