Vault의 복제 지원

Vault의 복제 지원 (Replication)

많은 조직이 여러 데이터센터에 걸친 인프라를 운영합니다. Vault는 ID 관리, 시크릿 저장, 정책 관리라는 핵심 서비스를 제공합니다. 이 기능은 고가용성이어야 하고 클라이언트 수와 기능적 요구가 늘어남에 따라 확장되어야 합니다. 동시에 운영자는 공통 정책 세트가 전역적으로 시행되고, 상호운용이 필요한 애플리케이션에 일관된 시크릿·키 세트가 노출되기를 원합니다.

Vault 복제는 일관성(consistency), 확장성(scalability), 고가용성 재해 복구(highly-available disaster recovery) 를 제공함으로써 이 두 요구를 모두 해결합니다.

출처: 문서

본문

스토리지 백엔드 요구사항: 복제를 사용하려면 통합 스토리지(Integrated Storage)나 Consul처럼 트랜잭션 업데이트를 지원하는 스토리지 백엔드가 필요합니다.

아키텍처 (Architecture)

Vault 복제의 핵심 단위는 클러스터(cluster) 이며, 이는 Vault 노드 모음(활성 노드와 그에 대응하는 HA 노드)으로 구성됩니다. 여러 Vault 클러스터는 일대다(one-to-many) 방식의 거의 실시간 흐름으로 통신합니다.

복제는 리더/팔로워(leader/follower) 모델로 작동하며, 여기서 리더 클러스터(프라이머리(primary))가 일련의 팔로워 세컨더리(secondary) 클러스터와 연결됩니다. 프라이머리 클러스터는 기록 시스템(system of record) 역할을 하며 대부분의 Vault 데이터를 비동기적으로 복제합니다.

프라이머리와 세컨더리 간의 모든 통신은 부트스트래핑 중 교환되는 복제 토큰으로 설정된 상호 인증(mutually-authenticated) TLS 세션으로 종단간 암호화됩니다.

복제되는 데이터 (Replicated data)

프라이머리와 세컨더리 간에 복제되는 데이터는 둘 사이에 구성된 복제 유형에 따라 다릅니다. 이러한 관계 유형은 재해 복구(DR) 또는 성능 복제(performance replication) 관계입니다.

다음 표는 재해 복구와 성능 복제 사이의 기능 비교입니다.

기능 재해 복구 성능 복제
프라이머리 클러스터의 구성 미러링
프라이머리 클러스터의 백엔드(인증 메서드, 시크릿 엔진, 감사 장치 등) 구성 미러링
프라이머리 클러스터와 상호작용하는 애플리케이션·사용자의 토큰·임대 미러링 아니요. 세컨더리는 자체 토큰·임대를 추적합니다. 세컨더리가 승격되면 애플리케이션은 새로 승격된 프라이머리에서 다시 인증하고 새 임대를 얻어야 합니다.
세컨더리 클러스터가 클라이언트 요청을 처리하도록 허용 아니요

스토리지에 기록되는 모든 것은 세 가지 범주 중 하나로 분류됩니다.

  • 복제(replicated) 또는 "공유(shared)": 모든 하류 클러스터가 수신
  • 로컬(local): 하류 재해 복구 클러스터만 수신
  • 무시(ignored): 하류 클러스터에 전혀 복제되지 않음

시크릿 엔진이나 인증 메서드를 마운트할 때 로컬 마운트로 할지 공유 마운트로 할지 선택할 수 있습니다.

공유 마운트(기본값) 는 보통 모든 데이터를 성능 세컨더리에 복제하지만, 특정 스토리지 경로를 로컬로 지정하도록 선택할 수 있습니다. 예를 들어 PKI 마운트는 인증서를 로컬로 저장합니다. 공유 PKI 마운트의 역할을 조회하면 성능 프라이머리든 세컨더리든 같은 결과를 볼 수 있지만, 저장된 인증서를 나열하면 다른 값을 볼 수 있습니다.

로컬 마운트 는 데이터를 재해 복구 세컨더리에만 복제합니다. 성능 프라이머리에 만든 로컬 마운트는 그 성능 세컨더리에 전혀 보이지 않습니다. 성능 세컨더리에 로컬 마운트를 만들 수도 있으며, 이 경우 성능 프라이머리에는 보이지 않습니다.

마운트에 특정되지 않은 다른 스토리지 항목도 있습니다. 예를 들어 통합 스토리지 Autopilot 구성은 '무시' 스토리지 항목으로, 재해 복구 세컨더리가 프라이머리와 다른 구성을 갖도록 허용합니다. 토큰과 임대는 로컬 스토리지 항목에 기록됩니다.

성능 복제 (Performance replication)

성능 복제에서 세컨더리는 자체 토큰·임대를 추적하지만 기본 구성, 정책, 지원 시크릿(KV 값, transit용 암호화 키 등)은 공유합니다.

사용자 작업이 기본 공유 상태를 수정한다면 세컨더리는 그 요청을 처리하기 위해 프라이머리로 전달합니다. 이는 클라이언트에게 투명합니다. 실제로 대부분의 높은 처리량 워크로드(kv 백엔드의 읽기, transit의 암호화·복호화 작업 등)는 로컬 세컨더리로 처리할 수 있어, Vault는 과거처럼 수직적으로가 아니라 세컨더리 수에 따라 비교적 수평적으로 확장할 수 있습니다.

세컨더리 클러스터에서 취소 불가능한(irrevocable) 임대를 수동으로 폐기하지 않고 동적 시크릿 엔진을 비활성화하면 성능 복제가 깨집니다. 예를 들어 프라이머리 클러스터에서 database 시크릿 플러그인을 안전하게 비활성화하려면 먼저 세컨더리 클러스터의 로컬 임대를 모두 폐기해야 합니다.

성능 복제에는 자동 통합 스토리지 스냅샷이 포함되지 않습니다. Vault는 성능 복제의 일부로 자동 통합 스토리지 스냅샷을 복제하지 않습니다. 각 프라이머리·세컨더리 성능 클러스터가 개별 자동 스냅샷 복제본을 만들도록 명시적으로 구성해야 합니다.

경로 필터 (Paths filter)

성능 복제를 활성화하면 프라이머리 클러스터의 마운트 구성이 세컨더리 클러스터에 복제됩니다. 경우에 따라 모든 데이터가 복제되는 것을 원하지 않을 수 있습니다. 예를 들어 프라이머리 클러스터가 EU 리전에 있고, 데이터를 복제하고 싶지 않은 EU 외부의 세컨더리 클러스터가 있다고 가정하세요.

이를 지원하기 위해 지리적으로 분산된 리전에서 성능 있는 접근을 보장하면서 Vault의 경로 필터(paths filter) 를 활용합니다. 시크릿 엔진의 마운트 경로와 네임스페이스를 기반으로 필터를 설정할 수 있습니다.

위 예시에서 path1/ 경로와 path2 네임스페이스는 복제되지 않고 프라이머리 클러스터에만 남습니다.

비슷하게, 세컨더리 클러스터의 데이터가 복제되지 않기를 원하면 해당 시크릿 엔진과/또는 인증 메서드를 로컬로 표시할 수 있습니다. 로컬 시크릿 엔진과 인증 메서드는 복제되지 않으며 복제에 의해 제거되지도 않습니다.

예시: 세컨더리 클러스터에서 시크릿 엔진을 활성화할 때 -local 플래그를 사용하세요.

$ vault secrets enable -local -path=us_west_data kv-v2

튜토리얼: 데이터 복제를 허용·거부할 마운트를 지정하는 방법은 Set up performance replication 튜토리얼의 "manage replicated mounts" 섹션을 참고하세요.

재해 복구(DR) 복제

재해 복구(DR) 복제에서 세컨더리는 프라이머리와 동일한 기본 구성, 정책, 지원 시크릿(KV 값, transit용 암호화 키 등) 인프라를 공유합니다. 또한 DR 세컨더리 선출 시 원래 프라이머리에 연결한 애플리케이션의 지속 운영을 허용하도록 설계되었으므로, 프라이머리와 동일한 토큰·임대 인프라도 공유합니다.

DR은 전체 클러스터의 치명적 장애로부터 보호하기 위한 메커니즘으로 설계되었습니다. DR은 선출되어 새 프라이머리가 되기 전까지 서비스 읽기·쓰기 요청을 전달하지 않습니다.

참고: 성능 복제와 달리 로컬 시크릿 엔진, 인증 메서드, 감사 장치는 DR 세컨더리에 복제됩니다.

성능 및 재해 복구 복제의 기능에 대한 자세한 내용은 Vault Replication API Documentation을 참고하세요.

프라이머리와 세컨더리 클러스터 호환성

스토리지 엔진

두 클러스터가 같은 스토리지 엔진을 사용해야 한다는 요구사항은 없습니다.

시일 (Seals)

두 클러스터가 같은 시일 유형을 사용해야 한다는 요구사항은 없지만, 전체 세부사항은 sealwrap 문서를 참고하세요.

또한 복제를 활성화하면 세컨더리 시일이 수정된다는 점을 유의하세요. 세컨더리가 자동 시일(auto seal)을 사용하면 복구 구성과 키가 교체되고, shamir를 사용하면 시일 구성과 봉인 해제 키가 교체됩니다. 여기서 시일/복구 구성은 시일/복구 키 조각 수와 그 조각의 필수 임계값을 의미합니다.

프라이머리 시일 세컨더리 시일(이전) 세컨더리 시일(이후) 세컨더리 복구 키(이후) 복제 활성화가 세컨더리에 미치는 영향
Shamir Shamir 프라이머리의 shamir 구성 및 봉인 해제 키 N/A 시일 구성과 봉인 해제 키가 프라이머리 것으로 교체됨
Shamir Auto 변경 없음 프라이머리 시일 수신 시일 복구 구성과 키가 프라이머리 시일 구성·키로 교체됨
Auto Auto 변경 없음 프라이머리 복구 수신 시일 복구 구성과 복구 키가 프라이머리 것으로 교체됨
Auto Shamir 프라이머리 복구 수신 N/A 시일 구성과 키가 프라이머리 복구 시일 구성·키로 교체됨

참고: 자동 봉인 해제로 구성된 Vault 클러스터는 봉인 해제 키 대신 복구 키를 가집니다.

Vault 버전

Vault 변경사항은 업그레이드 지침이 실행 가능하도록, 즉 세컨더리가 프라이머리보다 더 새 버전을 실행할 수 있도록 설계·테스트됩니다.

하지만 업그레이드를 수행하는 데 필요한 기간보다 더 오래 다른 버전의 복제 Vault 클러스터를 실행하는 것은 권장하지 않습니다.

내부 (Internals)

복제 기능의 내부 설계에 대한 세부사항은 replication internals 문서에서 확인할 수 있습니다.

보안 모델 (Security model)

Vault는 전 세계에서 시크릿을 안전하게 지키는 데 신뢰를 받고 있습니다. 그래서 우리는 복제 모델에도 극도로 세부적인 부분에 주의를 기울였습니다.

프라이머리/세컨더리 통신

클러스터가 프라이머리로 표시되면 자체 서명 CA 인증서를 생성합니다. 요청 시, 사용자 지정 식별자가 주어지면 프라이머리는 이 CA 인증서로 개인 키와 인증서를 생성하고, 이를 다른 정보와 함께 복제 부트스트래핑 번들, 일명 세컨더리 활성화 토큰으로 패키징합니다. 이 인증서는 프라이머리와 해당 세컨더리 사이의 TLS 상호 인증을 수행하는 데 사용됩니다.

이 CA 인증서는 세컨더리와 공유되지 않으며, 어떤 세컨더리도 다른 세컨더리의 인증서에 접근할 수 없습니다. 실제로 이는 세컨더리의 프라이머리 접근을 폐기해도 다른 머신과 복제를 계속할 수 없다는 것을 의미합니다. 또한 프라이머리가 내려가면 어떤 클러스터가 프라이머리가 될지에 대한 완전한 관리 제어권이 있다는 뜻입니다. 공격자는 세컨더리를 속여 공격자가 제어하는 클러스터가 새 프라이머리라고 믿게 만들 수 없습니다(관리적으로 새 부트스트랩 패키지를 줘 세컨더리를 연결하도록 지시할 수 없기 때문입니다 — 이는 ACL로 보호되는 호출입니다).

Vault는 클러스터 포트에서 ALPN(Application Layer Protocol Negotiation) 을 사용합니다. 이를 통해 같은 포트가 요청 전달과 복제를 모두 처리할 수 있으며, 인증서 신뢰 루트와 기능 세트는 다르게 유지됩니다.

세컨더리 활성화 토큰

세컨더리 활성화 토큰은 극도로 민감한 항목이므로 응답 래핑(response wrapping) 으로 보호됩니다. 경험 많은 Vault 사용자는 복제 부트스트랩 패키지의 래핑 형식이 일반 응답 래핑 토큰과 다르다는 것을 알 것입니다. 즉 서명된 JWT입니다. 이를 통해 복제 토큰이 프라이머리 클러스터의 리다이렉트 주소를 토큰의 일부로 전달할 수 있습니다. 대부분의 경우 새 세컨더리에 토큰을 제공하는 것만으로 복제를 활성화하기에 충분하지만, 토큰이 세컨더리에 제공될 때 이를 재정의할 수도 있습니다.

세컨더리 활성화 토큰은 Vault 루트 토큰처럼 취급해야 합니다. 악의적인 행위자에게 노출되면 그 행위자가 모든 Vault 데이터에 접근할 수 있습니다. 따라서 극도의 민감성으로 취급해야 합니다. 모든 응답 래핑 토큰처럼 토큰이 성공적으로 사용되면(이 경우 세컨더리 활성화) 더 이상 쓸모가 없으므로, 한 머신에서 다음 머신으로 이동하는 동안만 보호하면 됩니다. 루트 토큰과 마찬가지로, HashiCorp는 세컨더리 활성화 토큰이 활성 상태일 때 생성부터 사용까지 여러 사람이 볼 것을 권장합니다.

세컨더리가 활성화되면 클러스터 정보는 암호화된 배리어 뒤에 안전하게 저장됩니다.

상호 TLS와 로드 밸런서

Vault는 클러스터 구성원을 위한 자체 인증서를 생성합니다. 초기 부트스트래핑 후 모든 복제 트래픽은 이러한 Vault 생성 인증서를 사용해 클러스터 포트를 사용합니다. 이 때문에 클러스터 트래픽은 로드 밸런서 수준의 클러스터 포트에서 종료(terminate)될 수 없습니다.

튜토리얼

복제 설정과 모범 사례에 대한 다음 튜토리얼을 참고하세요.

  • Set up Performance Replication
  • Disaster Recovery Replication Setup
  • Monitoring Vault Replication

API

Vault 복제 구성 요소는 완전한 HTTP API를 제공합니다. 자세한 내용은 Vault Replication API를 참고하세요.

더 알아보기 (Learn more)