「あ、アクセスログに記録されるIPアドレスを匿名化したいな......」と思うこと、ありますよね。私は昨日から思っています。ちょっと探してみました。
見つかったアプローチ
まず見つかったのが、GitHub - masonicboom/ipscrub: IP address anonymizer module for nginx という nginx のサードパーティモジュール。IPアドレスのハッシュ化をしてくれる様子。
そしてもう一つが↓のStackOverflowの投稿。
この投稿でベストアンサーになっているものが、「map
ディレクティブを使って、IPアドレスの末尾を強制的に 0
に置き換える」というもの。
map $remote_addr $ip_anonym1 { default 0.0.0; "~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip; "~(?P<ip>[^:]+:[^:]+):" $ip; } map $remote_addr $ip_anonym2 { default .0; "~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0; "~(?P<ip>[^:]+:[^:]+):" ::; } map $ip_anonym1$ip_anonym2 $ip_anonymized { default 0.0.0.0; "~(?P<ip>.*)" $ip; } log_format anonymized '$ip_anonymized - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; access_log /var/log/nginx/access.log anonymized;
なるほど!なんか手軽そうなのでこれをやってみる。
やってみた
Anonymize ip-addr by a-know · Pull Request #24 · a-know/yukizuri-provisioning · GitHub
StackOverflow では 0
に置き換えていたけど、よりわかりやすく x
に置き換えてみている。あと僕は普段からログをLTSV形式で出している。
これまで↓な感じで出力されていたのが......
local_time:25/May/2018:07:53:31 +0900 host:61.124.176.123 forwardedfor:- req:GET / HTTP/1.1 status:200 size:6329 referer:- ua:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36 reqtime:0.001 cache:- runtime:- vhost:hoge.com
こんな↓かんじに。
local_time:25/May/2018:07:59:22 +0900 host:61.124.176.x forwardedfor:- req:GET / HTTP/1.1 status:200 size:6329 referer:- ua:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36 reqtime:0.003 cache:- runtime:- vhost:hoge.com
この方法だとIPv6アドレスでも大丈夫なはず(もともとIPv6 ready にはできてなかったのだけど......)。ただ、エラーログについてはこれでは対処できないようなので、その出力は別途抑える必要があるみたい。いい方法ないかな。
蛇足
僕はどんなにしょうもないものでもどんどん形にして表に出したいと思っていて、そしてそれは僕だけじゃなくていろんな人にそうしてほしいなと思ってる。ただでさえ、「こんなもの表に出してもな......」とか感じてしまいがちな活動だと思うので、その心理的障壁になりそうなものはできるだけ排除したいと思っている。
ちゃんとしたサービス・事業の場合は、ちゃんと正面から向き合うべきだと思っているけど、そうでもないものはできるだけ簡単に対策できたい、という一心なので、より良い方法があればぜひ教えてください。