私は、Amazon S3 REST 認証とほとんど同じように機能する REST 承認サービスを設計しました。これは、HTTP で動作するのに十分安全です (すべての相互通信を SSL で実行するためのオーバーヘッドを必要としません)。
署名はリクエストごとに変更され、有効期限があるため、十分に安全です。そのため、MITM (何も編集できないため、エンドポイントは同じ署名を再生成できません) やリプレイ攻撃 (タイムスタンプの使用のため) に対して安全です。
これは、秘密鍵を知っているすべてのクライアントにとって良いことであり、要求データを含む一意の署名を生成する独自のデータに対して要求されたアクションを実行できるようになりました。
承認サービスはトークンを生成せず (そのため、MITM 攻撃の対象となることはありません)、内部的にのみ呼び出されます。つまり、クライアントは、トークンを要求する代わりに、特定の操作を実行するために適切なエンドポイントに直接要求を実行します。そのサービス...その後、そのリクエストを受信したエンドポイントは、「ねえ、これは正当なリクエストですか?」と尋ねる認可サービスへのクエリを作成します。その場合、承認サービスは「200 OK」を返し、サービスは要求された操作を実行します。それ以外の場合は、「401 Unauthorized」を返します。
私が今必要としているのは、特別なクライアントである Web ユーザー インターフェイスが、ユーザーに電子メール/パスワードを使用してログインさせ、WebUI 自体を使用してデータを取得/編集できるようにすることです。webUI は HTTPS で実行されます。新しいアカウントを作成すると常に user/pwd ログインと pubkey/privatekey の両方が生成されることを考慮してください。ただし、実際には pubkey/privatekey のみを使用しています。ユーザーと pwd は、WebUI のみが使用するデータベース内に格納されますが、pubkey/privatekey は (別の DB を使用する) 承認サービス内に格納されます。
もちろん、顧客データを操作するには、WebUI がログに記録されたユーザー (署名を生成するための pubkey/privatekey に関連付けられたペアを持つ) 用に作成されたクライアントとして動作するようにする何らかの方法が必要です。これを行う最も安全な方法がわからないので、私が考えたいくつかの解決策を説明します。
私が考えた最初の解決策は、Web インターフェイスに独自の pubkey/privatekey を与えて実際のクライアントにし、承認サービスを編集してそれを認識し、公開鍵 (承認サービスで取得できる) を送信できるようにすることです。 "X-Forwarded-For" のようなヘッダー) を使用し、常に webUI 権限を信頼します。しかし、どういうわけか、この権限を悪用して権限のないデータを取得する攻撃につながる可能性のある何かを見逃しているのではないかと心配しています.
2 番目の解決策は、ログインに成功したら、pubkey/privatekey の両方を Authorization Service から WebUI に転送し、WebUI がそれをセッション内に保存し、アクションが実行されるたびにそのデータを使用して有効な署名を生成することです。しかし、私はこれらのデータをネットワーク経由で渡すのはあまり好きではありません (また、秘密鍵が傍受されるのを避けるために、この通信は少なくとも SSL 経由で行う必要があるため)。また、秘密鍵をセッション バックエンド内に保存するのも好きではありません。 .
私が考えた最後の解決策は、承認サービスを再考し、ユーザーとパスワードによる認証も許可することです (これは webUI 内に保存されるのではなく、承認サービス内で pubkey/privatekey と一緒に保存されます)。WebUI は電子メールとパスワードを通信する必要があるため、これには常に SSL 接続が必要ですが、正しくログに記録された場合、作成されたセッション内にそれらのデータしか保存できません。もう 1 つの副作用は、署名メソッドを使用する代わりに user/pwd を使用するように他のサービスを実装できることです。これは、HTTP を介してデータを世界中に公開することを意味します。
アーキテクチャ全体がクライアントサーバーベースで動作すると考えられているため、webUI をクライアントとして機能させる、最強でより論理的なソリューションが必要です。ここに記載されていない他の提案も受け入れることができます。
私を助けるためにもっと知る必要があるかどうか教えてください。
ありがとうございます (投稿全体を読んだ場合:-P)