前提:
-2つのサービスAおよびB
-リソースXには所有者Uがいて、サービスBによって管理されています
今、私はこれらの認証シナリオを処理する必要があります:
1-エンドユーザーは、サービスBのAPIを直接使用してXにアクセスする必要があります
2-エンドユーザーがA(つまり、委任)を呼び出したため、サービスAはXにアクセスする必要があります
3-非同期通信(ジョブやイベントなど)の一部として、サービスAはXにアクセスする必要があります(エンドユーザーは関与しません)
私は多くのことを調査してきましたが(1か月後)、それでも混乱しています。たとえば、oauth/jwtとKongの統合を検討しましたが、上記の#3がどのように適合するかは明確ではありませんでした。 IstioはサービスにIDを割り当てることができるため、理想的です。
Istioを使用する場合:
-アプリケーション(AとBの両方)がauthのどの部分を担当しますか?
-アプリケーションへの最終的な(HTTP)リクエストは、おおよそのように見えますか?
確認したオプションは、承認に [〜#〜] jwt [〜#〜] トークンを使用します(ほとんどの場合)。トークンには、1つのサービスが意思決定を行うために必要なすべてのIDとロール情報が含まれています。 bearer
ヘッダーのAuthorization
トークンとして渡されます。トークン自体は署名されているので、エンドユーザーはハッキングしてより多くの特権を取得することはできません。また、トークンが定期的に期限切れになるようにタイムアウトがあります。
つまり、WebサービスがIDを別のサービスに委任する必要がある場合は、トークンをその要求に埋め込むだけです。また、APIプロキシの委任に耐える認証の形式であることも意味します。
最後のケースでは、k8sシークレットを使用して認証トークンを提供し、ジョブがセッショントークンをネゴシエートしてその役割を実行できます。うまくいけば、システムにアクセスしているすべてのコードのIDを確実に識別および検証できます。私が管理するシステムでは、非同期ジョブは他のクライアントと同じようにJWTトークンをネゴシエートする必要があります。
私のアプローチが非常に安全かどうかはわかりませんが、認証サーバーを使用しています。つまり、すべてのリクエストにはJWT(前述のAuthorizationヘッダー)が付いています。要求を受信する各サービスは、トークンに問題がないかどうかを認証サーバー(http呼び出し)に尋ね、問題がない場合はトークンに要求に応答します。
サービスは独自のトークンを生成できますが、それらが侵害された場合に、それらが永久に侵害されるリスクがない場合は、必ず期限切れにしてください。
イベントがどのように承認されるか。それはあなたが使っているツールに依存すると思います。 F.e. https://developer.ibm.com/technologies/messaging/tutorials/kafka-authn-authz/ 。
いずれの場合でも、ファイアウォールの背後にサービスがあるだけの場合は、サービス間の通信に認証を使用しないことを検討してください。したがって、基本的にはデプロイメントドメインでこの問題を解決できます;)。
JWTを使用したOauthは、クライアントの認証で機能します。しかし内部的には、各サービスにIDを与える方法が必要でした。
SPIFFEはこの目的で存在し、サービスメッシュによって実装されます(例:mTLSを使用するKubernetesのistio)