ログイン画面がインターネット上に公開されている以上、そこには自動化された総当たり攻撃、いわゆるブルートフォース攻撃が日常的に飛んできます。人間が一つずつ試すわけではなく、プログラムが1秒間に何百回もログインを試行します。
この記事では、ブルートフォース攻撃の仕組みと、実務での基本的な対策を整理します。
セキュリティ対策を横断的に確認したい方は、 Webアプリの脆弱性・セキュリティ対策まとめ もご覧ください。
ブルートフォース攻撃(総当たり攻撃)とは、考えられるパスワードの組み合わせを片っ端から自動的に試し続ける攻撃です。
似た手法に「辞書攻撃」(よく使われるパスワードのリストを順に試す)や「パスワードスプレー」(1つのパスワードを多数のアカウントに対して試す)がありますが、いずれも「制限なく何度でも試行できる」ことを前提にしている点は共通しています。
つまり対策の本質は、「何度でも試行できる」状態そのものを無くすことにあります。
実際に手を動かして確かめてみましょう。以下のデモは実際の通信を一切発生させません。ボタンを連打して、自動化された攻撃を疑似体験してください。
実際の通信は発生しません。ボタンを連打して、自動化された総当たり攻撃を疑似体験してください。
ボタンを押すと、実行結果がここに表示されます。
「対策なし」の状態では、何回失敗してもボタンを押し続けられたはずです。実際の攻撃はこれをプログラムで自動化するため、事実上無制限に試行され続けます。「対策あり」に切り替えると、一定回数失敗した時点でアカウントがロックされ、それ以上の試行そのものができなくなります。
実務で使われる主な対策は、次の3つです。
アカウントロックは効果が高い一方で、悪用すると「他人のアカウントを狙ってわざと連続失敗させ、正規の利用者をロックアウトする」という嫌がらせ(DoS的な悪用)が成立してしまう副作用もあります。実務では、ロック時間を段階的に伸ばす、IPアドレスも合わせて見る、といった工夫を組み合わせて運用します。
試行回数制限は「パスワードを当てさせない」ための対策ですが、それでも突破される可能性はゼロにはなりません。
多要素認証(MFA)とは?導入のポイント と組み合わせることで、万が一パスワードが割り出された場合でも、もう1段階の防壁が機能します。試行回数制限とMFAは、どちらか一方ではなく、両方を実装するのが実務上の基本です。
ブルートフォース攻撃は、特別な技術がなくても「制限なく何度でも試行できる」状態さえあれば成立してしまいます。対策の基本はログイン試行回数の制限であり、レート制限やCAPTCHAと組み合わせることでより強固になります。
自分のアプリのログイン画面に、この制限が実装されているか確認してみてください。