ここで私が興味を持っている特定のユースケースは、パブリックに利用可能なサーバーエンドポイント(パブリックREST APIなど)に対するRESTクライアントの認証です。
ここで最も簡単な解決策は、Basic Authです。しかし、ほとんどすべての状況でOAuth2が優れた認証ソリューションとして宣伝されているとよく耳にします。
問題は、RESTサーバーに対して認証を行うRESTクライアントが実行できるonlyOAuth2付与タイプは Resource Owner Password Credentials(ROPC) 、これは、コードの付与と暗黙の付与では、ユーザーがログインして、認証サーバーによってホストされるクライアントアプリを手動で承認します。
ROPCが機能する方法は、リソース所有者のユーザー名/パスワードとクライアントIDをquery string params?!?として送信することです。これはベーシック認証よりも安全性が低く(IMHO)、資格情報を少なくともbase-64でエンコードし、TLSで暗号化できるヘッダー内に送信します!
だから私は尋ねます:パブリックREST APIのコンテキストでは、OAuth2 ROPCは本当に基本認証より優れていますか? OAuth2 ROPCよりも安全なものは何ですか?
私は この優れた記事 を読んだだけで、Amazonの非OAuth2ベースのREST AWSのセキュリティについて説明しています。これは基本的に、秘密鍵ベースのソリューションであり、各RESTリクエストのハッシュが生成され、通常の(暗号化されていない)リクエストと並んでサイドカーとして送信されます。クライアントとサーバーだけが秘密鍵を知っているため、サーバーが要求を受信すると(ここでも、通常の要求+ハッシュされた要求を含みます)、サーバーはクライアントの秘密鍵を検索し、同じハッシュを通常の要求に適用します。次に、2つのハッシュを比較します。
これは、OAuth2のROPCよりもはるかに複雑で複雑で安全に聞こえます!何かが欠けていない限りmajorここでは、OAuth2 ROPCはclient_id
、username
およびpassword
をクエリ文字列paramsとして送信しています...まったく安全ではありません!このHMAC /ハッシュベースのソリューションは、はるかに印象的で安全なようです。
問題は、その記事の作者でさえ次のように述べていることです。
また、ある時点でOAuthを実装する必要があることをゆっくりと認識して受け入れます...
Ba-ba-bwhat?!?!もしOAuth2がこの賢いHMAC /ハッシュより安全でない場合ベースのソリューション、なぜこの記事の作成者はOAuthをいつか採用する必要があると感じているのですか?私は困惑している。
あなたの質問に対する答えは、コードレベル、プロトコルレベル、またはアーキテクチャレベルにすることができます。ここでは、プロトコルレベルの問題のほとんどを要約しようと思います。これは、通常、賛否両論の分析において重要であるためです。 OAuth2 は Resource Owner Password Credentials よりもはるかに大きいことに注意してください。これは、仕様によると、「レガシーまたは移行の理由」のために存在し、「他よりも高いリスクと見なされます」許可タイプ」と仕様では、クライアントと承認サーバーが「この許可タイプの使用を最小限に抑え、可能な限り他の許可タイプを利用する必要がある」(SHOULD)と明記されています。
基本認証よりもROPCを使用することには多くの利点がありますが、その前に、OAuth2と基本認証の基本的なプロトコルの違いを理解しましょう。これらを説明し、後でROPCに来るので、ご容赦ください。
ユーザー認証フロー
OAuth2仕様では4つの役割が定義されています。例では、次のとおりです。
クライアントアプリケーションを実行すると、ユーザーに基づいてリソースへのアクセスが許可されます。ユーザーが管理者権限を持っている場合、REST APIでユーザーが利用できるリソースと操作は、管理者権限を持たないユーザーよりもはるかに多くなる可能性があります。
OAuth2では、複数のクライアントと複数のリソースで単一の承認サーバーを使用することもできます。例として、リソースサーバーはFacebookでのユーザーの認証を受け入れることができます(このような場合、承認サーバーとして機能できます)。したがって、ユーザーがアプリケーション(つまりクライアント)を実行すると、ユーザーはFacebookに送信されます。ユーザーがFacebookに資格情報を入力すると、クライアントはリソースサーバーに提示できる「トークン」を返します。リソースサーバーはトークンを確認し、Facebookが実際にトークンを発行したことを確認してからトークンを受け入れ、ユーザーがリソースにアクセスできるようにします。この場合、クライアントはユーザーの資格情報(つまり、Facebookの資格情報)を見ることはありません。
しかし、すでにクライアントにトークンを付与しているFacebookの代わりに、ユーザーのIDを管理している(そして承認サーバーを持っている)としましょう。ここで、パートナーもいて、そのアプリケーション(つまりクライアント)があなたのREST APIにアクセスできるようにします。基本認証(またはROPC)を使用すると、ユーザーはそれを承認サーバーに送信するクライアント。承認サーバーは、クライアントがリソースにアクセスするために使用できるトークンを提供します。残念ながら、これは、ユーザーの資格情報がそのクライアントにも表示されることを意味します。ただし、パートナーのアプリケーション(組織の外部にある可能性がある)にユーザーのパスワードさえ知らせたい。これは今やセキュリティの問題です。その目標を達成するために、次のような別のフロー(認証コード付与など)を使用する必要があります。ユーザーは認証サーバーに資格情報を直接提供します。
したがって、OAuth2を使用すると、そのような場合はROPCを使用せず、認証コードフローなどの別のケースを使用するのが理想的です。これにより、アプリケーションは、承認サーバーにのみ提示されるユーザーの資格情報を知ることから保護されます。したがって、ユーザーの資格情報が漏洩することはありません。基本認証でも同じ問題が当てはまりますが、次のセクションでは、クライアントによる永続的なアクセスのためにユーザーの資格情報をクライアントがROPCに保存する必要がないため、ROPCがいかに優れているかを説明します。
ユーザーが承認サーバーにアクセスすると、承認サーバーはユーザーに、クライアントが自分に代わってリソースにアクセスすることを許可するかどうかを確認するよう要求することもできます。そのため、クライアントにリソースへのアクセスを許可するプロセスが含まれているため、許可サーバーと呼ばれます。ユーザーがクライアントを承認しない場合、クライアントはリソースにアクセスできません。同様に、ユーザー自身がリソースにアクセスできない場合でも、認証サーバーはアクセスを拒否してトークンを発行できません。
基本認証では、承認サーバーとリソースサーバーも1つのエンティティに結合されます。したがって、リソースサーバーはユーザーを承認する必要があるため、クライアントから資格情報を要求します。クライアントは、リソースサーバーがユーザーを認証するために使用する資格情報を提供します。つまり、複数のリソースサーバーは基本的にユーザーからの資格情報を必要とします。
トークン発行
クライアントは認証サーバーからトークンを取得し、それらを保持し、それらを使用してリソースにアクセスします(トークン自体の詳細は以下を参照)。クライアントはユーザーのパスワードを(ROPC以外のフローで)知ることはなく、それを保存する必要はありません。 ROPCでは、クライアントがユーザーのパスワードを知っていても、これらのトークンを使用してリソースにアクセスするため、クライアントはパスワードを保存する必要はありません。対照的に、基本認証では、クライアントがユーザーにすべてのセッションで資格情報を提供することを望まない場合、クライアントはユーザーのパスワードを保存して、次回から提供できるようにする必要があります。これは、クライアントがWebアプリケーションのみである場合を除き、基本認証を使用する場合の主な欠点です。この場合、Cookieはこれらの懸念のいくつかに対処できます。ネイティブアプリケーションでは、これは通常オプションではありません。
OAuth2には、トークンが発行されて機能する方法に伴う別の側面があります。ユーザーが認証サーバーに認証情報を提供すると(ROPCでも)、認証サーバーは、1)アクセストークンと2)更新トークンの2種類のトークンの1つ以上を提供できます。
アクセストークンはリソースサーバーに送信され、リソースサーバーは検証後にリソースへのアクセスを許可します。通常、それらのライフタイムは短いです。 1時間。更新トークンは、クライアントによって承認サーバーに送信され、期限切れになると別のアクセストークンを取得します。通常、有効期間は長くなります(数日から数か月、さらには数年)。
クライアントがリソースサーバーにアクセストークンを提供すると、クライアントはトークンを確認し、検証した後、トークン内を調べてアクセスを許可するかどうかを決定します。アクセストークンが有効である限り、クライアントはそれを使い続けることができます。ユーザーがアプリケーションを閉じて翌日それを開始し、アクセストークンが期限切れになったとします。これで、クライアントは承認サーバーを呼び出し、有効期限が切れていないことを想定して更新トークンを提示します。認可サーバーはすでにトークンを発行しているため、トークンを検証し、ユーザーが資格情報を再度提供する必要がないことを確認して、クライアントに別のアクセストークンを付与します。これで、クライアントはリソースサーバーに再びアクセスできるようになります。これは、通常、FacebookおよびTwitterのクライアントアプリケーションが資格情報を一度要求し、ユーザーが資格情報を再度提供する必要がないようにする方法です。これらのアプリケーションは、ユーザーの資格情報を知る必要はありませんが、ユーザーがアプリケーションを起動するたびにリソースにアクセスできます。
これで、ユーザーは認証サーバー(Facebookユーザープロファイルなど)にアクセスし、クライアントアプリケーションに影響を与えることなくパスワードを変更できます。それらはすべて適切に機能し続けます。ユーザーがリフレッシュトークンを含むアプリケーションをすでに持っているデバイスを紛失した場合、ユーザーは認証サーバー(Facebookなど)に、既存のアプリケーションを承認しないことで認証サーバー(Facebook)が実行するアプリケーションから「ログアウト」するように指示できます。トークンを更新し、ユーザーがそれらのアプリケーションを介してリソースにアクセスしようとしたときに、資格情報を再度提供するようユーザーに強制する.
[〜#〜] jwt [〜#〜] は、OAuth2およびOpenID Connectで通常使用される単純なトークン形式です。トークンに署名してそれを検証する方法は、さらに別のソリューションを実装するすべてのリソースサーバーの代わりに、それらに利用可能なライブラリで標準化されています。したがって、その利点は、吟味され、引き続きサポートされているコードの再利用性にあります。
セキュリティへの影響
上記のシナリオのいずれかが画像にある場合、基本認証は弱くなります。また、実装の一般的な脆弱性を回避するためにその提案を使用できる開発者が利用できる広範な OAuth2の脅威モデル も利用できます。脅威モデルを通過すると、多くの実装関連の脆弱性(オープンリダイレクタやCSRFなど)もカバーされていることがわかります。この応答では、これらを基本認証と比較することはしませんでした。
OAuth2の最後の主な利点は、プロトコルが標準化され、複数の承認サーバー、クライアント、およびリソースサーバーがそれを尊重することです。開発者は多数のライブラリを使用できます。これらのライブラリは、セキュリティの問題が実装で見つかるように維持されているため、相互運用性を維持しながらライブラリが更新されます。
結論
新しいアプリケーションIMOを作成している場合、理想的なケースは、基本認証とROPCの両方に固有の問題があるため、それらを回避することです。ただし、アプリケーションごとにニーズ、タイムライン、開発者の熟練度などが異なるため、ケースバイケースで決定します。しかし、基本認証以上の必要性がなかったとしても、それを選択することで、拡張が容易でない可能性のあるアーキテクチャに身を固めることができます(たとえば、将来複数のサーバーがある場合、必ずしも必要ではないでしょう)ユーザーは、認証サーバーに1回だけ提供するのではなく、それぞれに資格情報を提供します。これにより、トークンを渡すことができます。
資格情報はTLSや類似のプロトコル、または所有証明などを使用して保護できるため、資格情報がネットワーク経由で送信される方法についてのコメントには触れなかったことに注意してください。誰かがすでに示唆したように、base 64エンコーディングは0のセキュリティなので、しないでください。だまされる。上記の違いは通常、アーキテクチャレベルにあります。したがって、実装したアーキテクチャを変更するのが最も難しいため、ここで焦点を当てています。
Azure Active Directory B2C Basic 、私が取り組んでおり、最近パブリックプレビュー用にリリースされたサービスです。サードパーティのアプリケーションが、ソーシャルIDP(Facebook、Googleなど)と相互運用できる承認サーバーとしてAADを使用できます。等。)。また、ソーシャルIDPを使用する代わりに、ユーザーが自分のアカウントを作成することもできます。これらのアカウントは、後で認証の目的で使用できます。そのような他のサービスもいくつかあります(たとえば、私が知っている別のサービスは auth です)。これは、開発者がアプリケーションとリソースの認証とユーザー管理を完全に外部委託するために使用できます。開発者は、上記で説明したのと同じプロトコル特性を使用して、承認サーバー(AAD)、リソース(たとえば、REST API))、クライアント(たとえば、モバイルアプリケーション)、およびユーザーを分離します。この説明がある程度役に立てば幸いです。
基本認証は、REST APIを保護するための良い方法ではありません。理由を説明しました この回答で 。
REST APIを作成すると、OAuth2用語で resource server を実装します。APIが行う必要があるのは、トークンが Authorization HTTP header は有効であり、信頼できる発行者からのものです。利用可能なライブラリがない場合に検証を実装する方法については、 this link を参照してください。
承認サーバーから クライアントがトークンを取得する の方法は、 クライアントの種類 によって異なります。クライアントを許可サーバーに登録するときに、使用するクライアントのタイプを指定する必要があることを覚えておいてください。
サーバーと通信するWebアプリケーションの場合、 認証コード付与 を使用できます。モバイルアプリケーションやJavaScriptアプリのような信頼されていないクライアントの場合は、 implicit grant を使用する必要があります。
リソース所有者とやり取りできないバックエンドサービスの場合は、 client credentials grant を使用できます。コマンドラインツールの場合、クライアントの資格情報または リソース所有者のパスワードの付与 を使用できます。
それはすべて、使用しているクライアントの種類によって異なります。
最後に、JWTトークンの検証は、承認サーバーと通信する必要なく、リソースサーバーで行われます。これにより、各クライアントのプライベートデータを検索する必要があるソリューションよりも優れたスケーラブルなアーキテクチャが実現します。
URLのGET変数に関する暗号化について誤った情報を持っていると思います
リクエストのGET変数を表示できるのは、元のコンピューターと受信サーバー( link )だけです。
HTTPSリクエストの送信先のドメインに基づくDNSルックアップのみが暗号化されません。それ以外、ポート、GET変数、リソースIDはすべて暗号化されます。
唯一の注意点は、受信側サーバーが完全な要求パスをログアウトする可能性があることですが、あなたはそれを制御できるため、適切と思われる方法でデータを保護できます。
安全か安全でないかのどちらかです。それ以上でもそれ以下でもありません。 base64を使用しても、基本認証(またはその他)の安全性は向上しません。
Httpsのような暗号化されたパイプを使用している場合、暗号化されていないものを送信しても問題はありません。
OAuth ありその他の機能。必要に応じて使用してください。その他、たとえば銀行は、基本的なチャレンジ/レスポンスを使用して問題なく安全です。
最初に用語を理解する必要があると思います。比較しています- Authorization と Digital signature
OAuthはAuthorizationのオープンスタンダードであり、Amazonが行っているように(質問で提供された記事と詳細に従って)、有効なデジタル署名を作成しています。受信者(ここではAmazon)は、メッセージが既知の送信者によって作成され、送信者がメッセージを送信したことを拒否できないという理由を与えます(認証と否認防止)
どの認証メカニズムを使用するかは、多かれ少なかれ、ユースケースに依存します。
以下は StackOverflow here で見つけられるものです:
必要な単一のヘッダーを計算するために非常に単純なハッシュを必要とする基本認証-OAuthは、間違いなく、より高価な認証です。2つの認証メカニズムがまったく異なるように機能することを認識することが重要です。目的。基本認証は、プライマリアプリケーションに対してクライアントを認証するためのものです。OAuthは、サードパーティがプライマリアプリケーションからクライアントデータにアクセスすることを許可するためのものです。どちらにも場所があり、どちらかを選択する必要があります。実装の特定のユースケースによって推進されます。
そして、これが別の 興味深い記事 で2つを比較しています。
SSL経由の基本認証は、単純化されたセキュリティの観点から、実際にはかなり責任があります。ユーザー名とパスワードをめぐって争う場合、基本認証は実装が非常に簡単であるため、普及しているソリューションです。資格情報の送信はSSLを介して暗号化され、「Authorization」ヘッダーの使用はHTTPクライアントおよびシステムの至る所にあります。