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 드라이버 로테이션 조정기 기능을 사용하여 시크릿 매니저에서 최신 시크릿을 검색하도록 할 수 있습니다.
ServiceAccount를 참조하는 JSON 웹 토큰(jwt)을 사용하여 AWS Secrets Manager와 동기화하는 것을 볼 수 있습니다.
AWS 시크릿 매니저에서 어떤 데이터를 가져와야 하는지, 데이터를 어떻게 변환하고 Kubernetes 시크릿으로 저장해야 하는지 설명하는 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 시크릿 수명 주기 관리가 더 쉬워지지만 시크릿을 볼륨으로 사용할 수 없습니다. 사