1. 問題
私自身のアプリはしばらくオンラインになっていましたが、ある日突然、オンライン製品が確認コードを送信できないことに気づきました。
サードパーティの SMS 確認コード サービス バックエンドにログインしたところ、問題が深刻であることがわかりました。
3 | ようびけん | 15797 | 2015-12-25 |
4 | ようびけん | 57 | 2015-12-23 |
5 | ようびけん | 49 | 2015-12-22 |
6 | ようびけん | 54 | 2015-12-21 |
7 | ようびけん | 64 | 2015-12-20 |
数日前、SMS サービスが実際に 15,000 件を超えるテキスト メッセージを送信し、サービス料金が直接なくなってしまったことを発見しました。
理由を知りたければ、Nignx のログを見るしかありません。
ログにSMSインターフェースへの大量のアクセスがあり、確認してみると相変わらずログが狂ったように追記されており、典型的なDDoS攻撃でした。もちろん、中心となる内容は SMS インターフェイスへの異常なアクセス数です
221.178.182.21 - - [05/Jan/2016:16:19:25 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.3; XM50h Build/19.1.1.C.1.2)" "-" 171.82.225.66 - - [05/Jan/2016:16:19:32 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.4; 2014812 MIUI/V6.6.3.0.KHJCNCF)" "-" 171.82.225.66 - - [05/Jan/2016:16:19:32 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.4; 2014812 MIUI/V6.6.3.0.KHJCNCF)" "-" 110.89.16.13 - - [05/Jan/2016:16:19:49 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-" 110.89.16.13 - - [05/Jan/2016:16:19:49 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-" 118.114.160.200 - - [05/Jan/2016:16:21:26 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-" 118.114.160.200 - - [05/Jan/2016:16:21:39 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-" 119.122.0.136 - - [05/Jan/2016:16:21:41 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-" 118.114.160.200 - - [05/Jan/2016:16:21:51 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-"。アクセス数が多すぎると、サーバーが正常にサービスを提供できず、崩壊の危機に瀕していると感じるでしょう。
2. 一時的な解決策
問題を解決する前に、最初に思い浮かぶのは、攻撃者がサービスにアクセスできないように SMS サービスを停止することですが、オンライン ユーザーがまだ使用しているため、サーバーをオフにすることはできません。 。
それでは、まず nginx を使用してこのインターフェースを書き換えます。
if ( $request_uri ~* "showType=smsAuthcode" ) { rewrite ^/ http://www.baidu.com/; }
まず、百度に謝罪し、攻撃リクエストを百度に転送しました。実際には、200 などの任意の値を返すだけです。
3. ログ分析に基づく解決策
もちろん、この問題は解決できず、オンライン ユーザーは新規ユーザーを登録できません。
私が最初に考えた解決策は、IP アクセスを制限することでした。ログを分析したところ、一部の IP は何千回も攻撃されており、もちろんアクセス数がわずかしかない IP もありました。何度かアクセスされた IP の場合、実際には、それが実際のユーザーの IP なのか、それとも攻撃マシンの IP なのかを判断する方法はありません。 インターネット上で、特定のインターフェイスで一定期間内の IP アクセス数を制限できるソリューションを見つけました。
iptables -A INPUT -p tcp --dport 80 -d xx.xx.xx.xx -m string --string "/myinterface?showType=smsAuthcode" --algo kmp -m recent --name httpuser --set iptables -A INPUT -m recent --update --name httpuser --seconds 86400 --hitcount 4 -j LOG --log-level 5 --log-prefix 'HTTP attack: ' iptables -A INPUT -m string --string "/myinterface?showType=smsAuthcode" --algo kmp -m recent --update --name httpuser --seconds 86400 --hitcount 10 -j REJECT
実際、これは一定の効果を持つ解決策でもあります
シリアル番号 | アカウント | 数量(アイテム) | 日付 |
---|---|---|---|
2 | youbiquan | 540 | 2016-01-08 |
3 | youbiquan | 2857 | 2016-01-04 |
4 | ようびけん | 3 88 | 2016-01- 05 |
5 | youbiquan | 2469 | 2016-01-06 |
ある日、途方に暮れていたところ、nginxのアクセスログを再度開いてみると、突然、攻撃動作のユーザーエージェントが非常に短く、他の訪問のユーザーエージェントとは明らかに異なっていることに気づきました。
攻撃者のユーザー年齢は「Mozila/5.0」のようですが、他の訪問ではシステムのバージョンやブラウザなどを含む詳細情報が表示されます。
この推測に従って、プログラムを使用してユーザーエージェントを分析したところ、確かに、SMS インターフェイスにアクセスした UA だけが短い「Mozila/5.0」を持っていましたが、他のアクセスには存在していました。その後、いくつかの短い UAs
Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-"が検索したところ、Dalvik が Android 仮想マシンであることがわかり、UA 防止に基づいて Mozila/5.0 と仮想マシンを完全にブロックできると感じました。
そこで、次のコードを nginx 設定に追加しました
if ($http_user_agent = "Mozilla/5.0") { return 503; } if ($http_user_agent ~* "Dalvik/1.6.0") { return 503; }
最初の段落は、Mozila/5.0 と厳密に一致するようにすることです。2 番目の段落は、Dalvik で始まる UA が仮想マシンの UA であることを意味します。
案の定、この予防方法を採用した後、効果はすぐに明らかでした。
2 | youbiquan | 57 | 2016-01-09 |
新しい方法によると、新しい予防策の後、送信されたテキストメッセージの数は直接以前の通常に戻りますレベル、自分で使ってください いくつかの携帯電話でテストしましたが、問題ありませんでした。
でも、あまり早く喜ぶ必要はないようです。DDOS を完全に解決したい場合は、より科学的かつ文化的な知識を学ぶ必要があります。
上記は、私が遭遇した DDOS 攻撃を賢く解決するための Nignx の使用方法を紹介したもので、PHP チュートリアルに興味のある友人に役立つことを願っています。