Help us understand the problem. What is going on with this article?

credentials.yml.enc を使ってGmailのアプリパスワードを安全に管理する

More than 1 year has passed since last update.

前提

  • バージョンは Rails 5.2.3 です。
  • credentials.yml.enc は 5.2 から追加されたようです。
$ rails -v
Rails 5.2.3

経緯

先日私が書いた記事で、Gmailと連携してRailsにメール送信の機能を実装しました。

この記事にもあるように、Gmailと連携するためにはGmailのメールアドレスとアプリパスワードを設定する必要があります。

config/environments/development.rb
Rails.application.configure do

  #...(中略)...

  # コメントアウトすることでdevelop環境からもメールを送信する設定になる
  # config.action_mailer.raise_delivery_errors = false

  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
      :enable_starttls_auto => true,
      :address => 'smtp.gmail.com',
      :port => 587,
      :domain => 'gmail.com',
      :authentication => :plain,
      # メールアドレス
      :user_name => 'xxxxx@gmail.com',
      # アプリパスワード
      :password => 'aaaabbbbccccdddd'
  }
end

ただ、メールアドレスとアプリパスワードについては外部には公開したくない情報となるため、例えば config/environments/development.rb などにハードコーディングしてGitHubなどにpushすることは避けたいものです。

また、このような情報は複数人で開発している場合は、「ハードコーディングでpushしたくないけど、全員で共有したいもの」となります。

このような機密情報を、安全に、かつチーム内で共有できるように管理するために、Railsには credentials.yml.enc というファイルが用意されています。

使い方

実際に使いながら、説明していきます。

機密情報を記述する

  • 機密情報などは、config/credentials.yml.enc に記述し、これをpushしてチーム内で共有します。
  • ただ、config/credentials.yml.enc は暗号化されているため、エディタで開くことはできても、何が書いてあるかさっぱりわからないのでそのまま編集することはできません(だからpushしても安全なのですが)。
  • そんな config/credentials.yml.enc を編集するためには、以下のコマンドを使います。
$ EDITOR="vi" bin/rails credentials:edit
  • このコマンドを打つことで以下のようにエディタが開くので、機密情報を入力して :wq で保存します。
  • 入力例として aws: がすでに記述されていますので、これを参考にして同じようなインデント構成で打ちます。
# aws:
#   access_key_id: 123
#   secret_access_key: 345

# ここから
gmail:
  mail_address: xxxxx@gmail.com
  app_password: aaaabbbbccccdddd
# ここまで

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: *******************************************************************************

機密情報を参照させる

  • 上記で設定した機密情報をソース内で参照させるようにするには、以下のように記述します。
config/environments/development.rb
Rails.application.configure do

  #...(中略)...

  # コメントアウトすることでdevelop環境からもメールを送信する設定になる
  # config.action_mailer.raise_delivery_errors = false

  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
      :enable_starttls_auto => true,
      :address => 'smtp.gmail.com',
      :port => 587,
      :domain => 'gmail.com',
      :authentication => :plain,
      # メールアドレス(参照している)
      :user_name => Rails.application.credentials.gmail[:mail_address],
      # アプリパスワード(参照している)
      :password => Rails.application.credentials.gmail[:app_password]
  }
end

これでハードコーディングを避けることができました。実装自体はとても簡単ですね。

復号化について

  • コマンドを打って機密情報を編集したり、ソース内で参照することができたりするのは、内部で config/credentials.yml.enc を復号化しているからです。復号化に必要な鍵が /config/master.key です。
  • つまり、各々のローカル環境に同じ /config/master.key を持つようにする(もちろんGitHubなどを使わずに、ですが)ことで、チーム全員が機密情報を編集することができるようになります。

鍵をバージョン管理外にする

  • Rails 5.2 からは、以下のように .gitignore にあらかじめ /config/master.key をバージョン管理外にする設定が記述されています。
  • それ以前のバージョンからアップデートした場合は、.gitignore への手動記述が必要です。
.gitignore
# Ignore master key for decrypting credentials and more.
/config/master.key

鍵の内容を環境変数に設定する

  • /config/master.key を共有できない場合は、環境変数 RAILS_MASTER_KEY/config/master.key の内容を設定することで、同じように復号化できるようになります。
  • 本番環境や検証環境のサーバ内では/config/master.key を持たずに環境変数を設定することになるのかなと思います。
  • 本番環境にて、/config/master.key の内容を設定していない場合に、サーバ起動をできなくする設定があります。config/environments/production.rb に一行記述するだけです。推奨されている設定とのことなので、ぜひやっておきましょう。
  • あらかじめコメントアウトされた状態で記述されているバージョンもありますので、その場合はコメントアウトを外すだけでOKです。
config/environments/production.rb
  # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
  # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
  config.require_master_key = true # コメントアウトをはずす

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away