Ssoon
AWS EKS - Security - Sealed Secrets 을 사용하여 Secrets 보호 본문
AWS EKS Workshop Study 2기
AWS EKS - Security - Sealed Secrets 을 사용하여 Secrets 보호
구구달스 2024. 4. 10. 13:45CloudNet@ 팀의 AWS EKS Workshop Study 2기 - 6주차
# EKS Workshop 참고
Sealed Secrets 프로젝트는 AWS 서비스가 아닌 Bitnami Labs의 타사 오픈 소스 도구입니다.
- Sealed Secrets는 Kubernetes 클러스터에서 비밀을 안전하게 저장하고 관리하기 위한 도구입니다.
- Sealed Secrets는 암호화된 형태로 Kubernetes Secrets를 저장하며, 이를 클러스터에 안전하게 배포할 수 있도록 해줍니다. 이를 통해 보안적인 측면을 강화하고, 비밀 데이터를 안전하게 전송하고 저장할 수 있습니다.
- Seal Key Pair 생성: Sealed Secrets는 클러스터에 설치된 컨트롤 플레인에 의해 사용되는 공개 및 개인 키 쌍을 생성합니다. 이 키 쌍은 암호화 및 복호화 작업에 사용됩니다.
- 비밀 생성 및 암호화: 클러스터 관리자는 kubectl을 사용하여 비밀을 생성하고, 이를 Sealed Secrets 컨트롤러에 전달합니다. Sealed Secrets 컨트롤러는 비밀을 받아서 이를 공개 키로 암호화한 후, 클러스터에 배포될 수 있도록 인코딩합니다.
- 암호화된 비밀 배포: 암호화된 비밀은 Kubernetes 클러스터에 배포됩니다. 이때, 클러스터에는 Sealed Secrets 컨트롤러가 설치되어 있어야 합니다. Sealed Secrets 컨트롤러는 암호화된 비밀을 받아서 복호화하기 위해 개인 키를 사용합니다.
- 복호화: 클러스터 내에서 Pod가 비밀을 사용할 때, 해당 비밀은 Sealed Secrets 컨트롤러에 의해 자동으로 복호화됩니다. 이는 원본 비밀을 사용하는 것과 같은 방식으로 Pod가 비밀을 이용할 수 있도록 합니다.
- Sealed Secrets의 장점
- 안전한 저장 및 전송: 비밀 데이터는 암호화되어 저장되며, 전송 중에도 안전한 상태로 유지됩니다.
- 원본 보존: 암호화된 비밀은 Kubernetes Secrets와 동일한 구조를 유지하므로, 기존의 Kubernetes 리소스 및 도구와 호환됩니다.
- 클러스터 외부에서 생성 가능: 비밀을 생성하고 암호화하는 작업은 클러스터 외부에서 수행할 수 있으므로, 보안적인 측면에서 유리합니다.
✅ 실습준비
- Workshop 실습 환경 준비
- 봉인된 시크릿은 시크릿 오브젝트를 암호화하여 공용 리포지토리에도 안전하게 저장할 수 있도록 하는 메커니즘을 제공합니다. 봉인된 시크릿은 쿠버네티스 클러스터에서 실행 중인 컨트롤러만 해독할 수 있으며, 다른 누구도 봉인된 시크릿에서 원본 시크릿을 얻을 수 없습니다.
- 실습에서는 SealedSecrets를 사용하여 쿠버네티스 시크릿과 관련된 YAML 매니페스트를 암호화하고 이러한 암호화된 시크릿을 kubectl과 같은 도구를 사용한 일반적인 워크플로우를 사용하여 EKS 클러스터에 배포할 수 있습니다.
✅ Sealed Secrets for Kubernetes
- Sealed Secrets 은 두 부분으로 구성됩니다:
- 클러스터 측 컨트롤러
- kubeseal이라는 클라이언트 측 CLI
- 컨트롤러가 시작되면 클러스터 전체의 개인/공개 키 쌍을 찾고, 찾을 수 없는 경우 새로운 4096비트 RSA 키 쌍을 생성합니다. 개인 키는 컨트롤러와 동일한 네임스페이스(기본값은 큐브 시스템)에 있는 시크릿 오브젝트에 유지됩니다. 이 공개 키 부분은 이 클러스터에서 SealedSecrets를 사용하려는 모든 사람이 공개적으로 사용할 수 있습니다.
- 암호화하는 동안 원본 시크릿의 각 값은 무작위로 생성된 세션 키와 함께 AES-256을 사용하여 대칭적으로 암호화됩니다. 그런 다음 세션 키는 SHA256을 사용하여 컨트롤러의 공개 키와 원본 시크릿의 네임스페이스/이름을 입력 매개변수로 사용하여 비대칭으로 암호화됩니다. 암호화 프로세스의 출력은 다음과 같이 구성된 문자열입니다: 암호화된 세션 키의 길이(2바이트) + 암호화된 세션 키 + 암호화된 시크릿.
- SealedSecret 사용자 정의 리소스가 쿠버네티스 클러스터에 배포되면 컨트롤러가 이를 선택하고 개인 키를 사용하여 봉인을 해제하고 시크릿 리소스를 생성합니다. 암호 해독 중에 SealedSecret의 네임스페이스/이름이 입력 파라미터로 다시 사용됩니다. 이렇게 하면 SealedSecret과 Secret이 동일한 네임스페이스와 이름에 엄격하게 연결됩니다.
- 컴패니언 CLI 도구인 kubeseal은 공개 키를 사용하여 시크릿 리소스 정의에서 SealedSecret 사용자 정의 리소스 정의(CRD)를 생성하는 데 사용된다. kubeseal은 쿠버네티스 API 서버를 통해 컨트롤러와 통신하고 런타임 시크릿을 암호화하는 데 필요한 공개 키를 검색할 수 있다. 공개 키는 컨트롤러에서 다운로드하여 로컬에 저장하여 오프라인에서 사용할 수도 있습니다.
- SealedSecrets는 다음 세 가지 범위를 가질 수 있습니다:
- strict (default) : 비밀은 정확히 동일한 이름과 네임스페이스로 봉인해야 합니다. 이러한 속성은 암호화된 데이터의 일부가 되므로 이름 및/또는 네임스페이스를 변경하면 '복호화 오류'가 발생할 수 있습니다.
- namespace-wide : 봉인된 비밀은 주어진 네임스페이스 내에서 자유롭게 이름을 변경할 수 있습니다.
- cluster-wide : 모든 네임스페이스에서 비밀을 봉인 해제할 수 있으며 어떤 이름으로든 지정할 수 있습니다.
✅ Installing Sealed Secrets
- kubeseal CLI는 Sealed Secrets 컨트롤러와 상호 작용하는 데 사용되며 이미 Cloud9에 설치되어 있습니다.
- EKS 클러스터에 Sealed Secrets 컨트롤러를 설치하는 것입니다:
- 파드의 상태를 확인
- Sealed Secrets 컨트롤러의 로그는 컨트롤러가 시작하는 동안 기존 개인 키를 찾으려고 시도하는 것을 보여줍니다. 개인 키를 찾지 못하면 인증서 세부 정보로 새 비밀을 만듭니다.
- 봉인 키가 포함된 시크릿의 내용을 다음과 같이 공개/개인 키 쌍으로 YAML 형식으로 볼 수 있습니다:
✅ Sealing your Secrets
- 카탈로그 네임스페이스의 카탈로그 배포는 환경 변수를 통해 카탈로그-db 시크릿에서 다음 데이터베이스 값에 액세스합니다:
- DB_USER
- DB_PASSWORD
- 카탈로그-db 시크릿을 살펴보면 다음과 같이 쉽게 디코딩할 수 있는 base64로만 인코딩되어 있습니다.
- ~/environment/eks-workshop/base-application/catalog/secrets.yaml
- 새로운 비밀 카탈로그-sealed-db를 만들어 보겠습니다. 카탈로그-db 시크릿과 동일한 키와 값을 사용하여 new-catalog-db.yaml 파일을 새로 만들겠습니다.
- ~/environment/eks-workshop/modules/security/sealed-secrets/new-catalog-db.yaml
- kubeseal로 SealedSecret YAML 매니페스트를 생성해 보겠습니다.
- 컨트롤러에서 공개 키를 가져와 오프라인으로 사용하여 비밀을 봉인할 수 있습니다.
- 다음 내용이 포함된 봉인된 비밀을 생성합니다:
- /tmp/sealed-catalog-db.yaml
- SealedSecret을 EKS 클러스터에 배포합니다.
- 컨트롤러 로그에 따르면 방금 배포된 SealedSecret 커스텀 리소스를 가져와 봉인을 해제하고 일반 시크릿을 생성하는 것으로 나타났습니다.
- SealedSecret에서 봉인 해제된 카탈로그-sealed-db 시크릿이 컨트롤러에 의해 보안-시크릿 네임스페이스에 배포되었는지 확인합니다.
- ~/environment/eks-workshop/modules/security/sealed-secrets/deployment.yaml
- SealedSecret 리소스인 카탈로그-sealed-db는 클러스터에 배포된 데몬셋, 디플로이먼트, 컨피그맵 등과 같은 다른 쿠버네티스 리소스와 관련된 YAML 매니페스트와 함께 Git 리포지토리에 안전하게 저장할 수 있습니다.
- 그런 다음 GitOps 워크플로우를 사용하여 이러한 리소스를 클러스터에 배포하는 것을 관리할 수 있습니다.
✅ Managing the Sealing Key
- SealedSecret 내에서 암호화된 데이터를 해독하는 유일한 방법은 컨트롤러가 관리하는 씰링 키를 사용하는 것입니다.
- 재해가 발생한 후 클러스터의 원래 상태를 복원하려는 경우 또는 GitOps 워크플로우를 활용하여 Git 리포지토리에서 SealedSecrets를 포함한 Kubernetes 리소스를 배포하고 새 EKS 클러스터를 생성하려는 경우가 있을 수 있습니다.
- 새 EKS 클러스터에 배포된 컨트롤러는 동일한 봉인 키를 사용해야 SealedSecrets의 봉인을 해제할 수 있습니다.
- 다음 명령을 실행하여 클러스터에서 씰링 키를 검색합니다. 프로덕션 환경에서는 이 작업을 수행하는 데 필요한 권한을 제한된 클라이언트 집합에 부여하기 위해 Kubernetes RBAC를 사용하는 것이 모범 사례로 간주됩니다.
- 작동을 테스트하기 위해 봉인 키가 포함된 시크릿을 삭제하고 봉인된 시크릿 컨트롤러를 재활용해 보겠습니다:
- 이제 컨트롤러의 로그를 확인해 보겠습니다. SealedSecret 해독에 실패한 것을 확인할 수 있습니다:
- 이는 봉인 키를 삭제하여 컨트롤러가 시작될 때 새 키를 생성했기 때문입니다.
- 이렇게 하면 이 컨트롤러에서 모든 SealedSecret 리소스에 액세스할 수 없게 됩니다. 다행히도 이전에 /tmp/master-sealing-key.yaml에 저장해 두었으므로 EKS 클러스터에서 다시 만들 수 있습니다:
- 로그를 다시 확인해보니 이번에는 컨트롤러가 복원된 봉인 키를 가져와 카탈로그 봉인된 데이터베이스의 비밀을 해제했습니다:
- tmp/master-sealing-key.yaml 파일에는 컨트롤러에서 생성한 공개/개인 키 쌍이 포함되어 있습니다. 이 파일이 손상되면 모든 SealedSecret 매니페스트의 봉인이 해제되고 저장된 암호화된 민감한 정보가 공개될 수 있습니다. 따라서 이 파일은 최소 권한 액세스 권한을 부여하여 보호해야 합니다
- 봉인 키를 보호하는 한 가지 옵션은 AWS 시스템 관리자 매개변수 스토어에 /tmp/master-sealing-key.yaml 파일 내용을 SecureString 매개변수로 저장하는 것입니다. 이 매개변수는 KMS CMK(고객 관리 키)를 사용하여 보호할 수 있으며, 키 정책을 사용하여 이 키를 검색하기 위해 이 키를 사용할 수 있는 IAM 주체의 집합을 제한할 수 있습니다. 또한 KMS에서 이 CMK의 자동 로테이션을 사용 설정할 수도 있습니다. 표준 계층 매개변수는 최대 4096자의 매개변수 값을 지원한다는 점에 유의하세요. 따라서 마스터.yaml 파일의 크기를 고려할 때 고급 티어에 파라미터로 저장해야 합니다.
'AWS EKS Workshop Study 2기' 카테고리의 다른 글
AWS EKS - Security - Pod Security Standards (1) | 2024.04.12 |
---|---|
AWS EKS - Security - Amazon GuardDuty for EKS (0) | 2024.04.12 |
AWS EKS - Security - AWS Secrets Manager로 Secrets 관리 (0) | 2024.04.10 |
AWS EKS - Security - Amazon EKS Pod Identity (0) | 2024.04.10 |
AWS EKS - Autoscaling - Workloads (1) | 2024.03.31 |
Comments