メインコンテンツにスキップ
ブログ計算ログインAPIのブルートフォース攻撃からの防御

ログインAPIのブルートフォース攻撃からの防御

赤いブロックのシンボルに以下のテキスト:「ログインAPIのブルートフォース攻撃に対する防御:なぜなら、手抜きはあなたを無力にしかねないからです"

大きなリリースの締め切りに間に合わせようと急いでいると、手を抜いてしまうものだ。テストカバレッジは散漫になり、コードはDRYでなくなり、例外処理は技術的負債の墓場、つまりバックログに送られる。誰もが経験したことがあるだろう。

しかし、いざ手を抜こうとするとき、「ログイン試行失敗の最大値」セーフガードの実装を省いてはならない。もしあなたのログインAPIが適切なセーフガードを実装していなければ、総当たりでユーザーアカウントにアクセスすることは、現在では比較的簡単にできてしまう。

この投稿では、攻撃者がログインAPIをブルートフォース(総当たり)する方法を紹介する。そして、あなたのシステムを守るためにできる対策について説明します。

ログインAPIの例

デモンストレーションのために、Node.js と Express を使って非常に基本的な API サーバーを構築してみた。単一のエンドポイントへのPOSTリクエストをリッスンする、 /login.リクエストボディは username そして password.クレデンシャルが正常に提供されると、API は以下を返します。 200 OK.それ以外の場合は 401 UNAUTHORIZED.

これがシンプルなExpressサーバーのコードだ:

const express = require('express');
const users = require('./users.json');

const app = express();
const PORT = 3000;

// Middleware to parse JSON bodies
app.use(express.json());

app.post('/login', (req, res) => {
    const { username, password } = req.body;

    // Check if the username exists and the password matches
    if (users[username] && users[username] === password) {
        return res.status(200).send('OK');
    } else {
        return res.status(401).send('UNAUTHORIZED');
    }
});

// Start the server
app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

この単純なデモでは、ユーザー名とパスワードのリストを users.json.

サーバーをLinodeにデプロイし、ポート 3000.試しにリクエストしてみよう:

~$ curl -i \        -X POST \        --header "Content-type:application/json" \        --data '{"username":"user08","password":"testpassword"}' \         172.233.153.34:3000/login

HTTP/1.1 401 UnauthorizedX-Powered-By: ExpressContent-Type: text/html; charset=utf-8Content-Length: 12ETag: W/"c-MvHJP5yPj49I/9tX+wGrvHWbTRk"Date: Sat, 25 May 2024 19:17:34 GMTConnection: keep-aliveKeep-Alive: timeout=5
UNAUTHORIZED

ログインAPIが稼動しました!

さて、APIをブルートフォース(総当たり)しようと思ったら、次のようなスクリプトを書くかもしれない:

#!/bin/sh

API_ENDPOINT="http://172.233.153.34:3000/login"

USERNAME="user5"

echo "Attempting to login at $API_ENDPOINT as \"$USERNAME\""

for i in {1..8}
do
  PASS="password${i}"
  RESULT=$(curl --silent -X POST --header "Content-type:application/json" --data "{\"username\":\"$USERNAME\",\"password\":\"$PASS\"}" $API_ENDPOINT)
  echo "\"$PASS\": $RESULT"

  if [[ $RESULT == 'OK' ]]; then
    echo "!!! Password for \"$USERNAME\" found: \"$PASS\""
    break
  else
    sleep 1
  fi
done

初歩的なブルートフォース・スクリプトを実行すると、次のようになる:

$ source bruteforce.sh
Attempting to login at http://172.233.153.34:3000/login as "user5"
"password1": UNAUTHORIZED
"password2": UNAUTHORIZED
"password3": UNAUTHORIZED
"password4": UNAUTHORIZED
"password5": OK
!!! Password for user5 found: "password5"

攻撃者は本当にパスワードを推測できるのか?

与えられたユーザー名に対して、少なくともいくつかのパスワードを循環させることができるスクリプトを書くことがいかに簡単であるかを見てきた。あなたはこう言うかもしれない、「OK、それは興味深い作為的な例だ。しかし、攻撃者は本当にパスワードを推測できるのだろうか

これは、最も一般的な10,000のパスワードのリストです。攻撃者にとっては、かなり良いスタートだ。考えてみてほしい。"password123 "や "qwerty "を使っている人に出くわしたことがあるだろうか?それはあなたかもしれない!

攻撃者があなたのシステムのユーザー名をいくつか知っていて、これらの一般的なパスワードをループするスクリプトを実行したら、ヒットするかもしれない。

ユーザー名とパスワードの組み合わせの試行が許可されるたびに、アカウントに侵入される可能性が高まる。

これは、OWASPのAPIセキュリティ・リスク・トップ10の第2位である、認証が壊れている典型的なケースだ。もしあなたのアプリケーションが自動化された攻撃から適切に保護されていないなら、あなたはトラブルを求めていることになる。安全策がなければ、ユーザのアカウントは重大なリスクにさらされる。

パスワードはしばしば、システムのセキュリティにおける最も弱いリンクである:

  • ユーザーは複数のサイトでパスワードを再利用する。
  • ユーザーは覚えやすい(推測しやすい)パスワードを選ぶ。
  • ユーザーはパスワードをほとんど更新しない。

これらすべての要素が、ブルートフォース攻撃を恐ろしく効果的なものにしている。

では、質問に戻ろう:攻撃者は本当にパスワードを推測できるのか?もちろんです。そして、もしあなたが適切な予防策を講じていないのであれば、それはあなたが思っているよりも早く起こる可能性があります。

APIを保護するには?

ログインAPIに対するブルートフォース攻撃を防御する方法は複数ある。

最大ログイン失敗回数を設定する

各ユーザに許可するログイン失敗回数の制限を設定する。ユーザーに対するログイン試行が発生したら、ログイン失敗の実行カウントを維持します。制限回数に達したら、アカウントを一時的にロックするか、送信者のIPアドレスからのその後のリクエストをブロックする。こうすることで、攻撃者がブルートフォース(総当たり)で侵入することがより難しくなります。

ウェブアプリケーションファイアウォール(WAF)の使用

WAFは、悪意のあるアクティビティを検出してブロックすることで、APIを保護するのに役立つ。

  • ボットの活動:優れたWAFは、正当なユーザーとボットを区別し、自動化されたブルートフォース攻撃をブロックすることができる。
  • Torの後ろからの不審なログイン要求:多くの攻撃者はTorネットワークを利用して正体を隠しています。Torノードからのリクエストをブロックしたり、チャレンジすることで、攻撃のリスクを減らすことができます。

HaltdosはLinodeMarketplace で利用可能なWAFで、これらの保護やその他の機能を提供している。このようなツールを統合することで、APIの防御を大幅に強化することができる。

レート制限の導入

一定時間内に1つのIPアドレスからのAPIリクエスト数を制限する。これはブルートフォースアタックを遅くし、実行可能性を低くする。レート制限は、ログインAPIだけでなく、すべてのAPIとエンドポイントに対して有効なプラクティスだ。

多要素認証(MFA)の有効化

MFAのような追加のセキュリティ・レイヤーを追加すれば、攻撃者がパスワードを正しく推測した場合でも、総当たり攻撃を阻止することができる。認証フロー全体をうまく通過するには、ユーザーが知っているもの(パスワード)と持っているもの(電話やハードウェア・トークン)が必要です。

ログイン試行の監視と分析

APIリクエスト監視ソリューションをセットアップし、ログイン試行を監視する。攻撃を示す可能性のあるパターンを探す。これにより、不審なアクティビティに迅速に対応することができる。

これらの対策を実施することで、ブルートフォース攻撃からAPIを保護し、ユーザーのアカウントを安全に保つことができる。

結論 

ログインAPIをブルートフォース攻撃から守ることは非常に重要だ。パスワードを推測することは思っているほど難しくなく、推測を自動化することは子供の遊びだ。あなたのシステムは脆弱ですか?システムを強化するためにできることをいくつか紹介しました。これらのステップを踏むことで、セキュリティ態勢を大幅に強化することができます。

アプリケーションやAPIの構築に躍起になるあまり、あちこちで手を抜いたとしても、私たちは許します。誰だってそうする。しかし、ログインAPIを無防備なままにしてはいけません!攻撃が起こるまで待つのではなく、システムとユーザーを守るために今すぐ行動を起こしましょう。ロギングとシステム監視に関するより詳細なガイダンスについては、Linodeのドキュメントをご覧ください。アプリケーションを提供するためにApache 、DoS/DDoS攻撃からサーバーを守るためにmod_evasiveを設定するガイドをご覧ください

気をつけて!

コメント 

コメントを残す

あなたのメールアドレスは公開されません。必須項目には*印がついています。