パブリックREST APIのOAuth2 ROPCと基本認証


21

ここで興味のある特定のユースケースは、公開されているサーバーエンドポイント(公開REST APIなど)に対してRESTクライアントを認証することです。

ここで最も簡単なソリューションは、基本認証です。しかし、ほとんどすべての状況において、OAuth2が優れた認証ソリューションとして宣伝されているとよく耳にします。

事は、あるのみ RESTサーバに対してRESTクライアント認証のために実現可能であるのOAuth2許可タイプがあるリソース所有者のパスワードの資格情報(ROPC)コード補助金と暗黙の補助金がため(認証サーバによってホストされている)UI / Webページを必要とするため、ログインしてクライアントアプリを手動で承認するユーザー。

ROPCが機能する方法は、リソース所有者のユーザー名/パスワードとクライアントIDをクエリ文字列パラメーターとして送信することです。これは、少なくともBase-64が資格情報をエンコードし、TLSで暗号化できるヘッダー内に送信するBasic Authよりも安全性が低い(IMHO)です!

だから私は尋ねる:パブリックREST APIのコンテキストでは、OAuth2 ROPCは本当に基本認証よりも優れていますか?OAuth2 ROPCより安全なものは何ですか?


更新

AmazonのAWS向けの非OAuth2ベースのRESTセキュリティを説明するこの素晴らしい記事を読んだところです。これは基本的に、各RESTリクエストのハッシュが生成され、通常の(暗号化されていない)リクエストと一緒にサイドカーとして送信される秘密鍵ベースのソリューションです。クライアントとサーバーのみが秘密鍵を知っているため、サーバーがリクエストを受信すると(再び、通常のリクエスト+ハッシュされたリクエストを含む)、サーバーはクライアントの秘密キーを検索し、同じハッシュを通常のリクエストに適用し、次に、2つのハッシュを比較します。

これは、OAuth2のROPCよりもはるかに複雑で、複雑で、安全に聞こえます!ここで重要何かを見逃していない限り、OAuth2 ROPCは単に送信client_idしてusernameおりpassword、クエリ文字列パラメーターとして...完全に完全に安全ではありません!このHMAC /ハッシュベースのソリューションは、はるかに印象的で安全なようです。

問題は、その記事の著者でさえ次のように述べていることです。

また、ある時点でOAuthを実装する必要があることをゆっくりと認識し、受け入れます。

バババウト?!?!OAuth2がこの賢いHMAC /ハッシュベースのソリューションよりも安全性低い場合、この記事の著者はなぜOAuthをいつか受け入れる必要があると感じるのでしょうか。私は困惑している。


どのようなクライアントについて話しているのですか?ほとんどのクライアントにはUIがあると思います。その場合、WebView(デスクトップ、モバイル)でOAuthログインページをロードするか、直接リダイレクト(Web)できます。UIを避ける必要がある理由がわかりません。
デサイクロン

@decycloneは質問の最初の文を読んでください!RESTサービスに対して認証するREST(ヘッドレスHTTP)クライアントについて取り上げています。
smeeb

私が尋ねている質問は、そのクライアントにUIがあるのか​​どうかです?たとえそれがなかったとしても、少なくとも認証のためにダイアログをポップアップするUIのない​​アプリケーションを見てきました。
デサイクロン

@decyclone純粋なRESTクライアントにはUIがまったくありませんが、通常UIはRESTサービスへの接続に純粋なRESTクライアントを使用します。1つのユースケースは、RESTクライアントを使用して(シェルで入力された)ユーザーコマンドをRESTサービスに送信するコマンドラインツールです。ここでは、シェルからUIをポップすることは受け入れられないソリューションです。
smeeb

1
ただし、コマンドライン/シェル以外にも多くのユースケースがあります。別のユースケースは、UIを持たず、UIを持たないバックエンドサーバーで実行されている可能性があるJava / Ruby / Pythonの純粋なREST / HTTPクライアントです。バックエンドサーバーは、RESTを介して別のバックエンドサーバーと通信する必要があります。ここで、バックエンドサーバー#1がバックエンドサーバー#2と通信する必要があるときにUIをポップするのは厄介でハッキングだけでなく、ログインページを表示するブラウザ/ UIクライアントがなく、人間がいない
smeeb

回答:


24

質問への答えは、コードレベル、プロトコルレベル、またはアーキテクチャレベルになります。プロトコルレベルの問題のほとんどをここで要約しようとします。これは、長所と短所の分析では通常重要だからです。ことを覚えておいてくださいのOAuth2がはるかよりもリソース所有者のパスワードの資格情報、仕様に従って、「レガシーまたは移行の理由」のために存在し、「他の助成金型より高いリスク」とみなされ、仕様が明示的に述べていること、クライアントと認証サーバ「この許可タイプの使用を最小限に抑え、可能な限り他の許可タイプを使用する必要があります」。

基本認証よりもROPCを使用することには多くの利点がありますが、その前に、OAuth2と基本認証の基本的なプロトコルの違いを理解しましょう。これらを説明し、後でROPCに来ますので、ご容赦ください。

ユーザー認証フロー

OAuth2仕様には4つの役割が定義されています。例は次のとおりです。

  1. リソース所有者:何らかのリソースへのアクセス権を持つユーザー。たとえば、あなたの場合、異なるユーザーはREST APIへの異なるアクセスレベルを持つことができます。
  2. クライアント:通常、ユーザーが使用しているアプリケーションであり、ユーザーにサービスを提供するためにリソースにアクセスする必要があります。
  3. リソースサーバー:ケースのREST API。そして
  4. 承認サーバー:ユーザーの資格情報が提示され、ユーザーを認証するサーバー。

クライアントアプリケーションが実行されると、ユーザーに基づいてリソースへのアクセスが許可されます。ユーザーに管理者権限がある場合、REST APIでユーザーが使用できるリソースと操作は、管理者権限のないユーザーよりもはるかに多くなる可能性があります。

OAuth2では、複数のクライアントで複数のリソースに対して単一の承認サーバーを使用することもできます。例として、リソースサーバーは、Facebookでのユーザーの認証を受け入れることができます(このような場合、承認サーバーとして機能できます)。したがって、ユーザーがアプリケーション(クライアント)を実行すると、ユーザーはFacebookに送信されます。ユーザーはFacebookで資格情報を入力すると、クライアントはリソースサーバーに提示できる「トークン」を取得します。リソースサーバーは、トークンを見て、Facebookが実際にトークンを発行したことを確認して受け入れ、ユーザーがリソースにアクセスできるようにします。この場合、クライアントはユーザーの資格情報(つまり、Facebookの資格情報)を見ることはありません。

ただし、Facebookの代わりにユーザーのIDを管理している(そして承認サーバーを持っている)としましょう。Facebookは既にクライアントにトークンを付与します。ここで、パートナーがいて、そのアプリケーション(クライアント)がREST APIにアクセスできるようにしたいとします。基本認証(またはROPC)を使用すると、ユーザーは認証サーバーに送信するクライアントに資格情報を提供します。認可サーバーは、クライアントがリソースにアクセスするために使用できるトークンを提供します。残念ながら、これはユーザーの資格情報がそのクライアントにも表示されることを意味します。ただし、パートナーのアプリケーション(組織の外部にいる可能性がある)がユーザーのパスワードを知っていることは望ましくありません。これは現在、セキュリティの問題です。その目標を達成するために、

したがって、OAuth2では、理想的にはそのような場合にROPCを使用せず、承認コードフローなどの別のROPCを使用します。これにより、承認サーバーにのみ提示されるユーザーの資格情報をアプリケーションが知ることができなくなります。したがって、ユーザーの資格情報は漏洩しません。基本認証でも同じ問題が当てはまりますが、次のセクションでは、クライアントによる永続的なアクセスのためにユーザーの資格情報をクライアントがROPCに保存する必要がないため、ROPCがどのように優れているかを説明します。

ユーザーが許可サーバーにアクセスするときに、許可サーバーはユーザーに依頼して、クライアントに代わってリソースへのアクセスを許可するかどうかを確認することもできます。そのため、クライアントがリソースにアクセスすることを承認するプロセスがプロセスに含まれるため、承認サーバーと呼ば れます。ユーザーがクライアントを承認しない場合、リソースにアクセスできません。同様に、ユーザー自身がリソースにアクセスできない場合でも、承認サーバーはアクセスを拒否し、トークンを発行できません。

基本認証では、承認サーバーとリソースサーバーも1つのエンティティに結合されます。したがって、リソースサーバーはユーザーを承認するため、クライアントに資格情報を要求します。クライアントは、リソースサーバーがユーザーの認証に使用する資格情報を提供します。これは、複数のリソースサーバーが基本的にユーザーからの資格情報を要求することを意味します。

トークン発行

クライアントは、認可サーバーからトークンを取得し、それらを保持し、それらを使用してリソースにアクセスします(トークン自体の詳細については以下を参照)。クライアントはユーザーのパスワードを(ROPC以外のフローで)決して知らないため、保存する必要はありません。ROPCでは、クライアントがユーザーのパスワードを知っていても、これらのトークンを使用してリソースにアクセスするため、パスワードを保存する必要はありません。対照的に、基本認証では、クライアントがすべてのセッションで資格情報を提供することをユーザーに望まない場合、クライアントは次回に提供できるようにユーザーのパスワードを保存する必要があります。これは、クライアントがWebアプリケーションのみである場合を除き、基本認証を使用することの大きな欠点です。その場合、Cookieはこれらの懸念の一部に対処できます。ネイティブアプリケーションでは、通常、これはオプションではありません。

OAuth2には、トークンがどのように発行され、どのように機能するかに伴うもう1つの側面があります。ユーザーが(ROPCであっても)認証サーバーに資格情報を提供すると、認証サーバーは、1)アクセストークン、および2)更新トークンの2種類のトークンの1つ以上を提供できます。

アクセストークンはリソースサーバーに送信され、リソースサーバーは検証後にリソースへのアクセスを許可します。通常、有効期間は1時間などです。更新トークンは、有効期限が切れたときに別のアクセストークンを取得するために、クライアントによって承認サーバーに送信され、通常は長い有効期間(たとえば、数日から数か月、さらには数年)を持ちます。

クライアントがアクセストークンをリソースサーバーに提供すると、クライアントはトークンを確認し、検証後、トークン内を確認してアクセスを許可するかどうかを決定します。アクセストークンが有効である限り、クライアントはそれを使用し続けることができます。ユーザーがアプリケーションを閉じて翌日に起動し、アクセストークンの有効期限が切れたとします。これで、クライアントは承認サーバーを呼び出し、有効期限が切れていないことを前提に更新トークンを提示します。認可サーバーはすでにトークンを発行しているため、それを検証し、ユーザーが再度資格情報を提供する必要がないことを判断し、クライアントに別のアクセストークンを提供します。これで、クライアントはリソースサーバーに再びアクセスできるようになります。これは通常、FacebookおよびTwitterのクライアントアプリケーションが資格情報を1回要求し、ユーザーが資格情報を再度入力する必要がない方法です。これらのアプリケーションは、ユーザーの資格情報を知る必要はありませんが、ユーザーがアプリケーションを起動するたびにリソースにアクセスできます。

これで、ユーザーは認証サーバーにアクセスして(Facebookユーザープロファイルなどで)、クライアントアプリケーションに影響を与えることなくパスワードを変更できます。それらはすべて正常に機能し続けます。ユーザーが既に更新トークン付きのアプリケーションを持っているデバイスを紛失した場合、承認サーバー(Facebookなど)に既存のアプリケーションを尊重しないことで達成するアプリケーションから「ログアウト」するよう承認サーバー(Facebookなど)に指示できます。トークンを更新し、ユーザーがこれらのアプリケーションを介してリソースにアクセスしようとしたときに、資格情報を再度入力するように強制します。

JWTは、OAuth2およびOpenID Connectで通常使用される単純なトークン形式です。トークンに署名して検証する方法も、すべてのリソースサーバーがさらに別のソリューションを実装する代わりに、利用可能なライブラリで標準化されています。したがって、利点は、吟味され、サポートされ続けているコードの再利用性にあります。

セキュリティへの影響

上記のシナリオのいずれかが図にある場合、基本認証は弱くなります。OAuth2の広範な脅威モデルもあり、その中の提案を使用して実装の一般的な脆弱性を回避できる開発者が利用できます。脅威モデルに目を通すと、実装に関連する多くの脆弱性(オープンリダイレクタやCSRFなど)もカバーされていることがわかります。この応答では、基本認証と比較しませんでした。

OAuth2の最後の主な利点は、プロトコルが標準化され、複数の承認サーバー、クライアント、およびリソースサーバーがそれを尊重することです。開発者は多数のライブラリを利用できます。これらのライブラリは、実装でセキュリティの問題が見つかった場合に維持されるため、相互運用性を確保しながらライブラリが更新されます。

結論

新しいアプリケーションIMOを作成している場合、固有の問題があるため、基本認証とROPCの両方を避けるのが理想的なケースです。ただし、アプリケーションごとにニーズ、タイムライン、開発者の習熟度などが異なるため、決定はケースバイケースです。しかし、基本認証以外の必要性がなくても、選択することで、簡単に拡張できないアーキテクチャに縛られる可能性があります(たとえば、将来複数のサーバーを使用する場合、必ずしも持つ必要はありません)ユーザーは資格情報を各自に提供します。認証サーバーに一度だけ提供するだけで、トークンなどを配布できます)

TLSまたは同様のプロトコル、または所有の証明などを使用して資格情報を保護できるため、資格情報がワイヤ経由で送信される方法についてのあなたのコメントには対処しなかったことに注意してください。それに惑わされます。上記の違いは、通常、アーキテクチャレベルにあります。したがって、アーキテクチャは実装後に変更するのが最も難しいため、ここで焦点を当てています。

私が取り組んでおり、最近公開プレビュー用にリリースされたAzure Active Directory B2C Basicは、サードパーティアプリケーションがAIDをソーシャルIDP(Facebook、Googleなど)との相互運用性を備えた承認サーバーとして使用できるようにします。また、ユーザーはソーシャルIDPを使用する代わりに独自のアカウントを作成でき、それらは後で認証目的に使用できます。他にもいくつかのサービスがあります(たとえば、私が知っている別のサービスは auth0です)開発者はこれを使用して、アプリケーションとリソースの認証とユーザー管理を完全に外部委託できます。上記で説明したのと同じプロトコル特性が開発者によって使用され、承認サーバー(AAD)、リソース(REST APIなど)、クライアント(モバイルアプリケーションなど)、ユーザーを分離します。この説明がいくらか役立つことを願っています。


広角に感謝しますが、これらの利点(a) letting the user agent hold just the token instead of the password, (b) allowing a password change without disrupting existing client apps, (c) allowing users log out other sessionsはトークン認証フローに固有のものではないと思います。基本認証もトークン認証も、仕様に関数(b)と(c)を記載していません。(b)と(c)の実装は、あらゆる種類の認証で可能と思われます。パスワード(できればハッシュ)を追跡する必要があります。利点(a)は、パスワードのより広い範囲に依存しているようです。
うなぎghEEz

ユーザー(リソース所有者)に外部認証サーバーの資格情報はないが、クライアントアプリケーションに資格情報がある場合、どのようにOAuthを使用できますか?つまり、リソース所有者(ユーザー)、クライアント(ユーザーを表し、ユーザーの資格情報も含む)、およびリソースサーバーがあります。リソースサーバーはどのようにユーザーを認証および承認できますか?
Arun Avanathan

3

URLのGET変数に関する暗号化について誤った情報を受け取っていると思います

リクエストでGET変数を表示できるのは、元のコンピューターと受信サーバー(link)だけです。

HTTPS要求の送信先ドメインに基づくDNSルックアップのみが暗号化されません。他のすべて、ポート、GET変数、リソースIDは暗号化されます。

唯一の注意点は、受信サーバーが完全な要求パスをログアウトする可能性があることですが、それを制御できるので、適切と思われるデータを保護できます。


3

基本認証は、REST APIを保護する良い方法ではありません。この答えでその理由を説明しました。

REST APIを構築するとき、OAuth2の用語でリソースサーバーを実装します。APIが行う必要があるのは、Authorization HTTPヘッダーのリクエストとともに渡されたトークンが有効であり、信頼できる発行者からのものであることを検証することだけです。使用可能なライブラリがない場合に検証を実装する手順については、このリンクを参照してください。

クライアントが認可サーバーからトークン取得する方法は、クライアントの種類によって異なります。クライアントを許可サーバーに登録するときに使用するクライアントのタイプを指定する必要があることに注意してください。

サーバーと通信するWebアプリケーションの場合、認証コードgrantを使用できます。モバイルアプリケーションやJavaScriptアプリのような信頼できないクライアントの場合、暗黙的なgrantを使用する必要があります。

リソース所有者と対話できないバックエンドサービスの場合、クライアント資格情報grantを使用できます。コマンドラインツールの場合、クライアントの資格情報またはリソース所有者のパスワード付与のいずれかを使用できます。

すべては、使用しているクライアントの種類によって異なります。

最後に、リソースサーバー上でJWTトークンの検証が行われ、承認サーバーと通信する必要はありません。これにより、各クライアントのプライベートデータを検索する必要があるソリューションよりも優れたスケーラブルなアーキテクチャが実現します。


1

安全か安全でないかのどちらかです。これ以上でもそれ以下でもありません。base64を使用しても、基本認証(またはその他)の安全性は向上しません。

Httpsのような暗号化されたパイプを使用している場合、暗号化されていないものを送信しても何も問題はありません。

OAuthにさらに機能があります。必要な場合は使用してください。銀行などのその他のものについては、基本的なチャレンジ/レスポンスを使用することは問題ありません。


0

最初に用語を理解する必要があると思います。あなたは比較しています- 承認デジタル署名

OAuthはAuthorizationのオープンスタンダードであり、Amazonが行うこと(質問で提供された記事と詳細による)は、受信者(ここではAmazon)がメッセージが既知の人によって作成されたと考える理由を与える有効なデジタル署名を作成する送信者、送信者がメッセージの送信を拒否できないこと(認証および否認防止)

どの承認メカニズムを使用するかは、ユースケースによって多少異なります。

以下はStackOverflowで見つけることができるものです

単一の必要なヘッダーを計算するために非常に単純なハッシュを必要とする基本認証-OAuthは間違いなくより高価な認証です。認識すべき重要なことは、2つの認証メカニズムがまったく異なる目的に役立つことです。基本認証は、クライアントをプライマリアプリケーションに対して認証するためのものです。OAuthは、サードパーティがプライマリアプリケーションからクライアントデータにアクセスすることを許可するためのものです。どちらにもそれぞれの位置があり、どちらかを選択することは、実装の特定のユースケースによって決定されるべきです。

そして、この2つを比較する別の興味深い記事があります。

SSL経由の基本認証は、実際には、単純化されたセキュリティの観点からかなり責任があります。ユーザー名とパスワードと競合する場合、基本認証は実装が非常に簡単なので一般的なソリューションです。資格情報の送信はSSLで暗号化され、HTTPクライアントおよびシステムでは「Authorization」ヘッダーの使用が広く普及しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.