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

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

비밀번호 인증 제거 공지 — Snowflake는 2025년 11월부터 모든 사용자에 대해 비밀번호 인증을 비활성화해요. HashiCorp는 비밀번호 대신 키 페어 인증(key pair authentication)을 루트 회전(root-rotation)을 포함해 지원하도록 추가했어요.

Snowflake는 Vault의 데이터베이스 시크릿 엔진이 지원하는 플러그인 중 하나예요. 이 플러그인은 Snowflake 호스팅 데이터베이스에 설정된 롤(role)을 기준으로 데이터베이스 자격 증명을 동적으로 생성하고, 정적 롤(Static Role)도 지원해요.

데이터베이스 시크릿 엔진을 어떻게 구성하는지에 대한 자세한 내용은 데이터베이스 시크릿 엔진 문서를 참고해 주세요. Snowflake 데이터베이스 시크릿 엔진은 gosnowflake를 사용해요.

출처: 문서

본문

지원 기능(Capabilities)

플러그인 이름 루트 자격 증명 회전 동적 롤 정적 롤 사용자 이름 커스터마이징 자격 증명 유형
snowflake-database-plugin 예 (1.8+) password(비권장), rsa_private_key

설정(Setup)

데이터베이스 시크릿 엔진이 아직 활성화되어 있지 않다면 먼저 활성화해요.

$ vault secrets enable database
Success! Enabled the database secrets engine at: database/

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

userpass 인증으로 구성하는 경우는 다음과 같아요. 데이터베이스를 구성할 때 올바른 형식의 데이터 소스 이름(DSN)을 제공해야 해요. 이 DSN은 보통 {{username}}:{{password}}@account/db_name 형식으로 되어 있어요. {{username}}{{password}}는 구성 중 그대로 사용되며, 초기 연결 시 구성에 전달된 username/password 옵션으로 대체돼요. account는 Snowflake 계정 식별자고, db_name은 Snowflake 인스턴스 안 데이터베이스 이름이에요.

$ vault write database/config/my-snowflake-database \
    plugin_name=snowflake-database-plugin \
    allowed_roles="my-role" \
    connection_url="{{username}}:{{password}}@ecxxxx.west-us-1.azure/db_name" \
    username="vaultuser" \
    password="vaultpass"

키 페어 인증으로 구성하는 경우에는 연결 URL에 템플릿 처리되거나 하드코딩된 username/password 정보를 넣지 마세요. Snowflake 플러그인은 제공된 username과 private_key를 사용해 Snowflake에 인증할 수 있도록 전체 DSN을 적절히 구성해요.

$ vault write database/config/my-snowflake-database \
    plugin_name=snowflake-database-plugin \
    allowed_roles="my-role" \
    connection_url="<account>.west-us-1.azure.snowflakecomputing.com/<db_name>" \
    username="vaultuser" \
    [email protected]

연결 URL에는 선택적 쿼리 파라미터 외에 다음 파라미터가 반드시 포함되어야 해요.

  • account — Snowflake 계정 식별자. Snowflake ODBC 구성의 server 섹션을 참고하세요.
  • db_name — Snowflake 인스턴스의 데이터베이스 이름. 예: ecxxxx.west-us-1.azure.snowflakecomputing.com/my_app_data

Vault에는 ACCOUNT_ADMIN 권한을 가진 Snowflake 사용자를 제공해야 해요. Vault가 연결된 루트 자격 증명을 회전해도 Snowflake 계정이나 계정의 다른 Snowflake 사용자 작업을 방해하지 않도록, Vault 접근에 전용 고유 사용자 계정을 사용하는 것을 강력히 권장해요.

사용법(Usage)

시크릿 엔진을 구성한 뒤에는 동적 롤과 정적 롤을 구성해 자격 증명 생성을 활성화해요.

동적 롤(Dynamic roles)

비밀번호 자격 증명 — 비밀번호 자격 증명을 가진 새 Snowflake 사용자를 생성하는 롤을 구성해요.

$ vault write database/roles/my-password-role \
    db_name=my-snowflake-database \
    creation_statements="CREATE USER {{name}} PASSWORD = '{{password}}' DAYS_TO_EXPIRY = {{expiration}} DEFAULT_ROLE=myrole; GRANT ROLE myrole TO USER {{name}};" \
    revocation_statements="DROP USER IF EXISTS {{name}};" default_ttl="1h" \
    max_ttl="24h"
Success! Data written to: database/roles/my-password-role

롤 이름을 사용해 /creds 엔드포인트를 읽어 새 자격 증명을 생성해요.

$ vault read database/creds/my-password-role
Key                Value
---                -----
lease_id           database/creds/my-password-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration     1h
lease_renewable    true
password           SsnoaA-8Tv4t34f41baD
username           v_root_my_password_role_fU0jqEy4wMNoAY2h60yd_1610561532

키 페어 자격 증명 — 키 페어 자격 증명을 가진 새 Snowflake 사용자를 생성하는 롤을 구성해요.

$ vault write database/roles/my-keypair-role \
    db_name=my-snowflake-database \
    creation_statements="CREATE USER {{name}} RSA_PUBLIC_KEY='{{public_key}}' DAYS_TO_EXPIRY = {{expiration}} DEFAULT_ROLE=myrole; GRANT ROLE myrole TO USER {{name}};" \
    revocation_statements="DROP USER IF EXISTS {{name}};" credential_type="rsa_private_key" \
    credential_config=key_bits=2048 \
    default_ttl="1h" \
    max_ttl="24h"
Success! Data written to: database/roles/my-keypair-role

롤 이름을 사용해 /creds 엔드포인트를 읽어 새 자격 증명을 생성해요.

$ vault read database/creds/my-keypair-role
Key                Value
---                -----
lease_id           database/creds/my-keypair-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration     1h
lease_renewable    true
rsa_private_key    [REDACTED PRIVATE KEY]
username           v_token_my_keypair_role_n20WjS9U3LWTlBWn4Wbh_1654718170

PEM 인코딩된 rsa_private_key 값을 그대로 사용해 Snowflake에 연결할 수 있어요. 키 페어 인증으로 연결을 맺는 클라이언트 목록과 방법은 connection options를 참고하세요.

정적 롤(Static roles)

비밀번호 자격 증명 — 기존 Snowflake 사용자의 비밀번호 자격 증명을 회전시키는 정적 롤을 구성해요.

$ vault write database/static-roles/my-password-role \
    db_name=my-snowflake-database \
    username="snowflake_existing_user" \
    rotation_period="24h" \
    rotation_statements="ALTER USER {{name}} SET PASSWORD = '{{password}}'"
Success! Data written to: database/static-roles/my-password-role

/static-creds 엔드포인트에서 현재 비밀번호 자격 증명을 가져와요.

$ vault read database/static-creds/my-password-role
Key                    Value
---                    -----
last_vault_rotation    2020-08-07T16:50:48.393354+01:00
password               Z4-KH8F-VK5VJc0hSkXQ
rotation_period        24h
ttl                    23h59m39s
username               my-existing-couchbase-user

키 페어 자격 증명 — 기존 Snowflake 사용자의 키 페어 자격 증명을 회전시키는 정적 롤을 구성해요.

$ vault write database/static-roles/my-keypair-role \
    db_name=my-snowflake-database \
    username="snowflake_existing_user" \
    rotation_period="24h" \
    rotation_statements="ALTER USER {{name}} SET RSA_PUBLIC_KEY='{{public_key}}'" \
    credential_type="rsa_private_key" \
    credential_config=key_bits=2048
Success! Data written to: database/static-roles/my-keypair-role

/static-creds 엔드포인트에서 현재 키 페어 자격 증명을 가져와요.

$ vault read database/static-creds/my-keypair-role
Key                    Value
---                    -----
last_vault_rotation    2022-06-08T13:13:02.355928-07:00
rotation_period        24h
rsa_private_key        [REDACTED PRIVATE KEY]
ttl                    23h59m55s
username               snowflake_existing_user

키 페어 인증(Key pair authentication)

Snowflake는 사용자 이름/비밀번호 인증의 대안으로 보안을 강화한 키 페어 인증을 지원해요. Snowflake 데이터베이스 플러그인은 rsa_private_key 자격 증명 유형을 사용해 Snowflake 사용자의 키 페어 자격 증명을 관리할 수 있어요. 동적 롤과 정적 롤을 모두 사용하는 예시는 사용법 섹션을 참고하세요.

API

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

데이터베이스 시크릿 엔진의 HTTP API에 대한 자세한 내용은 Database secrets engine API 페이지를 참고해 주세요.

더 알아보기 (Learn more)

  • 데이터베이스 시크릿 엔진 문서에서 시크릿 엔진 구성 방법을 살펴보세요.
  • Snowflake 데이터베이스 플러그인 API 페이지에서 세부 옵션을 확인해 보세요.