26S21d

QK·2026년 9월 21일

맞습니다! 사내 사설 CA(PKI)나 Cert-Manager가 구축되어 있지 않다면, openssl 명령어로 자체 서명(Self-Signed) 인증서와 키를 직접 생성해서 시크릿으로 등록해야 합니다.

MinKMS(또는 KES)는 TLS 인증서의 SAN(Subject Alternative Name)에 K8s 내부 서비스 도메인 주소가 정확히 포함되어 있어야 MinIO가 접속할 때 TLS 핸드셰이크 오류(certificate valid for ..., not ...)를 내지 않습니다.

아래 절차대로 실행하시면 필요한 인증서와 키가 생성되고 Secret 등록까지 한 번에 완료됩니다.


  1. OpenSSL 설정 파일(san.cnf) 작성: SAN 설정.
    MinKMS 파드와 Service 도메인을 포괄할 수 있도록 SAN 설정 파일을 임시로 생성합니다.
cat <<EOF > minkms-san.cnf
[req]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = dn
req_extensions     = req_ext

[dn]
CN = minkms.minkms.svc.cluster.local

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = minkms
DNS.2 = minkms.minkms
DNS.3 = minkms.minkms.svc
DNS.4 = minkms.minkms.svc.cluster.local
IP.1  = 127.0.0.1
EOF

(※ 네임스페이스가 minkms가 아니라면 네임스페이스에 맞게 도메인을 수정하세요.)

  1. 개인키 및 자체 서명 인증서 생성: 인증서 발급.
    작성한 설정을 바탕으로 10년(3650일) 유효기간의 개인키와 인증서를 생성합니다.
# 1. 개인키 생성 (minkms-server.key)
openssl genrsa -out minkms-server.key 2048

# 2. 자체 서명 인증서 생성 (minkms-server.crt)
openssl req -new -x509 \
  -key minkms-server.key \
  -out minkms-server.crt \
  -days 3650 \
  -config minkms-san.cnf \
  -extensions req_ext

검증: openssl x509 -in minkms-server.crt -text -noout | grep -A 5 "Subject Alternative Name"을 실행해 위 DNS 목록들이 잘 들어갔는지 확인합니다.

  1. TLS Secret 생성: K8s 등록.
    생성된 crt와 key 파일로 Kubernetes Secret을 생성합니다.
kubectl create secret tls minkms-tls \
  --cert=minkms-server.crt \
  --key=minkms-server.key \
  -n minkms

검증: kubectl get secret minkms-tls -n minkms로 생성을 확인합니다.


추가 팁: MinIO가 이 자체 서명 인증서를 신뢰하게 하려면

자체 서명 인증서이므로 MinIO 테넌트가 MinKMS에 연결할 때 certificate signed by unknown authority 에러가 발생하지 않도록, 방금 만든 minkms-server.crt를 MinIO 테넌트의 신뢰할 수 있는 CA 인증서(Secret) 목록에도 함께 등록해 주어야 합니다.

# MinIO 테넌트가 위치한 네임스페이스에 CA Secret으로 등록 (예: minio 네임스페이스)
kubectl create secret generic minkms-ca-cert \
  --from-file=minkms-ca.crt=minkms-server.crt \
  -n <MINIO_NAMESPACE>

==

MinIO 테넌트가 MinKMS(KES)와 통신할 때 신원을 증명하는 클라이언트 인증서(mTLS Client Certificate) 생성 및 MinKMS 정책(policy)에 등록할 Identity Hash 추출 방법입니다.


  1. MinIO 클라이언트 개인키 및 자체 서명 인증서 생성:
    클라이언트 인증서는 도메인(SAN) 검증 대신 인증서의 공개키 해시(Identity) 자체로 식별하므로 일반적인 자체 서명 인증서로 생성합니다.
# 1. 클라이언트 개인키 생성
openssl genrsa -out minio-client.key 2048

# 2. 클라이언트 자체 서명 인증서 생성 (10년 유효기간)
openssl req -new -x509 \
  -key minio-client.key \
  -out minio-client.crt \
  -days 3650 \
  -subj "/CN=minio-aistor-tenant"
  1. MinKMS Identity Hash 계산:
    MinKMS는 X.509 인증서의 DER 인코딩된 공개키에 대한 SHA-256 해시값을 identity로 사용합니다. openssl 명령어로 이를 추출합니다.
openssl x509 -in minio-client.crt -pubkey -noout \
  | openssl pkey -pubin -outform DER \
  | openssl dgst -sha256 \
  | awk '{print $NF}'

출력 예시:

7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d

이 64자리 16진수 문자열이 바로 MinKMS config.yaml의 identities 항목에 들어갈 값입니다.

  1. MinKMS ConfigMap에 Identity 등록:
    추출한 Identity 해시값을 MinKMS 설정의 policy.<정책명>.identities 목록에 추가합니다.
# minkms-config.yaml 예시 발췌
policy:
  minio:
    paths:
      - /v1/key/create/*
      - /v1/key/generate/*
      - /v1/key/decrypt/*
      - /v1/key/bulk/decrypt/*
    identities:
      - 7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d  # 위에서 추출한 해시값
  1. MinIO 테넌트 네임스페이스에 클라이언트 Secret 생성:
    MinIO 테넌트 Pod들이 MinKMS 호출 시 사용할 수 있도록, MinIO가 위치한 네임스페이스에 인증서와 키를 시크릿으로 등록합니다.
# MinIO 테넌트 네임스페이스(예: minio)에 Secret 생성
kubectl create secret generic minio-kes-client-cert \
  --from-file=client.crt=minio-client.crt \
  --from-file=client.key=minio-client.key \
  -n <MINIO_TENANT_NAMESPACE>

테넌트 CRD / values.yaml 최종 매핑

생성한 Secret을 MinIO 테넌트 정의에 지정하면 mTLS 연동 준비가 완료됩니다.

spec:
  features:
    enableKMS: true
  kms:
    endpoint: "https://minkms.minkms.svc.cluster.local:7373"
    defaultKey: "my-minio-key"
    certificate:
      secretName: minio-kes-client-cert # 위 Step 4에서 생성한 Secret

==

MinIO 테넌트가 MinKMS(KES)와 통신할 때 신원을 증명하는 클라이언트 인증서(mTLS Client Certificate) 생성 및 MinKMS 정책(policy)에 등록할 Identity Hash 추출 방법입니다.


  1. MinIO 클라이언트 개인키 및 자체 서명 인증서 생성:
    클라이언트 인증서는 도메인(SAN) 검증 대신 인증서의 공개키 해시(Identity) 자체로 식별하므로 일반적인 자체 서명 인증서로 생성합니다.
# 1. 클라이언트 개인키 생성
openssl genrsa -out minio-client.key 2048

# 2. 클라이언트 자체 서명 인증서 생성 (10년 유효기간)
openssl req -new -x509 \
  -key minio-client.key \
  -out minio-client.crt \
  -days 3650 \
  -subj "/CN=minio-aistor-tenant"
  1. MinKMS Identity Hash 계산:
    MinKMS는 X.509 인증서의 DER 인코딩된 공개키에 대한 SHA-256 해시값을 identity로 사용합니다. openssl 명령어로 이를 추출합니다.
openssl x509 -in minio-client.crt -pubkey -noout \
  | openssl pkey -pubin -outform DER \
  | openssl dgst -sha256 \
  | awk '{print $NF}'

출력 예시:

7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d

이 64자리 16진수 문자열이 바로 MinKMS config.yaml의 identities 항목에 들어갈 값입니다.

  1. MinKMS ConfigMap에 Identity 등록:
    추출한 Identity 해시값을 MinKMS 설정의 policy.<정책명>.identities 목록에 추가합니다.
# minkms-config.yaml 예시 발췌
policy:
  minio:
    paths:
      - /v1/key/create/*
      - /v1/key/generate/*
      - /v1/key/decrypt/*
      - /v1/key/bulk/decrypt/*
    identities:
      - 7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d  # 위에서 추출한 해시값
  1. MinIO 테넌트 네임스페이스에 클라이언트 Secret 생성:
    MinIO 테넌트 Pod들이 MinKMS 호출 시 사용할 수 있도록, MinIO가 위치한 네임스페이스에 인증서와 키를 시크릿으로 등록합니다.
# MinIO 테넌트 네임스페이스(예: minio)에 Secret 생성
kubectl create secret generic minio-kes-client-cert \
  --from-file=client.crt=minio-client.crt \
  --from-file=client.key=minio-client.key \
  -n <MINIO_TENANT_NAMESPACE>

테넌트 CRD / values.yaml 최종 매핑

생성한 Secret을 MinIO 테넌트 정의에 지정하면 mTLS 연동 준비가 완료됩니다.

spec:
  features:
    enableKMS: true
  kms:
    endpoint: "https://minkms.minkms.svc.cluster.local:7373"
    defaultKey: "my-minio-key"
    certificate:
      secretName: minio-kes-client-cert # 위 Step 4에서 생성한 Secret

==

MinIO 테넌트가 MinKMS(KES)와 통신할 때 신원을 증명하는 클라이언트 인증서(mTLS Client Certificate) 생성 및 MinKMS 정책(policy)에 등록할 Identity Hash 추출 방법입니다.


  1. MinIO 클라이언트 개인키 및 자체 서명 인증서 생성:
    클라이언트 인증서는 도메인(SAN) 검증 대신 인증서의 공개키 해시(Identity) 자체로 식별하므로 일반적인 자체 서명 인증서로 생성합니다.
# 1. 클라이언트 개인키 생성
openssl genrsa -out minio-client.key 2048

# 2. 클라이언트 자체 서명 인증서 생성 (10년 유효기간)
openssl req -new -x509 \
  -key minio-client.key \
  -out minio-client.crt \
  -days 3650 \
  -subj "/CN=minio-aistor-tenant"
  1. MinKMS Identity Hash 계산:
    MinKMS는 X.509 인증서의 DER 인코딩된 공개키에 대한 SHA-256 해시값을 identity로 사용합니다. openssl 명령어로 이를 추출합니다.
openssl x509 -in minio-client.crt -pubkey -noout \
  | openssl pkey -pubin -outform DER \
  | openssl dgst -sha256 \
  | awk '{print $NF}'

출력 예시:

7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d

이 64자리 16진수 문자열이 바로 MinKMS config.yaml의 identities 항목에 들어갈 값입니다.

  1. MinKMS ConfigMap에 Identity 등록:
    추출한 Identity 해시값을 MinKMS 설정의 policy.<정책명>.identities 목록에 추가합니다.
# minkms-config.yaml 예시 발췌
policy:
  minio:
    paths:
      - /v1/key/create/*
      - /v1/key/generate/*
      - /v1/key/decrypt/*
      - /v1/key/bulk/decrypt/*
    identities:
      - 7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d  # 위에서 추출한 해시값
  1. MinIO 테넌트 네임스페이스에 클라이언트 Secret 생성:
    MinIO 테넌트 Pod들이 MinKMS 호출 시 사용할 수 있도록, MinIO가 위치한 네임스페이스에 인증서와 키를 시크릿으로 등록합니다.
# MinIO 테넌트 네임스페이스(예: minio)에 Secret 생성
kubectl create secret generic minio-kes-client-cert \
  --from-file=client.crt=minio-client.crt \
  --from-file=client.key=minio-client.key \
  -n <MINIO_TENANT_NAMESPACE>

테넌트 CRD / values.yaml 최종 매핑

생성한 Secret을 MinIO 테넌트 정의에 지정하면 mTLS 연동 준비가 완료됩니다.

spec:
  features:
    enableKMS: true
  kms:
    endpoint: "https://minkms.minkms.svc.cluster.local:7373"
    defaultKey: "my-minio-key"
    certificate:
      secretName: minio-kes-client-cert # 위 Step 4에서 생성한 Secret
profile
engineer

0개의 댓글