web-dev-qa-db-ja.com

HMACと共有キーによるSSO。これは改善できますか?

A.comで認証されたユーザーがいる場合、ユーザーをB.comにリダイレクトして、即座に認証されるようにします。私が検討しているスキームは非常に基本的です:

A.comとB.comはどちらもキーを共有します[〜#〜] s [〜#〜]

A.comで、ユーザーを https://B.com/auth?userid=userid&time =current_time&mac =[〜#〜] mac [〜#〜]ここでMACはHMAC-SHA256(ユーザーID +時間、S)です。

B.com/authでは、所定のMACが有効であり、時刻がクロックの5秒以内であることが必要です。

クライアントがSSLを使用することを考えると、リプレイ攻撃はありそうもないと思いますが、最小限の保護を提供しました。 OAuthログイントークンのようなものは必要ありません。クライアントは常にこのプロセスを介してB.comにアクセスします。

他に見逃しているものはありますか?このようなSSOの正式な名前はありますか?

4
Steve Clay

ここではMACが適切なツールであり、HMAC/SHA-256で十分です。 5秒の許容誤差を使用すると、少し楽観的になる可能性があります。

  • 両方のサーバーのクロックが正確であることを確認する必要があります。 [〜#〜] ntp [〜#〜] を使用します。また、明確に定義された表現、つまりUTCの何かを使用していることを確認してください(そうしないと、夏時間で問題が発生します)。

  • 「5秒の遅延」は、往復に対応するのに十分でなければなりません。サーバー[〜#〜] a [〜#〜]は、「リダイレクト」応答をクライアントに送信します。次に、クライアントは[〜#〜] b [〜#〜]に接続してリクエストを送信します。クライアントが悪条件にある場合(電車内でラップトップを使用しているクライアントなど)、ネットワークは一度に数秒間使用できなくなる可能性があります。

リプレイ攻撃 外部からの攻撃はSSLによって阻止されます。タイムスタンプを含めることは、ユーザー自身によるリプレイ攻撃を無効にすることです。サーバー[〜#〜] b [〜#〜]n秒以上のタイムスタンプが必要な場合、これは意味します[〜#〜] a [〜#〜]でユーザーへのアクセスをブロックすると、ユーザーは引き続き[〜# 〜] b [〜#〜]n秒。おそらく、より長いn;を許容できます。個人的には、5分の遅延を使用します。もう1つの見方は次のとおりです。認証が一度実行されると、[〜#〜] b [〜#〜]は、指定された時間フレーム[〜#〜] t [〜#〜]、例えばCookieベースのセッション管理を使用し、セッションが[〜#〜] t [〜#〜]秒後に期限切れになる場合、n[〜#〜] t [〜#〜]よりはるかに短い.

悪意のあるユーザーがサーバー[〜#〜] b [〜#〜]のクロックを戻すためにNTPパケットを偽造したい場合があることに注意してください古くなったMACで古い認証URLを再利用するため。 NTPパケットは認証されません。通常のNTPクライアントは、NTPサーバーがそれが数週間オフであると主張した場合でも、かなりの量でクロックを変更することを受け入れません。ただし、起動時のntpdate呼び出しは理論的には悪用される可能性があります。この攻撃は実際には確認していません。

改善のための提案:

  • [〜#〜] a [〜#〜]および[〜#〜] b [〜#〜]の識別子を含めることができます(例:サーバー名)リダイレクトURL、およびMAC入力の一部として。これにより、誰が認証+承認を行っているか、およびどのサーバーに対してユーザーが承認されているかが追跡されます。後でいくつかの異なる[〜#〜] a [〜#〜]および[〜#〜でシステムを拡張する場合、これはより柔軟です] b [〜#〜]サーバー。

  • MACをデジタル署名(RSA、DSA ...)で置き換えることができます。サーバー[〜#〜] a [〜#〜]は秘密鍵を所有し、それを使用して符号;サーバー[〜#〜] b [〜#〜][〜#〜] a [〜#〜]を使用します署名を検証するための公開鍵。これにより、[〜#〜] a [〜#〜][〜#〜] b [〜#〜](秘密が共有されるほど、秘密は少なくなります)。

5
Thomas Pornin