K8S-Goat Install on EKS
매번 공부를 미루던 k8s에 대한 찍먹을 위해 k8s-goat 프로젝트를 통해 찍먹을 진행한다. 해당 goat 프로젝트에서는 k8s 환경에서 발생할 수 있는 misconfigurations, 취약점, 보안 문제를 의도적으로 취약하게 구성되어있으며 이를 통해 공격을 진행하며 학습한다.
k8s-goat은 AWS, GCP, Azure, K3S 등 다양한 환경에서의 설치를 지원한다! 여기서 나는 AWS EKS 환경에서 k8s-goat을 구성한다.
EKS 환경에서 k8s-goat을 설치할 경우 생성되는 노드들에 대한 설정이 미흡하여 minikube를 통해 로컬 쿠버네티스 환경에서 구축하는 것을 추천
EKS환경에서 k8s-goat을 구성하려면 기본적으로 아래와 같은 세팅이 필요하다.
- eksctl 설치 (참고)
- kubectl 설치 (참고)
- awscli 설치 및 aws configure 설정 (참고)
- helm 설치 (참고)
이후 아래와 같은 명령을 통해 t4g.medium 유형의 두개의 노드가 있는 k8s-goat-cluster
라는 EKS 클러스터를 생성한다.
1
2
3
4
eksctl create cluster --name k8s-goat-cluster \
--region [Region] \
--node-type t4g.medium \
--nodes 2
클러스터가 생성 완료됐으면 아래 명령을 통해 $HOME/.kube/config
파일을 업데이트한다.
1
aws eks update-kubeconfig --name k8s-goat-cluster --region [Region]
클러스터 구성이 정상적으로 추가되었고 컨텍스트가 제대로 설정되었는지 다음 명령을 통해 확인 가능하다.
1
kubectl cluster-info
이제 k8s-goat를 clone하여 설치해준다.
1
2
3
git clone https://github.com/madhuakula/kubernetes-goat.git
cd kubernetes-goat/
bash setup-kubernetes-goat.sh
정상적으로 파드들이 생성됐는지 확인을 위해 kubectl get pods
명령으로 파드들을 확인하니 health-check 파드가 몇분째 ContainerCreating 상태로 정상동작을 하지 않고있다.
kubectl describe pod [파드명]
명령으로 로그를 보니 몇가지 에러가 보인다.
1
2
3
4
5
6
7
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 42m default-scheduler Successfully assigned default/health-check-deployment-77c7b6686-ljtc5 to ip-192-168-47-94.ap-northeast-2.compute.internal
Warning FailedMount 31m (x3 over 36m) kubelet Unable to attach or mount volumes: unmounted volumes=[docker-sock-volume], unattached volumes=[kube-api-access-fg87z docker-sock-volume]: timed out waiting for the condition
Warning FailedMount 6m37s (x12 over 40m) kubelet Unable to attach or mount volumes: unmounted volumes=[docker-sock-volume], unattached volumes=[docker-sock-volume kube-api-access-fg87z]: timed out waiting for the condition
Warning FailedMount 2m3s (x28 over 42m) kubelet MountVolume.SetUp failed for volume "docker-sock-volume" : hostPath type check failed: /var/run/docker.sock is not a socket file
kubernetes-goat의 이슈 중 Health Check Deployment Pod not running에서 현재 상황과 동일한 문제가 이슈로 등록되었고 kubernetes-goat/scenarios/health-check/deployment.yaml
파일에서 33번 라인의 /var/run/docker.sock
를 /var/run/containerd/containerd.sock
로 수정하고 다시 setup bash 파일(setup-kubernetes-goat.sh)을 실행하면 변경이 없는 파드들은 unchanged, 변경을 준 health-check 파드만 configured되면서 파드가 재설정된다.
1
2
3
4
5
6
7
8
# kubernetes-goat/scenarios/health-check/deployment.yaml
# 수정한 volumes 정의 부분
volumes:
- name: docker-sock-volume
hostPath:
path: /var/run/containerd/containerd.sock
type: Socket
마지막으로 생성한 k8s-goat에 접근할 수 있도록 포트 포워딩 작업을 수행하는 스크립트를 실행한다.
1
bash access-kubernetes-goat.sh
쿠버네티스 찍먹 준비 끝!
참고로 포트포워드를 종료하려면 pkill kubectl -9