실습

Authentication - EKS

  1. kubeconfig 파일 리뷰

    kubectl config view
  2. kubeconfig에 명시된 users 확인 - https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins

    kubectl config view | yq e '.users' -
  3. user에 명시된 명령어 실행

    $(kubectl config view \
    -o=jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args[*]}')
  4. 토큰값을 환경변수로 지정 - Base64로 인코딩된 부분만 캡쳐

    {
        export TOKEN=$($(kubectl config view \
        -o=jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args[*]}') \
        | jq -r '.status.token' | grep -oP '(?<=k8s-aws-v1.).*')
        echo $TOKEN
    }
  5. Base64URL 유틸리티 설치

    npm install -g base64-url-cli
  6. 토큰값을 디코딩해서 환경변수로 지정

    {
        export DECODED_URL=$(base64url decode $TOKEN)
        echo $DECODED_URL 
    }
  7. Node에 부여된 Label을 통해서 EKS 클러스터 이름 확인하고 환경변수로 저장

    {
        export CLUSTER_NAME=$(kubectl get node \
        -o=jsonpath='{.items[0].metadata.labels.alpha\.eksctl\.io\/cluster-name}')
        echo $CLUSTER_NAME
    }
  8. 디코딩한 URL 호출

    curl -H "x-k8s-aws-id: $CLUSTER_NAME" $DECODED_URL
  9. 현재 설정된 AWS 자격증명을 확인

    aws sts get-caller-identity
  10. API 서버 주소를 확인하고 환경변수로 지정

    {
        export K8S_SERVER=$(kubectl config view \
        -o=jsonpath='{.clusters[*].cluster.server}')
        echo $K8S_SERVER
    }
  11. Node 목록을 보는 API 호출

    curl -k -X GET \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    $K8S_SERVER/api/v1/nodes
  12. 토큰값을 환경변수로 지정

    {
        export TOKEN=$($(kubectl config view \
        -o=jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args[*]}') \
        | jq -r '.status.token')
        
        echo $TOKEN
    }
  13. Node 목록을 보는 API 호출

    curl -k -X GET \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    $K8S_SERVER/api/v1/nodes
  14. IAM 유저 생성

    aws iam create-user --user-name john
  15. 위에서 생성한 IAM 유저의 Access Key 생성

    aws iam create-access-key --user-name john > key.txt
  16. Access Key가 정상적으로 생성되었는지 확인

    cat key.txt
  17. AWS CLI 자격증명 파일 및 설정 파일 백업

    {
        cp ~/.aws/credentials ~/.aws/credentials_backup
        cp ~/.aws/config ~/.aws/config_backup
    }
  18. 위에서 생성한 Access Key를 AWS CLI 자격증명 파일에 반영

    {
    cat <<EOF >> ~/.aws/credentials
    
    [john]
    aws_access_key_id=$(cat key.txt | jq -r '.AccessKey.AccessKeyId')
    aws_secret_access_key=$(cat key.txt | jq -r '.AccessKey.SecretAccessKey')
    EOF
    
    cat <<EOF >> ~/.aws/config
    
    [profile john]
    region = ap-northeast-2
    EOF
    }
  19. 위에서 명시한 프로필을 통해서 AWS API 호출

    aws sts get-caller-identity --profile john
  20. kubeconfig 파일 삭제

    rm -rf ~/.kube/config
  21. 쿠버네티스 API 호출 시도

    kubectl get pod -A
  22. 새로 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 생성

    aws eks update-kubeconfig --name $CLUSTER_NAME --profile john
  23. IAM 유저에서 eks:DescribeCluster 권한 부여

    aws iam put-user-policy --user-name john --policy-name eks-admin --policy-document \
    '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "eks:DescribeCluster"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }'
  24. IAM 정책이 부여되었는지 확인

    {
        aws iam list-user-policies --user-name john
        aws iam get-user-policy --user-name john --policy-name eks-admin
    }
  25. 새로 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 생성 - 정책 적용까지 시간이 걸릴수 있음

    aws eks update-kubeconfig --name $CLUSTER_NAME --profile john
  26. 새로 생성된 kubeconfig 파일 리뷰

    kubectl config view
  27. 쿠버네티스 API 호출 시도

    kubectl get pod -A
  28. user에 명시된 명령어 실행

    {
        export $(kubectl config view -o=jsonpath='{.users[0].user.exec.env[0].name}={.users[0].user.exec.env[0].value}')
        $(kubectl config view \
        -o=jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args[*]}')
    }
  29. 토큰값을 환경변수로 지정 - Base64로 인코딩된 부분만 캡쳐

    {
        export TOKEN=$($(kubectl config view \
        -o=jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args[*]}') \
        | jq -r '.status.token' | grep -oP '(?<=k8s-aws-v1.).*')
        echo $TOKEN
    }
  30. 토큰값을 디코딩해서 환경변수로 지정

    {
        export DECODED_URL=$(base64url decode $TOKEN)
        echo $DECODED_URL 
    }
  31. 디코딩한 URL 호출

    curl -H "x-k8s-aws-id: $CLUSTER_NAME" $DECODED_URL
  32. 어드민 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트

    {
        rm -rf ~/.kube/config
        unset AWS_PROFILE
        aws eks update-kubeconfig --name $CLUSTER_NAME
    }

Authorization

  1. ClusterRole 목록 확인

  2. cluster-admin ClusterRole 리뷰

  3. ClusterRoleBinding 목록 확인

  4. cluster-admin ClusterRoleBinding 리뷰

  5. 현재 kubeconfig에 설정된 유저의 자격증명으로 수행할수 있는 API 목록 확인

  6. aws-auth ConfigMap에 명시된 MapRoles 내용 확인 - https://kubernetes.io/docs/reference/access-authn-authz/node/

  7. 한개의 Node의 인스턴스 ID를 확인하고 환경변수로 지정

  8. Node에 부여된 IAM 인스턴스 프로필을 확인하고 환경변수로 지정

  9. 위에서 확인한 인스턴스 프로필에 연동된 IAM 역할 확인

  10. view ClusterRole 리뷰

  11. ClusterRoleBinding 생성

  12. Node에 부여된 Label을 통해서 EKS 클러스터 이름을 확인하고 환경변수로 저장

  13. EKS 클러스터가 생성되어 있는 AWS 계정번호 확인하고 환경변수로 저장

  14. aws-auth ConfigMap에 규칙 추가

  15. aws-auth ConfigMap 변경분 확인

  16. john IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트

  17. 현재 kubeconfig에 설정된 유저의 자격증명으로 수행할수 있는 API 목록 확인

  18. 클러스터에 생성된 Pod 목록 확인

  19. Pod 생성 시도

  20. IAM 역할 생성

  21. aws-auth ConfigMap에 규칙 추가

  22. aws-auth ConfigMap 변경분 확인

  23. john IAM 유저의 자격증명으로 위에서 생성한 IAM 역할 전환하는 설정 추가해서 kubeconfig 파일 업데이트

  24. 새로 생성된 kubeconfig 파일 리뷰

  25. 쿠버네티스 API 호출 시도

  26. john IAM 유저에서 sts:AssumeRole 권한 부여

  27. IAM 정책이 부여되었는지 확인

  28. 쿠버네티스 API 호출 시도 - 정책 적용까지 시간이 걸릴수 있음

  29. user에 명시된 명령어 실행

  30. 토큰값을 환경변수로 지정 - Base64로 인코딩된 부분만 캡쳐

  31. 토큰값을 디코딩해서 환경변수로 지정

  32. 디코딩한 URL 호출

  33. 어드민 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트

  34. 리소스 삭제

Service Account

  1. Pod 생성

  2. Pod 생성 확인

  3. Pod에 부여된 ServiceAccount 확인

  4. default 네임스페이스에 존재하는 ServiceAccount 목록 확인

  5. ServiceAccount 생성

  6. Pod 생성

  7. 생성된 Pod 안에서 포함된 kubectl을 통해서 kube-system 네임스페이스에 있는 Pod 목록 확인

  8. 위에서 생성한 ServiceAccount에 부여된 권한 확인

  9. ClusterRole 생성

  10. RoleBinding 생성

  11. 생성된 Pod 안에서 포함된 kubectl을 통해서 kube-system 네임스페이스에 있는 Pod 목록 확인

  12. 생성된 Pod 안에서 포함된 kubectl을 통해서 default 네임스페이스에 있는 Pod 목록 확인

  13. 위에서 생성한 ServiceAccount에 부여된 권한 확인

  14. 위에서 생성한 ServiceAccount에 kube-system 네임스페이스에 대해서 부여된 권한 확인

  15. 리소스 삭제

IAM roles for service accounts

  1. Pod 생성

  2. Pod 생성 확인

  3. 생성된 Pod에 부여된 AWS 자격증명 확인

  4. Pod가 배포된 Node 확인

  5. Pod가 배포된 Node의 인스턴스 ID를 확인하고 환경변수로 지정

  6. Node에 부여된 IAM 인스턴스 프로필을 확인하고 환경변수로 지정

  7. 위에서 확인한 인스턴스 프로필에 연동된 IAM 역할 확인

  8. Pod에 부여된 AWS 자격증명 확인

  9. Pod에서 EC2 인스턴스 메타데이터를 통해서 상속받는 자격증명 확인

  10. 위에서 확인한 자격증명에 부여된 Access Key 확인

  11. AWS CLI가 자격증명을 불러오는 순서 확인

  12. Node에 부여된 Label을 통해서 EKS 클러스터 이름을 확인하고 환경변수로 저장

  13. ServiceAccount 생성

  14. 생성된 ServiceAccount 확인

  15. ServiceAccount에 명시된 IAM 역할 이을 확인하고 환경변수로 지정

  16. ServiceAccount와 연동된 IAM 역할에 부여된 IAM 정책 확인

  17. ServiceAccount와 연동된 IAM 역할에 부여된 신뢰관계 정책 확인

  18. EKS 클러스터에 연동된 OIDC 제공자 확인

  19. Pod를 재생성하고 위에서 생성한 ServiceAccount 부여

  20. Pod에 부여된 AWS 자격증명 확인

  21. Pod에서 EC2 인스턴스 메타데이터를 통해서 상속받는 자격증명 확인

  22. AWS CLI가 자격증명을 불러오는 순서 확인

  23. Pod에 지정된 환경변수 확인

  24. Pod에 생성된 AWS 임시토큰 파일 내용 확인

  25. 위에서 확인한 토큰 내용 확인

  26. ServiceAccount와 연동된 IAM 역할에 부여된 신뢰관계 정책 확인

  27. Pod에서 AWS CLI를 통해서 S3 버킷 목록 확인

  28. 리소스 삭제

Last updated