[解決済み] 分散ブルートフォースへの最適な対策は?
質問
まず、背景を少し説明します。私がCodeIgniterに認証システムを実装していることは周知の事実で、今のところ私は(いわば)勝利を収めています。しかし、私はかなり非自明な課題(ほとんどの認証ライブラリが完全に見逃しているものですが、私はそれを適切に処理することにこだわります)にぶつかりました:どのようにインテリジェントに 大規模、分散、可変ユーザー名ブルートフォース攻撃 .
いつものトリックをすべて知っています。
- IP/ホストごとの失敗した試行回数を制限する と犯罪者のアクセスを拒否する (例: Fail2Ban) - これはもう機能しない ボットネットがより賢くなったため
- 上記を組み合わせて ブラックリストと組み合わせることで、既知の「悪い」IP/ホスト (例: DenyHosts) - これはボットネットが #1 に引っかかることを当てにしています。 に該当するボットネットに依存するもので、ますますそうではなくなってきています。
- IP/ホストホワイトリスト 従来の認証との組み合わせ (悲しいかな、動的な IP ユーザーと、ほとんどの Web サイトの高い解約率では役に立ちません)
- を設定する。 サイト全体の制限 を設定し、その後何分間/何時間かの間、すべてのログイン試行をスロットリング (停止) します (DoS 攻撃がボットネットの子供の遊びになってしまうという問題があります)。
- 必須 デジタル署名 (公開鍵証明書) または RSA ハードウェア トークンを、ログイン/パスワード オプションなしですべてのユーザーに提供すること (間違いなく強固なソリューションですが、閉鎖的で専用サービスの場合にのみ実用的です)。
- 強制 超強力なパスワード スキーム (例: >25 nonsense characters with symbols - again, too impractical for casual users)
- そして最後に CAPTCHAs (ほとんどの場合うまくいくかもしれませんが、ユーザーにとっては迷惑なもので、また は事実上無意味です。 に対して 決意のある、機知に富んだ攻撃者 )
さて、これらは理論的に実行可能なアイデアにすぎません。以下のようなものがあります。 たくさん には、(例えば些細な DoS 攻撃に対して) サイトを大きく開放してしまうような、くだらないアイデアがたくさんあります。私が欲しいのは、より良いものです。そして、より良いものというのは、つまり
-
DoS 攻撃やブルートフォース攻撃に対して安全 (+) でなければならず、また、少しばかり狡猾なボットがレーダーの下で活動を続けることを可能にするような新しい脆弱性を導入してはならない。
-
自動化されていなければなりません。各ログインを確認したり、疑わしい活動を監視したりするために人間のオペレーターが必要な場合、現実のシナリオではうまくいきません。
-
主流の Web 用途として実現可能でなければならない (すなわち、高い解約率、高いボリューム、および非プログラマが実行できるオープンな登録)
-
カジュアルなユーザーがイライラしたり不満を感じたりするほど、ユーザー エクスペリエンスを阻害してはならない(そして潜在的にサイトを放棄する)。
-
子猫が登場することはできません。 本当に本当に安全で 子猫
(+) 安全」というのは、少なくとも偏執狂的なユーザーが自分のパスワードを秘密にしておくのと同じくらい安全であるという意味です。
では - 聞かせてください! あなたならどうする? ? 私が言及していないベストプラクティスをご存知でしょうか(ああ、あると言ってください)?私は自分自身のアイデア (3 と 4 のアイデアを組み合わせたもの) を持っていることを認めますが、自分を困らせる前に真の専門家に話してもらうことにします ;-)
どのように解決するのですか?
元の投稿にある 3 と 4 の方法を組み合わせて、一種の「ファジー」または動的なホワイトリストにし、そして - これがトリックです -。 ホワイトリストに載っていない IP をブロックせず、地獄に落ちるまでスロットリングすること .
なお、このメジャーは だけ この非常に特殊なタイプの攻撃を阻止するためのものであることに注意してください。実際には、もちろん、認証に対する他のベストプラクティスのアプローチと組み合わせて機能します。固定ユーザー名スロットリング、IPごとのスロットリング、コードによる強力なパスワードポリシー、スロットルなしのクッキーログイン、保存前にすべてのパスワード同等物のハッシュ化、セキュリティ質問を使用しない、などです。
攻撃シナリオの想定
攻撃者が可変のユーザー名をターゲットにしている場合、私たちのユーザー名による絞り込みは機能しません。攻撃者がボットネットを使用しているか、大規模な IP 範囲にアクセスしている場合、私たちの IP スロットリングは無力になります。攻撃者がユーザーリストを事前に入手している場合(通常、オープンな登録制のウェブサービスでは可能)、「ユーザーが見つかりません」というエラーの数に基づいて進行中の攻撃を検出することはできません。また、システム全体 (すべてのユーザー名、すべての IP) を制限するスロットルを強制する場合、そのような攻撃は、攻撃の期間とスロットル期間中、サイト全体を DoS してしまいます。
ですから、私たちは何か他のことをする必要があるのです。
対策の第一弾:ホワイトリスト化
私たちがかなり確信できることは、攻撃者は、私たちの数千人のユーザー (+) の IP アドレスを検出し、動的に偽装することはできないということです。そのため ホワイトリスト が実現可能なのです。言い換えると、各ユーザーについて、そのユーザーが以前 (最近) ログインした (ハッシュ化された) IP のリストを保存します。
したがって、ホワイトリスト方式は、ロックされた「フロントドア」として機能し、ユーザーはログインするために、認識された「良い」IP の 1 つから接続されなければなりません。この「正面玄関」に対するブルート フォース攻撃は、事実上不可能です (+)。
(+) 攻撃者がサーバー、すべてのユーザーのボックス、または接続自体を「所有」していない限り、そのようなケースでは、もはや「認証」の問題ではなく、本物のフランチャイズ規模のプラグの破損の状況が発生します。
対策の第 2 部: システム全体のスロットリング 認識されないIPの
ユーザーが頻繁にコンピュータを切り替えたり、動的なIPアドレスから接続するようなオープン登録のWebサービスでホワイトリストを機能させるためには、認識されていないIPから接続するユーザーに対して「猫のドア」を開いておく必要があります。ボットネットが立ち往生し、正当なユーザーが迷惑を被るようなドアを設計することがコツです。 を可能な限り少なくすることです。 .
私のスキームでは、これを実現するために 非常に
を設定し (サービスの種類によっては、これより短い期間や長い期間を使用する方が賢明かもしれません)、その制限を解除することです。 グローバル とし、その制限を、すなわち、すべてのユーザーアカウントに対して行うようにします。遅い (試行間隔が 1~2 分の) ブルートフォースでさえ、この方法を使えば素早く効果的に検出され、阻止されるでしょう。もちろん 本当に遅い しかし、あまりに遅い速度では、ブルートフォース攻撃の目的そのものが達成されません。
私がこのスロットリング機構で達成したいことは、最大制限に達した場合、「猫のドア」はしばらくの間閉じられますが、通常の手段で接続する正当なユーザーに対しては玄関が開いたままであるということです。
- 認識されている IP の 1 つから接続する。
- または、(どこからでも)永続的なログイン クッキーを使用する。
攻撃を受けている間 (つまりスロットリングが有効な間)、影響を受ける唯一の正当なユーザーは、未知の場所または動的 IP でログインしている、持続的ログイン Cookie を持たないユーザーでしょう。これらのユーザーは、スロットリングが切れるまでログインできません (攻撃者がスロットリングにもかかわらずボットネットを実行し続けた場合、しばらく時間がかかる可能性があります)。
この小さなサブセットのユーザーが、ボットがまだドアを叩いている間でも、密閉されたドアを通り抜けることができるように、私は CAPTCHA を備えた「バックアップ」ログイン フォームを使用します。そうすれば、「申し訳ありませんが、現在このIPアドレスからはログインできません」というメッセージを表示したときに、「ログイン」というリンクが含まれるようになります。 セキュアバックアップログイン - HUMANS ONLY ( ボット: 嘘をつかない ) ということです。冗談はさておき、彼らがそのリンクをクリックしたら、サイト全体のスロットリングをバイパスするreCAPTCHA認証のログインフォームを与えましょう。そうすれば、もし彼らが人間で、正しいログインとパスワードを知っていれば(そしてCAPTCHAを読むことができれば)、次のようになります。 決して たとえ未知のホストから接続し、自動ログイン Cookie を使用していなくても、サービスが拒否されることがあります。
私はCAPTCHAを一般的に悪だと考えているので、「バックアップ」ログインオプションは次のようになります。 のみです。 が表示されます。 スロットリングが有効な間 .
そのような持続的な攻撃が DoS 攻撃の一形態であることは否定しませんが、説明されているシステムを導入すると、ごく一部のユーザー、つまり、quot; remember me" クッキーを使用しない人、攻撃が行われているときにたまたまログインしている人、いつもの IP からログインしていない人、CAPTCHA を読むことのできない人にのみ影響が及ぶと思われます。これらの基準すべてに「いいえ」と言える人だけが、特にボットや 本当に運が悪い 障害者)だけが、ボット攻撃から逃れることができるのです。
<ブロッククオートEDITです。 バックアップのCAPTCHAログインの代わりに、またはその補足として、1回しか使えないユーザー固有のロックダウンコードをメールに送信するオプションをユーザーに提供し、それを使ってスロットリングを回避することができるようにするのです。これは間違いなく私の「迷惑」の閾値を超えますが、これは単に 最後の手段 としてのみ使用され、アカウントからロックアウトされるよりはまだましなので、許容範囲でしょう。
(また、以下のことに注意してください。 なし は、攻撃がここで説明した厄介な分散型バージョンよりも洗練されていない場合に発生します。もし攻撃が少数の IP から来るか、少数のユーザ名を襲うだけなら、もっと早く阻止されるでしょうし、また、を使用しても阻止されるでしょう。 いいえ サイト全体の結果)
これが健全で、私が見逃しているもっと簡単なソリューションがないことを確信したら、私の認証ライブラリに実装する予定です。実際、セキュリティには間違ったことをする微妙な方法がたくさんあり、私は間違った仮定や絶望的なほど欠陥のある論理を作ることに抵抗がないのです。ですから、あらゆるフィードバック、批評、改善、微妙な点など、非常に高く評価されます。
関連
-
[解決済み】攻撃者はinspect要素を有害に使用することができるか?
-
[解決済み] セキュリティ透過的な方法Xによるセキュリティクリティカルな方法Yへのアクセスの試みは失敗しました。
-
[解決済み] System.Web.Security がアセンブリに存在しない
-
GTA3 オートフルブラッド C++
-
[解決済み] HTTPSヘッダーは暗号化されていますか?
-
[解決済み] ハッシュ化アルゴリズムと暗号化アルゴリズムの根本的な違い
-
[解決済み] HTTP基本認証で使用されるBase64エンコーディングの目的、理由を教えてください。
-
[解決済み] チェックボックスリキャプチャの仕組みと使い方を教えてください。
-
[解決済み] Google Authenticatorが公共サービスとして利用可能に?
-
[解決済み] APIキーとシークレットキーはどのように機能するのですか?APIキーやシークレットキーを他のアプリケーションに渡すのは安全ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] セキュリティ透過的な方法Xによるセキュリティクリティカルな方法Yへのアクセスの試みは失敗しました。
-
[解決済み] 正規のコードに0x90(NOP)シーケンスが含まれる場合
-
[解決済み] フォーム型Webサイト認証の決定版【終了しました
-
[解決済み] スクリプターによるウェブサイト叩きを阻止する
-
[解決済み] HTTPS(HTTP + SSL)において、クエリストリングパラメーターは安全ですか? [重複している]。
-
[解決済み] CodeIgniterの認証ライブラリはどのように選べばよいのでしょうか?[クローズド]
-
[解決済み] 認証とセッション管理に関するSPAのベストプラクティス
-
[解決済み] reCaptchaはクラックされましたか?[クローズド]
-
[解決済み] HTTP基本認証で使用されるBase64エンコーディングの目的、理由を教えてください。
-
[解決済み] JWTはlocalStorageとcookieのどちらに保存するべきか?重複