2013-05-18
_ Nginx でログに残したくないデータをマスキングする
HTTPリクエストのGETパラメータで,ログとしては残しておきたくない値を,マスキングしたくなったので調べてみた.やりたいことは Rails の config.filter_parameters のような,ログファイルにパラメータ情報を出力しないようにすること.
タイミングよく,NginxのForumで同じことを質問している人がいて,その回答が参考になった.このまま利用すると,log_format を location ディレクティブに書くことになり,起動時に警告されるので気持ち悪い.なので log_format は http ディレクティブに以下のように定義する.
log_format filter '$remote_addr - $remote_user [$time_local] "$filtered_request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
location ディレクティブ内では以下のように設定することで,警告も出ずに目的を達成することができた.
set $filtered_request $request; if ($filtered_request ~ (.*)token=[^&]*(.*)) { set $filtered_request $1token=[FILTERED]$2; } access_log /var/log/nginx/access.log filter;
この設定ではリクエストパラメータにtokenが指定されていた場合に,その値については[FILTERED]に置き換えられることになる.
xxx.xxx.xxx.xxx - - [17/May/2013:01:23:45 +0000] "GET /api/v0/hoge?token=[FILTERED]¶m1=xxx" 200 108 "-" "" ""