2015-09-15 13 views
43

私のウェブサイトは先週、サービス拒否攻撃を受けています。この攻撃は、ループ内でランダムに生成された無効なAPIキーを使用してWeb APIに当たっています。ウェブAPIのハック/ DOS攻撃を停止する方法

鍵を推測しようとしているか(64ビット鍵として数学的に不可能)、DOS攻撃をしようとしているのかどうかはわかりません。攻撃は分散しているので、何百ものクライアントからIPアドレスのすべてを禁止することはできません。

私の推測によると、IPによるAndroidアプリであるため、Androidアプリにマルウェアがあり、すべてのインストールを使用して自分のサーバーを攻撃しているようです。

サーバはTomcat/Javaです。現在のところ、Web APIは無効な鍵に400回しか応答せず、いくつかの無効な鍵の試行を行ったIPをキャッシュしますが、それぞれの不正な要求に対して何らかの処理を行う必要があります。

攻撃を停止する方法を教えてください。 HTTPヘッダーからのリクエストを行うAndroidアプリを特定する方法はありますか?

+1

HTTPヘッダーとは –

+0

ヘッダーにIPがあり、エージェント文字列がヌルです – James

+0

「64ビット鍵として数学的に不可能です」ウット? ** a)**メッセージよりも短いキーを持つ暗号化システムはありません。攻撃者が隠れた情報(最悪の場合、全体の平文)を取得することを防ぐことができます。ここには「不可能」はありません。 ** b)** 2015年の64ビット鍵(DES?)はあまりありません。私はむしろそれが弱いと言うだろう。 – deviantfan

答えて

36

防止ブルートフォース攻撃:

あり、あなたがこれを行うために利用できるツールや戦略の広大な配列があり、かつ、使用するサーバーの実装と要件に完全に依存。

ファイアウォール、IDS、またはその他のネットワーク制御ツールを使用しないと、アプリケーションへのサービス拒否から実際にDDoSを停止することはできません。ただし、アプリケーションを修正して、ブルートフォース攻撃を大幅に難しくすることができます。

ロックアウトまたはプログレッシブ遅延を実装するのが標準的な方法です。ロックアウトにより、IPがN回ログインに失敗した場合に、IPがX分間ログイン要求を行うのを防ぎます。プログレッシブ遅延は、悪いログインリクエストを処理するために、より長い遅延と長い遅延を追加します。

ウェブアプリケーションの設定で<login-constraint>という要素を持つ認証システムを使用している場合は、Tomcat LockoutRealmを使用する必要があります。これにより、多くの不正なリクエストが発生した場合に簡単にロックアウトすることができます。

Tomcatの認証システムを使用していない場合は、より具体的な情報を得るために使用している情報についての詳細情報を投稿する必要があります。

最後に、APIキーの長さを単純に長くすることができます。 64ビットは探索するには巨大なキースペースのように見えるが、現代の基準によるそのアンダーウェイトだ。多くの要因は、あなたが期待するよりも、それははるかに少ない安全な作りに貢献することができます:あなたは場所に何の保護を持っていない場合は

  • ボットネット(またはその他の大規模なネットワークでは)、毎秒数十の試みの何千ものを作ることができます。
  • キーの生成方法とエントロピーの収集方法によっては、 事実上のキースペースがかなり小さくなる可能性があります。
  • 有効なキーの数が増えるにつれて、少なくとも理論的には が有効な数字を見つけようとするキーの数が急激に減少します( )。

APIキーの長さを128(または256、または512)にすることはあまり費用がかからず、あらゆるブルートフォース攻撃の検索スペース(したがって難易度)を大幅に上げます。

問題を緩和する要素DDOS攻撃:DDOS攻撃を軽減するために

は、しかし、あなたはもう少し取材を行う必要があります。 DDoS攻撃は防御するためにハードであり、あなたのサーバがオンになっているネットワークを制御していなければ特に困難です。言われていること

は、あなたが行うことができますいくつかのサーバー側のものがあります。

  • ウェブアプリケーションファイアウォールのインストールと設定、mod_securityのように、あなたが定義したルールに違反する着信接続を拒否すること。説明するように、あなた自身のTomcat Valve作成DDOS攻撃が発生しているときを検出し、それが
  • 別の優れたオプションの@Martin Muller's postを参照してください軽減するための最初のステップを取る、fail2ban
  • し、SnortのようなIDSシステムを、セットアップ
  • hereは、到着したリクエストを最後の防衛線として、User-Agents(または他の基準)で拒否します。

しかし、最終的にはDDOS攻撃を無料で止めることができます。サーバーのメモリは非常に多く、CPUサイクルは非常に多く、ネットワーク帯域幅は非常に大きい。十分な着信接続では、最も効率的なファイアウォールでも、あなたがダウンしてしまうことはありません。帯域幅の広いインターネット接続やサーバーを増やしたり、アプリケーションをAmazon Web Servicesに配備したり、多くのコンシューマーおよびエンタープライズDDoS軽減製品(@SDude has some excellent recommendations in his post)を購入した場合は、DDOS攻撃を軽減することができます。これらのオプションはどれも安く、速く、または簡単ではありませんが、利用可能なオプションです。

ボトムライン:あなたはDDOSを軽減するために、アプリケーションのコードに依存している場合DDOS攻撃が深刻である場合

は、すでに

+0

ありがとう、私は、より多くのサーバー時間が要求を拒否するだけで応答スレッドをスリープ状態に費やされるかどうかは不明なIPへの応答を遅らせることを考えました。たぶん要求を拒否するのはサーバーのリソースを最小限に抑えるだけかもしれませんが、ハッカーからの要求は20,000件に増えています。少なくともリクエストに答える方法はないので、クライアントは少なくともしばらくはハングアップしていますか? – James

+0

絶対に。 HTTPは、応答を得るまで誰かが相手にいるかどうかを知る方法がありません。応答しない場合、クライアントはタイムアウトが経過するまで待つだけです。しかし、全体的には、特にネットワークを制御できない場合、DDOS攻撃は防御するのが難しいです。私は強く、適切に設定されたファイアウォールのように、あなたのアプリにDDoS対策テクニックを焼き付けようとするよりも低いレベルのソリューションを使うことを強くお勧めします。彼らがあなたのアプリに接続していて、少量のリソースしか使用していなければ、彼らは勝っています。 –

+0

@Jamesの場合、1つの低レベルメソッドは、ヌルのuser-agentで要求を拒否するTomcat 'Valve 'を書くことです。 [このスレッド](http://www.tomcatexpert.com/ask-the-experts/useragentvalve)には、これを行う方法に関する良い情報があります。 –

2

を失ってしまった、アプリケーションレベルのチェックがで動作しません。すべて。 D-DOSクライアントは帯域幅全体を消費し、アプリケーションレベルのチェックは実行されません。実際にあなたのWebサービスはまったく動かない。

深刻なD-DOS攻撃からアプリケーションを保護する必要がある場合は、お金を払ってサードパーティ製のツールに頼る以外の方法はありません。 Neustar

あなたのウェブサイトでD-DOS攻撃が軽度である場合は、アプリケーションレベルのチェックを実装することができます。 D-DOS攻撃にもっと洞察についてRestrict calls from single IP

<Directory /home/*/public_html> -- You can change this location 
    MaxConnPerIP 1 
    OnlyIPLimit audio/mpeg video 
</Directory> 

に引用されたとして例えば、コンフィギュレーションの下Wiki linkを訪問し、単一のIPからの接続の最大数を制限します。ファイアウォール、スイッチ、ルータ、IPアドレスベースの予防、D-DOSベースの防御

し、最終的に

クリーンパイプ(すべてのトラフィックが通過している:それは、予防&応答ツールのリストを提供します"悪い"トラフィック(DDoS攻撃や他の一般的なインターネット攻撃)を分離し、サーバーの向こう側に良いトラフィックだけを送信する、プロキシ、トンネル、または直接回路などのさまざまな方法を介して "クリーニングセンター"または "スクラビングセンター")

クリーンパイプの12の販売店を見つけることができます。

+0

ありがとう、これに来ていない、私はそれを買う余裕があるかどうか疑う。 – James

+0

この場合、IPベースの予防策、ファイアウォールなどを利用できます。 –

3

最善の方法は、失敗したIPアドレスが完全に3回になると、サービスへのアクセスを完全に防止することです。 Tomcatがこのユーザーのスレッドを開始する前に攻撃者がブロックされるので、これはサーバーからの負荷の大半を占めます。

これを達成するための最良のツールの1つは、fail2ban(http://www.fail2ban.org)です。すべての主要なLinuxディストリビューションでパッケージとして提供されています。

基本的に、失敗した試行をファイルに記録し、fail2ban用のカスタムフィルタを作成します。 Darryn van Tonderは、自分のブログで自分のフィルタを書く方法の良い例を持っています:https://darrynvt.wordpress.com/tag/custom-fail2ban-filters/

4

もしそれが十分であれば、それだけで止めることはできません。あなたはアプリケーションレベルで必要なすべての最適化を行うことができますが、あなたはまだダウンします。予防のためのアプリケーションレベルのセキュリティ(FSQの回答のような)に加えて、(あなたのビジネスについて真剣に考えている場合は)実績のあるソリューションをプロフェッショナルに任せておくべきです。私の助言は:

  1. CloudFlareまたはIncapsulaにお申し込みください。これは日々のものです。
  2. APIリクエストの第2段階としてAWS API gatewayを使用することを検討してください。 APIのフィルタリング、スロットル、セキュリティ、自動スケーリング、HAは、Amazonスケールにあります。 > CloudFlareの/ Incapsula - - > AWS APIゲートウェイ - >あなたのAPIサーバー

    0,02

    次に、あなたは(アマゾンや外)あなたのマシンに

インターネットを有効な要求を転送することができます

PS:私は「伝える」を識別し、(それを吸収する能力を提供する以外の)唯一の現実的な解決策は、攻撃をプロファイリングすることで、この質問が対象と高度に分散DOS攻撃についてSec

1

に属していると思いますし、そのトラフィックを低いリソースハンドラにルーティングします。

あなたの質問には、リクエストが無効であることが示されていますが、それを判断するにはコストがかかりすぎる可能性があります。要求はネットワークの特定のグループに由来し、おそらくはバーストで発生すると考えられます。

お客様のコメントでは、少なくとも1つの他のtell - the user agentがnullであることをお知らせしました。

追加のコンポーネントを追加せずに、接続をタピッティングすることで開始できます。プロファイルに一致するリクエストがあった場合は、キーを検証してからコードを2〜3秒間スリープ状態にします。これにより、これらのクライアントからの要求は、わずかなコストで削減されます。

もう1つの解決方法は、tellと一致するログ障害を使用し、ファイアウォールをリアルタイムで再構成して、しばらくの間、送信元アドレスからのすべてのパケットをドロップすることです。

いいえ、影響を受けるデバイスを手に入れることなくアプリを識別することはできません。

2

ここにいくつかのアイデアがあります。それに加えていくつかの戦略がありますが、これはあなたを始めさせるはずです。また、アマゾンは頻繁にddosされ、システムには、特にElasticロードバランシングを使用している場合は、これを使用する必要がある場合には、これらの攻撃からそれらを(したがってあなたが)強化するいくつかの発見的傾向がある傾向にあります。

  • CDNを使用する - 多くの場合、ddosを検出して防御する方法があります。アカマイ、習得、またはアマゾン独自のクラウドフロント。
  • iptablesを使って攻撃的なipsをブラックリストに載せます。あなたがない限り、あなたはこの周りの持っているより多くのツールは、より速くあなたがブロークすることができます/自動的に1〜2メガバイト以上(たとえば大きい非常に大きい要求を拒否リクエスト

  • の多数を防ぐために

  • 使用スロットリングのメカニズムのブロックを解除しますあなたのアプリケーションに到着する前に写真アップロードサービスなどがあります。

  • システム内の他のコンポーネントへの接続の総数に制限を設けてカスケード接続の失敗を防止します。たとえば、数千の接続を開いてデータベースサーバーを過負荷にしないでください。

関連する問題