반응형
HashiCorp Vault에서 MySQL 동적 계정(Dynamic Credentials) 구성하는 방법
MySQL 서버(111번)의 계정 관리를 Vault(141번~143번)에 위임하여, 클라이언트가 요청할 때마다 일회용 DB 계정을 발급하고 자동 회수하는 환경을 구축하는 방법입니다.
1. MySQL 서버 준비 (sshdServer: 192.168.0.111)
디렉토리 생성
mkdir -p /docker-container/mysqld-server
cd /docker-container/mysqld-server
docker-compose.yml 작성
vim docker-compose.yml
services:
vault-mysql:
image: mysql:8.0
container_name: vault-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
MySQL 컨테이너 기동
docker compose up -d
더보기
---
MySQL 컨테이너 실행
docker run -d \
--name vault-mysql \
-e MYSQL_ROOT_PASSWORD=root_password \
-p 3306:3306 \
mysql:8.0
Vault용 관리자 계정 생성
docker exec -it vault-mysql mysql -uroot -proot_password -e "
CREATE USER 'vault_admin'@'%' IDENTIFIED BY 'vault_admin_password';
GRANT ALL PRIVILEGES ON *.* TO 'vault_admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;"
---
2. Vault 전용 MySQL 관리자 계정 생성
MySQL 컨테이너 접속
docker exec -it vault-mysql mysql -uroot -proot_password
기존 계정 정리 (재설정)
DROP USER IF EXISTS 'vault_admin'@'%';
Vault 전용 관리자 계정 생성
CREATE USER 'vault_admin'@'%' IDENTIFIED BY 'vault_admin_password';
모든 권한 부여 (GRANT OPTION 필수)
GRANT ALL PRIVILEGES ON *.* TO 'vault_admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
계정 생성 확인
SELECT user, host FROM mysql.user WHERE user = 'vault_admin';
- Vault는 DB 사용자 생성/삭제 권한이 필요하므로 GRANT OPTION 필수
728x90
3. Vault 서버 설정 (node141 - Active Node)
Vault 로그인
export VAULT_ADDR="https://vault1.scbyun.com:8200"
export VAULT_TOKEN="hvs.2JkrW3kigeQX0YNlxNey5sda"
vault login $VAULT_TOKEN
Database Secrets Engine 활성화
vault secrets enable database
이미 활성화되어 있다면 오류 메시지 출력되며 무시 가능
MySQL 연결 정보 등록 (Vault와 MySQL 연결)
vault write database/config/my-mysql \
plugin_name=mysql-database-plugin \
connection_url="{{username}}:{{password}}@tcp(192.168.0.111:3306)/" \
allowed_roles="mysql-client-role" \
username="vault_admin" \
password="vault_admin_password"
- connection_url : MySQL 서버 주소
- allowed_roles : 해당 DB에서 허용할 Vault Role
- vault_admin : MySQL 사용자 생성 권한 보유 계정
MySQL 동적 계정 Role 생성
vault write database/roles/mysql-client-role \
db_name=my-mysql \
creation_statements="
CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';
GRANT ALL PRIVILEGES ON *.* TO '{{name}}'@'%';
" \
default_ttl="1h" \
max_ttl="24h"
- db_name database/config에 등록한 이름
- creation_statements 사용자 생성 SQL
- default_ttl 기본 유효 시간
- max_ttl 최대 유효 시간
TTL 만료 시 Vault가 자동으로 계정 회수
4. SSH 클라이언트에서 동적 계정 발급 테스트
Vault 자격 증명 발급
export VAULT_ADDR="https://vault1.scbyun.com:8200"
export VAULT_TOKEN="hvs.2JkrW3kigeQX0YNlxNey5sda"
vault read database/creds/mysql-client-role
Key Value
--- -----
lease_id database/creds/mysql-client-role/MgfhQs15Grx7byx2ov7uddjj
lease_duration 1h
lease_renewable true
password 49l9lSAXAgRnSFX-SrtU
username v-root-mysql-clie-hUIUuy3ICr0FTq
5. 발급된 계정으로 MySQL 접속 확인
mysql -h 192.168.0.111 -P 3306 \
-u v-root-mysql-clie-hUIUuy3ICr0FTq -p
정상 접속 시 Vault ↔ MySQL 동적 계정 구성 완료
원라이너(One-liner) 접속
jq를 활용하여 발급과 동시에 접속하는 자동화 스크립트입니다.
jq 설치 확인
sudo apt install jq
CREDS=$(vault read -format=json database/creds/mysql-client-role)
DB_USER=$(echo $CREDS | jq -r '.data.username')
DB_PASS=$(echo $CREDS | jq -r '.data.password')
접속
mysql -h 192.168.0.111 -u$DB_USER -p$DB_PASS
이렇게 구축하면 보안 사고 시에도 유출된 계정이 1시간 뒤면 쓸모없어지기 때문에 인프라 보안 수준이 획기적으로 올라갑니다.
728x90
반응형
'리눅스' 카테고리의 다른 글
| 리눅스의 일반 계정에서 암호 없이 특정 계정으로 전환하는 방법 (0) | 2026.02.23 |
|---|---|
| Vault OTP 계정과 로컬 계정을 함께 사용하는 SSH 인증 구성하는 방법 (0) | 2026.02.20 |
| Backlog(백로그)란? (0) | 2026.02.20 |
| 도커 컨테이너를 이용해서 Let's Encrypt 인증서를 DNS-01 챌린지로 발급받고 자동 갱신하는 방법 (0) | 2026.02.11 |
| HashiCorp Vault SSH OTP 설정 및 인증 접속 방법 (0) | 2026.02.10 |