0

Series HashiCorp Vault Thực chiến | Bài 5: Transit Engine - Mã hóa Dữ liệu Nhạy cảm (Encryption as a Service)

Hãy tưởng tượng Vault là một cái máy xay thịt siêu bảo mật (Encryption as a Service).

  1. Ứng dụng của bạn ném cục "thịt tươi" (Dữ liệu thẻ NFC) vào Vault.
  2. Vault dùng chìa khóa bí mật nằm sâu trong lõi của nó để mã hóa, rồi nhả ra "xúc xích" (Ciphertext).
  3. Ứng dụng đem "xúc xích" này lưu vào MySQL.
  4. Khi cần đọc, ứng dụng gửi "xúc xích" lên Vault, Vault sẽ nhả lại "thịt tươi".

Điểm mấu chốt: Ứng dụng Backend không hề biết chìa khóa mã hóa là gì. Chìa khóa không bao giờ rời khỏi bộ nhớ của Vault. Hacker có chui được vào Database hay lấy được Source code của bạn cũng chỉ thấy những đoạn mã vô nghĩa.

1. Bước 1: Kích hoạt Transit Engine và Tạo "Ổ khóa"

Bật tính năng Transit lên bằng một lệnh đơn giản:

vault secrets enable transit

Tạo một ổ khóa (Encryption Key) chuyên dùng để mã hóa thông tin vé. Chúng ta sẽ đặt tên nó là afc-ticket-key:

vault write -f transit/keys/afc-ticket-key

Từ giờ, Vault đã tạo ra và cất giữ một chìa khóa AES-256-GCM mang tên afc-ticket-key.

2. Bước 2: Mã hóa dữ liệu (Encrypt)

Quy tắc bắt buộc: Vault yêu cầu mọi dữ liệu thô đẩy lên phải được mã hóa dạng Base64 trước (để tránh lỗi ký tự đặc biệt truyền qua API).

Giả sử mã thẻ NFC của khách là NFC-987654321.

  • Encode Base64 chuỗi đó: TkZDLTk4NzY1NDMyMQ==

Bây giờ, gửi lên Vault để mã hóa:

vault write transit/encrypt/afc-ticket-key \
    plaintext="TkZDLTk4NzY1NDMyMQ=="

Kết quả trả về:

Key            Value
---            -----
ciphertext     vault:v1:A1b2C3d4E5f6G7h8I9j0... (đoạn mã hóa)

Chuỗi bắt đầu bằng vault:v1:... chính là thứ bạn sẽ lưu vào cột card_number trong Database. Chữ v1 biểu thị đây là dữ liệu được mã hóa bằng chìa khóa phiên bản 1.

3. Bước 3: Giải mã dữ liệu (Decrypt)

Khi cần xác thực khách qua cổng quét vé, bạn móc chuỗi vault:v1:... từ Database ra và nhờ Vault giải mã:

vault write transit/decrypt/afc-ticket-key \
    ciphertext="vault:v1:A1b2C3d4E5f6G7h8I9j0..."

Vault sẽ trả về lại chuỗi Base64 ban đầu: TkZDLTk4NzY1NDMyMQ==. Bạn chỉ việc decode Base64 trong code là ra mã NFC-987654321.

4. Tính năng "Sát thủ": Key Rotation (Xoay vòng chìa khóa)

Đây là lý do các hệ thống lớn bỏ tự viết hàm mã hóa để chuyển sang dùng Vault. Giả sử định kỳ 1 năm bạn phải đổi chìa khóa mã hóa một lần. Nếu tự code, bạn phải lôi toàn bộ Database ra giải mã bằng key cũ, rồi mã hóa lại bằng key mới cực kỳ rủi ro và tốn tài nguyên.

Với Vault, bạn chỉ cần chạy đúng 1 lệnh để tạo ra phiên bản chìa khóa mới (v2):

vault write -f transit/keys/afc-ticket-key/rotate

Điều kỳ diệu là gì?

Vault đủ thông minh để biết rằng: Nếu dữ liệu gửi lên bắt đầu bằng vault:v1:..., nó sẽ tự móc chìa khóa cũ (v1) ra để giải mã. Nếu bạn mã hóa dữ liệu mới, nó sẽ tự dùng chìa khóa mới và gắn nhãn vault:v2:.... Dữ liệu cũ trong Database hoàn toàn không bị ảnh hưởng, không có downtime, không có rủi ro!

5. Áp dụng vào thực tế kiến trúc Backend

Trong code Laravel/Node.js, bạn có thể tạo một Helper function hoặc Mutator trong Model (Eloquent) để tự động hóa việc này:

  1. Trước khi save(): Lấy giá trị của field, base64 encode, gọi API POST /v1/transit/encrypt/afc-ticket-key, lấy ciphertext gán lại vào Model, rồi lưu xuống DB.
  2. Sau khi retrieve(): Đọc ciphertext từ DB, gọi API POST /v1/transit/decrypt/afc-ticket-key, base64 decode và trả về cho logic nghiệp vụ xử lý.

Tổng kết Series HashiCorp Vault

Chúng ta đã đi qua một hành trình đẳng cấp của kỹ thuật System/Backend:

  • Bài 1 & 2: Hiểu bản chất Vault và dùng KV Engine cất cấu hình tĩnh.
  • Bài 3: Thiết lập AppRole, tạo danh tính cho Cỗ máy (Machine Identity).
  • Bài 4: Dùng Dynamic Secrets tự sinh và tự hủy tài khoản Database.
  • Bài 5: Dùng Transit Engine mã hóa dữ liệu nhạy cảm mà không cần quản lý key.

Khi đã thiết kế được một kiến trúc Backend tích hợp sâu với Vault như thế này, hệ thống của bạn (đặc biệt là khối lượng giao dịch vé liên tục của Metro) đã đạt tiêu chuẩn bảo mật của các hệ thống ngân hà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í