現象

Capistrano3を利用して、Rails5のアプリをデプロイしたときに、SECRET_KEY_BASEが指定されていないという以下のエラーメッセージが表示される。

Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`

前提

  • Rails 5.0.0.1
  • Capistrano Version: 3.6.1 (Rake Version: 11.3.0)
  • ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
  • unicorn v5.2.0

解決策

Capistrano3は、.bash_profileではなく.bashrcを読み込むため、いくら.bash_profileexport SECRET_KEY_BASE=hogehogeと書いても読み込んでもらえなかった。

.bashrcexport SECRET_KEY_BASE=hogehogeと記載することで、上手く読み込まれた。

SECRET_KEY_BASEに定義する値は、bundle exec rake secretで生成するのが流儀のようです。

そもそも SECRET_KEY_BASEって何?

However, since Rails 4, the default store is EncryptedCookieStore. With EncryptedCookieStore the session is encrypted before being stored in a cookie. This prevents the user from accessing and tampering the content of the cookie. Thus the session becomes a more secure place to store data. The encryption is done using a server-side secret key secrets.secret_key_base stored in config/secrets.yml .
http://guides.rubyonrails.org/security.html

railsガイドを読んだところ以下の理解です。

  • セッションハイジャックを防ぐため、EncryptedCookieStoreでは、セッションは暗号化されてからクッキーに格納される
  • この暗号化を行う際の秘密鍵が、SECRET_KEY_BASE
  • 秘密鍵SECRET_KEY_BASEによる暗号化を行っているため、このSECRET_KEY_BASEが盗まれると復号化されてしまう

Ruby on Rails Security Guide — Ruby on Rails Guides

secret_key_baseとは - DesignAssembler

参考

Capistrano で.bash_profileに書いてある環境変数が読まれない件 - Qiita

secret_key_baseあたりのメモ - Qiita