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 | ENV.fetch("DATABASE_URL") |
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ỹ.