이번 주는 EKS 에서의 인증/인가에 대해 알아봤습니다.
인증
누가 접근하고 있는가?
인가
무엇을 할 수 있는가?(권한)
EKS에서의 인증/인가
EKS에서 인증/인가는 각각 다른 방식으로 처리가 됩니다.
인증 - IAM
클러스터를 생성하고나면 aws-auth configmap이 자동으로 생성된 것을 확인할 수 있습니다.
$ kubectl get cm aws-auth -n kube-system -oyaml
apiVersion: v1
data:
mapRoles: |
- rolearn: arn:aws:iam::111122223333:role/[NodeGroup IAM role명]
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
mapUsers: |
- groups:
- system:masters
userarn: arn:aws:iam::111122223333:user/[IAM user명]
username: kubernetes-admin
...
.kube/config 파일을 살펴보면, 아래와 같이 sts 토큰을 받아오는 명령어가 사용되는 것을 볼 수 있습니다.
cat ~/.kube/config | yh
...
- name: admin@myeks.ap-northeast-2.eksctl.io
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- eks
- get-token
- --output
- json
- --cluster-name
- myeks
- --region
- ap-northeast-2
command: aws
env:
- name: AWS_STS_REGIONAL_ENDPOINTS
value: regional
interactiveMode: IfAvailable
provideClusterInfo: false
전체 IAM 인증 과정은 아래와 같습니다.
사용자가 kubectl 명령어를 입력하면, .kube/config에 설정된 정보를 토대로 token을 발급받습니다.
해당 토큰과 kubectl로 실행이 필요한 action이 kube-api에 전달이 되고, AWS-IAM-Authenticator Server가 해당 정보를 리뷰합니다. 검증에 성공하면 aws-auth configmap에 해당 user/role이 있는지 확인을 합니다.
인가 - RBAC
위에서 인증된 AWS IAM user/role 검증이 되면, 매핑된 group을 토대로 권한이 부여됩니다.
해당 group에는 ClusterRole, ClusterRoleBinding로 권한이 정의되어 있습니다.
$ kubectl rbac-tool lookup system:masters
SUBJECT | SUBJECT TYPE | SCOPE | NAMESPACE | ROLE
+----------------+--------------+-------------+-----------+---------------+
system:masters | Group | ClusterRole | | cluster-admin
$ kubectl describe clusterrole cluster-admin
Name: cluster-admin
Labels: kubernetes.io/bootstrapping=rbac-defaults
Annotations: rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
*.* [] [] [*]
[*] [] [*]
$ kubectl rbac-tool lookup system:node
SUBJECT | SUBJECT TYPE | SCOPE | NAMESPACE | ROLE
+---------------------+--------------+-------------+-----------+-----------------------+
system:node-proxier | Group | ClusterRole | | system:node-proxier
system:nodes | Group | ClusterRole | | eks:node-bootstrapper-viewer
IRSA
서비스(pod)에게 AWS IAM 권한을 부여하기 위한 기능입니다.
실행한 pod 내에서 AWS 자원에 대한 권한이 필요할 때 해당 기능을 사용합니다.
Service Account에 IAM role을 연결하고, pod에 Service Account를 설정하여 권한을 획득할 수 있습니다.
Service Account 생성 시 secret이 생성(v1.2되고, pod가 생성될 때 pod에 볼륨으로 마운트 됩니다.
pod에서는 AWS_ROLE_ARN, AWS_WEB_IDENTITY_TOKEN_FILE를 환경변수로 설정해서 IAM 권한을 얻을 수 있습니다.
이때, 환경변수 설정은 mutating web hook에 의해 이루어 집니다.
설정은 아래와 같이 진행합니다.
1) 사용 필요한 IAM role에 신뢰관계 설정
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/xxxxxx"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-2.amazonaws.com/id/xxxxxx:sub": "system:serviceaccount:[namespace]:[serviceaccount명]",
"oidc.eks.ap-northeast-2.amazonaws.com/id/xxxxxx:aud": "sts.amazonaws.com"
}
}
}
]
}
위와 같이 설정 시 하나의 Service Account에서 사용이 가능하고, '*'를 이용하여 하나의 namespace 내 모든 Service Account에서 사용하게 설정할 수도 있습니다.
2) Service Account에 IAM Role arn annotation 추가
apiVersion: v1
kind: ServiceAccount
metadata:
name: test
namespace: test
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/[IAM role명]
3) pod 생성 및 테스트
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: eks-iam-test
namespace: test
spec:
serviceAccountName: test
containers:
- name: my-aws-cli
image: amazon/aws-cli:latest
command: ['sleep', '36000']
restartPolicy: Never
EOF
해당 pod에 접속하여 aws cli를 통해 AWS IAM role의 권한을 사용할 수 있습니다.
참고 문서
'Kubernetes > EKS Study' 카테고리의 다른 글
[5주차] EKS Autoscaling (0) | 2023.05.24 |
---|---|
[4주차] EKS Observability (0) | 2023.05.21 |
[3주차] EKS Storage (0) | 2023.05.09 |
EKS에서 볼륨 snapscheduler 설치하기 (0) | 2023.05.09 |
EKS에서 pvc로 생성한 ebs에 태그 추가하기 (0) | 2023.05.09 |