Kubernetes/EKS Study

[6주차] EKS Security

백곰곰 2023. 6. 11. 15:53
728x90
반응형

이번 주는 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의 권한을 사용할 수 있습니다.

참고 문서

- Diving into IAM Roles for Service Accounts

- EKS에서 쿠버네티스 포드의 IAM 권한 제어하기: Pod Identity Webhook

728x90

'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