0

Series HashiCorp Vault Thực chiến | Bài 2: Dựng "Két sắt" cục bộ và Thao tác với KV Secrets Engine

Trong môi trường Production, việc cài đặt Vault đòi hỏi cấu hình High Availability (HA), sinh chứng chỉ TLS, và Auto-unseal cực kỳ phức tạp. Nhưng để dev và test API, HashiCorp cung cấp một chế độ gọi là Dev Server.

Chế độ Dev này chạy hoàn toàn trên RAM (In-memory), không lưu xuống ổ cứng và tự động "mở khóa" (unseal) sẵn để anh em thao tác ngay lập tức. Cực kỳ tiện lợi!

1. Khởi chạy Vault bằng Docker

Mở Terminal lên và chạy một command duy nhất. Đảm bảo máy anh em đã có Docker nhé:

docker run --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=root_token_123' -p 8200:8200 -d --name vault-dev vault

Giải ngố câu lệnh:

  • --cap-add=IPC_LOCK: Quyền này ngăn không cho hệ điều hành swap bộ nhớ của Vault xuống ổ cứng, đảm bảo mọi mật khẩu chỉ nằm trên RAM.
  • VAULT_DEV_ROOT_TOKEN_ID: Đặt "Chìa khóa vạn năng" (Root Token) mặc định. Ở đây mình đặt là root_token_123.
  • -p 8200:8200: Mở port mặc định của Vault.

Kiểm tra xem container đã chạy chưa bằng lệnh docker ps. Nếu thấy trạng thái Up, xin chúc mừng, Két sắt đã sẵn sàng!

2. Giao tiếp với Vault qua hai con đường

Vault cung cấp cả giao diện Web (UI) lẫn Command Line (CLI). Để thực chiến tự động hóa, anh em phải làm quen với CLI.

Hãy "chui" vào bên trong container để dùng công cụ CLI của Vault:

docker exec -it vault-dev sh

Bên trong container, anh em cần khai báo 2 biến môi trường để CLI biết cách nói chuyện với Server:

export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='root_token_123'

(Lưu ý: Bạn cũng có thể mở trình duyệt, gõ http://localhost:8200 và nhập token root_token_123 để xem giao diện web siêu mượt của Vault).

3. Key-Value (KV) Secrets Engine - Kẻ kết liễu file .env

Bây giờ, giả sử dự án bán vé AFC của bạn cần lưu thông tin kết nối tới Database MySQL. Thay vì viết vào .env, chúng ta sẽ nhét nó vào Vault.

Mặc định, chế độ Dev đã bật sẵn một KV Engine (Version 2) tại đường dẫn secret/.

Ghi một bí mật vào Vault:

vault kv put secret/afc-system/mysql host="10.0.0.5" port="3306" username="afc_db_user" password="super_secret_password_999"

Terminal sẽ trả về một bảng thông báo thành công, ghi rõ version: 1.

Đọc lại bí mật từ Vault:

vault kv get secret/afc-system/mysql

Bùm! Thông tin database của bạn hiện ra rõ nét.

4. Tại sao KV v2 lại là "Chân ái"? (Tính năng Versioning)

Hãy tưởng tượng tuần sau, công ty yêu cầu đổi mật khẩu Database. Bạn lại chạy lệnh PUT một lần nữa:

vault kv put secret/afc-system/mysql host="10.0.0.5" port="3306" username="afc_db_user" password="NEW_password_2026"

Lúc này, nếu bạn chạy lệnh get, Vault sẽ trả về mật khẩu mới và đánh dấu đây là version: 2. Nhưng điều gì xảy ra nếu hệ thống bị lỗi do mật khẩu mới chưa đồng bộ kịp?

Với file .env, bạn phải đi mò lại mật khẩu cũ. Còn với Vault KV v2, bạn có thể xem lại và khôi phục (rollback) phiên bản trước đó cực kỳ dễ dàng:

# Đọc lại mật khẩu ở phiên bản số 1
vault kv get -version=1 secret/afc-system/mysql

Mọi lịch sử thay đổi cấu hình đều được Vault lưu trữ và quản lý chặt chẽ.

Tổng kết Bài 2

Bằng vài dòng lệnh cơ bản, anh em đã biết cách khởi tạo Vault và thao tác Ghi/Đọc bí mật. Dữ liệu giờ đây được mã hóa và cất giữ tập trung, không còn trôi nổi trong các file text dễ bị lộ nữa.

Bây giờ chúng ta đã có data trong Vault. Nhưng trong thực tế, ứng dụng Laravel hoặc Node.js của anh em không thể dùng cái root_token_123 (chìa khóa vạn năng) để gọi lên Vault được, vì lỡ lộ token này là hacker lấy được toàn bộ công ty.

Ở Bài 3, anh em muốn tìm hiểu cách cấu hình AppRole (cơ chế xác thực chuyên dụng cho Backend Service để lấy Token an toàn), hay muốn học cách viết code PHP/Laravel gọi API vào Vault để tự động kéo mật khẩu xuống khi khởi động ứng dụng?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí