Secret Manager를 사용해서 K8S Secret 관리하기
개요
kubernetes secrets은 단순 base64 인코딩 된 값이기 때문에 기밀성을 보장하지 않습니다.
그렇기 때문에 보안을 향상하기 위해서 Secret Manager를 사용했습니다. 대표적으로 AWS Secret Manager는 데이터베이스 자격증명, API 키, 토큰 값 등 민감한 정보를 AWS KMS키로 암호화하여 저장하는 관리형 서비스입니다.
Secret Manager에 존재하는 데이터를 kubernetes secrets으로 연동할 수 있는 도구는 대표적으로 External Secret operator(ESO), Kubernetes Secrets Store CSI Driver(SSCSID)두 가지가 있습니다.
두 가지의 차이점과 비교한 것들을 정리하겠습니다.
Secret Manager 목록
- AWS Secrets Manager
- AWS Parameter Store
- Akeyless
- Hashicorp Vault
- Google Cloud Secrets Manager
- Azure Key Vault
- IBM Cloud Secrets Manager
- Yandex Lockbox
- Gitlab Project Variables
- Alibaba Cloud KMS
- Oracle Vault
ESO와 SSCSID의 차이점
- ESO는 k8s secrets를 무조건 생성하게 되며, k8s secrets과 Secret Manager가 동기화가 됩니다.
- SSCSID는 k8s secrets 생성을 선택할 수 있습니다.
- ESO는 secret을 k8s의 모든 리소스에서 사용할 수 있습니다.
- SSCSID는 secret을 k8s의 모든 리소스에서 사용하기 어렵고, 단지 pod에 볼륨 마운트로 간단하게 사용할 수 있습니다.
정리해보면, k8s secret을 생성하지 않고 pod에 간단하게 마운트하여 사용하려면 SSCSID을 선택합니다. 하지만 pod마다 ServiceAccount를 붙여야 하는 번거로움이 있습니다.
그 외에 k8s secret을 생성하고 pod를 제외한 다른 k8s 리소스에서도 secret을 사용한다면 ESO를 선택합니다. 추가로, 보안을 향상하기 위해서 k8s secret 리소스에 RBAC으로 개발자의 접근을 차단하고 Secret Manager에서 개발자들이 시크릿을 변경, 관리하도록 합니다. 그리고 pod에 secret을 env로 넣지 않고 volume mount로 넣습니다.
위의 내용은 아래 깃헙 이슈를 바탕으로 정리했습니다.
https://github.com/external-secrets/external-secrets/issues/478
AWS Secret Manager 예시
External Secret operator(ESO)
https://github.com/external-secrets/external-secrets
Kubernetes Secrets Store CSI Driver(SSCSID)
https://github.com/kubernetes-sigs/secrets-store-csi-driver
번외1. 어플리케이션에서 호출
만약 단지 어플리케이션에 민감한 정보를 하드코딩하는 것이 걱정이라면 위의 두 개 도구를 사용해서 k8s secret을 생성하고 pod에 마운트하는 것보다 어플리케이션에서 secret manager에 저장된 값을 바로 호출하는 것이 가장 심플합니다. 아래 코드는 AWS SDK Java 예시입니다.
public static void getValue(SecretsManagerClient secretsClient,String secretName) {
try {
GetSecretValueRequest valueRequest = GetSecretValueRequest.builder()
.secretId(secretName)
.build();
GetSecretValueResponse valueResponse = secretsClient.getSecretValue(valueRequest);
String secret = valueResponse.secretString();
System.out.println(secret);
} catch (SecretsManagerException e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
번외2. hashicorp vault
hashicorp vault도 좋은 솔루션이지만 암호 생성/관리, 사용방법이 다소 복잡합니다. 이미 클라우드 서비스를 사용하고 있다면 관리형 서비스(Secret Manager)를 사용하는 것이 편리하다고 생각합니다.
참고
https://nangman14.tistory.com/76