おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Railsアプリのソースを公開する際に役立つtips(secretを自動生成)

最近はgithubcodereposなどの共有レポジトリが流行っています(?)ね。僕はまだコミットした事はないのですが、パスワードなどの秘密の情報が存在するアプリケーションをコミットするときにはどのように秘密部分を加工しているのだろうなー?とずっと疑問に思っていました。

Railsアプリの場合は、クッキーセッションの認証用データを作成するためのシークレットキーがconfig/environment.rbに書かれており(下記の:secretの部分)、ここが秘密部分に当たります。

  config.action_controller.session = {
    :session_key => '_hoge_session',
    :secret      => '4d6c53b43ce6e777251291be7aa191eb80773f332731424c411c3f79bbee485250c6fd24aa8503757cf973e35dfc8a18efb1ce63e26e888431bfa537e6fce4b7'
  }

普通はその部分だけ消すかxxxxxみたいに適当な値にしてコミットすればいいのでしょうが、それだとupdateしてから実際に動かす前に必ず修正しないといけないし、コミットする前にも消したかどうか確認しないといけないしでとても面倒。

何かうまい方法はあるのかなーとずっと思っていたのですが、今日たまたまfastladderのソースを見ていたら、うまいやり方で解決していて感心したので紹介します。こんな感じ。

  secret = ""
  secret_path = File.join(RAILS_ROOT, "config/secret.txt")
  if File.exist?(secret_path)
    secret = open(secret_path) { |io| io.read }.gsub(/\s/, '')
  end
  if secret.empty?
    characters = ("0".."9").to_a + ("a".."f").to_a
    secret = Array.new(128) { characters[rand(characters.size)] }.join
    open(secret_path, "w") { |io| io.write(secret) }
  end
  config.action_controller.session = {
    :session_key => '_fastladder_session',
    :secret      => secret
  }

秘密部分をランダム生成して別ファイルに書き出し→次回以降はファイルから読み込みという訳です。これはRailsアプリを公開したいときに使えるテクニックですねー。