PostgreSQL 데이터베이스 시크릿 엔진

PostgreSQL 데이터베이스 시크릿 엔진 (PostgreSQL database secrets engine)

데이터베이스 시크릿 엔진에서 PostgreSQL 자격 증명을 동적으로 생성하는 postgresql 플러그인을 다룹니다.

출처: 문서

본문

PostgreSQL은 데이터베이스 시크릿 엔진이 지원하는 플러그인 중 하나예요. 이 플러그인은 PostgreSQL 데이터베이스에 대해 설정된 역할을 기반으로 데이터베이스 자격 증명을 동적으로 생성하며, 정적 역할(Static Roles)도 지원합니다.

데이터베이스 시크릿 엔진 설정에 대한 자세한 내용은 데이터베이스 시크릿 엔진 문서를 참고하세요.

PostgreSQL 시크릿 엔진은 PostgreSQL 스토리지 백엔드와 같은 데이터베이스 라이브러리인 pgx를 사용해요. SSL 옵션을 포함한 연결 문자열 옵션은 pgxPostgreSQL 연결 문자열 문서에서 찾을 수 있어요.

기능 (Capabilities)

플러그인 이름 루트 자격 증명 회전 동적 역할 정적 역할 사용자명 커스터마이즈 자격 증명 유형
postgresql-database-plugin Yes Yes Yes Yes (1.7+) password, gcp_iam

설정 (Setup)

  1. 데이터베이스 시크릿 엔진이 아직 활성화되지 않았다면 활성화해요.
$ vault secrets enable database
Success! Enabled the database secrets engine at: database/

기본적으로 시크릿 엔진은 엔진 이름으로 활성화돼요. 다른 경로에 활성화하려면 -path 인자를 사용하면 됩니다.

  1. 적절한 플러그인과 연결 정보로 Vault를 구성해요.
$ vault write database/config/my-postgresql-database \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/database-name" \
    username="vaultuser" \
    password="vaultpass" \
    password_authentication="scram-sha-256"
  1. Vault의 이름을 데이터베이스 자격 증명을 만드는 SQL 문에 매핑하는 역할을 구성해요.
$ vault write database/roles/my-role \
    db_name="my-postgresql-database" \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"
Success! Data written to: database/roles/my-role

사용법 (Usage)

시크릿 엔진이 구성되고 사용자/머신이 적절한 권한을 가진 Vault 토큰을 가지면 자격 증명을 생성할 수 있어요.

  1. 역할 이름으로 /creds 엔드포인트를 읽어 새 자격 증명을 생성해요.
$ vault read database/creds/my-role
Key                Value
---                -----
lease_id           database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration     1h
lease_renewable    true
password           SsnoaA-8Tv4t34f41baD
username           v-vaultuse-my-role-x

정적 역할을 위한 Rootless 구성과 비밀번호 회전

Enterprise에요. 이 기능은 Vault Enterprise가 필요합니다.

PostgreSQL 시크릿 엔진은 Rootless DB 연결 구성과 함께 정적 역할 및 그 비밀번호 회전 메커니즘을 사용하는 것을 지원해요. 이 워크플로에서는 연결을 구성하기 위해 권한 있는 루트 계정이 필요 없이, 정적 DB 사용자를 Vault의 정적 역할 회전 메커니즘에 온보딩할 수 있습니다. 단일 루트 연결을 사용하는 대신, 각 정적 역할마다 DB에 대한 여러 전용 연결이 만들어져요. 이 워크플로는 동적 역할/자격 증명을 지원하지 않아요.

참고: 정적 역할로 온보딩되는 DB 사용자에게는 최소한의 권한 집합을 부여할 것을 강력히 권장해요. 각 정적 역할은 DB에 새 연결을 엽니다. 온보딩되는 DB 사용자에게 최소 권한을 부여하면 외부 시스템에 대한 여러 고권한 연결이 만들어지지 않게 보장됩니다.

참고: Out-of-band 비밀번호 회전은 Vault가 DB 사용자 상태와 동기화되지 않게 만들고, 회전 중 발생한 오류를 해결하려면 외부 PostgreSQL DB에서 사용자의 비밀번호를 수동으로 업데이트해야 합니다.

  1. 데이터베이스 시크릿 엔진을 활성화해요. ($ vault secrets enable database)
  2. 루트 자격 증명 없이 DB에 연결을 구성하고 self_managed 파라미터를 설정해 rootless 워크플로를 활성화해요.
$ vault write database/config/my-postgresql-database \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/database-name" \
    self_managed=true
  1. self_managed_password 파라미터로 DB의 사용자에 대한 전용 연결을 만드는 정적 역할을 구성해요.
$ vault write database/static-roles/my-role \
  db_name="my-postgresql-database" \
  username="staticuser" \
  self_managed_password="password" \
  rotation_period="1h"
  1. 정적 자격 증명을 읽어요.
$ vault read database/static-creds/my-role
Key                    Value
---                    -----
last_vault_rotation    2024-09-11T14:15:13.764783-07:00
password               XZY42BVc-UO5bMsbgxrW
rotation_period        1h
ttl                    59m55s
username               staticuser

클라이언트 x509 인증서 인증

이 플러그인은 PostgreSQL의 x509 Client-side Certificate Authentication을 지원해요.

이 인증 방식을 사용하려면 디스크의 파일에서 PEM 인코딩된 TLS 데이터를 "@" 기호로 접두사 붙여 인라인으로 읽도록 플러그인을 구성해요. 이는 Vault 서버를 호스팅하는 머신에 직접 접근할 수 없는 환경에서 유용합니다. 예:

$ vault write database/config/my-postgresql-database \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/database-name?sslmode=verify-full" \
    username="vaultuser" \
    private_key=@/path/to/client.key \
    tls_certificate=@/path/to/client.pem \
    tls_ca=@/path/to/client.ca

참고: private_key, tls_certificate, tls_ca는 PostgreSQL의 sslkey, sslcert, sslrootcert 구성 옵션에 대응하는데, **Vault 파라미터는 그 파일들의 내용(파일명이 아니라)**입니다.

Vault 서버 프로세스를 실행하는 머신에 TLS 인증서 데이터가 있는 환경에서는 인증서 인증을 이렇게 구성할 수도 있어요. sslmode를 PostgreSQL 문서에 설명된 적용 가능한 값 중 하나로 설정하고, SSL 자격 증명을 sslrootcert·sslcert·sslkey 연결 파라미터에 파일 경로로 설정해요. 예:

$ export SSL="sslmode=verify-full&sslrootcert=/path/to/ca.pem&sslcert=/path/to/client.pem&sslkey=/path/to/client.key"
$ vault write database/config/my-postgresql-database \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/database-name?sslmode=verify-full&${SSL}" \
    username="vaultuser"

API

구성 가능한 전체 옵션 목록은 PostgreSQL 데이터베이스 플러그인 API 페이지에서 확인할 수 있어요.

데이터베이스 시크릿 엔진 HTTP API에 대한 자세한 내용은 데이터베이스 시크릿 엔진 API 페이지를 참고하세요.

IAM으로 클라우드 DB 인증

Google Cloud

Google의 CloudSQL 문서가 제시하는 IAM 역할 외에도, Vault에서의 최소 기능을 위해 서비스 어카운트의 DB 사용자에게 다음 SQL 권한이 필요해요.

-- DB 내에서 서비스 어카운트가 역할을 만들 수 있게 함
ALTER USER "<TEST_USER>" WITH CREATEROLE;
설정
  1. 데이터베이스 시크릿 엔진을 활성화해요. ($ vault secrets enable database)
  2. 적절한 플러그인과 연결 정보로 Vault를 구성해요. 여기서 GCP IAM 인증을 명시적으로 활성화하고 Application Default Credentials로 인증할 수 있어요.
$ vault write database/config/my-postgresql-database \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="host=project:us-west1:mydb [email protected] dbname=postgres sslmode=disable" \
    auth_type="gcp_iam" \
    use_private_ip="false" \
    use_psc="false" \

서비스 어카운트 자격 증명을 인코딩된 JSON 문자열로 직접 전달해 연결을 구성·인증할 수도 있어요.

$ vault write database/config/my-postgresql-database \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="host=project:region:instance [email protected] dbname=postgres sslmode=disable" \
    auth_type="gcp_iam" \
    use_private_ip="false" \
    use_psc="false" \
    service_account_json="@my_credentials.json"

연결이 구성되고 IAM 인증이 완료되면 역할을 설정하고 자격 증명을 생성하는 단계는 위에 나열된 것과 동일해요.

더 알아보기 (Learn more)