今回はログの秘匿情報をフィルタリングすることができるRailsの機能「filter_parameter_logging」を使ってみたので紹介したいと思います。セキュリティ対策ではログ周りにも注意しなければなりませんが、見落としがちな部分でもあるため自身の備忘録としてもまとめています。
filter_parameter_loggingとは
filter_parameter_loggingとは、ログに表示される秘匿情報にフィルタリングをかけることができるRailsの機能です。filter_parameter_logging.rbはconfig/initializers配下に置かれています。
# Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += [:password]
filter_parameter_loggingを使ってみる
新規プロジェクトの作成
% rails new filter_parameter_logging -d mysql
% rails db:create
- Ruby: 2.6.5
- Rails: 6.0.4.8
- DB: MySQL
Userモデルの作成
% rails g scaffold User name:string age:integer address:string
% rails db:migrate
- name: 名前
- age: 年齢
- address: 住所
初期データの作成
% rails c
> User.create(name: '田中', age: 10, address: '東京都江戸川区')
> User.create(name: '佐藤', age: 20, address: '東京都港区')
> User.create(name: '高橋', age: 30, address: '東京都大田区')
ログの閲覧
> User.all[0]
=> #<User id: 1, name: "田中", age: 10, address: "東京都江戸川区", created_at: "2022-05-01 03:35:35", updated_at: "2022-05-01 03:35:35">
> User.all
=> #<User id: 2, name: "佐藤", age: 20, address: "東京都港区", created_at: "2022-05-01 03:35:52", updated_at: "2022-05-01 03:35:52">
> User.all
=> #<User id: 3, name: "高橋", age: 30, address: "東京都大田区", created_at: "2022-05-01 03:36:08", updated_at: "2022-05-01 03:36:08">
ログを見ると、個人情報が丸見えの状態になっていますね。
ログをフィルタリング
filter_parameter_logging.rbを以下のように編集します。
今回は年齢(age)と住所(address)をフィルタリングしてみます。
# Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += [:password, :age, :address]
再度ログを見ると、年齢と住所がフィルタリングされているはずです。
> User.all[0]
=> #<User id: 1, name: "田中", age: [FILTERED], address: [FILTERED], created_at: "2022-05-01 03:35:35", updated_at: "2022-05-01 03:35:35">
> User.all
=> #<User id: 2, name: "佐藤", age: [FILTERED], address: [FILTERED], created_at: "2022-05-01 03:35:52", updated_at: "2022-05-01 03:35:52">
> User.all
=> #<User id: 3, name: "高橋", age: [FILTERED], address: [FILTERED], created_at: "2022-05-01 03:36:08", updated_at: "2022-05-01 03:36:08">
このようにfilter_parameter_logging.rbにカラムを追加することで、秘匿情報をフィルタリングすることが可能になります。
注意点
パラメータのフィルタリングは正規表現の部分一致によって行われるため、想定しないものまでフィルタリングされてしまう恐れがあります。
例えば、先ほどのUserモデルに名前のフリガナを保存する「name_kanaカラム」を追加し、nameカラムのみフィルタリングしたいとします。
% rails g migration AddNameKanaToUsers name_kana:string
% rails db:migrate
% rails c
> User.create(name: '丸山', name_kana: 'マルヤマ', age: 40, address: '東京都葛飾区')
# Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += [:name]
しかし、パラメータのフィルタリングは正規表現の部分一致によって行われるため、name_kanaの情報までフィルタリングされていることが分かります。
> User.last
=> #<User id: 5, name: [FILTERED], age: 40, address: "東京都葛飾区", created_at: "2022-05-01 04:29:41", updated_at: "2022-05-01 04:29:41", name_kana: [FILTERED]>
フィルタリングする際は、部分一致であることを意識して記述するようにしましょう。
まとめ
- filter_parameter_loggingとは、ログに表示される秘匿情報にフィルタリングをかけることができるRailsの機能
- デフォルトではpasswordのみがフィルタリングされている
- パラメータのフィルタリングは正規表現の部分一致によって行われる
参考
Railsガイド config-filter-parameters
今回はログの秘匿情報をフィルタリングすることができるRailsの機能「filter_parameter_logging」について紹介しました。セキュリティ対策ではログ部分が見落とされがちなため、今回を機にログ周りのセキュリティ対策を強化してみてはいかがでしょうか。