Ssoon

AWS EKS - Security - AWS Secrets Manager로 Secrets 관리 본문

AWS EKS Workshop Study 2기

AWS EKS - Security - AWS Secrets Manager로 Secrets 관리

구구달스 2024. 4. 10. 13:14
CloudNet@ 팀의 AWS EKS Workshop Study 2기 - 6주차
# EKS Workshop 참고
  • 쿠버네티스 시크릿은 클러스터 운영자가 비밀번호, OAuth 토큰, ssh 키 등과 같은 민감한 정보의 배포를 관리하는 데 도움이 되는 리소스
  • 이러한 시크릿은 데이터 볼륨으로 마운트하거나 파드의 컨테이너에 환경 변수로 노출할 수 있으므로 파드 배포와 파드 내의 컨테이너화된 애플리케이션에 필요한 민감한 데이터 관리를 분리
  • DevOps 팀에서 다양한 Kubernetes 리소스에 대한 YAML 매니페스트를 관리하고 Git 리포지토리를 사용하여 버전을 제어하는 것이 일반적인 관행이 되었습니다. 이를 통해 Git 리포지토리를 GitOps 워크플로와 통합하여 이러한 리소스를 EKS 클러스터로 지속적 배포할 수 있습니다. 
  • Kubernetes는 단순한 base64 인코딩을 사용하여 시크릿의 민감한 데이터를 난독화하며, 이러한 파일을 Git 리포지토리에 저장하는 것도 base64 인코딩된 데이터를 디코딩하는 것이 간단하기 때문에 매우 안전하지 않습니다. 따라서 클러스터 외부에서 Kubernetes 시크릿에 대한 YAML 매니페스트를 관리하기가 어렵습니다.


Exploring Secrets

  • 쿠버네티스 시크릿은 환경 변수 및 볼륨과 같은 다양한 방식으로 파드에 노출
  • 환경 변수로 시크릿 노출
    • 파드 매니페스트를 사용하여 데이터베이스-자격증명 시크릿의 키, 즉 사용자 이름과 비밀번호를 환경 변수로 파드에 노출

  • 볼륨으로 비밀 노출
    • 시크릿은 파드에 데이터 볼륨으로 마운트할 수도 있으며, 다음과 같이 파드 매니페스트를 사용하여 시크릿 키가 투영되는 볼륨 내의 경로를 제어
    • 데이터베이스-자격증명 시크릿의 사용자 이름 키 값은 파드 내의 /etc/data/DATABASE_USER 파일에 저장된다
    • 비밀번호 키의 값은 /etc/data/DATABASE_PASSWORD 파일에 저장된다.

  • AWS Secrets Manager 를 사용하면 자격 증명, API 키, 인증서 등과 같은 민감한 데이터를 쉽게 회전, 관리 및 검색할 수 있습니다. Kubernetes Secrets Store CSI Driver 용 AWS Secrets and Configuration Provider (ASCP) 를 사용하여 시크릿 매니저에 저장된 시크릿을 쿠버네티스 파드에 볼륨으로 마운트할 수 있습니다
  • ASCP를 사용하면, 시크릿 매니저에서 시크릿을 저장 및 관리한 다음 Amazon EKS에서 실행 중인 워크로드를 통해 시크릿을 검색할 수 있습니다. IAM 역할과 정책을 사용하여 클러스터의 특정 쿠버네티스 파드로 시크릿에 대한 액세스를 제한할 수 있습니다. ASCP는 파드 아이덴티티를 검색하고 그 아이덴티티를 IAM 역할로 교환한다. ASCP는 파드의 IAM 역할을 가정한 다음, 해당 역할에 대해 권한이 부여된 시크릿 매니저에서 시크릿을 검색할 수 있다.
  • AWS 시크릿 매니저와 쿠버네티스 시크릿을 통합하는 또 다른 방법은 외부 시크릿을 사용하는 것이다. 외부 시크릿은 AWS 시크릿 매니저에서 시크릿을 통합하고 동기화할 수 있는 오퍼레이터로, 시크릿의 정보를 읽고 그 값을 자동으로 추상화하여 Kubernetes 시크릿에 주입하여 시크릿의 수명 주기를 저장 및 관리합니다.
  • 시크릿 매니저 자동 로테이션을 시크릿에 사용하는 경우, Amazon EKS 클러스터 내에서 시크릿을 관리하기 위해 선택한 도구에 따라 외부 시크릿 새로 고침 간격을 사용하거나 시크릿 스토어 CSI 드라이버 로테이션 조정기 기능을 사용하여 시크릿 매니저에서 최신 시크릿을 검색하도록 할 수 있습니다.

 실습준비


  • Workshop 실습 환경 준비
더보기
  • 쿠버네티스 시크릿 스토어 CSI 드라이버
  • AWS 시크릿 및 구성 공급자
  • 외부 시크릿 오퍼레이터

Storing secrets in AWS Secrets Manager

  • AWS 시크릿 매니저에 시크릿을 저장
  • 사용자 이름 및 비밀번호 자격 증명에 대해 JSON으로 인코딩된 키/값 콘텐츠와 함께 비밀을 저장

 

  • 새로 저장된 암호를 검증


AWS Secrets and Configuration Provider (ASCP)

  • 실습준비 환경 스크립트를 실행했을 때, 이 실습에 필요한 쿠버네티스 시크릿 스토어 CSI 드라이버를 위한 AWS 시크릿 및 구성 공급자(ASCP)가 이미 설치되어 있습니다.
  • 애드온이 배포되었는지 확인
  • 시크릿 스토어 CSI 드라이브 데몬셋과 각 파드를 확인

  • AWS 드라이버 DaemonSet 및 해당 포드에 대한 CSI Secrets Store Provider를 확인

 

  • CSI 드라이버를 통해 AWS 시크릿 매니저에 저장된 시크릿에 대한 액세스를 제공하려면, 드라이버 구성과 AWS 시크릿 매니저의 정보와 일치하는 특정 파라미터를 제공하는 데 사용되는 네임스페이스 사용자 정의 리소스인 SecretProviderClass가 있어야 합니다.
  • ~/environment/eks-workshop/modules/security/secrets-manager/secret-provider-class.yaml

  • 해당 사양을 탐색할 수 있는 리소스 생성

 

  • 다음 단계에서 AWS Secrets Manager에 저장할 eks-workshop/catalog-secret이라는 비밀을 가리키는 개체 매개변수
  • JSON 형식의 비밀에서 특정 키-값을 추출하기 위해 jmesPath를 사용

 

  •  Kubernetes 비밀을 생성 및/또는 AWS Secrets Manager에 저장된 비밀의 데이터와 동기화하는 secretObjects입니다.
  • SecretProviderClass는 포드에 마운트될 때 Kubernetes 비밀이 아직 존재하지 않는 경우 이를 생성하고 AWS Secrets Manager에 저장된 값을 이 Kubernetes 비밀과 동기화합니다. 이 경우 이름은 Catalog-secret입니다.


Mounting AWS Secrets Manager secret on Kubernetes Pod

  • 이제 AWS 시크릿 매니저에 시크릿이 저장되고 쿠버네티스 시크릿과 동기화되었으므로 파드 내부에 시크릿을 마운트해 보겠습니다. 먼저 카탈로그 디플로이먼트와 카탈로그 네임스페이스에 있는 기존 시크릿을 살펴봐야 합니다.
  • 카탈로그 배포는 환경 변수를 통해 Catalog-db 비밀에서 다음 데이터베이스 자격 증명에 액세스합니다.
    • DB_USER
    • DB_PASSWORD

  • 카탈로그 배포에는 /tmp에 마운트된emptyDir 이외의 볼륨이나 VolumeMount가 없습니다.

 

  • 이제 AWS Secrets Manager에 저장된 암호를 자격 증명 소스로 사용하기 위해 카탈로그 배포에 변경 사항을 적용해 보겠습니다.
  • ~/environment/eks-workshop/modules/security/secrets-manager/mounting-secrets/kustomization.yaml

  • 앞서 파드 내부의 /etc/catalog-secret mountPath에서 유효성을 검사한 SecretProviderClass와 함께 CSI 드라이버를 사용하여 AWS 시크릿 매니저 시크릿을 마운트할 것입니다.
  • 이렇게 하면 AWS 시크릿 매니저는 저장된 시크릿의 내용을 Amazon EKS와 동기화하고, 파드의 환경 변수로 사용할 수 있는 동일한 내용으로 쿠버네티스 시크릿을 생성합니다.

 

  • 카탈로그 네임스페이스의 변경 사항을 확인해 보겠습니다.
  • 배포에서는 CSI 비밀 저장소 드라이버를 가리키는 새 볼륨과 해당 볼륨 마운트가 있고 /etc/catalog-secrets 경로에 마운트되어 있는지 확인할 수 있습니다.

 

  • 마운트된 시크릿은 하나 이상의 파드 컨테이너의 파일 시스템 내부에서 민감한 정보를 파일로 사용할 수 있는 좋은 방법입니다.
  • 시크릿의 값을 환경 변수로 노출하지 않고 볼륨에 시크릿의 데이터가 포함되어 있고 해당 시크릿이 업데이트될 때 쿠버네티스가 이를 추적하여 볼륨의 데이터를 업데이트한다는 몇 가지 이점이 있습니다.
  • Pod 내부에 마운트된 보안 비밀의 내용을 확인할 수 있습니다.

 

  • 마운트 경로 /etc/catalog-secret에 3개의 파일이 있습니다.
    • eks-workshop-catalog-secret: JSON 형식의 비밀번호 값입니다
    • password: 비밀번호 jmesPath 필터링 및 형식화된 값입니다.
    • username: 사용자 이름 jmesPath 필터링 및 형식화된 값입니다.
  • 또한 환경 변수는 이제 이전에는 존재하지 않았던 새로운 시크릿인 카탈로그 시크릿에서 소비되고 있으며, 이는 CSI 시크릿 스토어 드라이버를 통해 SecretProviderClass에 의해 생성되었습니다.

  • 실행 중인 파드의 환경 변수를 확인하면 이를 확인할 수 있습니다:

  • 이제 AWS 시크릿 매니저와 완전히 통합된 쿠버네티스 시크릿을 통해 시크릿 관리의 모범 사례인 시크릿 로테이션을 활용할 수 있습니다. 
  • AWS 시크릿 매니저에서 시크릿이 회전되거나 업데이트될 때마다, CSI 시크릿 스토어 드라이버가 회전된 값으로 Kubernetes 시크릿 콘텐츠를 동기화할 수 있도록 배포의 새 버전을 롤아웃할 수 있습니다.

External Secrets Operator

  • 외부 비밀 연산자를 사용하여 관리되는 비밀과의 통합을 확인합니다.이것은 이미 EKS 클러스터에 설치되어 있습니다.

  • external-secrets-sa 라는 이름의 서비스 계정이 있는데, 이 계정은 IRSA를 통해 IAM 역할에 연결되며, AWS Secrets Manager에 액세스하여 비밀 정보를 검색할 수 있습니다.

  • 그 외에도 모든 네임스페이스의 모든 ExternalSecrets에서 참조할 수 있는 클러스터 전체 SecretStore인 ClusterSecretStore라는 새로운 클러스터 리소스를 만들어야 합니다.
  • ~/environment/eks-workshop/modules/security/secrets-manager/cluster-secret-store.yaml

 

  • 새로 생성된 리소스 사양을 확인합니다.
  • ServiceAccount를 참조하는 JSON 웹 토큰(jwt)을 사용하여 AWS Secrets Manager와 동기화하는 것을 볼 수 있습니다.

  •  AWS 시크릿 매니저에서 어떤 데이터를 가져와야 하는지, 데이터를 어떻게 변환하고 Kubernetes 시크릿으로 저장해야 하는지 설명하는 ExternalSecret을 생성합니다. 그런 다음 카탈로그 배포를 패치하여 외부 시크릿을 자격 증명의 소스로 사용하도록 할 수 있습니다.
  • ~/environment/eks-workshop/modules/security/secrets-manager/external-secrets/kustomization.yaml

 

 

  • 새로 생성된 ExternalSecret 리소스 확인

  • 리소스의 상태가 SecretSynced 상태인지 확인합니다. 이는 AWS Secrets Manager에서 성공적으로 동기화되었음을 의미합니다. 

  • AWS Secrets Manager에 저장한 비밀과 이전에 생성한 ClusterSecretStore를 가리키는 키와 secretStoreRef 매개변수가 보입니다. 또한 refreshInterval이 1시간으로 설정되어 있어 이 시크릿의 값이 매시간 확인되고 새로 고쳐집니다.
  • 하지만 파드에서 이 외부시크릿을 어떻게 사용할 수 있을까? 이 리소스를 생성하면 네임스페이스에 동일한 이름의 쿠버네티스 시크릿이 자동으로 생성됩니다.

  • 이 비밀을 자세히 확인합니다.

  • 외부 비밀 연산자를 가리키는 ownerReference가 있는지 확인합니다.
  • 이제 카탈로그 포드가 이 새 비밀의 값으로 이미 업데이트되었으며 실행 중인지 확인합니다.

  • 결론적으로 AWS Secrets Manager에 저장된 비밀을 관리하기 위해 AWS Secrets and Configuration Provider (ASCP)External Secrets Operator (ESO) 중에서 선택하는 데 있어 가장 좋은 옵션은 없습니다.
  • AWS Secrets and Configuration Provider (ASCP)  는 시크릿을 환경 변수로 노출하지 않고 AWS 시크릿 매니저에서 파드에 직접 볼륨으로 마운트하는 데 도움이 될 수 있지만, 볼륨을 관리해야 한다는 단점이 있습니다.
  • External Secrets Operator (ESO) 는 클러스터 전체에 걸쳐 시크릿 스토어를 제공하므로 Kubernetes 시크릿 수명 주기 관리가 더 쉬워지지만 시크릿을 볼륨으로 사용할 수 없습니다. 사
Comments