Encrypted Credentials với Rails 5.2
Phiên bản Rails 5.1 đã giới thiệu cách để bảo mật các thông tin bí mật(encrypted credentials), có 2 nơi bạn có thể đặt các thông tin bí mật của mình là secrets.yml và secrets.yml.enc. Điều này gây ra một chút nhầm lẫn khi bạn sử dụng các thông tin bí mật thông thường hoặc các thông tin bí mật đã ...
Phiên bản Rails 5.1 đã giới thiệu cách để bảo mật các thông tin bí mật(encrypted credentials), có 2 nơi bạn có thể đặt các thông tin bí mật của mình là secrets.yml và secrets.yml.enc. Điều này gây ra một chút nhầm lẫn khi bạn sử dụng các thông tin bí mật thông thường hoặc các thông tin bí mật đã được bảo mật.
Phiên bản 5.2 ra mắt đã thay thế cả 2 cách đó. Bây giờ bạn không thể sử dụng các văn bản đơn giản(plain text credentials). Chỉ còn có credentials.yml.enc.
Mã hóa Credentials
Để sử dụng encrypted credential, bạn cần có một key. Nếu không có key mã hóa, bạn sẽ không thể nào giải mã được thông tin. Nó vẫn an toàn nếu bạn chỉ commit file đã được mã hóa mà không commit key mã hóa lên repository.
Key mã hóa nằm trong config/master.key đã được tạo khi bạn chạy command rails new. Nó cũng được thêm vào .gitignore để không bị commit lên repository.
Các encrypted credential được lưu trong config/credentials.yml.enc. Bạn không được sửa file này một cách trực tiếp. Để thực hiện việc đó bạn cần chay command:
bin/rails credentials:edit
Text editor sẽ mở một phiên bản không được mã hóa của các thông tin. Nếu bạn không sử dụng text editor, bạn có thể chạy
EDITOR=vi bin/rails credentials:edit
Sau khi lưu thông tin mới chỉnh sửa thì một phiên bản mã hóa sẽ được lưu vào config/credentials.yml.enc
Đọc Credentials
Để sử dụng các credential trên môi trường production, bạn cần thêm vào file config/environments/production.rb đoạn config sau:
config.require_master_key = true
Bạn có thể truy cập các credentials với Rails.application.credentials. Ví dụ
foo: bar $ Rails.application.credentials.foo $>> "bar"
Định dạng Credentials
Bạn có thể sử dụng định dạng YAML cho credentials cuat bạn. Rails khuyến khích sử dụng flat format điều đó cũng có nghĩa là bạn không cần phải tách biệt develop hoặc production thêm nữa.
aws: access_key_id: 123 secret_access_key: 345 $ Rails.application.credentials.aws[:access_key_id] $ Rails.application.credentials.aws[:secret_access_key]
Lợi ích của Encrypted Credentials
- Đầu tiên, chắc chắn rồi: các credentials của bạn được mã hóa. Không ai có thể giải mã nó nếu như không có key.
- File mã hóa credentials được lưu trên repository của bạn. Bạn sẽ có một lịch sử của những thay đổi và những người đã làm nó.
- Bạn có thể deploy các credentials mới cùng với code mới. Ví dụ nếu code của bạn access đến một API, bạn có thể deploy code cùng với token trong credentials.yml.enc. Trước đây, bạn sẽ phải chắc chắn rằng bạn đã thêm biến môi trường trước khi deploy code mới.
- Tất cả những gì bí mật đều nằm ở một chỗ. Thay vì phải quản lý hàng loạt các biến môi trường, giờ mọi thứ đều nằm trong một file.
Quản lý key mã hóa
Mặc dù mã hóa các credential có rất nhiều lợi thế so với không mã hóa nhưng chúng ta vẫn có một vấn đề cần giải quyết đó là lưu trữ key. Bạn không thế lưu nó trong repository vì người khác có thể dùng nó để decrypt các thông tin. Ở đây chúng ta có 2 lựa chọn:
- Upload master.key một cách an toàn. Bạn có thể scp hoặc sftp file key này.
- Đặt key trong biến môi trường RAILS_MASTER_KEY.