えいのうにっき

a-knowの日記です

nginx でアクセスログに記録される IP アドレスを匿名化する

「あ、アクセスログに記録されるIPアドレスを匿名化したいな......」と思うこと、ありますよね。私は昨日から思っています。ちょっと探してみました。

見つかったアプローチ

まず見つかったのが、GitHub - masonicboom/ipscrub: IP address anonymizer module for nginx という nginx のサードパーティモジュール。IPアドレスのハッシュ化をしてくれる様子。

github.com

そしてもう一つが↓のStackOverflowの投稿。

stackoverflow.com

この投稿でベストアンサーになっているものが、「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 にはできてなかったのだけど......)。ただ、エラーログについてはこれでは対処できないようなので、その出力は別途抑える必要があるみたい。いい方法ないかな。

蛇足

僕はどんなにしょうもないものでもどんどん形にして表に出したいと思っていて、そしてそれは僕だけじゃなくていろんな人にそうしてほしいなと思ってる。ただでさえ、「こんなもの表に出してもな......」とか感じてしまいがちな活動だと思うので、その心理的障壁になりそうなものはできるだけ排除したいと思っている。

ちゃんとしたサービス・事業の場合は、ちゃんと正面から向き合うべきだと思っているけど、そうでもないものはできるだけ簡単に対策できたい、という一心なので、より良い方法があればぜひ教えてください。