ブルートフォース
Brute Force Attack
正しいパスワードや暗号鍵を探すため、候補の組み合わせを網羅的に試す攻撃です。候補数が多く試行も制限される場合は、現実的な時間内に突破できるとは限りません。
🐾 猫で例えると?
狙ったおもちゃを仕留めるために、計算も工夫もせず、とにかく凄まじい勢いで猫パンチを連打するアメショ。この手数の多さを、パスワード候補を一つずつ試す様子に重ねます。同じ入力を連打するだけでなく、候補の組み合わせを網羅していく点がブルートフォースの要点です。
💻 IT現場における「ブルートフォース」とは?
ブルートフォース(総当たり攻撃)は、ハッカーがログイン画面や暗号データに対して行う最も原始的なサイバー攻撃です。たとえば4桁の暗証番号であれば「0000」から「9999」まで、1万通りを順番にすべて入力すれば、どこかで必ず正解の番号に突き当たります。
試行できる速さは状況によって大きく異なります。ログイン画面への攻撃は通信や回数制限の影響を受けますが、流出したパスワードハッシュを攻撃者の手元で解析する場合は、サイト側のロックが効きません。後者には、パスワード保存時の専用ハッシュ方式やソルトも重要です。
⚠️ ブルートフォースの仕組みと注意点
実務においては、WebサイトのログインフォームやSSH接続のポートがこの攻撃の標的になりやすいです。攻撃をそのまま放置すると、サーバーに膨大なログイン試行リクエストが届き、CPUやネットワークに極端な高負荷がかかってシステムダウンを引き起こす原因にもなります。
強固なパスワードポリシーの必須性
長く、他のサービスと使い回さないパスワードを使い、推測されやすい語や漏洩済みパスワードを避けます。決まった記号を末尾に足すだけで十分とは限りません。サイト側は試行の制限と多要素認証を組み合わせます。
// Node.jsでの簡易的なブルートフォース対策(アカウントロックの概念)
const loginAttempts = new Map();
function login(userId, password) {
const attempts = loginAttempts.get(userId) || 0;
// 短時間に何度も間違えている場合は処理をブロックしてリソースを守る
if (attempts >= 5) {
throw new Error("アカウントが一時的にロックされています。連続試行は拒否されます。");
}
if (verifyPassword(userId, password)) {
loginAttempts.delete(userId);
return "ログイン成功";
} else {
loginAttempts.set(userId, attempts + 1);
return "パスワードが違います";
}
} この例は回数を数える概念だけを示す疑似コードです。verifyPasswordの実装、制限の期限、解除手段、複数サーバー間の共有を省略しており、そのままでは「一時的」ではなくプロセスが動く間ずっとロックされます。実装時は制限の終了時刻を保存し、本人を故意に締め出す攻撃にも備えます。
🛠️ 総当たり攻撃に備えるポイント
- ログイン試行回数の制限(アカウントロック): 一定回数以上ログインに失敗したアカウントやIPアドレスを自動的にブロックする仕組みを必ず導入しましょう。
- 多要素認証を導入する: パスワードの漏洩だけでログインされる危険を減らします。方式ごとにフィッシングへの耐性が異なるため、認証アプリやパスキーなども検討します。
- CAPTCHAを補助として使う: 自動化のコストを上げますが、突破や代行の可能性もあります。回数制限の代わりにはせず、利用者の操作負担にも配慮します。
何度も猫パンチを繰り出すアメショに対し、システムでは「何回でも試せる」状態を避けることが大切です。利用者が安心してログインできるよう、連打を抑える仕組みと失敗した本人の復旧手段を一緒に整えましょう。