自動ログインを安全に実装する方法


15

私は多くの、多くの、読んだ多くの「あなたはおそらく間違ったパスワードを保存している」方法についての記事を。これらは常に、ユーザーがログインしているサーバーにパスワードを保存することを指します。基本的に、パスワードなどを確実にソルトするなど、ユビキタスなアドバイスを再ハッシュします(ただし、クライアントがログインする必要がないように、パスワードをクライアントに保存するためのベストプラクティスに関する記事を見たことはありません)ログインするたびに手動で。「私を記憶する」機能。

ブラウザからDropboxなどのプログラムまで、多くのソフトウェアにこの機能があります。

最近、DropboxがコンピューターにIDを保存する方法に関する古い記事を読みました。別のコンピューターにコピーして貼り付けてDropboxを起動し、IDを取得したデバイスとしてログインできます。ログインもなし、Dropboxアカウントへのフルアクセスもありません。これは本当にばかげたデザインのように思えますが、それを行うより良い方法は考えられません。

クッキーのようなものをプレーンテキストで保存しないようにする方法すらわからない。暗号化する場合、暗号化を解除するためのキーはどこに保存しますか?

セキュリティの脆弱性を導入しない唯一の方法は、自動ログイン機能を削除し、ユーザーがサービスを使用するたびにパスワードを入力するようにすることですが、それは使い勝手が悪く、ユーザーはそうする必要がないことを期待して甘やかされています。

自動ログイン機能を実装するために、資格情報を安全にローカルに保存することについて何を読むことができますか?原則が記事全体に対して単純すぎる場合、それらは何ですか?問題のソフトウェアは、すべてのプラットフォームに存在しない機能(一部のLinuxディストリビューションにある「キーチェーン」など)に依存すべきではありません。


2
それはあなたが信頼するものについてです。マシンがIDを保存することを信頼できない場合、それが問題です。キーチェーンを信頼する場合、それが最大のセキュリティになります。もちろん、デバイスのハードウェアなどを検出するようなカスタムの安全性を追加することもできますが、すべて偽造可能であるため、最終的には知ることができません。それはあなたのコントロールの外です。オフテキストのパスワードを保存するなど、もちろん愚かなことは除外されます。
リュックフランケン

@LucFrankenどのようにマシンを信頼できますか?だれかがDropboxのようにあなたを悪用できます。また、私はキーチェーンを信頼しますが、すべてのコンピューターにキーチェーンがあるわけではなく、Windowsにはありません(私の知る限り)。また、パスワードを保存している場合、クリアテキストで保存しないようにするにはどうすればよいですか?それらを暗号化する場合、それを解読するためのキーをどこに保存しますか?
ジェイサイモン

それがまさに問題です。あなたはそれを信頼することはできません。ユーザーは、それを信頼するようにのみ定義できます。ユーザーが自分のマシンがどれほど安全であるかを理解していることを考慮に入れます。Dropboxesからデータを取得するウイルスを作成することは可能です。ローカルに保存されたキーおよび他のローカルデータと同じです。あなたはそれをより安全にするのを助けることができます(5つの数字のコードを必要とするアプリについて考えてください)が、結局それはローカルであり、あなたのコントロール外です。
リュックフランケン

@LucFrankenそれは私だけですか、自動ログインはユビキタス機能のように見えますか?もしそうなら、なぜ人々はそれを正しく行う方法について書かれていないのですか?
ジェイサイモン

いくつかのエンタープライズソフトウェアでは許可されていませんが、これは非常に一般的な要件です。たとえば、SalesForceでは、パスワードではなく、ユーザー名のみを保存できます。はっきり言ってみましょう。ログインのためにクライアントにパスワードを保存する必要はありません。サーバー上のハッシュに対応するランダムハッシュを保存できます。
リュックフランケン

回答:


12

1つの方法は次のとおりです。

  • ユーザーがログインしたら、セッションIDをクライアントのコンピューターのCookieに保存します(ユーザー名やパスワードではありません)。
  • セッションをIPアドレスに結び付けるため、個々のセッションIDは、開始されたコンピューターでのみ機能します。

サイトの開発に使用しているフレームワークによっては、この動作は組み込み機能として利用できる場合があります。

HTTPプロトコルはとにかくステートレスであるため、Webサイトを使用する1回のセッション中に誰かをログインさせたままにすることと、次回サイトを使用するときに「自動ログイン」することに機能的な違いはありません。セッションの有効期限が切れるまでにどれだけの時間を許可するかだけです。

更新:また、明らかにセキュリティを強化するためにHTTPSを使用します。

更新2:このアプローチには制限があり、IPアドレスを大幅に変更するユーザーにはうまく機能しないことに注意してください。ただし、セキュリティのレベルは向上し、状況によっては役立つ場合があります。


1
誰かがあなたと同じファイアウォールの背後にあるコンピューターを持っている可能性があるため、IPアドレスに接続してもあまり役に立ちません。
ジェイサイモン

2
@JaySimon、私は「あまり役に立たない」とは言いません。あなたと同じファイアウォールの背後にあるコンピューターの数は、世界のコンピューターの数よりもはるかに少ないです。攻撃にさらされる可能性を制限することであり、これにより大幅に制限されます。これは標準的なアプローチであり、それ以上にできることはあまりないと思います。誰かがユーザー同じIPアドレスを持ち、セッションIDの取得に成功した場合、その人はサーバーの観点からはユーザーと区別できなくなります。サイトに何らかの種類のログインがある場合、そのような攻撃にさらされます。

3
IPアドレスが頻繁に変更される可能性がある携帯電話のユーザーにとって、このようなアプローチは迷惑になると思いますか?
ジェイサイモン

@JaySimon、セッション内で発生した場合、ユーザーは突然のログアウトとしてそれを経験しますが、これは確かに迷惑です。ただし、実際にどれくらいの頻度で変更されるかはわかりません(簡単なGoogle検索では決定的な答えは見つかりません)。IPが実際に使用されている間にIPが変更される可能性がなければ、私はあまり心配しません。

前述のように、セッションをIPに制限するのは現実的ではありません。ユーザーは頻繁に場所を変更します。携帯電話だけでなく、ラップトップでも。たとえば、フレックス作業。最善の方法は、GeoIPチェックとその距離を移動する時間の組み合わせです。Gmailのように。
ロード

5

Amazon(および他の多く)はハイブリッドアプローチを使用しています。閲覧、カートへのアイテムの追加、および以前に使用したクレジットカード/配送先住所の組み合わせを使用した注文のための自動ログインを提供します。ただし、クレジットカードの追加、配送先住所の追加/変更、パスワードの更新、過去の注文(オプションでユーザーに対して)の表示、その他の多くのアカウント設定など、多くのアクションのためにパスワードを入力する必要があります。

そう、あなたのコンピューターにアクセスする人々はあなたのセッションをハイジャックできますが、あなたはまだ彼らが注文したものを手に入れます!(さらに重要なことに、セッションをハイジャックするインセンティブはほとんど無効になっています。)しかし、誰かが私のコンピューターにアクセスできる場合、平均的なサイトセッションを盗む人々よりも大きな問題があります。

セキュリティがそれほど必要ないアプリケーションの部分がある場合、セッションID(ハッシュまたは必要に応じて)を格納するハイブリッドモデルを選択して、サイトのセキュリティの低い部分にユーザーを自動ログインできます。 、ただし、より高いセキュリティエリアに入るときにパスワードを入力し、セッションの終了時に高いセキュリティトークンを削除するように要求します。

もちろん、これが銀行レベルのサイトの場合、自動ログインはオプションではありません。繰り返しますが、これらの種類のセキュリティを使用するサイトは、保護しているデータの価値を想定しており、ハイジャックされたセッションの潜在的なリスクを考慮してユーザーの利便性を高めています。アプリケーションに当てはまらない場合は、自動ログインを実装しないでください。ユースケースに適したセキュリティ/有用性のトレードオフのレベルにアクセスする必要があります。


2

実際にはそれほど難しくはありません。最初に次の形式でCookieを保存します。

userID.token

トークンにsha1ハッシュを使用できます。その後、remember_me_tokensデータベーステーブルストアのuserID、トークンのbcryptハッシュ、およびトークンが生成された時刻。

次に、誰かがあなたのサイトにアクセスしたら、Cookieが設定されているかどうかを確認します。Cookieが設定されている場合、過去7日以内にデータベース内に有効な行があるかどうかを確認します。データベースにCookieの有効な行がある場合、ユーザーがログインしていることを示すセッションを設定し、一致するCookie /データベース行も削除して、新しいCookie /トークン/データベース行を生成します。

ログアウトしたら、Cookieを削除します。

cronジョブを実行して、たとえば7日以上経過したremember_me_tokenを削除します。


誰かがこのキーをコピーして自分のマシンに貼り付け、ユーザー名またはパスワードなしでアカウントにアクセスするのを防ぐのは何ですか?
ジェイサイモン

どうやって鍵を手に入れるの?誰かのコンピューターにローカルに保存されます。
ライアン

コンピューターに近づいて、保存されているファイルを開きます:)
ジェイサイモン

2
@JaySimonこの同じ議論は、コンピューターをロックせずにログインして5分間離れたり、Remember Meをクリックしたり、アカウントのパスワードをジャンプしたりするユーザーに対しても行うことができます。この可能性のあるセキュリティ状況を受け入れることができる場合、その利便性は素晴らしいですが、CIA NOCリストにRemember Me機能が表示されないのはそのためです:)サーバーは、クライアントが保存する必要のあるトークンを提供する必要がありますファイルシステム上。ただし、サーバーの観点からはもう手元にありません。
maple_shaft

@maple_shaftなぜだから誰かがそれをdropboxにできることに驚いたのですか?(質問でリンクしました。)
ジェイサイモン

0

保管先のデバイスを信頼している場合のみ可能です。(デバイスに影響を与えられない場合)ユーザーの責任です。それは単にあなたの手の外にあります。

コメントに記載されているとおり:

それはあなたが信頼するものについてです。マシンがIDを保存することを信頼できない場合、それが問題です。キーチェーンを信頼する場合、それが最大のセキュリティになります。もちろん、デバイスのハードウェアなどを検出するようなカスタムの安全性を追加することもできますが、それはすべて偽物であるため、最終的にはわかりません。それはあなたのコントロールの外です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.