Secret key base và RAILS_MASTER_KEY trong rails
[Câu hỏi dài, mong mọi người bỏ qua]
Dạ em chào mọi người,
Hôm nay em xin phép được hỏi mọi người về secret_key_base trong rails.
Gần đây em cũng có thử học deploy ứng dụng rails lên aws, nhờ tham khảo bài viết hướng dẫn trên viblo nên em có làm thành công, tuy nhiên trong quá trình đọc hướng dẫn và làm theo em thấy rất hay có sự xuất hiện của những cái như 'secrets.yml', 'secret_key_base', 'RAILS_MASTER_KEY'... Lúc đó em không hiểu nhưng cứ copy vào làm theo.
Đến hôm nay em có tìm hiểu về những định nghĩa kể trên. Theo những gì em thu lượm được thì em rút ra 1 vài ý sau:
-
secrets.yml được sử dụng từ rails 4.1, với chức năng lưu những thông tin đăng nhập hay nhạy cảm trong dự án. . Vì chứa thông tin quan trọng nên file secrets.yml khi này không được phép cho vào source control (phải ignore file này) . Hoặc nếu đem file secrets.yml này vào repo dự án thì các value trong file này phải sử dụng dưới dạng biến môi trường.
-
Đến phiên bản rails 5.1 thì rails được bổ sung tíng năng encrypt cho những dữ liệu nhạy cảm được lưu trong file secrets.yml kể trên. . Khi tạo dự án mới trong rails 5.1 thì rails sẽ tự động sinh ra file secrets.yml.key, file này có chức năng lưu 1 khoá. . Với khoá đó có thể mã hoá cũng như giải mã các thông tin nhạy cảm nêu ở trên. . khoá đó được gọi là RAILS_MASTER_KEY . file lưu những thông tin nhạy cảm đã được mã hoá bằng RAILS_MASTER_KEY sẽ được sinh ra tên là: secrets.yml.enc . vì đã được mã hoá nên file secrets.yml.enc có thể được public. Còn file secrets.yml.key thì phải tuyệt đối bí mật.
-
Đến rails 5.2 thì ý tưởng vẫn tương tự như rails 5.1, sẽ có 1 RAILS_MASTER_KEY để mã hoá các thông tin quan trọng, tuy nhiên . RAILS_MASTER_KEY được lưu trong file master.key . Dữ liệu quan trọng và được mã hoá bởi RAILS_MASTER_KEY sẽ được lưu trong credentials.yml.enc ...
-
secret_key_base là 1 khoá bí mật được tạo ra khác nhau với từng rails app, với chức năng để làm 1 thành phần trong quá trình mã hoá cookies hoặc các hàm mã hoá khác.
Đó là 1 vài ý em em đang nghĩ, em không chắc chắn về những ý hiểu trên, nên mong anh chị có thể giúp em nhận xét và bổ sung giúp em.
Với 1 thắc mắc nữa của em đó là:
secret_key_base trong project em tạo (rails 5.2.2) được lưu trong mã hoá trong file credentials.yml.enc
em có truy cập vào giá trị của nó thông qua:
Rails.application.credentials.secret_key_base
và nhận được giá trị: "53839680570359733e0ed7240c389f66920109d76c03889aca1d673b1ca5f870a722a42dfa6c2f3e14b1aaf87a2e09a1f9121d3c7f823844754997f5d8e5fb30" đây đúng là giá trị của secret_key_base em đang có trong file credentials.yml.enc
Nhưng khi em gọi:
Rails.application.secret_key_base thì lúc này em vẫn nhận được giá trị: "31fa6a2dfd896c42a5036b7158cb8964" (khác hoàn toàn với secret_key_base ở trên)
Em bị rối ở đây, đó là chả nhẽ ngoài 1 secret_key_base được lưu mã hoá trong credentials.yml.enc ra, thì trong rails còn 1 secret_key_base nữa hay sao? và nếu còn 1 secret_key_base thì nó tồn tại để giải quyết bài toán gì?
Mong anh chị giúp đỡ, em xin cảm ơn
1 CÂU TRẢ LỜI
Hình như cái rails.application.secrets.secret_key_base
chính là cái secret_key_base
trong file secret.yml đó bạn
rails.application.credentials.secret_key_base
thì là biến secret_key_base
mình set trong credentials.yml.enc
vì secrets.yml đã lỗi thời nên production sẽ ưu tiên sử dụng theo thứ tự
ENV['SECRET_KEY_BASE'] || Rails.application.credentials.secret_key_base || Rails.application.secrets.secret_key_base
tham khảo thêm ở đây: https://api.rubyonrails.org/classes/Rails/Application.html#method-i-secret_key_base
nếu bạn test ở development thì rails sẽ generate ra 1 file là development_secret.txt
để chứa secret_key_base