6주차 - Security - EKS 인증/인가, IRSA, Pod Identity, Secrets Mgmt, Kyverno

0. 도입

  • K8S 인증/인가에 대해서 알아본다

  • AWS 인증/인가에 대해서 알아본다

  • EKS IRSA & pod Identity에 대해 알아본다.

  • Kyverno에 대해 알아본다.

  • EKS 워크숍 보안 솔루션에 대한 내용을 확인한다.

  • 파드와 컨테이너의 보안 컨텍스트에 대해 확인한다.

  • 실제로 탈취를 해보면서 어떤 부분이 취약한지 이해한다.

  • AWS내의 EKS 의 BEST PRACTICE를 알아본다.

  • 혼자 알아낼려고했다면 너무나 많은 시간이 걸렸을 텐데 운영에 바로 적용할 수 있도록 이렇게 정리해주셔서 @Cloudnet팀 구성원분들께 감사합니다.

  • 이번 주의 강의가 실무중에 생기는 보안적 취약점들을 점검할 수 있도록 케이스들을 알려주시고 대응방안을 말씀해주셨다. 4주차도 너무 유익했는데 6주차도 바로 사용할 수 있습니다.

1. 선수지식

  • 필요 지식 : Service Account Token Volume Projection, Admission Control, JWT(JSON Web Token), OIDC

  • K8S 인증/인가

  • AWS 인증/인가

2. 실습 환경 배포

  • 이번 환경은 DEVOPS 유저가 두명이라고 생각하고 BASTION 호스트가 2개이다

    • 권한에 따른 접속 불가를 확인하기 위한 용도

  • 이외에 특이사항은 없다.

  • GRAFANA 와 KUBEOPSVIEW 배포 확

3. K8S 인증/ 인가

A. [이론] K8S(API 접근) 인증/인가 소개

  • k8s 에서 요청은인증 -> 인가 -> Admission Controller에게 전달 되고 etcd에 마지막으로 저장됩니다.

인증

  • k8s에서의 인증은 HTTP Auth 나, kubectl의 .kubeconfig 를 통해 context에 저장되어있는 키를 통해 관리 가능합니다.

  • Service Account는 Secret을 가지게 되고 기본적인 사용자라고 생각하시면 됩니다.

인가

  • 다음과 같이 인가 방식이 RBAC, ABAC, Webhook, Node 방식이 있습니다.

    • RBAC는 Role Based Account Access 로 역할 기반의 권한 관리로 생각하면 됩니다.

    • Role(역할) -> 어떤 리소스에 대한 권한 명시

    • Service Account -> 유저

    • Role Binding -> 롤과 SA를 맵핑을 명시

  • .kube/config

    • clusters -> 원격 K8S API 서버 주소

    • users -> 쿠버네티스 사용자 인증 정보 목록 (SA의 토큰, 인증서)

    • contexts -> cluster + user 로 인증해 사용한다 라는 컨텍스트를 명시

B. [실습] 네임스페이스와 서비스 어카운트 생성/ 파드 생성후 권한 테스트

목적: 다른 권한을 가진 서비스 어카운트를 생성후에 권한 테스트

실험 설정:

  1. 위의 그림과 같이 SA 생성

  2. 파드 생성 이후에 특정 권한을 가지고 KUBECTL 실행 시 실행 확인

실험 결과:

  1. 서비스 어카운트 생성확인

  1. 다른 권한을 가진 SA에서 다른 POD에 대해서는 명령 내리지 못하는 것을 확인

C. [실습] 서비스 어카운트를 지정하여 생성한 파드에서 다시 권한 테스트

목적: SA 따른 파드 권한테스트

배경 지식:

  1. 롤이란: 리소스에 대한 VERBS 권한

실험 설정:

  1. 롤(Role)를 생성 후 서비스 어카운트 바인딩

실험 결과:

  1. DEV 팀 ROLE 생성

  1. ROLE BINDING 생성

  1. Role binding에 대한 확인

  1. 특정 권한 가진것을 확인

4. EKS 인증/ 인가

A. [이론] EKS 인증/인가 큰그림

  • 인증은 AWS IAM이 진행

  • 인가는 K8S RBAC에서 진행

B. [실습] RBAC 관련 KREW 플러그인

  • 해당 플러그인은 RBAC의 구성요소들을 쉽게 볼 수 있게 리스트업 해줍니다.

  • `kubectl krew install access-matrix rbac-tool rbac-view rolesum whoami` 으로 RBAC을 설치합니다.

  • 다음과 같은 ROLE 에대한 정보들이 시각화 됩니다.

C. [이론] 인증/인가 완벽 분석 해보기

  1. kubectl 에 요청을 보냄

  2. AWS-IAM-Authenticator를 거쳐 AWS STS에 토큰을 요청

  3. EKS API Cluster가 해당 토큰을 받아서 STS getCallerIdentity로 AWS IAM 인증 완료 후에 USER/ROLE에 대한 ARN 반환

  4. 해당 USER/ROLE 에 대해서 aws-auth configmap 에 mapping 정보 확인

  5. k8s 인가 확인하고 동작 실행

-> 두개의 플랫폼과 인증과 인가가 되는 과정이 굉장히 복잡

-> 또한, config맵에 대한 의존성으로 AWS-AUTH CONFIGMAP을 잘못 수정시에 권한 오류로 장애가 생김

이 때문에, A deepdive into simplified Amazon EKS access Management controls 라는 신기능이 도입됨.

  • EKS 인증과 인가가 EKS 관련 Policy와 AWS 리소스에 대한 방법으로 통합됨 API를 우선하게 되고 API 로 변경시 CONFIG 롤백 되지 않음(주의!!)

  • 다음과 같은 RESOURCE에 대한 POLICY로 통합됨

D. [실습] 데브옵스 신입 사원을 위한 myeks-bastion-2에 설정 해보기

목적: 실제로 유저를 하나 생성해서 권한을 RBAC으로 생성해서 K8S 동작 확인

배경 지식:

실험 설정:

  1. TEST USER 생성

  2. TEST USER 자격증명 설정

  3. TEST USER 권한 설정

실험 결과:

  1. KUBECTL 사용 확인

  2. IAM mapping 삭제 후에 kubectl 사용 확인

  • Bastion 2 에서 정상 동작 확인

  • eks에서 iamidentity 맵핑 삭제 이후에 bastion2 에서 kubectl 동작 실패 확인

E. [실습] EC2 INSTANCE PROFILE에 맵핑된 K8S RBAC 확인

목적: 실제로 유저를 하나 생성해서 권한을 RBAC으로 생성해서 K8S 동작 확인

실험 설정:

  1. 노드 mapRoles 확인

  2. 파드 생성

  3. config 맵 정보 확인

실험 결과:

  1. 생성된 파드로 노드에 대한 정보들 생성

  2. 해당 프로필을 사용하게되면 취약한 점을 알수있다.

    1. 해당 토큰을 가져와서 모든 요청에 사용할 수있다!

E. [실습] [신기능] simplified Amazon EKS access management controls

목적: CONFIG가 아닌 API를 사용한 인증 인가 플로우 확인

실험 설정:

  1. API 설정 생성 (CONFIG 무시)

  2. 테스트 유저 생성 및 정책 할당

실험 결과:

  1. 테스트 유저의 할당 으로 정상적 KUBECTL 명령 수행

5. EKS IRSA & Pod Identity

A. [이론] IRSA 소개

  • 다음과 같이 EC2 Instanace Profile은인스턴스에 권한을 부여하여 사용하기 편함

  • 하지만, 노드당 권한이 부여되어 하나의 파드가 탈취당하면 노드에 부여된 모든 권한을 사용가능

  • 보안상 취약점으로 대두

  • 이 때문에 IRSA가 파드에 대해서 권한을 부여하는 방법으로 권장됨

  • IRSA란? (IAM ROLES FOR SERVICE ACCOUNTS)

    • pod 마다 권한을 가질 수 있게끔 할당하는것

  • IRSA의 동작 원리

    • 파드가 토큰을 aws에 전송하고 aws는 토큰을 EKS ldP으로 IAM 권한검증

  • IRSA의고충

    • 불편함;

      • 파드마다 생성 필요

      • 신규 클러스터 신뢰 정책 전부 수정 필요

  • POD Identity 라는 신기능을 도입

  • ` Amazon EKS Pod Identity Agent ADD-ON 만 추가하면 Agent가인 token을 받아서 인증/인가를 확인할 수 있다.

  • SA 에 대해서 Pod Identity Association만 연결해주면 해당 SA에 대해서 동일한 권한을 지닌 POD가 생긴다.

  • TAG에 따른 추가적 할당도 가능하다.

B. [실습] k8s 권한 없음 확인/ KSA를 사용해 S3 서비스 확인

목적:

배경 지식:

실험 설정:

  1. API 설정으로 SA Token 설정 false로 변경

실험 결과:

  • access denied 확인

B. [실습] KSA 생성, 파드 생성 이후 토큰 탈취 당할 리스크 확인

목적: KSA 생성, 파드 생성 이후 토큰 탈취 당할 리스크 확인

실험 설정:

  1. pod 생성

  2. 토큰 탈취 및 해당 토큰으로 서비스 사용

실험 결과:

  1. 토큰으로 확인 및 aws 서비스는 사용 되지 않는것은 확인

  2. 토큰 안의 페이로드들 확인

  1. 여기서 중요한것이 AWS는 토큰 변조만 확인해주는 것이라서 서비스 계정에 역할에 대해 신뢰 정책이 *로 되어 있다면 클러스터 내의 해당 계정들에 대한 모든 역할이 가능해진다.

  1. 예를 들면, 다음과 같이 설정하게 되면 자격들이 내려온다.

  • 실습은 했으나 스크린샷 미첨부

A. [실습] EKS Pod Identity

목적: Identity를 사용해서 위에 생기는 취약점을 조치

실험 설정:

  1. `ADDON=eks-pod-identity-agent aws eks describe-addon-versions --addon-name $ADDON --kubernetes-version 1.28 --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" --output text`

    1. add on 설치

  2. aws eks create-addon --cluster-name $CLUSTER_NAME --addon-name eks-pod-identity-agent

    1. agent 설치

  3. podidentityAssociation 생성

실험 결과:

  1. s3 list 및 arn 확인시 정상적으로 권한 할당 확인

  2. 토큰 정보도 확인(생략) -중요정보

6. OWASP Kubernetes Top TEN

A. [실습] 명령어 원격 실행으로 토큰 탈취 및 해당 토큰으로 다른 명령 확인

목적: 토큰 탈취 진행으로 어떤 방식으로 토큰이 이용되는지 확인

실험 설정:

  1. dvwa를 배포 (security 낮추기)

  2. command injection 으로 토큰 탈취 및 정보 확인

실험 결과:

  1. 8.8.8.8 ; echo ; hostname 해당 hostname 나오는것을 확인

  2. 토큰 탈취 및 자격증명확인

8.8.8.8 ; curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"

(이미지 생략)

B. [실습] Kubelet 보안 설정 취약으로 노드 정보 확인 가능한것 확인

목적: kubelet 접근 제어 실패로 보안 취약점 생성

실험 설정:

  1. 노드에서 모든 access를 받을 수있게 변경

  2. kubelet 재시작

실험 결과:

  1. 원래 실험 결과는 정상적으로 표기되어야 하지만, 흠 무엇의 문제이든 실패하고있다. 트러블 슈팅이 필요해보인다.

A. [이론] Kyverno이란?

  • K8S 내의 정책들에 대해서 어떤 리소스가 어떤 방법으로 할당되어 있는지 확인 할 수 있습니다.

  • 정책을 Validate, Mutate, Generate할 수 있습니다.

B. [실습] Kyverno설치 및 MUTATE, VALIDATE, GRAFANA에서 보기

목적: Kyverno 실제 사용확인

실험 설정:

  1. Kyverno 설치 확인

  2. validate, mutate 에 대한 실험 을위한 policy 생성

실험 결과:

  1. validation 실패로 생성 실패 확인

  2. team bravo를 라벨로 생성하는 것을 확인

  3. Kyverno도 정상 표기 확

7. 파드/컨테이너 보안 컨텍스트

A. [이론] 컨테이너 보안 컨텍스트 SecurityContext

  • 컨테이너 마다 보안설정으로 대표적으로 다음과 같은 설정이 있습니다.

privileged

특수 권한을 가진 컨테이너로 실행

capabilities

Capabilities 의 추가와 삭제

allowPrivilegeEscalation

컨테이너 실행 시 상위 프로세스보다 많은 권한을 부여할지 여부

readOnlyRootFilesystem

root 파일 시스템을 읽기 전용으로 할지 여부

B. [이론] 파드 보안 컨텍스트

  • 파드마다 보안컨텍스트를 적용

  • 파드내부의 모든 컨테이너에 영향을 줍니다.

  • 대표적으로 다음과같은 정책이 있고 컨테이너 보안컨텍스트가 우선이 됩니다.

종류

개요

runAsUser

실행 사용자

runAsGroup

실행 그룹

runAsNonRoot

root 에서 실행을 거부

supplementalGroups

프라이머리 GUI에 추가로 부여할 GID 목록을 지정

C. [실습] 컨테이너 보안 컨텍스트 활용

목적: 컨테이너 보안 컨텍스트 확인

실험 설정:

  1. 컨테이너 보안 컨텍스트 root 파일 시스템 읽기 전용 사용

  2. 파일 생성 실패 확인

실험 결과:

  1. 파일 생성 실패

D. [실습] 파드 보안 컨텍스트 활용

목적: 파드 보안 컨텍스트 확인

실험 설정:

  1. 파드 보안 컨텍스트 USER 지정 VS ROOT로 지정

  2. PROCESS 각각 어떻게 생성되어있는지 확인

실험 결과:

  1. 다음과 같이 유저 아이디 다른것을 확인

9. Amazon EKS Best practices for security

A. [이론] kube-bench, falco, datree

  • kube bench는 취약점 점검 툴

  • falco는 실제 이벤트 점검하고 보안 위반을 식별 합니다.

  • 이벤트 기반 규칙 엔진 사용해서 탐지 제공

Last updated