web-dev-qa-db-ja.com

マイクロサービスでの特権昇格に対する強化

次のシナリオを検討してください。

  • システムには一連のビジネスオーナー(つまり、システムのユーザー)がいます
  • 各事業主は一連の顧客にマッピングされます
  • 事業主は、顧客を管理するためにシステムにログインします。

事業主は最初に単一の顧客を選択し、それ以降、彼のセッションは選択された顧客にバインドされます。

私は一連のマイクロサービスを持っており、それぞれが処理のためにCustomer-IDを必要とします。つまり.

  • マイクロサービスAはGET /resource-a/{customer-id}を公開します
  • マイクロサービスBはPOST /resource-b/{customer-id}を公開します
  • 等.

Customer-Idは機密情報と見なされるため、暗号化された形式になります。

ただし、それでもprivilege-escalationに対して脆弱です。つまり、あるビジネスオーナーが、暗号化された顧客IDをブックマークなどを介して誤って共有し、ビジネスオーナーが自分にマップされていない顧客の詳細にアクセスする可能性があります。 (正確には特権昇格ではありませんか?)

  • 動作が遅いことがわかっており、APIの90%がこの承認プロセスを繰り返さなければならないため、ビジネスオーナーに対するcustomer-idのサーバー側承認を避けたいと思います。
  • すべてのマイクロサービスはステートレスであるため、セッションIDをキーとしてCustomer-Idを暗号化することはできません(ステートフルマイクロサービス/セッションがないため)
  • また、このようなビジネスロジックを実行することを目的としていないため、ゲートウェイでこの承認を行うことはお勧めできません。

この状況で特権の昇格を防ぐにはどうすればよいですか?

1
Fahim Farook

サーバー側でこれを実行したくないことを考えると、他に2つの可能性しかありません。

  • security through obscurityを使用し、ユーザー向けにCustomer-Idを公開しないでください(アドレスバー、UI、ブラウザーの履歴などに表示されるアクション)。これによって問題が修正されることはなく、専用の攻撃者から保護されることもありません。ある程度は効くかもしれませんが。
  • ユーザーセッションを生成するには、ステートレス自己完結型トークン(JWTなど)を使用します。そして、そのユーザーにバインドされているすべてのcustomer-id'sをトークン自体に保存します。次に、サーバー側でセッショントークンを確認すると、同時に認証も取得されます。これは、パフォーマンスにまったくコストがかかりません。ただし、ユーザーにcustomer-idsが大量にバインドされていない場合にのみ、ソリューションとして機能する可能性があります(明らかに、トークンにDB全体を含めたくない場合)。
2
Trim Kadriu