Kubernetes 인증서로 워크로드 보호하기

Kubernetes 인증서로 워크로드 보호하기

Kubernetes Certificates API는 X.509 자격 증명 프로비저닝을 자동화해요. 이 API는 Kubernetes API 클라이언트가 CA(Certificate Authority)에서 X.509 인증서를 요청하고 얻을 수 있는 명령줄 인터페이스를 제공해요. CertificateSigningRequest(CSR) 리소스를 사용해 지정된 서명자(signer)가 인증서에 서명하도록 요청할 수 있어요. 요청은 서명되기 전에 승인되거나 거부돼요. Kubernetes는 잘 정의된 동작을 가진 내장 서명자와 사용자 지정 서명자를 모두 지원해요. 덕분에 클라이언트는 자신의 CSR에 어떤 일이 일어날지 예측할 수 있어요. 인증서 서명에 대해 더 알아보려면 Kubernetes 문서의 signing requests를 참고하세요.

내장 서명자 중 하나는 kubernetes.io/legacy-unknown이에요. CSR 리소스의 v1beta1 API는 이 legacy-unknown 서명자를 지원했어요. 하지만 안정화된 CSR v1 API는 signerName을 kubernetes.io/legacy-unknown으로 설정하는 것을 허용하지 않아요.

클러스터에서 인증서를 생성할 때 Amazon EKS CA를 사용하려면 사용자 지정 서명자를 사용해야 해요. CSR v1 API 버전을 사용하고 새 인증서를 생성하려면 기존 매니페스트와 API 클라이언트를 마이그레이션해야 해요. 기존 v1beta1 API로 만든 기존 인증서는 인증서가 만료될 때까지 유효하며 정상 동작해요. 여기에는 다음이 포함돼요.

  • 신뢰 배포(Trust distribution): 없음. Kubernetes 클러스터에서 이 서명자에 대한 표준적인 신뢰 또는 배포 메커니즘이 없어요.
  • 허용 주체(Permitted subjects): 모든 주체 허용
  • 허용 X.509 확장(Permitted x509 extensions): subjectAltName과 키 사용 확장을 존중하고 다른 확장은 무시해요.
  • 허용 키 사용(Permitted key usages): ["key encipherment", "digital signature", "server auth"]를 넘어서는 사용은 포함하면 안 돼요.

참고

클라이언트 인증서 서명은 지원되지 않아요.

  • 만료/인증서 수명: 45일(기본값 및 최대값)
  • CA 비트 허용 여부: 허용되지 않음

signerName을 사용한 CSR 생성 예시

다음 단계는 signerName: beta.eks.amazonaws.com/app-serving을 사용해 DNS 이름 myserver.default.svc용 서빙 인증서를 생성하는 방법을 보여줘요. 자신의 환경에 맞게 이 가이드를 활용하세요.

  1. RSA 개인 키를 생성하려면 openssl genrsa -out myserver.key 2048 명령을 실행합니다.
openssl genrsa -out myserver.key 2048
  1. 다음 명령을 실행해 인증서 요청을 생성합니다.
openssl req -new -key myserver.key -out myserver.csr -subj "/CN=myserver.default.svc"
  1. CSR 요청의 base64 값을 생성해 이후 단계에서 사용할 변수에 저장합니다.
base_64=$(cat myserver.csr | base64 -w 0 | tr -d "\n")
  1. 다음 명령을 실행해 mycsr.yaml 파일을 생성합니다. 다음 예시에서 beta.eks.amazonaws.com/app-serving이 signerName이에요.
cat >mycsr.yaml <<EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: mycsr
spec:
  signerName: beta.eks.amazonaws.com/app-serving
  request: $(base_64)
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
  1. CSR 리소스를 생성합니다.
kubectl create -f mycsr.yaml
  1. CSR이 Approved 상태가 될 때까지 기다렸다가 서명된 인증서를 다운로드합니다.
kubectl get csr mycsr -o jsonpath='{.status.certificate}' | base64 --decode > myserver.crt

더 알아보기 (Learn more)

출처: 문서