MySQL/MariaDB 데이터베이스 시크릿 엔진

MySQL/MariaDB 데이터베이스 시크릿 엔진 (MySQL/MariaDB database secrets engine)

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

출처: 문서

본문

참고: 이 엔진은 TLS 또는 서명 검증의 일부로 외부 X.509 인증서를 사용할 수 있어요. SHA-1을 사용하는 X.509 인증서에 대한 서명 검증은 더 이상 사용되지 않으며(deprecated), Vault 1.12부터는 우회 조치 없이는 사용할 수 없어요. 자세한 내용은 deprecation notices를 참고하세요.

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

이 플러그인은 vault에 몇 가지 다른 인스턴스가 내장되어 있는데, 각 인스턴스는 약간 다른 MySQL 드라이버를 위한 것입니다. 플러그인들의 유일한 차이는 플러그인이 생성하는 사용자명의 길이인데, MySQL 버전마다 허용하는 길이가 다르기 때문이에요. 사용 가능한 플러그인:

  • mysql-database-plugin
  • mysql-aurora-database-plugin
  • mysql-rds-database-plugin
  • mysql-legacy-database-plugin

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

기능 (Capabilities)

플러그인 이름 루트 자격 증명 회전 동적 역할 정적 역할 사용자명 커스터마이즈
위 항목 참고 Yes Yes Yes Yes (1.7+)

설정 (Setup)

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

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

  1. 적절한 플러그인과 연결 정보로 Vault를 구성해요.
$ vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
    allowed_roles="my-role" \
    username="vaultuser" \
    password="vaultpass"
  1. Vault의 이름을 데이터베이스 자격 증명을 만드는 SQL 문에 매핑하는 역할을 구성해요.
$ vault write database/roles/my-role \
    db_name=my-mysql-database \
    creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* 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           yY-57n3X5UQhxnmFRP3f
username           v_vaultuser_my-role_crBWVqVh2Hc1

클라이언트 x509 인증서 인증

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

이 인증 방식을 사용하려면 플러그인을 이렇게 구성해요.

$ vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    allowed_roles="my-role" \
    connection_url="user:password@tcp(localhost:3306)/test" \
    tls_certificate_key=@/path/to/client.pem \
    tls_ca=@/path/to/client.ca

참고: tls_certificate_keytls_ca는 MySQL의 ssl-cert (ssl-key와 결합)ssl-ca 구성 옵션에 대응하는데, **Vault 파라미터는 그 파일들의 내용(파일명이 아니라)**이라는 점이 달라요. 그래서 두 옵션은 서로 독립적입니다. 자세한 내용은 MySQL Connection Options를 참고하세요.

예제

grant 문에서 와일드카드 사용

MySQL은 grant 문에서 와일드카드 사용을 지원해요. MySQL 안의 많은 데이터베이스에 접근할 것으로 예상되는 애플리케이션에 가끔 필요합니다. 이는 grant 문에서 와일드카드를 사용해 구현할 수 있어요. 예를 들어 Vault가 만든 사용자가 fooapp_로 시작하는 모든 데이터베이스에 접근하게 하려면 다음 creation statement를 사용하면 됩니다.

CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT ON `fooapp\_%`.* TO '{{name}}'@'%';

MySQL은 와일드카드를 넣을 부분을 백틱(backticks) 안에 넣기를 기대해요. 이 creation statement를 Vault CLI로 Vault에 추가하려면, 셸이 백틱 사이의 텍스트를 실행해야 할 것으로 해석하므로 위 문장을 CLI에 그대로 붙여넣을 수 없어요. 가장 쉬운 해결 방법은 creation statement를 Base64로 인코딩해 Vault에 전달하는 것입니다. 예:

$ vault write database/roles/my-role \
    db_name=mysql \
    creation_statements="Q1JFQVRFIFVTRVIgJ3t7bmFtZX19J0AnJScgSURFTlRJRklFRCBCWSAne3twYXNzd29yZH19JzsgR1JBTlQgU0VMRUNUIE9OIGBmb29hcHBcXyVgLiogVE8gJ3t7bmFtZX19J0AnJSc7" \
    default_ttl="1h" \
    max_ttl="24h"

MySQL 5.6에서 루트 자격 증명 회전

MySQL의 기본 루트 회전 설정은 MySQL 5.7 이상에 있는 ALTER USER 구문을 사용해요. MySQL 5.6의 경우 root rotation statements를 예전 SET PASSWORD 구문을 사용하도록 구성해야 해요. 예:

$ vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
    root_rotation_statements="SET PASSWORD = PASSWORD('{{password}}')" \
    allowed_roles="my-role" \
    username="root" \
    password="mysql"

루트 자격 증명 회전 가이드는 Database Root Credential Rotation을 참고하세요.

API

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

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

IAM으로 클라우드 DB 인증

Google Cloud

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

-- DB 내에서 서비스 어카운트가 사용자를 만들 수 있게 함
GRANT SELECT, CREATE, CREATE USER ON *.* TO "test-user"@"%" WITH GRANT OPTION;
설정
  1. 데이터베이스 시크릿 엔진을 활성화해요. ($ vault secrets enable database)
  2. 적절한 플러그인과 연결 정보로 Vault를 구성해요. 여기서 GCP IAM 인증을 명시적으로 활성화하고 Application Default Credentials로 인증할 수 있어요.

참고: Google Cloud IAM의 경우 프로토콜이 tcp가 아니라 cloudsql-mysql입니다.

$ vault write database/config/my-mysql-database \
    plugin_name="mysql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="user@cloudsql-mysql(project:region:instance)/mysql" \
    auth_type="gcp_iam" \
    use_private_ip="false" \
    use_psc="false"

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

$ vault write database/config/my-mysql-database \
    plugin_name="mysql-database-plugin" \
    allowed_roles="my-role" \
    connection_url="user@cloudsql-mysql(project:region:instance)/mysql" \
    auth_type="gcp_iam" \
    use_private_ip="false" \
    use_psc="false" \
    service_account_json="@my_credentials.json"
  1. Vault에 새 역할을 구성하되, 기본 폐기(revocation) 문을 오버라이드해 Vault가 사용자를 drop하도록 해요.
$ vault write database/roles/my-role \
    db_name=my-mysql-database \
    creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" \
    revocation_statements="DROP USER '{{name}}'@'%';" \
    default_ttl="1h" \
    max_ttl="24h"
  1. 새 역할 구성이 끝나면 이전과 같이 자격 증명을 생성해요.
$ vault read database/creds/my-role
Key                Value
---                -----
lease_id           database/creds/my-role/2f6b629f-7ah2-7b19-24b9-ad879a8d4bf2
lease_duration     1h
lease_renewable    true
password           vY-57n3X5UQhxnmGTK7g
username           v_vaultuser_my-role_frBYNfYh3Kw3

더 알아보기 (Learn more)