2014-05-18 19 views
29

Gần đây tôi đã triển khai ứng dụng và gặp lỗi máy chủ nội bộ do thiếu secret_key_base sản xuất. Sau những giờ phút thử nghiệm, tôi quản lý để giải quyết vấn đề này với hai phương pháp:Thiếu secret_key_base sản xuất trong đường ray

Phương pháp 1:

tôi tạo ra một secret_key mới với rake secret và thay thế nó bằng <%= ENV["SECRET_KEY_BASE"] %> trong secrets.yml. Triển khai lại ứng dụng và lần này nó hoạt động. Nhưng tôi nghĩ rằng phương pháp này là sai.

Cách 2:

tôi tạo ra một secret_key mới với rake secret và thêm nó vào environments/production.rb như config.secret_key_base = 'd1f4810e662acf46a33960e3aa5bd0************************, mà không thay đổi secrets.yml (mặc định là production: <%= ENV["SECRET_KEY_BASE"] %>). Triển khai lại ứng dụng và hoạt động tốt.

Câu hỏi của tôi:

  1. Những phương pháp là tốt nhất?
  2. Nếu phương pháp thứ 2 là chính xác, tại sao đường ray không tạo ra secret_key_base trong production.rb theo mặc định?
  3. Có phương pháp nào khác để làm điều đó không?

Trả lời

29

Cuối cùng tôi đã tìm thấy phương pháp sửa lỗi. Không có phương pháp nào được đề cập là câu hỏi đúng.

phương pháp đúng:

Chính chúng ta sẽ tạo ra một chìa khóa bí mật (bởi rake secret) sau đó tạo ra một biến môi trường cho SECRET_KEY_BASE bằng cách chạy lệnh sau từ dấu nhắc lệnh:

rhc set-env SECRET_KEY_BASE=3dc8b0885b3043c0e38aa2e1dc64******************** -a myapp 

sau khi chạy lệnh này , kết nối với máy chủ của bạn qua SSH và chạy env để bạn sẽ thấy SECRET_KEY_BASE của mình trong danh sách.

Bây giờ, hãy khởi động lại ứng dụng rhc app-stop myapprhc app-start myapp, sau đó bạn nên thực hiện.

+0

Phương pháp rhc này chỉ có thể sử dụng được khi bạn lưu trữ tại openshift.redhat.com? –

+0

Bạn có thể tìm phương thức thích hợp cho từng dịch vụ trong tài liệu của mình. Ví dụ cho heroku bạn có thể kiểm tra trang này: https://devcenter.heroku.com/articles/config-vars – user3631047

+0

Cuối cùng tôi đã kết thúc với một bí mật trên VPS của tôi và đặt nó trong tập tin secrets.yml của tôi. –

0

Phương pháp 1 là chính xác. Bạn không muốn lưu trữ bí mật của mình trong mã.

+0

Tại sao không? Nó trả lời tất cả 3 câu hỏi: "Câu hỏi của tôi: Phương pháp nào là tốt nhất? Nếu phương pháp thứ 2 là chính xác, tại sao đường ray không tạo ra secret_key_base trong production.rb theo mặc định? Có phương pháp nào khác để làm điều đó không? " Bên cạnh đó, nó giải thích lý do tại sao. –

+0

Bạn có thể nếu bạn không có mã trên kho lưu trữ công cộng hoặc nếu trên kho công cộng, nó sẽ bị bỏ qua với gitignore –

+0

Ngay cả với kho lưu trữ riêng, đó là một nguy cơ bảo mật để lưu trữ bí mật sản xuất trong kiểm soát nguồn. Chỉ có môi trường thời gian chạy sản xuất "cần phải biết" những bí mật đó, nhưng với một VCS hiện có thêm bản sao trên tất cả các máy chủ có thanh toán/bản sao của repo, bao gồm cả hộp dev, máy chủ CI, v.v. bảo vệ (hoặc thậm chí hiểu) bề mặt tiếp xúc thực sự của bí mật sản xuất. –

3

Nếu bạn đang dùng máy Ubuntu bình thường, chỉ cần đặt export SECRET_KEY_BASE=" <<< output from rake secret here >>> " vào ~/.bashrc.

Chạy source ~/.bashrc và khởi động lại ứng dụng.

2

Có một tùy chọn khác sẽ an toàn hơn một chút và có nghĩa là thêm nó vào tệp cấu hình Apache/Nginx. Tôi đang sử dụng Apache và vừa sử dụng:

setenv SECRET_KEY_BASE my_secret

Sau đó, chỉ để lại những bí mật.tập tin yml được đặt thành: sản xuất: <% = ENV ["SECRET_KEY_BASE"]%>

Đối với máy chủ web sản xuất Tôi không chắc chắn có thể cho rằng tệp .bashrc được chạy và sẽ nhận biến ENV của bạn thiết lập, nhưng tôi nghĩ rằng cách này là chắc chắn để thiết lập nó. Tôi không và chuyên gia sẵn sàng để có bất kỳ rủi ro hoặc lý do tại sao nó không phải là một ý tưởng tốt chỉ ra cho tôi.

Các vấn đề liên quan