Terraform
← Tổng quan series

Bảo mật log và Terraform state

Nhận diện nơi secret có thể lọt ra, dùng sensitive đúng cách và bảo vệ state bằng backend, IAM, encryption và versioning.

Instructor walkthrough

Bài giảng: hiểu luồng trước khi chạy lệnh

Bài toán: Nhận diện nơi secret có thể lọt ra, dùng sensitive đúng cách và bảo vệ state bằng backend, IAM, encryption và versioning.

01Chuẩn bịkiểm tra account, region, provider và chi phí
02Đọc planđối chiếu resource address, diff và dependency
03Thực hànhapply mutation nhỏ trong sandbox, lưu evidence
04Khôi phụcre-run, failure drill, destroy hoặc rollback
Command reference · baseline
terraform fmt
terraform init
terraform validate
terraform plan
terraform apply
terraform plan -destroy
terraform destroy

sensitive chỉ là lớp che hiển thị

variable "db_password" {
  type      = string
  sensitive = true
}

output "db_endpoint" {
  value = aws_db_instance.app.endpoint
}

Terraform sẽ che giá trị nhạy cảm trong một số output/plan, nhưng provider có thể cần ghi nó vào state để biết resource. Vì vậy đừng hiểu sensitive = true là encryption. Secret thực sự nên nằm ở Secrets Manager, Vault, HCP variable hoặc CI protected variable.

Cẩn thận với TF_LOG

TF_LOG=TRACE terraform apply hữu ích khi điều tra provider, nhưng log trace có thể chứa request, response, header hoặc giá trị không nên chia sẻ. Nếu buộc phải dùng:

TF_LOG=DEBUG TF_LOG_PATH=terraform-debug.log terraform plan

Giới hạn quyền đọc file, redact trước khi gửi, xóa sau điều tra và tắt ngay sau đó. Không upload log trace vào artifact public.

State phải được coi là secret-adjacent

Checklist backend production:

  • Storage không public, block public access.
  • Encryption at rest, tốt hơn là KMS key có policy rõ.
  • Versioning để phục hồi state bị ghi nhầm.
  • IAM chỉ cho đúng runner/team và đúng prefix.
  • Locking để tránh concurrent apply.
  • Audit log cho read/write/delete.
terraform {
  backend "s3" {
    bucket       = "company-terraform-state"
    key          = "payments/prod/terraform.tfstate"
    region       = "ap-southeast-1"
    encrypt      = true
    use_lockfile = true
  }
}

Nếu secret đã lọt vào state?

Đừng chỉ xóa dòng trong file state bằng tay. Xoay vòng secret trước, xác định nơi đã tải artifact/log, thu hồi quyền, rồi dùng quy trình state được review. Xóa khỏi code không xóa lịch sử đã commit hoặc state version cũ.

Ngoài ra, .gitignore phải chặn state local nhưng không thay thế secret scanning. CI nên tìm credential pattern và ngăn merge trước khi apply.

Checklist incident khi secret đã xuất hiện

1. Thu hồi/xoay vòng secret ngay.
2. Xác định secret từng xuất hiện ở state, log, artifact hay Git history.
3. Hạn chế quyền đọc các bản sao đó.
4. Xóa artifact/log theo retention và cập nhật người bị ảnh hưởng.
5. Kiểm tra CloudTrail/audit log để tìm dấu hiệu sử dụng.
6. Sửa pipeline/provider để tránh lặp lại.

Không dùng terraform state rm như một công cụ xóa secret: lệnh đó bỏ resource khỏi state nhưng không đảm bảo secret biến mất khỏi version cũ, log hay remote object. Hãy coi đây là incident bảo mật, không chỉ là lỗi Terraform.

Expected control và incident drill

Expected state là secret test nằm ở secret manager/protected variable, output/plan/log/artifact được phân loại, state backend private/encrypted/versioned/locked/audited, IAM theo prefix/role và debug logging tắt mặc định. sensitive chỉ che hiển thị; state/version/log retention vẫn được coi là dữ liệu nhạy cảm.

Thực hiện các drill không dùng credential production:

  1. Quét plan/output/log/artifact/state mẫu để tìm token/password/private key, xác định nơi xuất hiện và kiểm tra redaction/retention/access.
  2. Bật TF_LOG=DEBUG trong một run ngắn, giới hạn TF_LOG_PATH, kiểm tra quyền file, redact rồi xóa; xác nhận pipeline không upload trace public.
  3. Mô phỏng secret lọt vào state/log: xoay vòng/thu hồi secret, hạn chế quyền đọc, inventory state versions/artifacts/Git history, xem audit log và ghi incident owner/timeline.
  4. Kiểm tra backend KMS/IAM/versioning/lock/delete policy và secret scanning CI; thử recovery từ state version mà không copy plaintext ra workspace lâu dài.

Quality gate

Pass khi người học phân biệt masking với encryption/removal, có data-flow inventory cho secret, backend/log/artifact controls, rotation/revocation/incident runbook, state version/Git history handling và least-privilege audit. Không dùng state rm hoặc xóa một file local làm bằng chứng secret đã được xử lý.