Vault backend storage용 FoundationDB 구성

Vault backend storage용 FoundationDB 구성

FoundationDB storage backend는 Vault의 데이터를 FoundationDB에 영구 저장하는 데 사용됩니다.

출처: 문서

본문

이 backend는 빌드 시 명시적으로 활성화해야 하며, 표준 Vault 바이너리 배포에는 포함되지 않습니다. Vault 소스 트리에서 backend의 소스와 함께 제공되는 문서를 참고하세요.

  • 고가용성 – FoundationDB storage backend는 고가용성을 지원합니다. HA 구현은 클러스터 내 Vault 노드의 시계가 제대로 동기화되는 것에 의존합니다. 시계 오차는 잠금에 경합을 일으키기 쉽습니다.
  • 커뮤니티 지원 – FoundationDB storage backend는 커뮤니티가 지원합니다. HashiCorp 직원의 검토를 거쳤지만 기술에 대해 그렇게 잘 알지 못할 수 있습니다. 문제가 발생하면 원저자에게 문의하도록 안내받을 수 있습니다.
storage "foundationdb" {
  api_version      = 520
  cluster_file     = "/path/to/fdb.cluster"

  tls_verify_peers = "I.CN=MyTrustedIssuer,I.O=MyCompany\, Inc.,I.OU=Certification Authority"
  tls_ca_file      = "/path/to/ca_bundle.pem"
  tls_cert_file    = "/path/to/cert.pem"
  tls_key_file     = "/path/to/key.pem"
  tls_password     = "PrivateKeyPassword"

  path             = "vault-top-level-directory"
  ha_enabled       = "true"
}

foundationdb 파라미터

  • api_version (int) - 사용할 FoundationDB API 버전입니다. 필수 파라미터이며 기본값이 없습니다. 최소 요구 API 버전은 520입니다.

  • cluster_file (string) - 대상 클러스터의 연결 데이터를 포함하는 클러스터 파일의 경로입니다. 필수 파라미터이며 기본값이 없습니다.

  • tls_verify_peers (string) - 피어 인증서 검증 기준입니다. TLS가 활성화된 경우 필수 파라미터입니다. FoundationDB TLS 문서를 참고하세요.

  • tls_ca_file (string) - CA 인증서 번들 파일의 경로입니다. TLS가 활성화된 경우 필수 파라미터입니다.

  • tls_cert_file (string) - 인증서 파일의 경로입니다. tls_key_file과 함께 지정하면 TLS 지원을 활성화합니다.

  • tls_key_file (string) - 키 파일의 경로입니다. tls_cert_file과 함께 지정하면 TLS 지원을 활성화합니다.

  • tls_password (string) - tls_key_file이 암호화된 경우 이를 복호화하는 데 필요한 비밀번호입니다. 선택 사항입니다. FDB_TLS_PASSWORD 환경 변수로도 지정할 수 있습니다.

  • path (string: "vault") - Vault 데이터가 위치할 최상위 FoundationDB 디렉터리(디렉터리 레이어 사용)의 경로입니다.

  • ha_enabled (string: "false") - FoundationDB backend를 사용해 Vault 고가용성 모드를 활성화할지 여부입니다.

foundationdb

클러스터 파일

FoundationDB 클라이언트는 클러스터에 발생하는 변경 사항과 최신 상태를 유지하기 위해 런타임에 클러스터 파일을 갱신할 수 있어야 합니다.

이를 위해 먼저 현재 파일 옆에 새 클러스터 파일을 쓴 다음 원자적으로 제자리로 이름을 바꿉니다.

즉 클러스터 파일과 그것이 있는 디렉터리는 Vault가 실행되는 사용자가 쓸 수 있어야 합니다. 클러스터 파일을 자체 디렉터리로 격리하는 것이 좋을 것입니다.

멀티 버전 클라이언트

FoundationDB 클라이언트 라이브러리 버전은 서버 버전과 밀접하게 연결되어 있습니다. 클러스터 업그레이드 중에는 여러 서버 버전이 클러스터에서 실행되며, 클라이언트는 그 상황을 처리해야 합니다.

이것은 (기본) 클라이언트 라이브러리가 특정 서버에 연결하기 위해 다른 버전의 더 최신 클라이언트 라이브러리를 로드하는 능력을 가짐으로써 처리되며, 이것을 멀티 버전 클라이언트 기능이라고 합니다.

LD_LIBRARY_PATH로 클라이언트 설정

mlock을 사용하지 않는다면 LD_LIBRARY_PATH를 사용해 링커가 기본 클라이언트 라이브러리의 위치를 가리키게 할 수 있습니다.

$ export LD_LIBRARY_PATH=/dest/dir/for/primary:$LD_LIBRARY_PATH
$ export FDB_NETWORK_OPTION_EXTERNAL_CLIENT_DIRECTORY=/dest/dir/for/secondary
$ /path/to/bin/vault ...

RPATH로 클라이언트 설정

Vault를 mlock으로 실행할 때 Vault 바이너리는 mlock 사용을 허용하는 capabilities가 설정되어 있어야 합니다.

# setcap cap_ipc_lock=+ep /path/to/bin/vault
$ getcap /path/to/bin/vault
/path/to/bin/vault = cap_ipc_lock+ep

capabilities의 존재로 인해 링커는 보안상의 이유로 LD_LIBRARY_PATH를 무시합니다.

그 경우 LD_LIBRARY_PATH 사용을 대체하기 위해 빌드 시점에 Vault 바이너리에 RPATH를 설정해야 합니다.

Vault를 빌드할 때 Go 링커에 -r /dest/dir/for/primary 옵션을 전달하세요. 예를 들어:

$ make dev FDB_ENABLED=1 LD_FLAGS="-r /dest/dir/for/primary "

(위 변수 값의 끝 공백에 주의하세요).

readelf로 Vault 바이너리에 RPATH가 설정되었는지 확인할 수 있습니다:

$ readelf -d /path/to/bin/vault | grep RPATH
 0x000000000000000f (RPATH)              Library rpath: [/dest/dir/for/primary]

클라이언트 라이브러리가 설치된 상태에서:

$ ldd /path/to/bin/vault
...
    libfdb_c.so => /dest/dir/for/primary/libfdb_c.so (0x00007f270ad05000)
...

이제 Vault를 실행합니다:

$ export FDB_NETWORK_OPTION_EXTERNAL_CLIENT_DIRECTORY=/dest/dir/for/secondary
$ /path/to/bin/vault ...

더 알아보기