LoginSignup
5
0

More than 1 year has passed since last update.

NginxでTorのIPをブロックする

Last updated at Posted at 2022-12-16

Wordpressサイトでやたらユーザー登録される。
名前やメールアドレスはめちゃくちゃ、アクセス元のIPも国もバラバラ。
何だこいつは?

と思ってIPを調べてみたところ、Torからのアクセスだと発覚したことがありました。
何が目的かは分からないですが、謎の会員が増えていくのは気持ち悪い、、、

ということで、とりあえずnginxでブロックすることにしました。
もっと上手いやり方があるのかもしれませんが、シェルスクリプトでサクッと対応したことについて書いていきます。
(AWSの機能でもできるのかな?)

※注意
「Torはヤバいからブロック推奨」という趣旨ではありません。
上記のように悪意を持って(もしくはただの悪戯で)Torを利用している人もいるので、
それに対抗するための技術を紹介するだけのものです。
Tor自体は悪くない。ネットの匿名性は大事。

環境

  • 初代Amazon Linux(早く最新のOSに入れ替えたい)
  • SysVinit(Systemdではないので、/etc/init.d/xxxx で操作します)

やりたいこと

  • Torの大量のIPを一個一個設定してられないので、IPのリストを全部取得して一括拒否したい。
  • TorのIPリストは定期的に変わるので、nginxの設定ファイルも定期的に更新したい。
  • その更新は自動でやって欲しい。
  • 更新がなんかうまくいかなかった時はSlackにメッセージ飛ばして欲しい。

実装

/opt/deny-tor-ip.sh
#!/bin/bash

TMPFILE="/tmp/deny-tor-ip.tmp"
rm -f ${TMPFILE}

TOR_EXIT_NODE_LIST_URL=https://raw.githubusercontent.com/SecOps-Institute/Tor-IP-Addresses/master/tor-exit-nodes.lst
CONFIG_FILE=$1

curl ${TOR_EXIT_NODE_LIST_URL} | sed -e 's/^/deny /g' -e 's/$/;/g' > ${CONFIG_FILE}

/usr/sbin/nginx -t 2> ${TMPFILE}
if [ $? == 0 ]; then
	/etc/init.d/nginx reload
else
	WEBMESSAGE="Nginx test failed. Check ${TMPFILE} at ${HOSTNAME}"
	curl -s -S -X POST --data-urlencode "payload={\"text\": \"${WEBMESSAGE}\" }" ${DENY_TOR_IP_WEBHOOKURL} >/dev/null
fi

一応ざっくり説明しておきます↓

  • TMPFILE: nginxの設定をテストした結果を保存しておくファイル。テストが失敗してしまった場合にはこのファイルを見て原因を確認する。置き場所とかファイル名はご自由に。
  • TOR_EXIT_NODE_LIST_URL: Torの出口ノードのIPリストを1時間ごとに更新してリスト化してくれるありがたいURL
  • CONFIG_FILE: IP拒否設定を記述するための、Nginxのconfigファイルのフルパス。サーバごとに設定ファイル名が変わるかもしれないので引数で渡すことにします。
  • そんでもって、/usr/sbin/nginx -tで設定を確認します。問題がなければ0が返ってくるので、nginxをリロードします。
  • もし「nginxの設定がおかしいよ」という場合は、Slackにメッセージを飛ばします。SlackにWebhookURLを設定する方法は割愛。DENY_TOR_IP_WEBHOOKURLは環境変数で渡すことにします。

  • 「まあどこのサーバでも同じ名前でいいだろ」というTMPFILEはスクリプト内で設定。
  • 「サーバによってはファイル名変えるかも」と思われるCONFIG_FILEは引数で渡す。
  • 「サーバによって変えるけど、引数で渡すと長くてcronが読みにくくなるわ」と予想されるDENY_TOR_IP_WEBHOOKURLは環境変数で渡す。

という方針にしています。

設置

さて、スクリプトが用意できたのでcrontabで以下のような設定をします。
crontabを設定するユーザーに対しては、上記のスクリプトやnginxを実行できる権限を与えてあげてください。

DENY_TOR_IP_WEBHOOKURL=XXXXXXX
00 01 * * * cd /opt/deny-tor-ip; ./deny-tor-ip.sh /etc/nginx/conf.d/XXXXX.conf > /dev/null 2>&1

IPリスト自体は1時間おきに更新されていますが、Nginxの設定としては1日1回の更新でも十分でしょう。
設定反映後、Torブラウザからアクセスして403になれば完了です。

なお、
「Amazon LinuxじゃなくてUbuntuです」
「SysVinitじゃなくてSystemdのシステムです」
という方については、スクリプトの/usr/sbin/nginx -tとか/etc/init.d/nginx reloadあたりをご自身の環境に合わせて調整してみてください。
たぶん同じように動きます。

以上です。

参考文献

出口ノードのIPリストを取得させていただいたGitHubアカウント

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0