← 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.

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.

Bản chuyển thể từ Securing Logs and Securing the State File.