Vấn đề quản lý secrets và giải pháp của HashiCorp Vault
Mục tiêu của bài
Sau khi đọc xong, bạn sẽ:
- Nhận diện các biểu hiện phổ biến của secret sprawl: secrets rải rác, không có TTL, không rotate, không audit được, PKI thủ công, credential cố định.
- Phân biệt static credentials và dynamic credentials, hiểu vì sao dynamic credentials là điểm nhấn lớn nhất của Vault.
- Biết được 5 use case cốt lõi mà Vault giải quyết: centralized secrets, dynamic secrets, encryption as a service, PKI automation, identity-based access.
Câu chuyện secret sprawl
Hãy tưởng tượng một đội kỹ thuật đang chạy một ứng dụng kết nối cơ sở dữ liệu PostgreSQL. Mật khẩu DB được đặt một lần khi dự án khởi động và từ đó nó bắt đầu lan rộng trên:
- File
.envtrên máy local của từng developer. Kubernetes Secrettrong namespace production.- Trường "Password" trong Jenkins Credentials Manager.
- File
config.ymltrên mỗi application server. - Email nội bộ gửi cho team mới vào.
Chỉ sau vài tháng, không ai trả lời được 4 câu hỏi này:
Ai đang giữ bản sao mật khẩu đó? Có bao nhiêu bản sao? Lần cuối đổi là khi nào? Ai đã đọc nó?
Đây chính là secret sprawl - secrets bị phân tán không kiểm soát trên nhiều hệ thống. Đó không phải lỗi của cá nhân nào mà đó là hệ quả tất yếu khi không có hạ tầng quản lý secrets đúng nghĩa.

Những vấn đề phổ biến thường gặp
| Vấn đề | Hệ quả | Ví dụ thực tế |
|---|---|---|
| Secrets rải rác nhiều nơi | Không biết bản nào là "source of truth". Khó quản lý khi thay đổi. Không biết ai đang sử dụng secret nào | DB password nằm đồng thời trong .env của 5 developer, trong Jenkins, trong Kubernetes Secret, và trong email onboarding. Khi cần đổi password, phải tìm và cập nhật từng nơi một — bỏ sót một chỗ là app bị lỗi |
| Không rotate định kỳ | Credential bị lộ có thể bị khai thác trong thời gian dài | AWS access key của một developer nghỉ việc bị commit nhầm lên GitHub public repo từ 8 tháng trước. Không ai phát hiện cho đến khi hóa đơn AWS tháng đó tăng đột biến vì kẻ tấn công đã dùng key đó khai thác crypto mining suốt thời gian đó |
| Không có TTL | Credential không bao giờ hết hạn, một lần lộ là lộ mãi mãi cho tới khi ai đó nhớ ra và đổi thủ công | Service account của hệ thống CI/CD cũ đã ngừng hoạt động 2 năm, nhưng token vẫn còn hiệu lực. Kẻ tấn công tìm thấy token trong một bản backup cũ và dùng nó để truy cập production environment |
| Không có dynamic secrets | Nhiều service dùng chung một credential, kẻ tấn công có credential đó là có tất cả | 12 microservice dùng chung một DB user app_user với quyền đọc/ghi toàn bộ database. Khi service payment-service bị compromise, kẻ tấn công có thể truy cập toàn bộ dữ liệu từ cả 11 service còn lại |
| PKI và TLS cert quản lý thủ công | Cert hết hạn ngoài giờ hành chính gây sự cố, quy trình CSR chậm và dễ sai | TLS cert của API gateway hết hạn lúc 2 giờ sáng thứ Bảy. Không ai đặt lịch nhắc. Toàn bộ mobile app báo lỗi SSL cho người dùng suốt 6 tiếng cho đến khi on-call engineer thức dậy và gia hạn thủ công |
| Không audit được ai truy cập secret | Khi xảy ra vi phạm, không có dữ liệu để điều tra trách nhiệm | Dữ liệu khách hàng bị rò rỉ. Security team cần xác định secret nào bị lộ và ai đã truy cập. Nhưng vì không có audit log, họ không biết liệu đó là do developer, CI pipeline, hay kẻ tấn công bên ngoài khiến điều tra kéo dài hàng tuần mà không có kết luận |
Vault giải quyết như thế nào
Vault không chỉ là một "password manager" cho hạ tầng. Nó giải quyết các vấn đề trên thông qua 5 thứ:
1. Centralized secrets storage
Vault cung cấp KV secrets engine - nơi lưu trữ secrets tập trung, có version, có policy kiểm soát truy cập. Thay vì mật khẩu nằm rải rác, tất cả đều quy về một endpoint.
Đặc biệt: KV version 2 tự động lưu các phiên bản cũ - bạn có thể rollback hoặc kiểm tra lịch sử thay đổi.
Vault có thể thay thế hoặc kết hợp với Jenkins Credentials, AWS Secrets Manager, hay Azure Key Vault một cách linh hoạt.
2. Dynamic secrets (điểm nhấn)
"Dynamic secrets do not exist until they are read." — HashiCorp Vault documentation
Đây là khái niệm thay đổi hoàn toàn cách nghĩ về credential. Thay vì tạo một tài khoản DB một lần rồi chia sẻ cho tất cả service, Vault sinh credential riêng biệt và tạm thời cho mỗi request.
So sánh Static credentials và Dynamic credentials:
| Static credentials | Dynamic credentials | |
|---|---|---|
| Vòng đời | Tồn tại vĩnh viễn cho tới khi ai đó xóa | Tự động hết hạn theo TTL |
| Rotation | Thủ công, thường không làm | Tự động, mỗi request là một credential mới |
| Dùng chung | Nhiều service dùng chung một credential | Mỗi ứng dụng/instance nhận credential riêng |
| Privilege | Thường over-provisioned vì ngại đổi | Cấp đúng, đủ quyền cho từng use case |
| Nguy cơ commit code | Cao vì credential cố định dễ bị commit nhầm | Thấp vì credential ngắn hạn, hết hạn nhanh |
| Revoke khi cần | Phải đổi credential, ảnh hưởng tất cả | Revoke đúng credential đó, không ảnh hưởng những cái khác |
Mỗi dynamic secret đi kèm một lease - "hợp đồng" về thời gian sống. Khi lease hết hạn, Vault tự động thu hồi credential từ hệ thống đích.

Các secrets engine cung cấp dynamic credentials điển hình: database, aws, gcp, ssh.
3. Encryption as a Service
Transit secrets engine của Vault cho phép ứng dụng mã hóa và giải mã dữ liệu mà không cần tự quản lý khóa. Vault đóng vai trò là "cryptography service provider" tức là ứng dụng chỉ cần gửi plaintext, Vault sẽ trả về ciphertext.
"Encryption without storage" - Transit engine không lưu dữ liệu của bạn, nó chỉ thực hiện phép mã hóa rồi trả về kết quả cho bạn.

4. PKI automation
Vault có thể đóng vai trò một Certificate Authority (CA) đầy đủ chức năng, cấp TLS certificate theo yêu cầu trong vài giây thay cho quy trình thủ công: viết CSR, gửi cho CA, chờ sign, download, cài vào server, đặt lịch renew.

5. Audit devices
Vault giải quyết vấn đề "không biết ai đã truy cập vào secret này" bằng audit devices, nó ghi lại toàn bộ request và response (đã hash các giá trị nhạy cảm) vào các đích như file, syslog, hay socket.

Một điểm quan trọng cần biết cho kỳ thi:
Nếu tất cả audit device đang được enable đều bị down, Vault sẽ từ chối phục vụ mọi request.
Đây là thiết kế cố ý vì Vault ưu tiên "fail secure" tức là thà không hoạt động còn hơn hoạt động mà không có audit trail.
Tóm tắt nhanh
- Centralized secrets: KV v2 là source of truth duy nhất, thay thế secrets rải rác trên nhiều hệ thống.
- Dynamic secrets: Vault sinh credential tạm thời cho từng request, tự hết hạn, tự revoke, không dùng chung.
- Encryption as a Service: Transit engine mã hóa/giải mã dữ liệu mà ứng dụng không cần tự quản lý khóa mã hoá.
- PKI automation: Vault làm CA, cấp TLS cert theo yêu cầu trong vài giây, hỗ trợ short-lived cert cho zero-trust.
- Audit: Ghi lại toàn bộ hoạt động truy cập Secrets.
Tài liệu tham khảo
- What is Vault? — tổng quan về Vault và các use case
- KV Secrets Engine v2 — centralized secrets storage với versioning
- Dynamic Secrets — Database — sinh credential tạm thời cho database
- Transit Secrets Engine — encryption as a service
- Audit Devices — ghi log toàn bộ hoạt động truy cập
Bắt tay vào thực hành
Hãy mở Codespace để làm bài thực hành tương ứng. Vault dev server sẽ tự khởi động sẵn cho bạn.
Lab: Trải nghiệm centralized secrets & encryption as a service
Thời gian ước tính: 20 phút
Open in GitHub Codespaces →