본문 바로가기

리눅스

HashiCorp Vault에서 MySQL 동적 계정 구성하는 방법

반응형

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
반응형