Vault backend storage용 PostgreSQL 구성

Vault backend storage용 PostgreSQL 구성

PostgreSQL storage backend는 Vault의 데이터를 PostgreSQL 서버 또는 클러스터에 영구 저장하는 데 사용됩니다.

출처: 문서

본문

  • 고가용성 – PostgreSQL storage backend는 고가용성을 지원합니다. PostgreSQL 9.5 이상이 필요합니다.
  • 커뮤니티 지원 – PostgreSQL storage backend는 커뮤니티가 지원합니다. HashiCorp 직원의 검토를 거쳤지만 기술에 대해 그렇게 잘 알지 못할 수 있습니다. 문제가 발생하면 원저자에게 문의하도록 안내받을 수 있습니다.
storage "postgresql" {
  connection_url = "postgres://user123:***@localhost:5432/vault"
}

참고: PostgreSQL storage backend 플러그인은 데이터베이스에 연결할 때 SSL을 사용하려 시도합니다. SSL이 활성화되지 않았다면 connection_url이 SSL을 비활성화하도록 구성되어야 합니다. SSL을 비활성화하는 방법은 아래 문서를 참고하세요.

PostgreSQL storage backend는 테이블을 자동으로 만들지 않습니다. 스키마와 인덱스를 만드는 몇 가지 샘플 SQL은 다음과 같습니다.

CREATE TABLE vault_kv_store (
  parent_path TEXT COLLATE "C" NOT NULL,
  path        TEXT COLLATE "C",
  key         TEXT COLLATE "C",
  value       BYTEA,
  CONSTRAINT pkey PRIMARY KEY (path, key)
);

CREATE INDEX parent_path_idx ON vault_kv_store (parent_path);

HA 활성화된 backend용 저장소:

CREATE TABLE vault_ha_locks (
  ha_key                                      TEXT COLLATE "C" NOT NULL,
  ha_identity                                 TEXT COLLATE "C" NOT NULL,
  ha_value                                    TEXT COLLATE "C",
  valid_until                                 TIMESTAMP WITH TIME ZONE NOT NULL,
  CONSTRAINT ha_key PRIMARY KEY (ha_key)
);

PostgreSQL 9.5 이전 버전을 사용한다면 다음 함수를 만드세요:

CREATE FUNCTION vault_kv_put(_parent_path TEXT, _path TEXT, _key TEXT, _value BYTEA) RETURNS VOID AS
$$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE vault_kv_store
          SET (parent_path, path, key, value) = (_parent_path, _path, _key, _value)
          WHERE _path = path AND key = _key;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO vault_kv_store (parent_path, path, key, value)
              VALUES (_parent_path, _path, _key, _value);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- Do nothing, and loop to try the UPDATE again.
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

postgresql 파라미터

  • connection_url (string: <required>) – PostgreSQL로 인증하고 연결하는 데 사용할 연결 문자열을 지정합니다. 연결 URL은 VAULT_PG_CONNECTION_URL 환경 변수로도 설정할 수 있습니다. 지원되는 파라미터의 전체 목록은 pgx 라이브러리 및 PostgreSQL 연결 문자열 문서에서 찾을 수 있습니다. 예시 연결 문자열 URL은 아래 예시 섹션을 참고하세요.

  • table (string: "vault_kv_store") – Vault 데이터를 쓸 테이블의 이름을 지정합니다. 이 테이블은 이미 존재해야 합니다(Vault가 만들려 시도하지 않습니다).

  • max_idle_connections (int) - 기본적으로 설정되지 않습니다. 유휴 연결 풀의 최대 연결 수를 설정합니다. 자세한 내용은 SetMaxIdleConns에 대한 golang 문서를 참고하세요. 1.2 이상이 필요합니다.

  • max_parallel (string: "128") – PostgreSQL에 대한 최대 동시 요청 수를 지정합니다.

  • ha_enabled (string: "true|false") – 기본적으로 활성화되지 않으며, 9.5 이상이 필요합니다.

  • ha_table (string: "vault_ha_locks") – 고가용성 정보를 저장하는 데 사용할 테이블의 이름을 지정합니다. 이 테이블은 이미 존재해야 합니다(Vault가 만들려 시도하지 않습니다).

  • auth_mode (string: "standard|aws_iam|azure_msi|gcp_iam") - 기본적으로 표준 인증입니다. 모드에 대한 자세한 내용은 아래의 클라우드 인증 섹션을 참고하세요.

  • aws_db_region (string: "") - DB가 위치한 AWS 리전을 지정합니다. auth_modeaws_iam으로 설정된 경우 필요합니다.

  • azure_client_id (string: "") - Azure의 사용자 할당 Managed Service Identity의 클라이언트 ID입니다. azure_client_id가 제공되지 않고 auth_modeazure_msi로 설정된 경우 시스템 할당 Managed Service Identity가 사용됩니다.

postgresql 예시

사용자 지정 SSL 검증

이 예시는 전체 SSL 검증(권장)으로 PostgreSQL 클러스터에 연결하는 방법을 보여줍니다.

storage "postgresql" {
  connection_url = "postgres://user:***@localhost:5432/database?sslmode=verify-full"
}

SSL 검증을 비활성화하려면(권장되지 않음) verify-fulldisable로 바꾸세요:

storage "postgresql" {
  connection_url = "postgres://user:***@localhost:5432/database?sslmode=disable"
}

클라우드에서 클라우드 ID로 인증

AWS IAM

AWS Identity and Access Management(IAM) 데이터베이스 인증을 사용해 DB 인스턴스로 인증할 수 있습니다. 자세한 내용은 AWS 문서를 참고하세요. 인증에는 AWS 기본 자격 증명이 사용됩니다.

storage "postgresql" {
  connection_url  = "postgres://[email protected]:5432/database?sslmode=require"
  auth_mode       = "aws_iam"
  aws_db_region   = "us-west-2"
}

Azure MSI

시스템 할당 및 사용자 할당 관리 ID를 모두 사용해 Azure Database for PostgreSQL flexible server로 인증할 수 있습니다. 자세한 내용은 Azure 문서를 참고하세요.

storage "postgresql" {
  connection_url  = "postgres://[email protected]:5432/database?sslmode=require"
  auth_mode       = "azure_msi"
}

GCP IAM

Google Cloud Identity and Access Management(IAM)를 사용해 Cloud SQL 리소스로 인증할 수 있습니다. 자세한 내용은 Google 문서를 참고하세요. 인증에는 Application Default Credentials가 사용됩니다.

storage "postgresql" {
  connection_url    = "postgres://[email protected]@203.0.113.0:5432/database?sslmode=require"
  auth_mode         = "gcp_iam"
}

더 알아보기