DoS攻撃を受けた場合にアクセス元を抽出する
前回の記事の補足になりますが、DoS攻撃を受けてWebサーバーが高負荷になった場合の対応の説明です。この場合、アクセスログやnetstatから怪しいIPアドレスを割り出して、そのIPからのアクセスをfirewall等で遮断することになると思います。
前回の記事の「(2)-(a) アクセス内容の吟味」で「不正なリクエストが多いのならアクセスを遮断」と書きましたが、単一のIPや少数のサブネットからのアクセスからの大量アクセスならブロック対象も比較的簡単に割り出せます。一方、DDoS攻撃のように大量のIPアドレスからアクセスをされると、ブロック対象のIPアドレス群を洗い出すのには手間がかかります。
こういう時は、私は自作の簡易ツールを使って、どのネットワークからのアクセスが多いか調べるようにしています。このツールを以下にアップしました。
https://github.com/kztomita/top-netblock
このツールはtopnetblock.pyに標準入力からIPv4アドレスのリストを渡すと、自動でwhois検索を行い、CIDR、ネットワーク名を抽出して出現回数をカウントして出力します。IPアドレスを分散してアクセスしてきても、大量のアクセスがあれば出現回数が突出しているネットワークが見つかるはずです。
使用例
python3 topnetblock.py < iplist.txt
Apache/NginxのアクセスログからIPアドレスのリスト(iplist.txt)を作成するには、以下のようにして作成できます。通常、アクセスログはかなり大きいので、ログファイルから調べたい時間帯の部分を抜き出してから処理した方がよいでしょう。
awk '{print $1}' access_log > iplist.txt
こちらはnetstatから現在接続中のクライアントのIPアドレス一覧を取得する例です。「接続中」と書きましたが、TIME_WAIT状態の接続も取得しています。直近の接続も取れた方が調査対象のデータも増えるのでこの方がいいでしょう。
netstat -tn | tail -n+3 | awk '{print $5}' | sed 's/:.*$//' > iplist.txt
実行結果は以下のようになります。
topnetblock.py実行例
Founded netblocks 172.106.0.0/15: 21 104.149.0.0/16: 9 23.228.192.0/18: 6 <略> Founded netnames PSYCHZ-NETWORKS: 48 VPLSNET: 7 APNIC-27: 6 <略>
アクセス数が多いネットワーク(netblocks)から順番に調べていき、Bot等の通常のアクセスでないものなら、ネットワークからのアクセスをブロックできないか検討します。国内向けのサイトなのに海外のネットワークからアクセスが来ているようならブロックしてしまっても問題ないことがほとんどだと思います。
投稿日:2019/03/25 00:40
タグ: Server