Vault(3) - 볼트와 MySQL 연동하기
mysql은 상당히 폭넓게 사용되는 DBMS로, 모바일 환경의 서비스 구축 시에도 많이 사용된다. 최근에는 다양한 요구사항에 맞춰 커스터마이징된 여러 가지 버전이 제공되고 있는데 대표적으로 MariaDB, AWS Aurora DB, AWS RDS 등이 있다. 물론 표준 mysql도 많이 사용된다. 이번 포스팅에서는 볼트를 mysql 서버에 연결하여, 짧은 유효기간을 가지는 유저와 패스워드를 발급받는 실습을 진행해보도록 하겠다.
실습을 위해 필요한 사전 준비는 다음과 같다.
- 도커가 설치되어 있어야 한다.
- 볼트 서버가 설치되어 있어야 한다.
- 도커와 볼트 서버에 대한 기본적인 이해도를 갖추고 있어야 한다.
실습. Vault - MySQL 연동하기
mysql과 볼트 연결하기
볼트에서 mysql 연결을 위해 지원하는 플러그인은 모두 4가지이다. 각각 인코딩과 같은 사소한 부분에서 차이가 있으며, 연결할 mysql 종류에 맞게 실행하면 된다. 여기서는 mysql-database-plugin을 사용한다.
- mysql-database-plugin : 일반 mysql을 위한 플러그인이다.
- mysql-aurora-database-plugin : mysql의 클러스터링 버전인 AWS 오로라 DB를 위한 플러그인이다.
- mysql-rds-database-plugin : mysql의 클라우드 관리형 버전인 RDS를 위한 플러그인이다.
- mysql-legacy-database-plugin : 구 버전의 mysql을 위한 플러그인이다.
-
데이터베이스용 시크릿 엔진을 활성화한다.
$ vault secrets enable database ⏎ Success! Enabled the database secrets engine at: database/
시크릿 엔진 활성화시 별도의 옵션을 주지 않으면 시크릿 엔진의 이름과 동일한 경로가 시크릿 패스로 자동 지정된다. 원하는 시크릿 패스를 지정하려면
-path
옵션을 사용한다. -
데이터베이스 연결을 위한 플러그인과 연결 정보를 설정한다.
$ vault write database/config/mysql-database \ plugin_name=mysql-database-plugin \ connection_url="vault_user:vault_pass@tcp(127.0.0.1:3306)/" \ allowed_roles="test-role" ⏎
- 실행하기 전에 반드시 설정 내용과 동일한 유저 정보가 mysql에 생성되어 있어야 한다.
- mysql이 외부 서버에 설치되어 있을 경우,
127.0.0.1
을 적절한 DNS로 변경한다.
-
유저/패스워드를 데이터베이스에서 동적으로 생성할 수 있도록 역할(Role)을 구성한다.
$ vault write database/roles/test-role \ db_name=mysql-database \ creation_statements="CREATE USER ''@'%' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO ''@'%';" \ default_ttl="1h" \ max_ttl="24h" ⏎ Success! Data written to: database/roles/mysql-role
- db_name은 실제 mysql의 데이터베이스 이름을 의미하는 것이 아니다. STEP 2에서
database/config/
이하에서 지정한 값을 사용해야 한다. 이 실습에서는mysql-database
가 이에 해당한다.
- db_name은 실제 mysql의 데이터베이스 이름을 의미하는 것이 아니다. STEP 2에서
역할 구성이 완료되었다. 이제 볼트에 정보를 요청하기만 하면 볼트가 알아서 mysql에서 유저와 비밀번호를 발급받아 줄 것이다. 실행해보자.
$ vault read database/creds/test-role ⏎
Key Value
--- -----
lease_id database/creds/test-role/K1UBTliZFl2Zwt1iJLUsiswWEF
lease_duration 1h
lease_renewable true
password PlCg0nXPcwKc-iXHHDSFsfew
username v_root_test-role_izg12sfew324JeY
유저가 정상적으로 생성된 것을 볼 수 있다. 이 인증 정보는 1시간 동안만 유효하다. 실제 mssql에 접속해 보면 해당 유저가 생성되어 있음이 확인된다.
mysql> use mysql;
Database changed
mysql> select host, user from user;
+-----------+----------------------------------+
| host | user |
+-----------+----------------------------------+
| % | root |
| % | v_root_test-role_izg12sfew324JeY |
| % | vault_user |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+----------------------------------+
6 rows in set (0.00 sec)
** 다음과 같은 오류 메세지가 출력된다면? **
Error 1045: Access denied for user 'vault_user'@'%' (using password: YES)
만약 위와 같은 메세지가 출력된다면, 이는 mysql에 생성된 vault_user에게 충분한 권한이 주어지지 않았기 때문일 가능성이 높다. 이 때에는 mysql에 루트 또는 관리자로 로그인한 다음, 아래 구문을 실행하여 충분한 권한을 부여한다.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'vault_user'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)