봉인/봉인 해제
봉인/봉인 해제 (Seal / Unseal)
Vault 서버를 시작하면 봉인된(sealed) 상태로 시작됩니다. 이 상태에서 Vault는 물리적 스토리지에는 접근할 수 있지만, 그 안의 어떤 데이터도 복호화할 수 없습니다. 봉인 해제(Unsealing) 는 복호화 키를 읽는 데 필요한 평문 루트 키를 얻는 과정입니다. 봉인 해제 전에는 Vault를 봉인 해제하는 것과 서버 상태를 확인하는 것만 가능합니다.
출처: 문서
본문
왜 봉인하나요? (Why?)
Vault는 데이터를 (키링의) 암호화 키(encryption key) 로 암호화해 스토리지 백엔드에 저장합니다. 이 암호화 키를 보호하기 위해 Vault는 또 다른 암호화 키인 루트 키(root key) 로 암호화 키를 암호화해 데이터와 함께 저장합니다.
데이터를 복호화하려면 루트 키가 있어야 암호화 키를 복호화할 수 있습니다. 봉인 해제는 이 루트 키에 접근하는 과정입니다. Vault는 루트 키를 봉인 해제 키(unseal key) 로 암호화해 모든 Vault 데이터와 함께 저장합니다.
요약하면, Vault는 대부분의 데이터를 키링의 암호화 키로 암호화합니다. 키링을 얻으려면 루트 키로 키링을 복호화하고, 루트 키 자체는 봉인 해제 키로 복호화해야 합니다.
Shamir 봉인 (Shamir seals)
기본 Vault 구성은 봉인 해제 키를 단일 키로 운영자에게 배포하는 대신, 샤미르의 비밀 공유(Shamir's Secret Sharing) 알고리즘을 사용해 키를 여러 조각(share)으로 나눕니다.
Vault는 키를 재구성하기 위해 일정 임계값(threshold) 개수의 조각을 필요로 합니다. 운영자는 Vault가 키를 재구성할 충분한 조각을 모을 때까지 순서에 상관없이 조각을 하나씩 입력합니다. 그다음 Vault는 봉인 해제 키로 루트 키를 복호화합니다. 이것이 Vault 봉인 해제 과정입니다.
봉인 해제 (Unsealing)
vault operator unseal 명령이나 API로 봉인 해제를 실행할 수 있습니다. 봉인 해제 과정은 상태를 유지합니다(stateful). 여러 클라이언트 머신에서 다양한 메커니즘으로 각 키를 입력할 수 있으며, 보안을 위해 각 루트 키 조각을 서로 다른 클라이언트 머신에 두도록 할 수 있습니다.
Shamir 봉인을 여러 노드에서 쓸 때는 각 노드를 필요한 임계값 개수의 조각으로 봉인 해제해야 합니다. Vault는 부분적으로 봉인 해제된 노드를 클러스터 전체에 분산하지 않습니다.
Vault 노드를 봉인 해제하면 다음 중 하나가 발생할 때까지 봉인 해제 상태를 유지합니다.
- API로 다시 봉인(seal)할 때
- 서버를 재시작할 때
- Vault의 스토리지 계층이 복구 불가능한 오류를 만날 때
노드 봉인 해제는 Vault 설치 자동화를 어렵게 만듭니다. 자동화 도구는 Vault를 쉽게 설치·구성·시작할 수 있지만, Shamir 봉인으로 봉인 해제하는 것은 수동 과정입니다. 대부분의 사용자에게는 자동 봉인 해제(auto unseal)가 더 나은 경험을 제공합니다.
봉인 (Sealing)
Vault를 봉인하는 API도 있습니다. 이 API는 메모리에서 루트 키를 삭제하며, 복원하려면 다시 봉인 해제 과정이 필요합니다. Vault를 봉인하려면 루트 권한을 가진 운영자 한 명만 있으면 됩니다.
침입이 감지되면 피해를 최소화하기 위해 Vault 데이터를 신속하게 봉인할 수 있습니다. 봉인된 Vault의 데이터는 루트 키 조각에 접근할 수 없으면 사용자가 접근할 수 없습니다.
자동 봉인 해제 (Auto unseal)
자동 봉인 해제는 봉인 해제 키를 안전하게 유지하는 운영 복잡성을 줄여줍니다. 이 기능은 봉인 해제 키를 보호할 책임을 사용자에서 신뢰할 수 있는 장치나 서비스(HSM, KMS 등)로 위임합니다. 시작 시 Vault는 신뢰 장치/서비스에 연결해 스토리지에서 루트 키를 복호화하도록 요청합니다.
봉인 해제 외에도 루트 토큰 생성처럼 사용자의 정족수(quorum)가 필요한 Vault 작업이 있습니다. Shamir 봉인을 사용하면 이런 작업을 승인하는 데 봉인 해제 키를 제공해야 하지만, 자동 봉인 해제를 사용하면 복구 키(recovery keys) 를 대신 사용합니다.
복구 키는 루트 키를 복호화할 수 없습니다. 따라서 자동 봉인 해제 메커니즘이 동작하지 않으면 복구 키만으로는 Vault를 봉인 해제할 수 없습니다. 자동 봉인 해제를 사용하면 기본 봉인 메커니즘에 대한 엄격한 보존 의존성이 생깁니다. Cloud KMS 키 같은 봉인 메커니즘을 봉인 마이그레이션 전에 사용할 수 없게 되거나 삭제되면, 그 메커니즘이 다시 사용 가능해질 때까지 Vault 클러스터에 접근을 복구할 수 없습니다.
봉인 메커니즘이나 그 키가 영구 삭제되면 백업에서도 Vault 클러스터를 복구할 수 없습니다. 이 위험을 완화하려면 AWS Service Control Policies 등으로 봉인 메커니즘 관리를 주의 깊게 제어하는 것이 좋습니다.
Vault Enterprise에서는 성능 복제(PR)나 DR 복제의 보조 클러스터의 performance standby 노드가 스스로 봉인되므로, 봉인 해제하려면 재시작해야 합니다.
복구 키 (Recovery key)
HSM이나 KMS로 Vault를 초기화하면 운영자에게 봉인 해제 키 대신 복구 키 가 반환됩니다. 복구 키는 HSM/KMS 없이 실행할 때 봉인 해제 키를 다루는 것과 유사하게, 내부 복구 키를 샤미르 비밀 공유로 나눠 생성됩니다.
generate-root 같은 복구 키를 사용하는 작업을 하면 Vault는 베리어 봉인 해제 키 대신 복구 키를 자동으로 선택합니다.
초기화 시 다음과 같은 CLI 플래그(및 /sys/init API의 대응값)에 따라 조각을 나눕니다.
recovery-shares— 복구 키를 나누는 조각 수 (recovery_shares와 동일)recovery-threshold— 복구 키 재구성에 필요한 조각 수 (recovery_threshold와 동일)recovery-pgp-keys— 반환되는 복구 키 조각을 암호화하는 PGP 키 (recovery_pgp_keys와 동일, API에서는 배열)
이 옵션을 설정하지 않으면 Vault는 초기화하지 않으므로 키를 생성하지 않습니다.
리키(Rekeying)
- 봉인 해제 키 —
vault operator rekey연산으로 봉인 해제 키를 리키할 수 있습니다. 복구 키의 임계값을 충족하면 Vault가 리키 연산을 승인하고, 이후 새 베리어 키를 구성된 HSM/KMS로 암호화해 스토리지에 저장합니다. - 복구 키 — 조각 수/임계값을 바꾸거나 다른 PGP 키로 다른 키 보유자를 대상으로 복구 키를 리키할 수 있습니다. CLI에서는
vault operator rekey -target=recovery를 사용하고, API에서는/sys/rekey-recovery-key엔드포인트를 사용합니다.
봉인 마이그레이션 (Seal migration)
봉인 마이그레이션은 가동 중지(downtime) 없이 수행할 수 없습니다. 봉인 구현의 기술적 특성상 클러스터 전체를 잠시 내려야 합니다. 마이그레이션 전에 백업을 만드는 것이 좋습니다. 마이그레이션 중에는 이전 봉인과 새 봉인이 모두 사용 가능해야 합니다.
- Vault 1.16.0 이후 — Seal HA를 통한 자동 봉인 간 온라인 마이그레이션(Enterprise): 대부분의 자동 봉인 유형 간에 봉인 고가용성(seal HA)으로 가동 중지 없이 마이그레이션할 수 있습니다. (Shamir 봉인은 지원하지 않음.) Vault 설정에 새 대상 봉인을 추가하고, SIGHUP으로 설정을 재로드한 뒤
sys/sealwrap/rewrap·sys/seal-backend-status엔드포인트를 모니터링하고, 다시 설정에서 이전 봉인을 제거하고 SIGHUP을 보내면 됩니다. - Vault 1.5.1 이후: 스탠바이 노드를 내리고 봉인 구성을 갱신합니다(Shamir→auto는 새 auto seal 블록 추가, auto→Shamir는 이전 seal 블록에
disabled = true추가, auto→auto는 둘 다). 그 노드를 다시 올리고-migrate플래그로 각 키를 입력해 봉인 해제합니다. 모든 스탠바이 노드에 대해 한 번에 하나씩 수행한 뒤 active 노드를 내립니다. 새 active 노드가 마이그레이션을 수행하며 로그에서seal re-wrap completed를 확인합니다. - 1.5.1 이전: 클러스터를 오프라인으로 내리고 봉인 구성을 갱신한 뒤,
-migrate플래그로 봉인 해제 과정을 실행합니다. 통합 스토리지(raft)의 경우 정족수 요구로 인해 모든 노드의 구성을 갱신하고 함께 다시 올려야 합니다.
참고: 봉인 종류·버전에 따라 마이그레이션·자동 봉인 지원 범위가 다르므로 공식 봉인 문서를 함께 확인하세요.