이전글: https://lilylabs.tistory.com/48
Secret 데이터 암호화를 위해서는 EncryptionConfiguration Object 생성과 kube-apiserver 설정 작업이 필요합니다. 자세한 내용은 하기 본문에 정리하였습니다.
1. EncryptionConfiguration Object 생성
1-1. EncryptionConfiguration란?
- 이전글: https://lilylabs.tistory.com/48
- 클러스터에서 데이터를 암호화하는 데 사용되는 구성 요소이다,
- Secrets, ConfigMaps 등 특정 리소스의 데이터를 암호화할 수 있다.
1-2. EncryptionConfiguration 정의
- EncryptionConfiguration Object의 providers 블록에서 알고리즘(identity, aescbc, aesgcm 등) 과 Key를 정의한다.
- provider는 여러개로 정의할 수 있으며 제일 처음 위치한 provider를 사용하여 암호화가 진행됨으로 순서가 중요하다.
- 본 문서에서는 secretbox를 사용하여 암호화를 진행하였으며 32-byte의 랜덤키가 필요하다.
- head -c 32 /dev/urandom | base64 (※ 32바이트 무작위 키를 생성하고 이를 base64로 인코딩)
# /etc/kubernetes/enc/enc.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <BASE 64 ENCODED SECRET>
- identity: {}
2. kube-apiserver 설정
2-1. kube-apiserver.yaml의 '--encryption-provider-config' 옵션 활성화
- vi /etc/kubernetes/manifests/kube-apiserver.yaml
- spec.containers.command 블록에서 하기 코드 추가
- --encryption-provider-config=/etc/kubernetes/enc/enc.yaml
- volumeMounts 블록에서 하기 코드 추가
- name: enc
mountPath: /etc/kubernetes/enc
readOnly: true
-
- volumes 블록에서 하기 코드 추가
- name: enc
hostPath:
path: /etc/kubernetes/enc
type: DirectoryOrCreate
2-2. API Server 재시작
- 'kube-apiserver.yaml'을 저장하면 자동으로 API Server가 재시작됩니다.
3. Secret 생성 및 데이터 확인
3-1. Secret 생성
# Secret 생성
kubectl create secret generic secret01 --from-literal username=admin
kubectl create secret generic secret02 --from-literal password=qwer123
# 생성한 Secret 확인
kubectl get secret
3-2. Secret 데이터 확인
- Secret 데이터가 ETCD에 암호화되어 저장되어 어떤 값인지 확인할 수 없다.
- 단, ETCD에 암호화되어 저장되어 있는 것으로 API를 통해 Secret을 조회할 때 Secret 값은 복호화되어 확인 가능하다.
ETCDCTL_API=3 etcdctl \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
get /registry/secrets/default/secret01 | hexdump -C
- Secret 데이터를 암호화 하더라도 기존 Secret 데이터는 암호화되지 않은 상태로 저장되었기 때문에, 하기 명령어를 통해 현재 클러스터에 존재하는 모든 Secret을 암호화할 수 있다.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
참고 사이트
1. Encrypting Confidential Data at Rest
2. ETCD 설치
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] Secret 생성 및 조회 (0) | 2024.05.08 |
---|---|
[Kubernetes] ConfigMap, Secret, Azure Keyvault (0) | 2024.05.07 |
[Kubernetes] Kubespray로 쿠버네티스 설치 (1) | 2024.05.02 |
[Kubernetes] ELK Stack 개념 (0) | 2024.04.29 |
[Kubernetes] Probe - Liveness, Readiness, Startup (0) | 2024.04.08 |