Quản lý secrets trong Rails: credentials, ENV và những thứ tuyệt đối đừng commit

API key, database password và private key không phải config bình thường. Nếu commit chúng rồi xóa ở commit sau, secret vẫn còn trong Git history. Git nhớ dai hơn người yêu cũ, và bot quét GitHub thì chăm hơn cả reviewer.

Rails credentials

Rails hỗ trợ encrypted credentials:

1
bin/rails credentials:edit

Đọc giá trị:

1
Rails.application.credentials.dig(:aws, :access_key_id)

File credentials được mã hóa có thể commit. Khóa giải mã (config/master.key hoặc biến môi trường tương ứng) không được commit.

Rails hiện đại còn hỗ trợ credentials theo environment:

1
bin/rails credentials:edit --environment production

Environment variables

ENV phù hợp với platform quản lý secret hoặc container runtime:

1
2
ENV.fetch("DATABASE_URL")
ENV.fetch("AWS_REGION", "ap-southeast-1")

Dùng fetch cho giá trị bắt buộc để ứng dụng fail sớm thay vì chạy nửa ngày rồi mới phát hiện config là nil.

File .env chỉ nên dùng local và phải nằm trong .gitignore. Không xem .env là secret manager production chỉ vì tên file có dấu chấm trông khá bí mật.

Nguyên tắc vận hành

  • Cấp quyền tối thiểu cho từng credential.
  • Tách credential theo environment và service.
  • Rotate định kỳ và ngay khi nghi ngờ bị lộ.
  • Không log secret hoặc nhét secret vào URL.
  • Dùng secret manager của cloud/platform khi hệ thống đủ lớn.
  • Quét repository bằng secret scanner trong CI.

Nếu secret từng bị commit, hãy rotate trước, sau đó mới cân nhắc rewrite history. Xóa lịch sử mà giữ nguyên credential chỉ làm repository sạch về thẩm mỹ.

Reference