QA@IT

rails の secret_token の扱い

4765 PV

rails では config/initializers/secret_token.rb に秘密にすべきトークンが書かれていますが、このような一般に公開すべきではない情報は、どう扱うのが良いのでしょうか?

一例としては Redmine だとインストール時に生成するようになっているようです。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Step-5-Session-store-secret-generation

  • 「どう扱うのが良いのか」というのはgithub等で公開する場合のことを指していますか? -
  • 公開する場合もそうですが、一般的にどう扱っているのか気になっています。
    あまり気にせずそのままレポジトリに入れてしまっているのでしょうか。
    -
  • `rake secret` -
  • `rake secret` は知っていますが、ランダムな文字列を生成してくれるだけです。そのランダムな文字列をどう扱えばいいのかという質問なのですが。 -

回答

Phusion のブログで secret_token の取り扱いについてまとめられていました。
http://blog.phusion.nl/2013/01/04/securing-the-rails-session-secret/

彼らのおすすめ順に:

  1. キーはコミットしないで、ユーザにキーを生成させる (Redmine みたいに)
  2. キーはコミットしないで、なかったらランダムなキーを自動的に生成する
  3. キーはコミットしないで、なかったらランダムでないキーを自動的に生成する
  4. キーはコミットするが、そこに環境固有の情報をくっ付けてハッシュ化したものを使う
  5. キーはコミットするが、環境変数が設定されていたらそっちを使う

それぞれのメリット・デメリットについても紹介されていますのでご一読あれ。個人的には Heroku で動かすようなアプリであれば 5 で十分かなあと思っております。

編集 履歴 (0)
  • 非常に参考になりました。
    ありがとうございます。
    deploy 方法などに応じていろいろ試してみます。
    -

config/initializers/secret_token.rb
これはRailsのsession生成に利用される秘密鍵で
Railsプロジェクト作成時にランダムで設定されます。

なので、例えばWebサービスを作ってソースコードをgithubで公開する場合は
secret_token.rb は実際に使用している物とは別のものを公開、もしくは非公開に
するのがいいんではないでしょうか。

Redmineの場合だと、OSSとして公開しているので
rake generate_secret_token
して、みなさんsecret_token.rb書き換えてね
ということです。
ちなみに、SecureRandom.hex(40)の値を設定しています。

rake secret の件は
出力結果をsecret_token.rbに設定してあげるってのでもいいですよ
ということです。

編集 履歴 (1)
  • はい、 secret_token.rb は非公開にした方が良いと思っていて、非公開にした場合に secret_token.rb の管理をどうやってるのが良いでしょうか、という質問です。
    実例としては redmine しか確認していないので、他の OSS はどうしているのか、定番の方法はあるのかということを知りたかったのです。
    わかりにくい質問ですいません。
    -
  • 「`rake secret` は知っていますが、ランダムな文字列を生成してくれるだけです。そのランダムな文字列をどう扱えばいいのかという質問」

    とあったので、secret_token.rb の意味や設定について記載してしまいました。

    文字数制限があるようなので、何回かに分けて再チャレンジしてみます。
    -
  • そんなにRailsのOSSに詳しくないので回答になっていないかもしれませんが、rake taskまで用意してくれてるredmine的なやり方は親切でいいのではないでしょうか? -
  • 「非公開にした場合に secret_token.rb の管理をどうやってるのが良いでしょうか」という質問が抽象的すぎるのでうまく回答できる自身がないですが
    公開ソースとは別のものでデプロイすればいいだけではと思っているのですが、、、やっぱり回答になってないですよね?
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。