web-dev-qa-db-ja.com

サーバー間の通信におけるOauth2とAPIKey

サードパーティのサービスプロバイダーが、バックエンドに統合する必要がある支払いAPIを公開しています。
トランスポート通信として、クライアント証明書付きのTLSを使用し、MPLSプライベートネットワーク経由でこのAPIを使用します。

認証フレームワークとして、サードパーティはOauth2を提案しています。
代わりに、APIKey/ClientSecretのような「より簡単な」認証を提案しています。
なぜ?
私の「制限された」経験から、このシナリオでOauth2を使用しても何のメリットも見られないためです。

  • APIは、バックエンドで使用される単一のサービスユーザーによって消費されます。
  • 承認のレベルはありません(クレームなし)。
  • Oauth2では、資格情報を保護するために、それらを使用してアクセストークンを取得し、それを使用してAPIに対して認証します。このシナリオでは、資格情報は個人の資格情報ではなく、サードパーティのAPIプロバイダーによって提供される単一のサービスの資格情報です。それらを漏らすことは、私の観点からは、APIKeyを漏らすようなものです。
  • セキュリティ違反が発生した場合は、APIKeyを取り消す必要があります。 Oauth2を使用している場合は、更新トークンを取り消して、許可されたアクセストークンを引き続き有効にする必要があります。
  • これにより、Oauth2プロトコルによって課されるすべての前後を処理するために、いくつかのユーティリティライブラリ(Restsharpに基づく)およびデータベーステーブルを作成する必要があります。他のプロジェクトで見たのは、同時アクセスの場合にこのライブラリを「同期」する必要があることです。

おそらく私はいくつかの重要なポイントを見逃しており、私の単純化は支払いAPIのような重要なサービスでは認められません。
あなたの経験では、この特定のシナリオでは、Oauth2には「基本認証」よりもいくつかの利点がありますか?

14
systempuntoout

APIキー/クライアントシークレットは、サービス間の通信にとってより意味があります。これは、私が収集するもの(APIサービスへのバックエンド)からのシナリオのようです。

とはいえ、OAuth 2には クライアント資格情報付与フロー があります。これは、ある種のAPIキー/クライアントシークレット/証明書ベースの認証を実行できます-サードパーティに確認してくださいプロバイダーがサポートしているかどうかを確認します。

通常OAuth 2は 認証コード付与フロー に関連付けられています。これは、ユーザーエージェントがブラウザーである場合に適しています。サービス間のサービス。

3
HTLee

これは興味深いトピックであり、考慮すべき点がいくつかあります。まず、 just コンシューマーではなく、APIプロバイダーからアクセスする必要があります。

WHO?

主な考慮事項は、認証と「ID」および権限です。復習:

  • アイデンティティ=誰があなたを言う
  • 認証=本当のあなた
  • 権限=できること

API IDと権限の詳細については、こちら post をご覧ください。

この場合、権限は暗黙的である可能性がありますが(認証されているため、APIを使用できます)、これを考慮してください:機密性の支払いが必要なレベルのサービスへのAPIのプロバイダーとして、私は know consumer is who who are the are]であることを確認します。

APIキーを渡しても、APIキーを持っていることが確認されるだけで、APIへのアクセスが承認されていることは証明されません。

現在、OAuthアクセストークンを所有している場合、最初は同じように表示されますが、OAuth [〜#〜] rfc [〜#〜] 状態

許可サーバーは、可能な限りクライアントを認証する必要があります。

OAuthは、先ほど述べたように、登録済みのリダイレクトURIとともに更新トークンを提供することでこれを可能にします。また、すべての初期リクエストと再認証リクエストに対して、最小スコープのトークンを提案します。

これにより、APIプロバイダーははるかに制御しやすくなり、可視性が高まり、APIが侵害されていないという確信が高まります。

また、OAuthは権限でうまく機能します。支払いゲートウェイ会社がGETおよびPOSTへのアクセス許可を要求するように認証を拡張することを決定した場合、これは、キーをアクセス許可に関連付けようとする必要があった場合よりも、作業が少なく安全です。

曝露

2つ目の関連する考慮事項は、APIキーが公開された場合の対処です。

鍵を信頼できるようにしたいのですが、違反された可能性があります。したがって、クライアントIPもホワイトリストに登録します...構成によってはIPが変更される可能性があり、偽装される可能性もあります...キーが悪用されているかどうかを知るにはどうすればよいですか?

APIキーが違反後に再発行された場合、最初のキーがわかっていれば、誰かが新しいキーの可能性を判断しやすくなります。つまり、プロバイダーのキー生成アルゴリズムも調整する必要がある場合があります。

何らかの方法で公開されたアクセストークンが発行された場合、それが更新のために表示されると、権限のないユーザーが再承認されることはありません。私はそれらをログに記録して、この誤った要求をログに記録し、コンシューマーと協力して根本原因を診断できます。

概要

APIキーは、IDの form として機能することのみを目的としていました。そのため、基本的なセキュリティ対策として実装した場合、基本的に誤用されます。

APIコンシューマーを認証する必要がある場合-APIの呼び出し元を検証し、その検証に基づいて特定のリソースへのアクセスを提供する必要がある場合-OAuthがより良い選択です。

お役に立てれば!


[〜#〜] nb [〜#〜]議論のために、内部サービスまたはネットワークへのrootアクセス権を持つ人は誰もいないと仮定しました。すべての有線通信はHTTPSを介しています。

7
llorrac

はい、そうです、それが起こる可能性があります。リプレイ攻撃は非常に一般的ですが、非常に安全に実装する方法があります。サーバーは必ずIPモニタリングを使用する必要があります。つまり、トークンが発行されると、特定のIPのみが許可されますが、内部から侵入が可能になるため問題は解決しません。 2番目の方法は、有効期限を最小化することで、曝露リスクを絞り込みます。最後に、常にWebSocketsが存在します。通常、リクエストごとに新しいトークンを発行するのに十分な速度で同期します。これにより、ほとんどのリスクが排除されます。これは、ビジネスで使用する場合、xポートにのみアクセスできる専用のVLANで使用するためです。 ...など

結局のところ、必要に応じてそれを完全に防護することができます。特に、マシンでルート証明書が危険にさらされている場合は、MITM攻撃に耐えることはできません。

1
JsEveryDay