1. Transform Secrets Engine Overview
Transform Secrets Engine (Enterprise) cung cấp các cơ chế data protection nâng cao, cho phép bảo vệ dữ liệu nhạy cảm mà vẫn giữ nguyên format ban đầu — khác với Transit Engine trả về ciphertext hoàn toàn khác format.
Ba loại Transform
| Loại | Mô tả | Reversible | Use case |
|---|---|---|---|
| FPE | Format Preserving Encryption | Có | Credit card, SSN — giữ format gốc |
| Masking | Che dữ liệu bằng ký tự | Không | Hiển thị "****1234" |
| Tokenization | Thay bằng token ngẫu nhiên | Có (lookup) | PCI DSS, de-scope environments |
2. Format Preserving Encryption (FPE)
FPE mã hóa dữ liệu nhưng giữ nguyên format gốc. Ví dụ: credit card number 16 chữ số mã hóa thành 16 chữ số khác. Điều này cho phép legacy systems tiếp tục hoạt động mà không cần thay đổi schema.
Setup FPE
# Enable Transform secrets engine
vault secrets enable transform
# Tạo alphabet (tập ký tự cho phép)
# Built-in: builtin/numeric, builtin/alphanumericlower, builtin/alphanumericupper
# Tạo template cho credit card
vault write transform/template/credit-card-tmpl \
type=regex \
pattern='(\d{4})-(\d{4})-(\d{4})-(\d{4})' \
alphabet=builtin/numeric \
encode_format='$1-$2-$3-$4' \
decode_format='$1-$2-$3-$4'
# Tạo transformation
vault write transform/transformations/fpe/credit-card \
template=credit-card-tmpl \
tweak_source=internal \
allowed_roles=payments
# Tạo role
vault write transform/role/payments \
transformations=credit-card
Sử dụng FPE
# Encode (encrypt)
vault write transform/encode/payments \
value="4111-1111-1111-1111" \
transformation=credit-card
# encoded_value: 7492-8372-1938-4726
# Decode (decrypt)
vault write transform/decode/payments \
value="7492-8372-1938-4726" \
transformation=credit-card
# decoded_value: 4111-1111-1111-1111
# Batch operations
vault write transform/encode/payments \
batch_input='[
{"value": "4111-1111-1111-1111", "transformation": "credit-card"},
{"value": "5500-0000-0000-0004", "transformation": "credit-card"}
]'
FPE cho SSN/CCCD
# Template cho SSN (xxx-xx-xxxx)
vault write transform/template/ssn-tmpl \
type=regex \
pattern='(\d{3})-(\d{2})-(\d{4})' \
alphabet=builtin/numeric
# Template cho CCCD Việt Nam (12 chữ số)
vault write transform/template/cccd-tmpl \
type=regex \
pattern='(\d{12})' \
alphabet=builtin/numeric
vault write transform/transformations/fpe/cccd \
template=cccd-tmpl \
tweak_source=internal \
allowed_roles=patient-data
3. Masking
Masking che dữ liệu bằng ký tự thay thế — không thể reverse. Phù hợp cho hiển thị trên UI, logs, reports.
# Tạo masking transformation
vault write transform/transformations/masking/card-mask \
template=credit-card-tmpl \
masking_character="#" \
allowed_roles=display
vault write transform/role/display \
transformations=card-mask
# Mask
vault write transform/encode/display \
value="4111-1111-1111-1111" \
transformation=card-mask
# encoded_value: ####-####-####-1111
4. Tokenization
Tokenization thay thế dữ liệu nhạy cảm bằng một token ngẫu nhiên, lưu mapping trong store riêng. Token không có quan hệ toán học với dữ liệu gốc → an toàn hơn FPE.
Tokenization vs FPE
| Tiêu chí | FPE | Tokenization |
|---|---|---|
| Giữ format gốc | Có | Tùy chọn |
| Reversible | Có (bằng key) | Có (bằng lookup store) |
| Cần external store | Không | Có (internal hoặc external) |
| PCI DSS de-scope | Không (vẫn cần key management) | Có (environments không có key) |
| Performance | Nhanh (crypto operation) | Chậm hơn (storage lookup) |
# Tạo tokenization store (internal)
vault write transform/stores/internal-store \
type=internal
# Tạo tokenization transformation
vault write transform/transformations/tokenization/card-token \
allowed_roles=tokenize-role \
stores=internal-store \
max_ttl=8760h
vault write transform/role/tokenize-role \
transformations=card-token
# Tokenize
vault write transform/encode/tokenize-role \
value="4111111111111111" \
transformation=card-token
# encoded_value: Q4hx8AZDhk3jfn9876XYZ123...
# Detokenize
vault write transform/decode/tokenize-role \
value="Q4hx8AZDhk3jfn9876XYZ123..." \
transformation=card-token
# decoded_value: 4111111111111111
# Kiểm tra token metadata
vault write transform/tokeninfo/tokenize-role \
value="Q4hx8AZDhk3jfn9876XYZ123..." \
transformation=card-token
5. Transit vs Transform — Khi nào dùng cái nào?
| Tiêu chí | Transit | Transform |
|---|---|---|
| License | Community | Enterprise |
| Output format | Base64 ciphertext | Giữ format gốc (FPE) hoặc token |
| Schema changes | Cần thay đổi column type | Không cần thay đổi |
| Use case chính | Encrypt at rest | PCI DSS, PII protection |
| Batch performance | Rất tốt | Tốt (FPE), khá (Tokenization) |
| Key rotation | Có (rewrap) | Có |
Ví dụ thực tế
Transit: Mã hóa email, địa chỉ, dữ liệu y tế trong database → ciphertext dài, cần decrypt để dùng
Transform FPE: Mã hóa credit card number → legacy billing system vẫn xử lý được format 16 chữ số
Transform Tokenization: Thay credit card thành token → dev/test environment hoàn toàn de-scoped khỏi PCI
Transform Masking: Hiển thị ****1234 trên UI → không thể recover data gốc
6. Tích hợp với Database Views
-- PostgreSQL view sử dụng Vault Transform
-- Application gọi Vault API để decode khi cần
-- Table gốc lưu tokenized data
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT,
card_token TEXT, -- Tokenized value
card_last4 TEXT, -- Masked value cho display
amount DECIMAL(10,2),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Application flow:
-- 1. User nhập card number
-- 2. App gửi đến Vault Transform → nhận token + masked
-- 3. Lưu token vào card_token, masked vào card_last4
-- 4. Khi cần charge → app gửi token đến Vault → nhận card number gốc
-- 5. Charge card rồi xóa plaintext khỏi memory
7. Tổng kết
FPE — mã hóa giữ format, phù hợp legacy systems
Masking — che dữ liệu, irreversible, cho UI/logs
Tokenization — thay bằng random token, de-scope environments
Transit — encryption cơ bản, Community edition
Transform — data protection nâng cao, Enterprise
Bài tiếp theo sẽ khám phá KMIP, Consul, Nomad Secrets Engines và cách phát triển Custom Plugins cho Vault.