본문으로 건너뛰기

Kubernetes를 위한 Sealed Secrets

Sealed Secrets는 두 부분으로 구성됩니다:

  • 클러스터 측 controller
  • kubeseal이라는 클라이언트 측 CLI

controller가 시작되면 클러스터 전체의 개인/공개 키 쌍을 찾고, 찾지 못하면 새로운 4096비트 RSA 키 쌍을 생성합니다. 개인 키는 controller와 동일한 네임스페이스(기본적으로 kube-system)의 Secret 객체에 저장됩니다. 이 키의 공개 키 부분은 이 클러스터에서 SealedSecrets를 사용하려는 모든 사용자가 공개적으로 사용할 수 있습니다.

암호화 과정에서 원본 Secret의 각 값은 무작위로 생성된 세션 키를 사용하여 AES-256으로 대칭 암호화됩니다. 그런 다음 세션 키는 원본 Secret의 네임스페이스/이름을 입력 매개변수로 사용하여 SHA256과 controller의 공개 키로 비대칭 암호화됩니다. 암호화 프로세스의 출력은 다음과 같이 구성된 문자열입니다: 암호화된 세션 키의 길이(2바이트) + 암호화된 세션 키 + 암호화된 Secret

SealedSecret 커스텀 리소스가 Kubernetes 클러스터에 배포되면 controller가 이를 감지하고 개인 키를 사용하여 봉인을 해제하고 Secret 리소스를 생성합니다. 복호화 과정에서 SealedSecret의 네임스페이스/이름이 다시 입력 매개변수로 사용됩니다. 이는 SealedSecret과 Secret이 동일한 네임스페이스와 이름에 엄격하게 연결되도록 보장합니다.

함께 제공되는 CLI 도구인 kubeseal은 공개 키를 사용하여 Secret 리소스 정의에서 SealedSecret 커스텀 리소스 정의(CRD)를 생성하는 데 사용됩니다. kubeseal은 Kubernetes API 서버를 통해 controller와 통신하고 런타임에 Secret을 암호화하는 데 필요한 공개 키를 검색할 수 있습니다. 공개 키는 controller에서 다운로드하여 로컬에 저장하여 오프라인으로 사용할 수도 있습니다.

SealedSecrets는 다음 세 가지 범위를 가질 수 있습니다:

  • strict (기본값): Secret은 정확히 동일한 이름과 네임스페이스로 봉인되어야 합니다. 이러한 속성은 암호화된 데이터의 일부가 되므로 이름 및/또는 네임스페이스를 변경하면 "복호화 오류"가 발생합니다.
  • namespace-wide: 봉인된 Secret은 주어진 네임스페이스 내에서 자유롭게 이름을 변경할 수 있습니다.
  • cluster-wide: Secret은 모든 네임스페이스에서 봉인을 해제할 수 있으며 모든 이름을 지정할 수 있습니다.