ホームページ >バックエンド開発 >PHPチュートリアル >Linuxサーバーはphpとcronと連携して攻撃者のIPを自動的にブロックします
最近忙しすぎて長い間何も書いていませんでしたが、毎日 Web ベンチを使って会社のサーバーを攻撃しているバカがいます
まず、攻撃に対する自動防御を共有しましょう。攻撃されたこの Web サイトの一般的な展開状況について説明します。この Web サイトは主に nginx+mysql+php であり、Web とデータベースをそれぞれホストしているオペレーティング システムです。ポート 80 は CentOS で、データベース サーバーはイントラネット上にあります。攻撃者の手口は実際には非常に簡単で、各リクエストが送信された後で、Web ベンチの Web サイト ストレス テスト ツールを使用してデータベースに大量のリクエストを送信します。はそれに応じて応答し、内容を読み取って最終的に表示します。その結果、データベースと Web の間で大量のデータ交換が発生し、さらに mysql が接続数の上限に達し、リクエストが拒否されました。さらに、攻撃者は時間があり、フローティング IP を変更し続けたので、ファイアウォールで IP アドレスをブロックしても意味がありません
最初に私がやったのは、PHP を使用して攻撃者のアドレスを取得することでした。エージェント ヘッダーを使用して Web ベンチへのアクセスであるかどうかを判断します。そうであれば、それを強制終了してデータベースへのリクエストを停止します。ただし、相手が頻繁にリクエストを送信するため、深刻な消費が発生します。他の方法を考える必要があるように思えましたが、最終的に、私は解決策を思いつき、実際のテストで実行可能であることがわかったので、それを全員に共有しました。 PHP を使用してユーザー エージェント ヘッダーを取得し、Web ベンチ ソースであるかどうかを判断します。その場合は、このファイルの内容が IP をブロックするためのルールを作成します。次に、chmod 関数を使用してファイルを変更します。このファイルは実行可能であり、cron を使用します。サービスはこのファイルを読み取って実行し、IP アドレスをブロックします。さらに、ブロックがブロックされると、不運であることを通知する電子メールが送信されます。
具体的な実装コードは次のとおりです:
IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') { $_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']); IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) { $p='/home/www/webbench.sh'; $_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow'; File_Put_Contents($p,"#!/bin/bash\niptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;\n",LOCK_EX); Chmod($p,0755); chown($p,'www'); Function sMail($to,$tit,$msg) { IF(Filter_var($to,FILTER_VALIDATE_EMAIL)==''){ throw new Exception('??地址??!'); } $tit='=?UTF-8?B?'.Base64_Encode($tit).'?='; $msg = str_replace("\n.","\n..",$msg); //Windows如果在一行开头发现一个句号则会被删掉,要避免此问题将单个句号替换成两个句号 Return Mail($to,$tit,$msg,'From:No-reply@adm.bossadm.com.tw'."\n".'Content-Type:text/html;charset=utf-8'); } sMail('see7di@gmail.com','【WebBench又?始了-by http://www.7di.net】!',date('Y-m-d H:i:s',time())." {$_SERVER['REMOTE_ADDR']}"); Header('Location:http://127.0.0.1'); Die(); }}
その後、もう一度実行して、メール部分をシェルファイルに入れました。上記のコードは次のように変更されます:
rrree