はじめに
renderでデプロイ時にcredentials.yml.encの設定がうまくかなかったので、備忘録に。
仕様
Rails7
dokcer
render
デプロイ時のエラー
ActiveSupport::MessageEncryptor::InvalidMessage
暗号化されたメッセージを復号化できていない。
おそらくconfig/master.key の鍵が config/credentials.yml.enc の鍵穴と一致していない。
credentials.yml/master.key の関係について
master.key を鍵、credentials.yml.enc を鍵穴に例えるとわかりやすいです。
credentials.yml.enc は暗号化されたデータ(例えば、アプリケーションのパスワードやAPIキー)で、このデータを読むためには特定の鍵が必要です。その鍵が master.key です。つまり、master.key を使って初めて credentials.yml.enc に格納された情報を解読(鍵を使って鍵穴を開けるイメージ)し、アクセスすることができます。
この鍵(master.key)がない、または間違っていると、鍵穴(credentials.yml.enc)に何が入っているかを知ることはできませんし、鍵が流出すると、誰でも鍵穴を開けて中身を見られる危険性があるということになります。
結論
config/credentials/production.yml.enを設定していたので、次の二つをやりました。
- production.yml.enc に secret_key_base を設定。
設定方法は次の通り。
下記のコマンドでsecret_key_baseに入れる値を生成します。
$ rails secret
上記のコマンドで生成されたキーをconfig/credentials/production.yml.encを開いてsecret_key_baseに設定します。
$ EDITOR="vim" rails credentials:edit --environment production
$ secret_key_base: #rails secretで生成されたキー
- RAILS_ENVの設定とRAILS_MASTER_KEYをproduction.keyに設定。
RAILS_ENV: production
RAILS_MASTER_KEY: #production.keyの値
それでもダメなら
config/credentials/production.keyの再設定をしてみる。
鍵と鍵穴が一致していないなら、新しく作りなおりましょう、ということですね。
$ rm config/credentials/production.yml.enc
$ rm config/credentials/production.key
$ EDITOR=vim rails credentials:edit --environment production
上記コマンドを実行し、再設定する。
まとめ
最初に、config/credentials.yml.encを使用していたことと、secret_key_baseが設定できていなかったことが原因でした。
- Rails ガイドにも、環境ごとの設定ファイルが存在する場合はそれを使用し、存在しない場合はデフォルトの config/credentials.yml.enc を使用すると書かれています。
デフォルトでは、config/credentials/#{Rails.env}.yml.encがあればそのパスを使い、なければconfig/credentials.yml.encを使います。
railsガイドから引用
そのrailsのgithub のコードはここに書いてある。(興味があれば)
- secret_key_baseについてはこんな感じ。
secret_key_base: このメソッドは、改竄防止のためにアプリケーションのセッションを既知の秘密キーと照合するためのキーを指定するときに使います。test環境とdevelopment環境の場合、secrets.secret_key_baseでランダムに生成されたキーを使います。その他の環境ではキーをconfig/credentials.yml.encに設定すべきです。
railsガイドから引用
秘密鍵は十分に長く、かつランダムでなければなりません。一意な秘密鍵を得るにはbin/rails secretを使います。Rails セキュリティガイド
参考記事
【Rails + Docker】Render.comでMulti Environment Credentialsに対応する
Rails の Credentials で使用する yml.enc を変えたい
credentials.yml master.key関係について