カクカクしかじか

技術的なアレコレ

Railsのログフィルター(filter_parameter_logging.rb)の活用法

filter_parameter_logging.rbって?

config/initializers 配下にあるRailsがデフォルトで提供している本番ログにセキュアな情報(パスワード等)が流れないようにする仕組みです。(Rails4系からあるのかな?)

実際の活用方法について

業務で使っていると仕様変更やその時の都合で実装を変えていかないといけない場面があると思います。
例えば、Userに関する情報をフロント側からサーバーサイドにPOSTするフォームで当初パラメーターの一つを info という名前で実装していましたが、 info というパラメータ名だと意味が広くなり過ぎます。そこで user_info というパラメーターに変更するとなった場合を仮定します。

例となるファイル

filter_parameter_logging.rb

Rails.application.config.filter_parameters += [
  :password,
  :info
]

やらないといけないこと

  • infoという名前を変える
  • 名前を変えても修正したものをデプロイしたリリース直後は両方のパラメーターをフィルターしたい

注意しないといけないこと

パラメーター名が info から user_info に変わったことで、この場合に info というフィルターを user_info に指定し直すことも出来ます。
しかし、フィルターするパラメータの名前を新しく info から user_info に変えて info の部分を消してしまうと、ユーザーが画面をリロードをしないで操作した場合に、パラメーターは info でPOSTされるので、個人情報がフィルターされないでPOSTされる事になります。

それを防ぐために以下のようなファイルの記載をします。 infouser_info 両方がフィルターされるように古いほうを残しておきます。

なお実際はリロードされてパラメーターが変更されないのはデプロイ直後なので、リリースから暫く経ってからは、 フィルターのパラメーター名の指定は :user_info だけで大丈夫です!

filter_parameter_logging.rb

Rails.application.config.filter_parameters += [
  :password,
  :info,
  :user_info
]

連番も正規表現で1つのフィルターだけで対応可能

filter_parameter_logging.rb でフィルターするパラメーター指定は下記の例のように正規表現で指定することも可能です。以下のようにすることで、address1address2 などの連番のパラメーターにも対応出来ます。

filter_parameter_logging.rb

Rails.application.config.filter_parameters += [
   :password,
   :info,
   :user_info,
  /\Aaddress\d?\Z/
]