web-dev-qa-db-ja.com

ログイン試行の失敗をログに記録するとパスワードが公開される

次のようなメッセージで、失敗したログイン試行のログを自分のウェブサイトに記録し始めました

Failed login attempt by qntmfred

これらのログの一部が次のようになっていることに気づきました

Failed login attempt by qntmfredmypassword

ユーザー名とパスワードをユーザー名フィールドに入力したため、ログインに失敗した人もいると思います。パスワードはデータベースでハッシュ化されますが、何らかの理由でデータベースが危険にさらされた場合、これらのログメッセージは、攻撃者がこのようなログインに失敗した人のわずかなパーセンテージのパスワードを突き止める方法になる可能性があります。

これを処理するより良い方法はありますか?この可能性についても心配する必要がありますか?

38
kenwarner

このようにしてみてください:

ユーザー名が存在する場合は、「usernameによるログイン試行の失敗」を記録します。そうでない場合は、「IPによるログイン試行の失敗123.45.67.89 "代わりに。ログに誤ってパスワードが表示されるという問題に対処する必要があります。

65
Mason Wheeler

そのようなユーザー名がデータベースに存在するかどうかを単にチェックしないのはなぜですか?これにより、2つの結果が得られます。

  1. ユーザーは正しいユーザー名を入力しました。次に、今記録しているものを簡単に記録できます。

  2. ユーザーはユーザー名フィールドにパスワードを入力したため、ユーザー名は無効です。身元不明のユーザーがログインに失敗したことを示すログエントリを入力するだけですか?

そしてもちろん、IP、日付などをログに記録するための追加フィールドを持つことができますか?

12
galdikas

考慮事項:

  1. 誰かがユーザー名を間違って入力したのではなく、これが発生したことを検出できますか?誤って入力したユーザー名をログに記録することは、サポートの目的で役立つ場合があります。ユーザー名を誤って入力しました。ドットではなくダッシュにする必要があります」、または「先頭にコロンがあり、その後に空白がある-切り取って貼り付けました」。高額の有料ユーザーが少ない場合(つまり、まだ別のソーシャルネットワーキングサイトではない場合)、おそらくこの種のサポートを提供する必要があります。

  2. 誰かがこれを行う場合の適切なアクションは何ですか?ユーザー名はハッキングの試みの指標となる可能性があります。ユーザー名がリストに表示されていなくても、それが何であるかを知る必要がないという意味ではありません。ただし、これが深刻な懸念であり、誰のパスワードであるかを検出できる場合は、これが発生した後にユーザーにパスワードの変更を要求することができます。

  3. 業界慣行とは業界慣行では、ユーザー名フィールドはログに記録しますが、パスワードフィールドはログに記録しません。あなたはこれを行うために解雇されることはほとんどありません。

通常とは異なる考慮事項がない限り、業界の慣行に従い、ユーザー名フィールドをログに記録することをお勧めします。これが不十分だと思われる場合は、パスワードの強制変更を提案2として検討してください。

1
Ben

安全のために、私の現在のアプリでのロギングは、ログインまたはパスワードリセットメソッドに渡されるパラメーターを保存しません。ログ呼び出しには、これを制御するオプションのパラメーターがあり、これをtrueに設定すると、格納されているパラメーターオブジェクトが[Redacted]に置き換えられます。確かに、私は少しのデータを見逃していますが、IPアドレスを持っているので、プレーンテキストで機密性の高いものを取得するリスクを冒したくありません。

この種のことを本当にログに記録したい場合は、ログイン試行をログに記録するときに、ユーザー名フィールドにある名前と一致する名前のユーザーをデータベースで確認し、一致する場合にのみそれを保存することをお勧めします。それ以外の場合は、「不明なユーザー」として保存するだけです。この値にそれが含まれているかどうかを確認すると、奇抜になるかもしれませんが、[User] [Password]と[UserPas] [sword]のような組み合わせを取得するリスクは常にあります。その場合、IPをチェックしてそれを推測できます誰かのパスワードの始まりを不注意で平文で保存した。これを可能性は低いが[User] [Password]と[UserPassword] [??]に拡張できます。この場合、「UserPasswordによるログインの失敗」に続いて「ユーザーによるログインの成功」が表示され、推測できます- allユーザーのパスワード。一般的に、安全のために、ログインが成功しない限り、ユーザー名をログに記録しないようにします。

編集して追加:

失敗したログイン試行のユーザー名をログに記録するために人々が投稿している議論のほとんどは、私の意見では、他の方法でより適切に処理されます。

たとえば、顧客が「ログオンできないのはなぜですか?」と尋ねられたときに、ログに記録されたユーザー名によってタイプミスを指摘できると言われていました。これは本当ですが、パスワードをキャッチするリスクもありません。これを行うには、失敗時にユーザーをログインフォームにリダイレクトし、ユーザー名フィールドをハイライト表示して、入力した内容を再入力して、ユーザーが自分で確認できるようにします。

もう1つの議論は、ハッキングの試みを特定できることです。 1つのユーザー名に対する一連の失敗は、パスワードをブルートフォースにしようとする試みである可能性があります。これを行うには、Usersテーブルに「BadLogins」列を作成します。この列は、このユーザーに一致するユーザー名でログインに失敗するたびにインクリメントされ、ログインが成功するとユーザーに「 x前回のログイン以降のログイン試行の失敗」と、ログイン試行が自分からのものではないと思われる場合の対処法をアドバイスします。本当に徹底したい場合は、ログイン成功後でもBadLogins列の最後の値を格納する別の列、および/またはこの列のこれまでで最高の値を格納する列、および/またはこのアカウントでこれまでに失敗したログインの総数を格納します。

1
anaximander