アカウントごとに試行を制限する

HydraBeginner
オンラインで実践に進む

はじめに

Gearroom は地元のものづくりをする人々に機材を貸し出しています。会員はログインして、自分の受取・返却日時や梱包の注意事項を読みます。ログイン制限はパスワードの繰り返し推測を一時停止するためのものですが、現在のカウンターは全員で共有されています。ある会員の失敗が、別の会員の作業開始を妨げることがあります。

Hydra で小規模で再現可能なテストを行い、カウンターをアカウント単位に変更して、保護と通常のアクセスを両方実証します。成果は、実際の認証と変更されていない貸出記録で裏付けた、有効な稼働中ポリシーです。レポートではありません。制限してよいのは指定された合成テスト会員だけです。参照用会員には既知の正しいパスワードのみを使い、サーバー、アカウント、元の記録を変更しないでください。

基本的なターミナル入力、パスの識別、タブ切り替えが必要です。必要な Hydra オプション、フォームフィールド、シェルの引用符、JSON ポリシー構造はここで説明します。準備済みの Workstation ターミナルと Equipment Desk サイトは、同じ隔離トレーニングコンテナの2つのインターフェースです。この単元は他のラボとは独立して開始します。人物、パスワード、記録はすべてローカルの合成トレーニングデータです。

読解と一般的なミスへの対応を含めて約55分を見込んでください。著者の見積もりであり、初心者の実測時間ではありません。30秒に3回の失敗、その後12秒のクールダウンという小さな値はトレーニング契約であり、本番環境のセキュリティ推奨値ではありません。

2人の会員が正常にログインできることを確認する

このステップでは、制限を試す前に2人の既知の会員記録を開きます。認証成功とは、サーバーが特定のユーザーを受け入れたことです。そのユーザーによって、閲覧できる記録が決まります。

Equipment Desk を開きます。上部のナビゲーションで Review brief を選びます。テストを許可された会員は member、パスワードは Member24 です。通常の参照用会員は reference、パスワードは Reference24 です。これらは既知の認証情報であり、発見する必要のあるパスワードではありません。

Member ID と Password がある実際の会員ログインフォーム

ラベル付きの2つの入力欄と Sign in ボタンを使います。フォーム下の行に、実際の POST パスと送信フィールド名が示されています。

Member sign-in を選び、テスト会員の認証情報を入力して Sign in を選びます。Signed in as member が表示されるはずです。Open your record を選びます。貸出 LN-204、Mina Park、Compact projector kit、受取 Thursday 14:00、返却 Monday 10:00、HDMI ケーブルを側面ポケットに入れる注意書きを確認します。Sign out を選びます。

テスト会員の元の貸出記録と梱包の注意事項

Member と Record のフィールドを、機材、受取、返却、梱包の注意事項と合わせて確認します。ログイン成功だけでは、元の記録が完全に保たれているとは証明できません。

再び Member sign-in を選び、参照用会員の認証情報でログインして Open your record を選びます。LN-119、Theo Bell、Portable audio recorder とウィンドスクリーンの注意事項を確認します。再度 Sign out を選びます。これらは別々の記録であり、両方を保つことも課題に含まれます。ブラウザーは通常、ログイン成功後に Cookie、つまりサーバーが発行するセッション識別子を自動保存します。ログアウトすると、そのセッションが終了します。

Workstation に切り替えます。設定された開始ディレクトリは /home/labex/project/login-limits です。pwd は現在のディレクトリを表示します。

pwd

/home/labex/project/login-limits が表示されるはずです。別の場所に移動していた場合、cd でディレクトリを変更します。

cd /home/labex/project/login-limits

cat はファイルを表示します。準備済みポリシーを読みます。

cat policy.json

これは JSON です。二重引用符で囲む名前付きフィールドを持つ、構造化テキスト形式です。コロンが名前と値を結び、カンマがフィールドを区切り、波括弧がオブジェクトを囲みます。現在 key は global なので、同じカウンターに別々の会員アカウントが含まれます。failed_attempts、window_seconds、cooldown_seconds は、定められた3回の失敗、30秒のウィンドウ、12秒のクールダウンです。entry_groups は準備済みログインパスを列挙します。この単元では対応関係を変えないでください。入口グループは次の独立したガイド付きラボで調べます。

deskctl は準備済みの、機能を限定した保守コマンドです。status は実際の有効なポリシーを読みます。ログイン、カウンターの消去、サービスの変更はしません。

deskctl status

有効なポリシーはファイルと一致するはずです。リビジョンは、現在使用しているポリシーを識別します。後でファイルを編集しても、適用するまでは有効なポリシーは変わりません。

共有カウンターの問題を観察する

このステップでは、許可されたテスト会員に対して、提供された誤ったパスワードだけを送信します。その後、グローバルカウンターが参照用会員まで拒否する様子を観察します。

Workstation に留まります。許可された候補ファイル全体を読みます。

cat wrong-passwords.txt
NotThis11
NotThis22
NotThis33
NotThis44
NotThis55

5つとも、テストアカウントに対して意図的に誤った値です。本物の認証情報を追加したり、別のアカウントを繰り返しテストしたりしないでください。Hydra は限定的な試行を発生させます。速度競争やパスワード発見の課題ではありません。

127.0.0.1 はこのトレーニングコンテナのループバックアドレスです。ポート 8080 は外部サイトではなく、準備済みローカルサービスに届きます。メインのログインフォームは /signin に POST リクエストを送ります。POST は本文で名前付きフィールドを運びます。ここでは username と password を & で区切ります。Hydra の http-post-form 引数はコロンで区切る3部分、パス、フィールド、応答条件からなります。^USER^ と ^PASS^ は Hydra のプレースホルダーです。S=Signed in as は実際の認証成功応答テキストを要求します。制限または拒否ページを有効なログインとして数えてはいけません。

Hydra のオプションは、この作業領域の古い復元プロンプトを無視する -I、1つのユーザー名を固定する -l member、提供されたパスワードファイルを指定する -P、ポートの -s、ワーカー1つの -t 1 です。ワーカーが1つだと、この少数の試行を観察しやすくなります。サーバー側の制限を作るわけではありません。最後の単一引用符付き引数は、空白や & を含んでも1つの引数のままです。

次のブロックでは、ターミナル HTTP クライアント curl も使います。ブラウザーとは独立し、そのセッションを自動では再利用しません。--data が POST フィールドを与え、-s が進捗表示を隠し、-o が応答本文を保存し、-w が HTTP ステータスを表示します。引用符内の \n はステータス出力を改行します。単一引用符は &、空白、%{http_code} をシェルに解釈させず、curl に渡します。この2つの診断ログインには既知の正しいパスワードを使います。

まず、それまでの試行が自然に期限切れになるのを待ちます。deskctl wait は準備状態を観察するだけで、カウンターをリセットしたり試行を追加したりしません。

deskctl wait

次の3コマンドは1つのブロックとしてまとめて実行してください。 12秒のクールダウン中に両方の診断応答を取得するので、コマンド間で読みながら停止する必要はありません。

hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin

全候補が誤りなので、Hydra は 0 valid password found と報告するはずです。診断の2行はどちらも HTTP 429 になるはずです。429 はサービスが試行を制限していることを示し、パスワードが誤りだとは意味しません。Curl は HTTP 拒否でも正常終了することがあります。終了ステータスを認証と見なさず、表示されたステータスと保存した本文を読んでください。この場面では、3回目の拒否がクールダウンを開始し、それ以降の試行はパスワードを調べる前に制限されます。

grep はテキストを検索します。-o は周囲の HTML ではなく、一致した語句だけを表示します。

grep -o 'Too many attempts' reference-login.html

正しい参照用パスワードも拒否されました。これが業務上の問題です。グローバルカウンターが別の会員の新規ログインまで止めています。

既存のサーバーイベントを読みます。

deskctl events

member が /signin で rejected、threshold、limited となり、その後 reference のログインが limited と記録される流れを探します。これらは Hydra 出力の解釈ではなく、実際のサーバー判断です。イベント履歴はクールダウン後も読めるので、一瞬のページを捉える必要はありません。

診断が遅すぎた場合は、deskctl wait の完了後、同じ小さな3コマンドブロックを再実行します。Hydra が構文または接続エラーを報告したら、結果を解釈する前に、引用符付き引数、アドレス 127.0.0.1、ポート 8080、宣言されたパスを修正します。接続失敗は保護テスト成功ではありません。HTTP 400 は誤ったフォームフィールド、404 は誤ったパスです。環境をリセットせずに通常の間違いを直してください。

アカウント単位のポリシーを適用する

このステップでは、各会員に独立した制限を与えるため、カウンターキーだけを変更します。トレーニング値と入口の対応関係は保ちます。

Workstation に留まります。次のコマンドはローカルの policy.json を置き換えます。cat > policy.json はテキストをファイルに書き込み、> は既存ファイルを上書きします。ヒアドキュメントは終了マーカー EOF までの行を入力として渡します。'EOF' を引用符で囲むと本文が文字どおりに保持されます。終了マーカーは行頭に空白を入れず、単独の行に置いてください。

cat > policy.json <<'EOF'
{
  "key": "account",
  "entry_groups": {
    "/signin": "loans",
    "/mobile/signin": "loans"
  },
  "failed_attempts": 3,
  "window_seconds": 30,
  "cooldown_seconds": 12
}
EOF

変更した値は key だけです。account は全アカウントをまとめず、送信された会員 ID で試行を分けます。しきい値をゼロにする、アカウントを削除する、全員を拒否するといった方法では、通常のサービスを維持できません。

準備済み制御コマンドでファイルを適用します。

deskctl apply policy.json --wait

apply はファイルを検証し、動作中のポリシーを明示的に変更します。--wait は、変更されたポリシーを適用する前に、既存のクールダウンや部分的な失敗ウィンドウが自然に終了するまで待ちます。部分的なウィンドウが落ち着くまで最大30秒かかります。待機中は旧ポリシーが有効です。サービス再起動、履歴破棄、有効なカウンターの消去は行いません。同一ポリシーを再適用しても変化せず、アカウントの制限は解除できません。

最初の変更では、ok: true、changed: true と、key が account の新しいリビジョンを確認します。同じ有効ファイルをすでに適用した場合、changed: false は正常です。

deskctl status

ファイルだけでなく、動作中のポリシーを読んでください。JSON エラーの多くはカンマ、引用符、波括弧の不足です。完全なブロックと比較し、修正後に再適用します。無効なポリシーは有効なポリシーを変更しません。チェックを通すためにサーバーを再起動したり、実装を編集したりしないでください。

保護と通常の回復を実証する

このステップでは、有効なポリシーをテストし、参照用会員のアクセスを保ちながら、制限されたテスト会員が自然に回復することを確認します。

Workstation に留まります。カウンターが自然に落ち着いた状態から始めます。

deskctl wait

この完全なブロックをもう一度実行します。パス、既知の診断パスワード、誤った候補集合は変わりません。有効なカウンターキーだけが異なります。

hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin

Hydra の発見はゼロで、Test member HTTP 429 と Reference member HTTP 200 になるはずです。保護対象アカウントは制限されたまま、無関係な参照用アカウントは認証できます。HTTP 200 だけでは不十分なので、保存された本文のユーザーを確認します。

grep -o 'Signed in as reference' reference-login.html
grep -o 'Too many attempts' test-login.html

新しいリビジョンに記録された判断を読みます。

deskctl events

member のしきい値と制限されたログインとともに、reference の認証成功が見えるはずです。修正を証明するのは現在のポリシー下のイベントだけです。以前のグローバルポリシーの証拠は残りますが、新しいポリシーが機能する証明にはなりません。ブロック内のコマンド間で停止してクールダウンを逃したら、自然に待って同じ限定ブロックを再実行します。候補を増やしたり、カウンターを消去したりしないでください。

テスト会員のクールダウンが終了するのを待ちます。

deskctl wait

Equipment Desk に切り替えます。Member sign-in を選び、member / Member24 で Sign in、続いて Open your record を選びます。LN-204、Mina Park、Compact projector kit とその全情報が変わっていないことを確認します。この新しいログインが自然終了後の回復を示します。Sign out を選び、Member sign-in で reference / Reference24 を使い、再び LN-119 を開きます。録音機とウィンドスクリーンの注意事項を確認し、ログアウトします。

最後に Visitor guide を選びます。公開の受取案内は引き続き利用できます。ターミナルの curl ログインとブラウザーは別セッションであり、以前の curl 応答がブラウザーを自動でログインさせることはありません。記録が403なら、実際のフォームでログインし、Open your record を使います。通常のパスワードやパスの誤記は VM 再起動ではなく修正で対処します。

policy.json は実際のアカウント単位ポリシーと一致しました。サーバーには、現在のリビジョン下で、繰り返し失敗、正しいパスワードの試行に対する制限、制限中の通常の参照用認証、自然回復後のテストログインという実際の証拠があり、両方の元の記録も完全です。評価は既存の事実と公開ページを読むだけで、不足したログイン、制限のリセット、回復の代行はしません。この単一プロセスの管理された演習が示すのは説明したローカル動作であり、あらゆる認証攻撃に対する完全な本番防御ではありません。

まとめ

限定的な Hydra 試行でグローバルカウンターを明らかにし、サービスを再起動・リセットせずにアカウント単位ポリシーを適用して、拒否と可用性を確かめました。テスト会員は正しいパスワードでも制限され、別の会員は認証でき、自然なクールダウン終了によって変更のない業務記録へのアクセスが戻りました。結果を裏付けるのは現在のポリシーと実際のサーバー判断であり、Hydra の空の結果や緑色の状態表示だけではありません。