Series HashiCorp Vault Thực chiến | Bài 4: Dynamic Secrets - "Ma thuật" tự động sinh và hủy Database User
Khi sử dụng KV Engine (như Bài 2), bạn tự tạo mật khẩu super_secret_password rồi nhét vào Vault. Dù an toàn, nhưng bản chất mật khẩu đó vẫn là tĩnh (static).
Với Database Secrets Engine, Vault sẽ đóng vai trò như một gã DBA (Quản trị viên CSDL). Bạn cấp cho Vault một tài khoản Root. Từ đó, mỗi khi ứng dụng Laravel của bạn gõ cửa xin quyền, Vault sẽ tự động dùng tài khoản Root đó để chạy lệnh CREATE USER..., trả thông tin cho ứng dụng, rồi hẹn giờ tự động DROP USER... khi hết hạn.
1. Bước 1: Kích hoạt Database Engine và Kết nối Vault với MySQL
Đầu tiên, phải bật tính năng Database lên:
vault secrets enable database
Tiếp theo, cung cấp cho Vault chuỗi kết nối (Connection String) của tài khoản có quyền tạo User (thường là root) trong MySQL:
vault write database/config/my-mysql-database \
plugin_name=mysql-database-plugin \
connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
allowed_roles="afc-sync-role" \
username="root" \
password="root_password_123"
(Lưu ý: Bạn thay 127.0.0.1:3306 và root_password_123 bằng cấu hình thực tế của bạn).
2. Bước 2: Tạo Role (Luật sinh tài khoản)
Bây giờ, chúng ta định nghĩa một Role tên là afc-sync-role. Khi ứng dụng gọi vào Role này, Vault sẽ chạy đoạn mã SQL nào?
vault write database/roles/afc-sync-role \
db_name=my-mysql-database \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT, INSERT ON afc_system_db.* TO '{{name}}'@'%';" \
default_ttl="1h" \
max_ttl="24h"
Giải mã đoạn cấu hình cực hay này:
- creation_statements: Đây là câu lệnh SQL mà Vault sẽ chạy. {{name}} và {{password}} là 2 biến mà Vault sẽ tự động generate ngẫu nhiên cực kỳ phức tạp (ví dụ: v-root-afc-sync-r-xyz123).
- default_ttl="1h": Tài khoản này chỉ sống đúng 1 tiếng. Hết 1 tiếng, Vault tự động vào MySQL chạy lệnh xóa user. Không để lại bất kỳ rác nào trong hệ thống!
3. Bước 3: Tận hưởng ma thuật (Sinh tài khoản động)
Mọi thứ đã setup xong. Giờ là lúc ứng dụng backend (hoặc script đồng bộ vé từ trạm) gọi lên Vault để lấy Database credentials:
vault read database/creds/afc-sync-role
Kết quả trả về sẽ khiến bạn kinh ngạc:
Key Value
--- -----
lease_id database/creds/afc-sync-role/h2h...
lease_duration 1h
lease_renewable true
password A1b2C3d4E5f6G7h8I9j0... (Mật khẩu ngẫu nhiên)
username v-token-afc-syn-wXyZ... (User ngẫu nhiên)
Bạn có thể chạy câu lệnh vault read... này 10 lần, nó sẽ sinh ra 10 user khác nhau.
4. Ứng dụng thực tế: Tại sao nó "Vô đối"?
Hãy hình dung hệ thống của bạn có một Worker chạy ngầm để quét log lỗi giao dịch vé và xử lý mỗi đêm.
Thay vì dùng chung một user db_worker, Worker này sẽ gọi Vault lấy một tài khoản có thời hạn 15 phút. Nó làm việc xong, 15 phút sau tài khoản đó bốc hơi khỏi hệ thống. Dù hacker có đánh cắp được thông tin kết nối ngay lúc đó, thì khi chúng kịp mở phần mềm lên, tài khoản đã không còn tồn tại!
Đây chính là khái niệm Zero Trust đỉnh cao trong kiến trúc phần mềm hiện đại.
Đến đây, anh em đã có trong tay bộ công cụ quản lý Secret cực kỳ mạnh mẽ của HashiCorp Vault.
All rights reserved