Chuyển đến nội dung chính

Bài 17: Transform và Tokenization - Data Protection

Transform Secrets Engine (Enterprise) — Format Preserving Encryption (FPE), Masking, Tokenization. PCI DSS compliance, PII protection. So sánh Transit vs Transform.

🔒 DevSecOps — Bài 17 Bài 17: Transform và Tokenization - Data Protection

HashiCorp Vault từ Cơ bản đến Nâng cao

Phần 4: Secrets Engines nâng cao

xdev.asia

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ạiMô tảReversibleUse case
FPEFormat Preserving EncryptionCóCredit card, SSN — giữ format gốc
MaskingChe dữ liệu bằng ký tựKhôngHiển thị "****1234"
TokenizationThay bằng token ngẫu nhiênCó (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íFPETokenization
Giữ format gốcCóTùy chọn
ReversibleCó (bằng key)Có (bằng lookup store)
Cần external storeKhôngCó (internal hoặc external)
PCI DSS de-scopeKhông (vẫn cần key management)Có (environments không có key)
PerformanceNhanh (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íTransitTransform
LicenseCommunityEnterprise
Output formatBase64 ciphertextGiữ format gốc (FPE) hoặc token
Schema changesCần thay đổi column typeKhông cần thay đổi
Use case chínhEncrypt at restPCI DSS, PII protection
Batch performanceRất tốtTốt (FPE), khá (Tokenization)
Key rotationCó (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.