OAuth 2は、セキュリティトークンを使用したリプレイ攻撃などからどのように保護しますか?


564

私が理解しているように、からユーザーの情報Site-Aにアクセスするために、OAuth 2では次の一連のイベントが発生します。Site-B

  1. Site-Aに登録しSite-B、シークレットとIDを取得します。
  2. ときにユーザーが伝えSite-AアクセスにSite-Bユーザーがに送信されSite-B、彼らが言うところSite-B、彼らが与えることでしょう実際に似ていることSite-A、特定の情報へのアクセス権を。
  3. Site-Bリダイレクトユーザーに戻ってSite-A認証コードと一緒に、。
  4. Site-A次にSite-B、セキュリティトークンと引き換えに、その認証コードとシークレットを渡します。
  5. Site-A次にSite-Bユーザーに代わって、リクエストとともにセキュリティトークンをバンドルしてリクエストを送信します。

セキュリティと暗号化の観点から、これらすべてはどのように機能しますか?OAuth 2は、セキュリティトークンを使用したリプレイ攻撃などからどのように保護しますか?


49
oauth2はここで簡単に説明されています:gist.github.com/mziwisky/10079157
Paolo

4
仕様を読んでください:tools.ietf.org/html/rfc6749それがいかに理解しやすいかに驚くかもしれません。悪くないかもしれませんが、それも正しいです。
Kris Vandermotten 2014年

1
この質問とその(現在の)回答はすべて、OAuth 2.0(つまりcode)の特定の「許可タイプ」に焦点を当てていますが、OAuth 2.0で定義されている他の許可タイプには、さまざまな使用例(ユーザーに関連しないものなど)に関連するものがあります。
Hans Z. 14

4
ああ、「サイトB」を「IdProviderサイト」のような読みやすいものに置き換えてみませんか?
ユーリィ

回答:


1378

OAuth 2.0が実際にどのように機能するか:

仕事に行く途中、オラフのベーカリーを運転していたとき、窓の中で最もおいしいドーナツが見えた。それで私は中に入って、「私はそのドーナツを持っていなければならない!」と要求しました。彼は「確かにそれは30ドルになるだろう」と言った。

ええ、知っています。ドーナツ1つにつき30ドルです。美味しい!突然、「いや、あなたにはドーナツがない」というシェフの叫び声が聞こえてきました。私は尋ねました:なぜですか?彼は銀行振込のみを受け入れると述べた。

マジ?うん、彼は真面目だった。すぐそこへ歩いて行ったところ、ドーナツが「食べて、美味しい…」と声をかけました。ドーナツからの注文に反対するのは誰ですか?私はオーケーと言った。

彼は自分の名前が書かれたメモ(ドーナツではなくシェフ)を私に渡しました:「オラフがあなたに送ったことを教えて」彼の名前はすでに記されていたので、それが何を言っているのかはわかりませんが、わかりました。

私は私の銀行に1時間半運転しました。紙幣を窓口に渡しました。私は彼女のオラフが私を送ったと言った。彼女は私にそれらのルックスの1つを与えました。

彼女は私のメモを取り、私のIDを尋ね、彼に与えるのにどれだけのお金が大丈夫か尋ねました。私は彼女に30ドルと伝えました。彼女は落書きをして私に別のメモを渡した。これにはたくさんの数字がありました、それが彼らがノートを追跡する方法だと思いました。

その時点で私は飢えています。私はそこから急いで出て、1時間半後に私は戻って、メモを伸ばしてオラフの前に立っていました。彼はそれを取り、それを見て、「私は戻ってきます」と言った。

私は彼が私のドーナツを手に入れていると思いました、しかし、30分後に私は疑わしくなり始めました。それで、カウンターの後ろの人に「オラフはどこ?」と尋ねました。彼は「彼はお金を得るために行きました」と言った。"どういう意味ですか?"。「彼は銀行にメモを取る」。

ええと...オラフは銀行が私に与えたメモを取り、銀行に戻って私の口座からお金を引き出しました。彼は銀行が私に与えたメモを持っていたので、銀行は彼が私が話している男だと知っていました、そして私が銀行と話したので彼らは彼に30ドルだけを与えることを知っていました。

私がそれを見上げるまでに、オラフは私の目の前に立っていて、ついにドーナツを手渡してくれたので、それを理解するには長い時間がかかったに違いありません。私が去る前に、「オラフ、いつもこの方法でドーナツを売っていましたか?」と尋ねなければなりませんでした。「いいえ、以前は別の方法でやっていました。」

ええと。車に戻ると、電話が鳴った。私はわざわざ答えなかった、それはおそらく私を解雇するようにという私の仕事でした、私の上司はそのような***です。その上、私がたった今行ったプロセスについて考えていた。

考えてみてください。オラフに口座情報を提供する必要なく、銀行口座から30ドルを引き出すことができました。そして、私はすでに銀行に30ドルしか取ることが許されないことを銀行に言ったので、彼があまりにも多くのお金を取り出すことを心配する必要はありませんでした。そして銀行は彼が私にオラフに与えるために与えたメモを持っていたので彼が正しい人であることを知っていました。

はい、ポケットから$ 30を渡したほうがいいでしょう。しかし、彼はそのメモを持っているので、私は銀行に彼に毎週30ドルをとるように言うことができ、それから私はパン屋に現れるだけでよく、もう銀行に行く必要はありませんでした。電話でドーナツを注文することもできます。

もちろん、私はそんなことは決してしません-そのドーナツは嫌なものでした。

このアプローチにはもっと幅広いアプリケーションがあるのだろうか。彼はこれが彼の2番目のアプローチであると述べました。私はそれをOlaf 2.0と呼ぶことができます。とにかく家に帰ったほうがいいです。新しい仕事を探し始めます。しかし、街のあちこちにある新しい場所からいちごのシェイクを手に入れる前に、そのドーナツの味を洗い流すために何かが必要です。


41
まあ、実際には、ドーナツを注文しなくても、オラフはいつでも好きなときにアカウントから$ 30を受け取ることができるはずです。興味深いことに、これが実際のoauth2.0シナリオの主な目標です:)これは確かに素晴らしい答えですが、これを読んでいる人は誰でも、Paoloが質問のコメントで述べたgit gistgist.github.com/mziwisky/)に進んでください10079157)。概念を明確にするための優れた補足資料。
Samiron 16

4
すばらしい答えですが、2ポイント引き上げる必要があります。1. @Samironが指摘したように、オラフはいつでも30ドルを受け取ることができます。2.実際のOAuth2.0シナリオでは、Olafは銀行からお金を取り出す前にドーナツを提供できません。この例では、彼は小切手を残しておいて、ルイスに自分の稼いだドーナツを渡すだけでした。したがって、例を変更して、私が知っているサードパーティから生地を取得することをオラフに許可する場合、オラフがドーナツを焼く前に生地を取得する必要があるので、より理にかなっています(孤独なドーナツオラフを想定)持っていたのは表示目的だけでした!)。
Ticker23

4
ticker23、ドーナツの話は残念ながらあなたの技術的な修正に勝っています-私がそれを読んだとき私はその話で売られました。それはホーマーシンプソンによって書かれました。
シェビー

4
@Prageeth Olafは、改ざんされた場合にインクが漏れる安全なボックス内の銀行との間で常にメモを運びます。メモを復元するには、多くの寿命が必要です。銀行はまた、最初の訪問時に顧客の指紋を採取します。オラフがベーキングアクシデントで指を失った場合、ルイスに銀行振込を再度セットアップするよう依頼する必要があり、銀行は次回ブレイキングブレッドのタトゥーでオラフを識別する必要があります。 。
クリス

11
私は次の人と同じくらいかわいい答えが大好きです、そして彼らのかわいいが答えをよりアクセシブルにするのに役立つとすごいです...しかし、結局のところ、Stack Overflowは人々を教育することであり、このかわいいストーリーはそれをしません。ドーナツのアナロジーを理解するには、OAuth2の仕組みをすでに理解している必要がありますが、答えの要点は、それを正確に説明することでした。このジョークを編集して、概念を実際に説明することを検討してください。最後に斜めに参照するだけでなく、冗談が1つまたは2つ犠牲になったとしても。
machineghost 2017

133

私が読んだことに基づいて、これはすべてがどのように機能するかです:

質問で概説されている一般的なフローは正しいです。ステップ2で、ユーザーXが認証され、サイトAがサイトBのユーザーXの情報にアクセスすることも許可します。ステップ4で、サイトはそのシークレットをサイトBに戻し、自身を認証し、認証コードを示します。 (ユーザーXのアクセストークン)が必要です。

全体として、OAuth 2は実際には非常にシンプルなセキュリティモデルであり、暗号化が直接作用することはありません。代わりに、シークレットとセキュリティトークンの両方が本質的にパスワードであり、すべてはhttps接続のセキュリティによってのみ保護されます。

OAuth 2には、セキュリティトークンまたはシークレットのリプレイ攻撃に対する保護機能がありません。代わりに、サイトBがこれらのアイテムに責任を持ち、それらを外に出さないこと、および転送中にhttps経由で送信されることに完全に依存しています(httpsはURLパラメーターを保護します)。

Authorization Codeステップの目的は単に便宜上のものであり、Authorization Code自体は特に重要ではありません。これは、サイトBにユーザーXのアクセストークンを要求するときに、サイトAのユーザーXのアクセストークンに共通の識別子を提供します。サイトB上のユーザーXのユーザーIDだけでは機能しませんでした。これは、同時に別のサイトに配布されるのを待っている未処理のアクセストークンが多数存在する可能性があるためです。


28
認証コードの重要な機能を見落としました。認証コードを交換するという追加の手順を実行する代わりに、更新トークン(セキュリティトークンと呼ばれるもの)をすぐに返さないのはなぜですか?更新トークンをキャプチャするとリプレイ攻撃が許可されるため、認証コードは1回しか使用できません。
モーリスナフタリン

3
OK、@ mauricen、それは理にかなっています...しかし、リプレイ攻撃はリフレッシュトークンでも同じように実行できませんでした。
ミケル氏2012

15
認証コードはユーザーを介して渡されるため、(たとえば)Cookieとして保存できます(stackoverflow.com/questions/4065657/…を参照)。更新トークンは2つのサイト間で直接渡されるため、脆弱性ははるかに少なくなります。
モーリスナフタリン

好奇心から、OAuthはプログラムが使用する一意の識別子を返しますか?たとえば、私は現在、ユーザーの識別にMACアドレスを使用していますが、それでも、MACは信頼性が低い/簡単にスプーフィングされるなどです。MACアドレス識別メカニズムを破棄して、ユーザーを一意に識別できる場合は、OAuthを実行します。
theGreenCabbage 14

1
この図では、tools.ietf.org / html / rfc6749#section-4.1に「シークレット」が表示されておらず、クライアント識別子(質問のID)のみが表示されていることに注意してください。なぜ秘密が重要であり、なぜそれがRFCに含まれていないのですか?また、質問には、クライアントID(A)の最初の送信で渡すことをお勧めするローカル状態と、XSSFから保護するための認証コードとともにクライアントへのリダイレクトもあります。
デビッドウィリアムズ

104

OAuthは、サードパーティのアプリが別のウェブサイトに保存されているデータに、アカウントとパスワードなしでアクセスできるプロトコルです。より公式の定義については、Wikiまたは仕様を参照してください。

以下にユースケースのデモを示します。

  1. LinkedInにログインして、Gmailの連絡先に含まれている友達を接続したいと考えています。LinkedInはこれをサポートしています。gmailから安全なリソース(私のGmail連絡先リスト)を要求します。だから私はこのボタンをクリックします:
    接続を追加

  2. アカウントとパスワードを入力すると、Webページがポップアップし、Gmailのログインページが表示されます。
    接続を追加

  3. 次に、Gmailで[同意する]をクリックする同意ページが表示されます。 接続を追加

  4. LinkedInがGmailの連絡先にアクセスできるようになりました。 接続を追加

以下は、上記の例のフローチャートです。

接続を追加

ステップ1:LinkedInはGmailの承認サーバーにトークンを要求します。

ステップ2:Gmail承認サーバーがリソースの所有者を認証し、ユーザーに同意ページを表示します。(ユーザーがまだログインしていない場合、ユーザーはGmailにログインする必要があります)

ステップ3:ユーザーがLinkedInにGmailデータへのアクセスをリクエストすることを許可します。

ステップ4:Gmail認証サーバーがアクセストークンで応答します。

ステップ5:LinkedInはこのアクセストークンでGmail APIを呼び出します。

ステップ6:アクセストークンが有効な場合、Gmailリソースサーバーは連絡先を返します。(トークンはGmailリソースサーバーによって確認されます)

OAuthの詳細については、こちらをご覧ください


すべての画像がなくなっています。それらをstack.imgurにロードできる可能性はありますか?
ChrisF

1
これはどのようにして正しいのでしょうか?このプロセスは、LinkedInではなく、ブラウザの前に座っているユーザーによって開始されたのではありません。しかし、あなたはそれをステップ3として持っています。これは私が得ないものです。
マット

17
最も簡単な説明。おかげで、私はドーナツを二度と購入しません
OverCoder

4番目のステップlinkedinは認証トークンで戻ります。これは、保護されたリソースにさらに使用できるアクセストークンと更新トークンを取得する5番目のステップで指定する必要があります。
amesh

おかげ@amesh、あなたはここで、認証コードの流れだと、正しい私はOAuthの2の基本的な考え方表示する簡略化された方法で述べた
オーウェン曹操

24

図1、RFC6750から抜粋

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

13

これがOauth 2.0の仕組みです。この記事で詳しく説明しています

ここに画像の説明を入力してください


Facebookやその他のサードパーティを使用せず、電話アプリで秘密鍵とTOTPトークンを使用してWebアプリを保護する場合、OAUTH2について説明できますか?
アルグラント

この例ではFacebookが認証サーバーで、クライアントにFacebook APIにアクセスできるようにアクセストークンを発行します。APIを保護する場合は、独自の承認サーバーを実装する必要があります。次に、アクセストークンを取得するために使用する付与タイプを決定します。あなたが正確に何を望んでいるか教えてください?説明します。
スラジュ2017年

SpringBootのセキュリティを設定することを検討しています。クライアント(電話)とwebappは、登録時にシークレットを交換します。次に、googleオーセンティケーターを使用して、パスワードに加えて、ログイン時に入力する時間/シークレットベースのコードを生成します。
アルグラント

私の最後のコメントはもうあなたを啓発しますか?Twitterの情報については私のプロフィールを参照してください
アルグラント

登録時にクライアントIDとシークレットを取得できます。次に、電話でクライアントIDを使用して、webapp(認証サーバー)にログインリクエストを送信します。WebアプリはクライアントIDを検証し、OTPを電話に送信します。電話は、クライアントシークレットを使用してwebappに別のリクエストを行い、OTPをアクセストークンと交換します。電話はこのaccssトークンを使用して、webapp上の保護されたリソースにアクセスします。これは、指定されたシナリオのOauth2フローになると思います。それがあなたを助けるかどうか私に知らせてください。
スラジュ2017

10

これは宝石です:

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

非常に簡単な要約:

OAuthは4つの役割を定義します。

  1. リソース所有者
  2. クライアント
  3. リソースサーバー
  4. 認可サーバー

あなた(リソース所有者)は携帯電話を持っています。複数の異なるメールアカウントがありますが、1つのアプリにすべてのメールアカウントが必要なため、切り替えを続ける必要はありません。したがって、GMail(クライアント)は、Yahooメール(リソースサーバー)へのアクセスを(Yahooの承認サーバー経由で)要求するので、GMailアプリケーションで両方のメールを読むことができます。

OAuthが存在する理由は、GMailがYahooのユーザー名とパスワードを保存することが安全でないためです。

ここに画像の説明を入力してください


8

他の答えは非常に詳細であり、OPによって提起された質問の大部分に対処します。

詳しく説明し、具体的にはOPの「OAuth 2はセキュリティトークンを使用したリプレイ攻撃などからどのように保護するのですか?」という質問に対処するため、OAuth 2の実装に関する公式の推奨事項には2つの追加の保護があります。

1)トークンには通常、短い有効期限があります(http://tools.ietf.org/html/rfc6819#section-5.1.5.3):

トークンの短い有効期限は、次の脅威に対する保護の手段です。

  • 再生...

2)トークンがサイトAで使用される場合、URLパラメーターとしてではなく、承認リクエストヘッダーフィールド(http://tools.ietf.org/html/rfc6750)で提示することが推奨されます。

クライアントは、「ベアラ」HTTP認可スキームで「認可」リクエストヘッダーフィールドを使用して、ベアラトークンで認証済みリクエストを作成する必要があります。...

「application / x-www-form-urlencoded」メソッドは、参加しているブラウザが「Authorization」リクエストヘッダーフィールドにアクセスできないアプリケーションコンテキスト以外では使用しないでください。...

URIクエリパラメータ...は現在の使用を文書化するために含まれています。セキュリティの欠陥のため、その使用は推奨されません


3

これはおそらく、4つの許可タイプすべて、つまりアプリがアクセストークンを取得できる4つの異なるフローでOAuth2がどのように機能するかを最も簡単に説明したものです。

類似点

すべての付与タイプのフローには2つの部分があります。

  • アクセストークンを取得
  • アクセストークンを使用

2番目の部分「アクセストークンの使用」はすべてのフローで同じです

各付与タイプのフロー「アクセストークン取得」の最初の部分は異なります。

ただし、一般に、「アクセストークンの取得」の部分は5つのステップで構成されます。

  1. アプリ(クライアント)をOAuthプロバイダー(Twitterなど)に事前登録して、クライアントID /シークレットを取得します
  2. クリックしたユーザーが認証を受けるためにOAuthプロバイダーにリダイレクトされるように、ページにクライアントIDと必要なスコープ/権限を含むソーシャルログインボタンを作成します
  3. OAuthプロバイダーは、アプリ(クライアント)に権限を付与するようユーザーに要求します
  4. OAuthプロバイダーはコードを発行します
  5. アプリ(クライアント)がアクセストークンを取得する

以下は、5つのステップに基づいて各付与タイプのフローがどのように異なるかを比較した並べた図です。

この図はhttps://blog.oauth.io/introduction-oauth2-flow-diagrams/からのものです

ここに画像の説明を入力してください

それぞれ、実装の難しさ、セキュリティ、およびユースケースのレベルが異なります。ニーズと状況に応じて、それらのいずれかを使用する必要があります。どちらを使用しますか?

クライアント資格情報:アプリが1人のユーザーのみにサービスを提供している場合

リソース所有者のパスワード資格情報:これは、ユーザーが自分の資格情報をアプリに渡す必要がある最後の手段としてのみ使用する必要があります。つまり、アプリはユーザーができるすべてのことを実行できます

認証コード:ユーザー認証を取得する最良の方法

暗黙:アプリがモバイルアプリまたはシングルページアプリの場合

選択の詳細については、こちらをご覧くださいhttps : //blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

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