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_mode가aws_iam으로 설정된 경우 필요합니다. -
azure_client_id(string: "")- Azure의 사용자 할당 Managed Service Identity의 클라이언트 ID입니다.azure_client_id가 제공되지 않고auth_mode가azure_msi로 설정된 경우 시스템 할당 Managed Service Identity가 사용됩니다.
postgresql 예시
사용자 지정 SSL 검증
이 예시는 전체 SSL 검증(권장)으로 PostgreSQL 클러스터에 연결하는 방법을 보여줍니다.
storage "postgresql" {
connection_url = "postgres://user:***@localhost:5432/database?sslmode=verify-full"
}
SSL 검증을 비활성화하려면(권장되지 않음) verify-full을 disable로 바꾸세요:
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"
}