AWS 기술 블로그

HardenEKS: Amazon EKS 클러스터를 프로그래밍 방식으로 모범 사례 검증하기

이 글은 AWS Container Blog의 HardenEKS: Validating Best Practices For Amazon EKS Clusters Programmatically by Doruk Ozturk, Joshua Kurz, and Jacob Mevorach의 한국어 번역 및 편집본입니다.

HardenEKS는 오픈 소스 Python 기반의 명령줄 인터페이스(CLI)입니다. HardenEKS는 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터가 AWS의 EKS 모범 사례 가이드(EKS Best Practices Guide, EBPG)에 정의된 모범 사례를 따르는지 프로그래밍 방식으로 더 쉽게 검증할 수 있도록 개발 되었습니다. EBPG는 보다 쉬운 Day 2 운영을 원하는 Amazon EKS 운영자를 위한 필수 리소스 입니다. 이 가이드에는 보안, 안정성, 오토스케일링, 네트워킹 및 확장성 등의 내용을 포함하고 있습니다. HardenEKS는 EBPG의 원칙을 일련의 규칙으로 통합하고 체계화했습니다. HardenEKS는 2022년 11월에 출시 되었으며, 초기 릴리즈 이후 AWS 내부 팀과 AWS 고객 모두로부터 많은 주목을 받았습니다.

HardenEKS는 Amazon EKS 클러스터에 대한 모범 사례를 검증하는 데 사용할 수 있습니다. HardenEKS를 통해 Amazon EKS 운영자가 운영중인 클러스터가 모범 사례를 따르고 있는지 쉽게 확인할 수 있도록 개발되었습니다. EKS 모범 사례 가이드는 Amazon EKS 클러스터를 운영하고 보호하는 방법에 대해 매우 상세하며 방대한 정보를 담고 있기 때문에 모범 사례 가이드의 각 부분을 읽고 클러스터가 지침을 따르고 있는지 판단하는 것은 큰 부담이 될 수 있습니다. HardenEKS는 모범 사례를 모든 Amazon EKS 클러스터에서 실행할 수 있는 프로그래밍 가능한 모듈로 제공됩니다. 자세한 내용은 HardenEKS의 공식 문서를 참조하세요.

HardenEKS란 무엇인가요?

현재 EBPG는 보안, 안정성, 오토스케일링, 네트워킹, 확장성 및 Windows 컨테이너라는 6가지 원칙을 중심으로 Amazon EKS 클러스터 모범 사례를 다루고 있습니다. HardenEKS는 Amazon EKS 모범 사례 규칙 중 프로그래밍 가능한 규칙을 코드로 구현하는데 중점을 둡니다. 현재 40개 이상의 자동화된 규칙이 통합되어 있으며, 더 많은 규칙이 추가되고 있습니다.

HardenEKS는 내부에 추가적인 설치를 할 필요가 없습니다. Amazon EKS 클러스터에 대한 모범 사례를 검증하는 모든 규칙이 외부에서 검증 되기 때문입니다. 클러스터 외부에서 검증하는 방식은 클러스터에 더 안전하고 덜 방해가 되며, 일관된 경험으로 HardenEKS를 실행할 수 있습니다.
또한 HardenEKS를 사용하여 지속적이고 자동화된 검증을 수행하려는 경우, 사용자가 선택한 방법을 통해 정기적으로 HardenEKS를 실행할 수 있습니다.

둘러보기

이 단계에서는 HardenEKS를 다운로드하고 설치합니다. 그리고 HardendEKS를 실행하여 Amazon EKS 클러스터를 검증하고 생성된 결과서를 확인합니다. 검증 이후 생성 되는 결과서가 어떻게 구성되는지 살펴보고, 샘플 모범 사례에서 클러스터 설정을 수정하며 결과서가 어떻게 달라지는지 보여 줍니다.

아래 명령어를 통해 HardenEKS를 빠르게 시작할 수 있습니다:

python3 -m venv /tmp/.venv
source /tmp/.venv/bin/activate
pip install hardeneks
hardeneks --export-html report.html
open report.html

위 명령을 통해 위반된 규칙이 포함된 HTML 형식의 결과서를 생성합니다. 아래는 HardenEKS에 의해 생성 된 결과서의 스크린샷입니다. HardenEKS는 클러스터에 대해 각 EBPG 섹션의 유효성을 검증합니다. 규칙이 위반된 경우 HardenEKS는 위반된 규칙의 세부 정보를 출력하고 EKS 모범 사례에 대한 세부 정보를 연결합니다.

각 위반된 결과에는 모범 사례에 대한 정보로 연결되는 링크가 연결되어 있습니다. 이 결과를 사용하여 클러스터에 어떤 문제가 있고 어떻게 해결해야 하는지 도움을 받을 수 있습니다.

위 스크린샷 예제를 살펴보면 EBPG의 권장 사항인 Amazon Elastic Block Store(Amazon EBS) 볼륨 암호화가 구성되어 있지 않다는 것을 확인할 수 있습니다.

EBPG의 권장 사항을 따르기 위해서는 Amazon EBS StorageClass 파라미터에서 암호화 플래그를 true로 설정하여 Amazon EBS 암호화를 구성하면 됩니다. HardenEKS를 다시 실행해 결과서를 확인해보면 Amazon EBS 볼륨에 대한 위반 사항이 더 이상 없다는 것을 확인할 수 있습니다.

이제 끝났습니다! 클러스터가 EBPG의 권장 사항을 따르고 있는지 검증했으며, 예제를 통해 Amazon EBS 암호화에 대한 모범 사례를 따르도록 구성해보았습니다. 이제 결과서를 보고 어떤 구성을 업데이트 할 지 결정할 수 있습니다.

HardenEKS를 사용하여 클러스터 구성을 지속적으로 검증하고 드리프트 감지하기

클러스터에 대한 주요 변경 사항이 적용되기 전후에 HardenEKS는 클러스터의 구성 상태에 대한 기준선(baseline)을 설정합니다. 변경 사항이 적용되면 새로운 기준선을 적용하고 프로세스를 계속 진행할 수 있습니다. 이 프로세스를 정기적인 일정에 따라 수행되도록 하면 클러스터에 큰 변경 사항이 발생하지 않고 자동화된 방식으로 모범 사례를 준수하고 있는지 확인할 수 있습니다. 기준선을 검사하고 기준선 간의 차이점을 찾는 것은 서로 다른 구성 간의 드리프트를 감지하는 데 사용할 수 있으며, 이는 Amazon EKS 클러스터를 유지 관리하는 데 중요한 부분이며 의도하지 않은 변경이 발생하지 않도록 보장합니다. HardenEKS는 JSON 형태의 출력을 통해 Amazon EKS 운영자가 클러스터가 잘 설계된(well-architected) Kubernetes 클러스터의 기준을 지속적으로 충족할 수 있도록 도와줍니다.

HardenEKS에서 결과를 JSON으로 출력해 다른 도구를 연결하여 자동화된 유효성 검사를 수행할 수 있습니다. 다음은 데이터를 JSON으로 내보내고 결과서의 변경 사항을 검증하는 방법의 예시입니다.

python3 -m venv /tmp/.venv
source /tmp/.venv/bin/activate
pip install hardeneks

# write StorageClass.yaml with encryption parameter false
cat > StorageClass.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
parameters:
  csi.storage.k8s.io/fstype: xfs
  type: io1
  iopsPerGB: "50"
  encrypted: "false"
EOF

kubectl apply -f StorageClass.yaml
hardeneks --export-json report.json
kubectl delete -f StorageClass.yaml

# write StorageClass.yaml with encryption parameter true
cat > StorageClass.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
parameters:
  csi.storage.k8s.io/fstype: xfs
  type: io1
  iopsPerGB: "50"
  encrypted: "true"
EOF

kubectl apply -f StorageClass.yaml
hardeneks --export-json report2.json

# Shows the difference in the reports before and after the StorageClass change was made
cat report.json | jq --raw-output  '.cluster_wide.security.encryption_secrets."EBS Storage Classes should have encryption parameter.".status'
false
cat report2.json | jq --raw-output  '.cluster_wide.security.encryption_secrets."EBS Storage Classes should have encryption parameter.".status'
true

이를 확장하여 드리프트가 발생한 위치를 정확히 찾아내고, 드리프트에 따라 운영팀에 알릴 수 있는 다양한 도구를 활용할 수 있습니다.

고급 구성(Advanced configuration)

구성 가능한 규칙(Configurable rules)

사용자는 yaml 형식의 config file을 통해 HardenEKS의 기본 동작을 커스텀 할 수 있습니다. config file에서 제외할 네임스페이스과 실행할 규칙들을 정의할 수 있습니다.

현재 HardendEKS의 목표는 EBPG 전체를 커버하는 것이며, 가능한 많은 규칙을 통합하기 위해 노력하고있습니다.

기여(Contributions)

HardenEKS에 기여하고 싶으신 분은 기여 가이드라인을 참고하시기 바랍니다. HardenEKS의 향후 버전을 구축하고 이끄는 데 도움을 주는 협력자 및 기여자분들을 환영합니다.

로드맵(Roadmap)

HardenEKS는 로드맵을 통해 향후 버전의 예정된 기능들에 대해서 공개하고 있습니다. 사용자는 GitHub 이슈를 생성해 로드맵에 영향을 끼칠 수 있습니다.

전제 조건

  • Python 3.7 이상 (pyenv를 사용하시면 다른 버전의 Python들을 쉽게 전환하여 사용하실 수 있습니다.)
  • AWS 계정
  • Amazon EKS 클러스터
  • readme에 정의된 필요 권한이 있는 AWS 자격 증명 및 ClusterRole
  • ~/.kube/config (현재는 기본 ~/.kube/config만 파일 위치로 지원합니다.)

리소스 정리

리소스 정리가 필요하지 않습니다. HardenEKS는 인프라를 생성하지 않으며 실행이 완료된 후 정리할 필요가 없습니다.

결론

이 포스팅에서는 Amazon EKS 운영자가 EBPG에 대해 프로그래밍 방식으로 Amazon EKS 클러스터를 검증하는 방법을 보여드렸습니다. 저희는 Amazon EKS를 통해 고객분들의 Day 2 Operation을 지원하는 새로운 방법을 만들게 되어 기쁘게 생각하고 있습니다. HardenEKS에 관심이 있으시다면, 다운로드를 받으셔서 Amazon EKS 클러스터에 테스트해 보시고 Github 이슈를 통해 피드백을 제공해 주세요.

Amazon EventBridge를 사용하여 HardenEKS를 주기적으로 실행하는 방법에 대한 소개 내용은 이 블로그 포스팅을 참고 하시길 바랍니다.

자세한 정보 및 기여: https://github.com/aws-samples/hardeneks

Jini Park

Jini Park

박진이 솔루션즈 아키텍트는 엔터프라이즈 고객을 대상으로 고객이 최적의 솔루션을 선택하여 비즈니스를 개선할 수 있도록 고객과 함께 효율적인 아키텍처를 구성하는 역할을 수행하고 있습니다.

Dongsoo Koo

Dongsoo Koo

구동수 솔루션즈 아키텍트는 디지털 기업 고객을 대상으로 고객의 비즈니스 성과 달성을 위해 고객과 함께 최적의 아키텍처를 구성하는 역할을 수행하고 있습니다.