この質問はいつも私を悩ませてきました。
Linuxでは、パスワードの入力を求められたときに、入力が正しい場合は、ほとんど遅延なくすぐにチェックされます。ただし、その一方で、間違ったパスワードを入力すると、確認に時間がかかります。何故ですか?
これは、これまでに試したすべてのLinuxディストリビューションで観察されました。
この質問はいつも私を悩ませてきました。
Linuxでは、パスワードの入力を求められたときに、入力が正しい場合は、ほとんど遅延なくすぐにチェックされます。ただし、その一方で、間違ったパスワードを入力すると、確認に時間がかかります。何故ですか?
これは、これまでに試したすべてのLinuxディストリビューションで観察されました。
回答:
実際には、ブルートフォース攻撃が1秒間に数百万のパスワードを試行するのを防ぐためです。アイデアは、パスワードをチェックできる速度を制限することであり、従う必要のあるルールがいくつかあります。
最後のものは特に重要です。これは、次のような役立つメッセージがないことを意味します。
Your user name is correct but your password is wrong, please try again
または:
Sorry, password wasn't long enough
「無効なユーザーとパスワード」と「有効なユーザーだが無効なパスワード」の失敗理由の応答に時間差さえありません。
すべての失敗は、テキストやその他の点でまったく同じ情報を提供する必要があります。
一部のシステムでは、さらに進んで、障害ごとに遅延を増やしたり、3回の障害のみを許可してから、再試行を許可する前に大幅な遅延を発生させたりします。
これにより、パスワードの推測に時間がかかります。
よくわかりませんが、間違ったパスワードを入力した後の遅延を統合して、攻撃を困難にすることはよくあることです。これにより、少数のパスワードのみをチェックするのに長い時間がかかるため、攻撃は実質的に実行不可能になります。
いくつかのパスワード(生年月日、猫の名前など)を試しても、面白くありません。
123456
可能性は十分にありますが、すべてのアカウントでその重要性に近いとは考えられません。
基本的に、ブルートフォース攻撃や辞書攻撃を軽減します。
遅延の計画
extern int pam_fail_delay(pam_handle_t *pamh, unsigned int micro_sec);
この関数はLinux-PAMによって提供され、pam_authenticate()の呼び出しが失敗した後、制御がアプリケーションに返されるまでの時間遅延を促進します。この関数を使用する場合、アプリケーションプログラマは、で使用できるかどうかを確認する必要があります。
#ifdef PAM_FAIL_DELAY .... #endif /* PAM_FAIL_DELAY */
通常、アプリケーションは、pam_authenticate()またはpam_chauthtok()の呼び出しを通じて、ユーザーがLinux-PAMによって認証されることを要求します。これらの関数は、関連するLinux-PAM構成ファイルにリストされているスタック認証モジュールのそれぞれを呼び出します。このファイルの指示に従って、1つ以上のモジュールが失敗し、pam _...()呼び出しがエラーを返す場合があります。アプリケーションを続行する前に一時停止することも望ましいです。このような遅延の主な理由はセキュリティです。遅延は、主にブルートフォース辞書攻撃を阻止するように機能しますが、時限(秘密チャネル)攻撃を妨げるのにも役立ちます。
これは、セキュリティを大幅に向上させるための非常にシンプルで実質的に簡単な方法です。考えてみましょう:
システムA
に遅延はありません。攻撃者は、ユーザー名とパスワードの組み合わせを作成するプログラムを持っています。1分あたり数千回の試行の割合で、すべての組み合わせを試行し、成功したすべてのログインを記録するのに数時間しかかかりません。
システムB
は、誤った推測が行われるたびに5秒の遅延を生成します。攻撃者の効率は1分あたり12回に減少し、ブルートフォース攻撃を効果的に無効にします。有効なログインを見つけるには、数時間ではなく数か月かかる場合があります。ハッカーがその忍耐強いなら、彼らは合法になるでしょう。:-)
ログイン試行の速度を下げるために、失敗した認証の遅延があります。誰かが辞書やブルートフォース攻撃を試みている場合、またはユーザーアカウントを使用している場合、攻撃者は失敗の遅延を待つ必要があり、その結果、攻撃者はより多くの時間を費やし、それを検出する機会が増えるという考え。
ログインシェルとして使用しているものによっては、通常、この遅延を構成する方法があることを知りたいと思うかもしれません。
GDMでは、遅延はgdm.confファイル(通常は/etc/gdm/gdm.conf)で設定されます。RetryDelay = xを設定する必要があります。ここで、xは秒単位の値です。
最近のほとんどのLinuxディストリビューションは、/ etc / login.defsでFAIL_DELAYを定義することもサポートしており、ログイン試行が失敗した後の待機時間を設定できます。
最後に、PAMでは、認証行にnodelay属性を設定して、失敗の遅延を回避することもできます。(これはPAMとLinuxに関する記事です)
回答が示唆するほど単純なことはないと思います。
正しいパスワードへの応答が(ある値の)即時である場合、パスワードが間違っていることを知るために、その値より長くなるまで待つ必要があるだけではありませんか?(少なくとも確率的には、クラッキングの目的には問題ありません)そして、とにかく、この攻撃を並行して実行することになります...これはすべて1つの大きなDoSウェルカムマットですか?
以前に試したことは機能しているように見えましたが、実際には機能しませんでした。気になる場合は、wikiの編集履歴を確認する必要があります...
何をしに、(私のために)仕事をされて、両方= Xでpam_faildelay.so遅延の低い値/etc/pam.d/login(私は、500000に0.5秒、それを低下させ)、そしてまたNODELAYを追加(Aが先行スペース)共通認証の行の終わりまで、Gabrielが彼の回答で説明しているように。
auth [success=1 default=ignore] pam_unix.so nullok_secure nodelay
少なくとも私(debian sid)にとっては、これらの変更の1つを行うだけでは、遅延がデフォルトの3秒よりも大幅に短くなることはありませんが、/ etc / pam.d / loginの値を変更するだけで遅延を長くすることはできます。
この種のがらくたは、成長した男を泣かせるのに十分です!
Ubuntu 9.10では、新しいバージョンもあると思いますが、探しているファイルは次の場所にあります。
/etc/pam.d/login
行を編集します。
authオプションのpam_faildelay.sodelay = 3000000
あなたが望むかもしれない別のもので番号3を変更します。
'nodelay'認証を取得するには、ファイルを編集する必要があると思います。
/etc/pam.d/common-auth
あまりにも。オンライン:
auth [success = 1 default = ignore] pam_unix.so nullok_secure
'nodelay'を最後に追加します(引用符なし)。しかし、「ノードレイ」についてのこの最後の説明は私が思うことです。
開発者の観点からメモを追加したいと思います。これは肉眼では明らかではありませんが、賢い開発者は一致が見つかったときに一致クエリから抜け出します。目撃者では、成功した試合は失敗した試合よりも早く完了します。なぜなら、マッチング関数は、正しい一致が見つかるまで、資格情報をすべての既知のアカウントと比較するからです。つまり、ID順に1,000,000のユーザーアカウントがあるとします。001、002、003など。あなたのIDは43,001です。したがって、正しいユーザー名とパスワードを入力すると、スキャンは43,001で停止し、ログインします。資格情報が正しくない場合は、1,000,000レコードすべてがスキャンされます。デュアルコアサーバーでの処理時間の違いは、ミリ秒単位である可能性があります。5つのユーザーアカウントを持つWindowsVistaでは、ナノ秒単位になります。
技術的には、この意図的な遅延は、「線形化攻撃」の ような攻撃を防ぐためのものです(他の攻撃や理由もあります)。
攻撃を説明するために、入力されたシリアルをチェックして、正しいシリアル(この場合は「xyba」)と一致するかどうかを確認するプログラム(この意図的な遅延なし)について考えてみます。ます。効率を上げるために、プログラマーは一度に1文字をチェックし、間違った文字が見つかったらすぐに終了してから、長さもチェックすることにしました。
正しいシリアル長は、誤ったシリアル長よりも処理に時間がかかります。さらに良いことに(攻撃者にとって)、最初の文字が正しいシリアル番号は、最初の文字が正しくないシリアル番号よりも時間がかかります。待機時間の連続するステップは、ループがもう1つあるたびに、正しい入力で比較が行われるためです。
- したがって、攻撃者は 4文字の文字列を xで始まる文字列に最も時間がかかります。(推測による)
- 次に、攻撃者は文字をxとして修正し、2番目の文字を変更できます。その場合、yが最も長くかかることがわかります。
- その後、攻撃者は最初の2文字を次のように修正できます。 xy、3番目の文字を変更できます。この場合、bに最も時間がかかることがわかります。
- 攻撃者は最初の3文字をxybとして修正できます、4番目の文字を変更できます。その場合、aに最も時間がかかることがわかります。
したがって、攻撃者は一度に1文字ずつシリアルを回復できます。
シリアル番号は4文字の長さで、各文字には128の可能な値があります。次に、128 4 = 2 28 = 268,435,456の可能なシリアルがあります。攻撃者が完全なシリアル番号をランダムに推測する必要がある場合、彼女は約2 27 = 134,217,728回の試行でシリアル番号を推測し ます。これは、膨大な量の作業です。一方、上記の線形化攻撃を使用すると、各文字に必要な推測は平均128/2 = 64であり、予想される合計作業量は約4 * 64 = 2 8 = 256推測です。 ありこれはな量です。仕事の。
書かれた武道の多くはこれから適応されています(マークスタンプの「情報セキュリティ:原則と実践」から引用)。また、上記の計算では、正しいシリアル長を計算するために必要な当て推量の量は考慮されていません。