MinIO AIStor 환경에서 암호화 키 관리(SSE-S3, SSE-KMS)를 제공하는 MinKMS(MinIO KMS / KES 차세대 엔터프라이즈 컴포넌트)를 Kubernetes 클러스터에 배포하고 AIStor 테넌트와 연동하는 표준 절차입니다.
MinKMS는 상호 TLS(mTLS)를 필수로 요구하므로, KMS 서버 인증서와 MinIO 테넌트가 KMS에 접근할 때 사용할 클라이언트 인증서가 준비되어 있어야 합니다.
# 네임스페이스 생성 (예: minkms 또는 minio)
kubectl create namespace minkms
# 1. MinKMS 서버 TLS 시크릿 생성
kubectl create secret tls minkms-tls \
--cert=minkms-server.crt \
--key=minkms-server.key \
-n minkms
# 2. MinIO 테넌트 인증용 클라이언트 인증서 공개키를 KMS 허용 목록에 등록하기 위한 Secret
kubectl create secret generic minkms-identities \
--from-file=minio-client.crt=minio-client.crt \
-n minkms
MinKMS는 백엔드 키 저장소(Vault, AWS KMS 또는 자체 로컬 암호화 키 스토리지)와 클라이언트 권한 정책을 정의합니다.
# minkms-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: minkms-config
namespace: minkms
data:
config.yaml: |
address: 0.0.0.0:7373
tls:
key: /etc/minkms/certs/tls.key
cert: /etc/minkms/certs/tls.crt
policy:
minio:
paths:
- /v1/key/create/*
- /v1/key/generate/*
- /v1/key/decrypt/*
identities:
# minio-client.crt의 SHA-256 identity 해시값
- <MINIO_CLIENT_CERT_IDENTITY_HASH>
keystore:
# 예: 로컬 파일 기반 또는 외부 Vault/KMIP 등 백엔드 지정
fs:
path: /var/lib/minkms/keys
kubectl apply -f minkms-config.yaml
Identity 해시 추출 팁:
kes identity of minio-client.crt또는openssl x509 -in minio-client.crt -pubkey -noout | openssl pkey -pubin -outform DER | openssl dgst -sha256로 해시값을 계산해 넣습니다.
# minkms-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: minkms
namespace: minkms
spec:
replicas: 2
selector:
matchLabels:
app: minkms
template:
metadata:
labels:
app: minkms
spec:
containers:
- name: minkms
image: quay.io/minio/kes:latest # AIStor 전용 엔터프라이즈 MinKMS 이미지 지정
args:
- server
- --config=/etc/minkms/config/config.yaml
ports:
- containerPort: 7373
name: https
volumeMounts:
- name: config
mountPath: /etc/minkms/config
- name: certs
mountPath: /etc/minkms/certs
- name: keys
mountPath: /var/lib/minkms/keys
volumes:
- name: config
configMap:
name: minkms-config
- name: certs
secret:
secretName: minkms-tls
- name: keys
emptyDir: {} # 영구 보관 필요 시 PVC로 마운트
---
apiVersion: v1
kind: Service
metadata:
name: minkms
namespace: minkms
spec:
selector:
app: minkms
ports:
- port: 7373
targetPort: 7373
name: https
kubectl apply -f minkms-deployment.yaml
kubectl get pods -n minkms -l app=minkms
검증: STATUS가 Running이고 재시작 카운트가 올라가지 않는지 확인합니다.
MinIO 테넌트 CRD(또는 Helm values)의 kms 섹션에 MinKMS 엔드포인트와 클라이언트 mTLS 시크릿을 등록합니다.
# AIStor Tenant CRD 예시 (또는 values.yaml)
spec:
features:
enableKMS: true
kms:
# MinKMS Service 내부 도메인 주소
endpoint: "https://minkms.minkms.svc.cluster.local:7373"
# MinIO가 사용할 기본 마스터 키 이름
defaultKey: "my-minio-key"
# MinIO 클라이언트 mTLS 인증서 시크릿
certificate:
secretName: minio-kes-client-cert
테넌트를 업데이트(kubectl apply)하면 MinIO 서버 파드들이 재기동되면서 시작 시 MinKMS와 mTLS 핸드셰이크를 맺고 SSE-S3/KMS 암호화 기능이 활성화됩니다.
mc 명령어로 검증)앞서 구성한 mc를 통해 버킷 기본 암호화 정책을 걸고 동작을 확인합니다.
# 1. 테스트 버킷 생성
mc mb myaistor/encrypted-bucket
# 2. SSE-KMS 기본 암호화 설정
mc encrypt set sse-kms my-minio-key myaistor/encrypted-bucket
# 3. 파일 업로드 후 암호화 메타데이터 검증
mc cp /etc/hosts myaistor/encrypted-bucket/
mc stat myaistor/encrypted-bucket/hosts
Encryption: 항목에 SSE-KMS가 표시되면 MinKMS 연동이 정상 완료된 것입니다.