본문 바로가기

Security

[실습] EKS - Cluster에 대해서 kubectl 접근 허용

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 kubectl을 통하여 Cluster를 접근 허용에 대한 개념과 실습을 해보겠습니다. EKS Cluster는 AdministratorAccess 권한이 있는 IAM user일지라도 Cluster에 접근 허용을 별도 설정해 주어야 합니다.


구성도

bastionA는 userA 전용으로 로컬에 clusterA, clusterB에 대한 정보를 저장하고, userA에 대한 접근이 허용된 2개의 cluster에 접근합니다. (context 전환을 통하여 cluster를 접근하므로 cluster가 헷갈리는 경우 발생 가능)
bastionB와 bastionC는 공용으로 1개의 cluster에 대한 정보를 저장하고, 여러 사용자가 리소스 기반으로 허용된 각 cluster에 접근합니다. (지정된 cluster만 접근하므로 cluster가 헷갈리는 경우는 배제됨)

1단계 : 서버 역할 설정 (ConfigMap에서 kubectl 접근 허용)

EKS 클러스터를 최초 생성한 AWS 리소스에서 ConfigMap 허용 설정

# cluster의 ConfigMap 수정
kubectl describe -n kube-system configmap/aws-auth  # 현재 권한 조회
kubectl edit -n kube-system configmap/aws-auth  # 사용자 및 서버에 대한 접근 허용 추가
apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::111111111111:role/eksctl-ekscluster-nodegroup-nodeg-NodeInstanceRole-LY3H83ELFJ8M
      username: system:node:{{EC2PrivateDNSName}}
    - groups: 
      - system:masters 
      rolearn: arn:aws:iam::111111111111:role/bastionB-role명   # clusterB는 bastionC-role명
      username: bastionB   # clusterB는 bastionC, 단순 구분용
  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::111111111111:user/userA
      username: usrA
......
userarn : IAM > Users > 사용자 선택 > Summary의 ARN 값
rolearn : IAM > Roles > Role 선택 > Summary의 ARN 값 

2단계 : 클라이언트 역할 설정 (kubeconfig 파일에 cluster 정보 등록)

bastionA~C의 kubeconfig 파일 업데이트

# 작업 전, 기존 파일 백업
cp ~/.kube/config ~/.kube/config.bak

# 자동으로 cluster 정보 등록하는 방법 (context는 cluster 의미)
aws eks update-kubeconfig --region ap-northeast-2 --name 클러스터명(ex : clusterA)
kubectl get svc

# 수동으로 cluster 정보 등록하는 방법 (context는 cluster 의미)
vi ~/.kube/config 
apiVersion: v1
clusters:
- cluster: 
    certificate-authority-data: "EKS > Clusters > 선택 > Overview (tab) > Certificate authority" 값
    server: "EKS > Clusters > 선택 > Overview (tab) > API server endpoint" 값
  name: arn:aws:eks:ap-northeast-2:AWS계정번호:cluster/클러스터명
contexts:
- context:
    cluster: arn:aws:eks:ap-northeast-2:AWS계정번호:cluster/클러스터명
    user: arn:aws:eks:ap-northeast-2:AWS계정번호:cluster/클러스터명
  name: arn:aws:eks:ap-northeast-2:AWS계정번호:cluster/클러스터명
current-context: arn:aws:eks:ap-northeast-2:AWS계정번호:cluster/클러스터명
kind: Config
preferences: {}
users:
- name: arn:aws:eks:ap-northeast-2:AWS계정번호:cluster/클러스터명
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - --region
      - ap-northeast-2
      - eks
      - get-token
      - --cluster-name
      - 클러스터명
      command: aws
bastion의 role로 cluster 접근하는 경우 role에 포함되어야 할 Policy 목록
  - AmazonEKSAdminPolicy (수동 생성, 참고 URL에서 내용 확인)
  - AmazonEC2FullAccess
  - AmazonEC2RoleforSSM
  - IAMFullAccess
  - ElasticLoadBalancingFullAccess
  - AmazonEC2ContainerRegistryFullAccess
  - AmazonEC2ContainerServiceforEC2Role
  - AWSCloudFormationFullAccess
  ※ 참고 URL : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/security_iam_id-based-policy-examples.html
      > Amazon EKS 콘솔 사용

eksctl로 cluster을 생성한 리소스에서는 context 표기가 다를 수 있습니다.
  - context:
      cluster: 클러스터명.ap-northeast-2.eksctl.io
      user: user@클러스터명.ap-northeast-2.eksctl.io
    name: user@클러스터명.ap-northeast-2.eksctl.io

3단계 : Cluster 접근

bastionA에서 userA를 통하여 2개의 cluster 접근

# cluster 목록 확인 
kubectl config get-clusters
  arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterA
  arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterB

# context 목록 확인 (*는 현재 사용 중인 current-context 의미)
kubectl config get-contexts
  CURRENT   NAME                                                        CLUSTER                                                     AUTHINFO                                                      NAMESPACE
  *         arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterA    arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterA    arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterA
            arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterB    arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterB    arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterB

# current-context 확인 (현재 사용 중인 cluster 확인)
kubectl config current-context
  arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterA

# context 전환 (방법1)
kubectl config use-context arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterB

# context 전환 (방법2, kubectx 설치 시 사용 가능)
sudo wget https://github.com/ahmetb/kubectx/releases/download/v0.9.4/kubectx
sudo install kubectx /usr/local/bin
kubectx arn:aws:eks:ap-northeast-2:111111111111:cluster/clusterB

참고 URL

EKS 클러스터 액세스 에러 발생 조치 방법 : https://repost.aws/ko/knowledge-center/eks-kubernetes-object-access-error

EKS 자격 증명 기반 정책 : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/security_iam_id-based-policy-examples.html

반응형