nginx で、訪問者に Cookie を食わせ識別子にして、アクセス制限を行う。IP 制限だけでは難しく、特定のユーザをダイレクトに弾きたい場合などに。
ngx_http_userid_module モジュールを使う
基本設定
トラッキングの設定
server {
userid on;
userid_name uid;
userid_domain yourdomain.com;
userid_path /;
userid_expires 30d;
}
uid や expires はお好みで。
アクセスログの設定
適当な箇所に $uid_set
$uid_got
を挿入する。この記述だけで、発行された識別子がアクセスログに記録されていく。どちらにも同じ書式の値が入るが、初回のアクセスには uid_set に、以降は uid_got に値が入る。
http {
log_format deflate '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'"$uid_set" "$uid_got"';
}
$uid_set
クッキー名と送信したクライアントの識別子$uid_got
クッキー名と受け取ったクライアントの識別子
ドキュメントによると、初回に発行した識別子を送信し (uid_setに投入) Cookie にセット、以降は Cookie から識別子を受信する (uid_gotに投入) 。
アクセスログの例
0.0.0.0 - - [00/Jan/0000:00:00:00 +0000] "GET /index.html HTTP/1.1" 200 100 "" "Mozilla/5.0" "-" "uid=XXXXXXXXXXXXXXXXXXXXXX"
"uid=XXXXXXXXXXXXXXXXXXXXXX"
が識別子である。なお、ブラウザのデベロッパーツールなどで付与されている Cookie を見ると、これとは異なる文字列が記述されている。
特定のキーを持っているユーザをdenyする
アクセスログなどからユーザの識別子が判明したら、後はそれを if や map などを用いて料理する。
server {
if ($uid_got = "uid=XXXXXXXXXX") {
return 403;
}
}
補足
同じブラウザを使っていれば(同じ Cookie を持っていれば) IP アドレスが変化しても追うことができる。 Cookie なのでブラウザを切り替えたり Cookie を削除されると ID は変わってしまうが、ユーザの行動次第で追跡もしやすくなる。