79

私は Rails 4 に不慣れで、Rails 4 でのsecret_key_baseunderの使用法を理解していませんconfig/secrets.yml。この概念について説明していただけますか?

また、実稼働環境で作業しているときは、 、、およびを設定secret_keyするように求められます。ただし、コマンドを使用して新しいシークレットを生成できます。devise.rbconfig.secret_keysecret_key_baserake secret

開発環境と本番環境の違いは何ですか?

生成するたびsecret_keyに追加すると、新しく生成されたものとどのように一致しますか?secret_key_base

他のサーバーでアプリケーションをどのように保護していますか?

4

2 に答える 2

67

secret_token.rbファイルのコンテンツには、署名付き Cookie の整合性を検証するために使用されるランダム化された長い文字列が含まれています(ユーザーが Web アプリにサインインしたときのユーザー セッションなど)。

ドキュメントには次のように記載されています。

イニシャライザから既存の secret_key_base を使用してsecret_token.rb、プロダクション モードで Rails アプリを実行するユーザーの SECRET_KEY_BASE 環境変数を設定します。または、既存の secret_key_base をsecret_token.rb初期化子から production セクションのsecrets.yml にコピーして、 <%= ENV["SECRET_KEY_BASE"] %>.

これは重要なファイルであり、.gitignore に置くことはできないため、env 変数を使用してsecret_key_base値を格納することをお勧めします。

作成.envまたは.powenvファイルして、次のように保存します。

export SECRET_TOKEN="9489b3eee4eccf317ed77407553e8adc97baca7c74dc7ee33cd93e4c8b69477eea66eaedeb18af0be2679887c7c69c0a28c0fded0a71ea472a8c4laalal19cb"

そして、config/initializers/secret_token.rb

YourAppName::Application.config.secret_key_base = if Rails.env.development? or Rails.env.test? # generate simple key for test and development environments
  ('a' * 30) # should be at least 30 chars long
else
  ENV['SECRET_TOKEN']
end

この記事 は (少し古くて) 長いですが、トピックに関する有益な情報が満載です。


更新 04.05.15

Rails 4.2 から、secret_token.rbファイルはなくなりました。新しい規則により、config/secrets.ymlアプリケーションの秘密を保存することを目的としたファイルがあります。

イノベーションに従って既存のアプリを 4.2.x にアップグレードする方法をお読みください。


技術的には、 の目的は、アプリケーションのメソッド (チェック)secrect_key_baseの秘密の入力になることです。key_generatorRails.application.key_generator

アプリケーションのkey_generator、したがってsecret_key_baseは、Rails フレームワーク内の 3 つのコア機能によって使用されます。

  • 経由でアクセスできる暗号化された Cookie の派生キー cookies.encrypted
  • 経由でアクセスできる HMAC 署名付き Cookie のキーを取得しますcookies.signed
  • アプリケーションのすべての名前付きmessage_verifierインスタンスのキーを導出します。

@michaeljcoyne による記事で、3 つのそれぞれについて詳しく確認してください。

于 2014-08-21T13:14:35.277 に答える
27

secret_key_base は、セッションの暗号化と署名に使用されます

クッキーでセッションを安全に送受信するため


Rails 4では、

  1. アプリが呼び出された場合Hello、および
  2. あなたが設定session['a'] = 'b'した、

クッキーは次のようになります。

_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689

これは次のように変換されます。

_Hello_session=<encrypted a=b>--<digital signature>

Cookie はサーバーによって設定され、クライアント側で保持されます。ブラウザは、ページをリクエストするたびに、設定された Cookie をサーバーに再送信します。

a=b文字列は悪者に理解されないように暗号化されています。
悪意のある人物による Cookie の改ざんを防ぐために、デジタル署名が使用されます。

どちらの場合も、secret_key_base値が使用されます (a=b の暗号化/復号化とデジタル署名の検証に)。

于 2015-08-05T21:49:19.557 に答える