web-dev-qa-db-ja.com

次の認証ソリューションは安全ですか、何か不足していますか?

コンテキスト:

2つのWebサーバーServerA(LAMPスタック)とServerB(ASP.NETスタック)があります。テクノロジーが(うまくいけば)問題ではないと思います。どちらのサーバーも認証を必要とし、おそらくこれらの作業を適切に実行しています。そうでない場合は、この質問の範囲外です。

タスク:

Iframeコンテンツを含むページを実装したいと思います。 ServerAは外部コンテンツを提供しますServerBは内部コンテンツ(iframe)を提供します。サーバーは異なるドメインにあります。ユーザーXがServerAにログインしてページに移動すると、iframeでServerBからのpersonalおよび機密コンテンツが表示されます。コンテンツは、サーバーBのユーザーXのIDに属しています。

提案された解決策:

  • ServerAとServerBには共有秘密があります(サーバー側)
  • ユーザーはServerAからServerBに複製されます。ユーザー名は一致し、ServerBのパスワードはランダムに生成され、まったく使用されません。 (読み続けます)
  • ServerAは、フォームベースの認証を使用してhttps経由でユーザーを認証します
  • 外部ページには、次のhtmlフラグメントが含まれています。URLの。any拡張は、サーバーで実行および応答するように構成されています(例:.aspxまたは.cshtmlまたは.phpなど:

<img src="https://serverb.com/dummy.any?parameter=crypted_username_and_date_using_the secret" style="display:none;" />
  • ServerBでは、dummy.any urlへのリクエストを受信すると、パラメータを復号化し、いくつかのチェックを行ってから、応答でcryptedcookieをユーザー名とともに含み。暗号化キーは共有シークレットにすることも、ServerBのプライベートシークレットにすることもできます。

  • ServerBでは、リクエストが内部ページ(iframe)に受信されたときに、Cookieが含まれている必要があります。Cookieが存在し、userXである場合、このまったく同じドメイン( https:// serverb )に設定されたものが存在し、5分の時間枠で問題がないとすると、ServerBは認証サブシステムを使用してプログラムでユーザーにログオンします(パスワードは提供されません)。 (認証サブシステムは、独自のCookieまたは何かを設定します。これは、私たちの観点では、うまくいけばブラックボックスです)

  • この後、ServerBはuserXに属する機密コンテンツを提供します。

私は開発者であり、セキュリティの専門家ではないことに注意してください。そのため、セキュリティホールを実装する前に質問します。

4
g.pickardou

これが答えになるかどうかはわかりませんが、コメントを入力するには多すぎます...

あなたが提案していることは、いくつかの仮定をもって、私には問題ないように見えます:

  • 共有シークレットは適切です。「test123」などはありません。
  • 使用する暗号は良いです。 ROT13なし;)
  • ユーザー名は大文字と小文字が区別され、明白に聞こえますが、ユーザーabcを登録し、ユーザーaBcの情報にアクセスすることを想像できます。

校長としてはうまくいくと思います。私が考えることができる唯一のことは、ユーザーがサーバーBに既に存在するサーバーAのアカウントを何らかの方法で登録できるかどうかですが、きっとあなたはそれを考えたと思います。

明らかに他のセキュリティ問題(サーバーのいずれかに脆弱性、通常のWeb攻撃など)がある場合、すべての賭けは無効になります。

1
Jay

私にとっての問題は、セッション管理がない場合、serverBへの要求がリプレイ攻撃を受けやすいことです。うまくいけば、サーバーとクライアント間のすべての通信は、認証だけでなくHTTPSを介して行われます(そうでない場合、これは大きなセキュリティ問題です)。これにより、傍受の可能性が減少します。ただし、トークンがリモートサーバーで有効になるまでに5分は非常に長い時間です。また、サーバーのクロックが同期していることを確認する必要があることも意味します。

Iframe URLで単一のタイムスタンプがあり、有効期限が切れるトークンを渡すだけの方が簡単ではないでしょうか?

別の解決策は、外部ページが要求されたときにserverAがserverBにワンタイムパスワードを要求し、それをiframeのURLに含めることです。しかし、これはそれほど簡単には拡張できません。

1
symcbean