OAuth 2, Güvenlik Simgesini kullanarak tekrar saldırıları gibi şeylere karşı nasıl koruma sağlar?


564

Anladığım kadarıyla, OAuth 2'de Kullanıcının bilgilerine Site-Aerişmek için aşağıdaki olaylar zinciri oluşur .Site-B

  1. Site-Akaydolur Site-Bve bir Sır ve Kimlik alır.
  2. Ne zaman Kullanıcı söyler Site-Aerişmek için Site-B, Kullanıcı gönderilir Site-Bonlar anlatmak nereye Site-Bonlar olur gerçekten gibi vermek için bu Site-Aözel bilgiler için izinleri.
  3. Site-Byönlendirmelerin Kullanıcı geri Site-Abir Yetkilendirme Kanunu ile birlikte.
  4. Site-Adaha sonra Site-BGüvenlik Kodu için Sırrı ile birlikte Yetkilendirme Kodunu geçirir .
  5. Site-Adaha sonra Güvenlik Simgesini isteklerle birlikte paketleyerek KullanıcıSite-B adına istekte bulunur.

Tüm bunlar güvenlik ve şifreleme açısından üst düzeyde nasıl çalışır? OAuth 2, Güvenlik Simgesini kullanarak tekrar saldırıları gibi şeylere karşı nasıl koruma sağlar?


49
oauth2 basitçe burada açıkladı: gist.github.com/mziwisky/10079157
Paolo

4
Spesifikasyonu okuyun: tools.ietf.org/html/rfc6749 Ne kadar anlaşılır olduğuna şaşırabilirsiniz. Aynı zamanda hangisinin çok kötü olmayabileceği de doğrudur.
Kris Vandermotten

1
Bu soru ve onun (şimdiki) yanıtları, OAuth 2.0'daki belirli bir "hibe türü" ne odaklanır (yani code), ancak OAuth 2.0'da tanımlanan ve farklı kullanım durumları (örn. Kullanıcı ile ilgili olmayanlar) ile ilgili başka hibe türleri vardır.
Hans Z.

4
"Site B" yi neden "IdProvider Site" gibi daha okunabilir bir şeyle değiştirmiyorsunuz?
Yurii

Yanıtlar:


1378

OAuth 2.0 gerçek hayatta nasıl çalışır:

Olaf'ın pastanesi tarafından pencerenin en lezzetli çörekini gördüğümde işe giderken sürüyordum - yani, şey çikolata iyiliği damlıyordu. Bu yüzden içeri girdim ve "O çörek olmalı!" Diye sordum. "Bunun 30 dolar olacağından emin" dedi.

Evet biliyorum, bir poğaça için 30 dolar! Lezzetli olmalı! Aniden şef "HAYIR! Sizin için hiçbir çörek" diye bağırdığını duyunca cüzdanım için ulaştım. Diye sordum: neden? Sadece banka havalelerini kabul ettiğini söyledi.

Ciddi anlamda? Evet, ciddiydi. Neredeyse orada yürüdüm, ama sonra çörek bana seslendi: "Ye beni, lezizim ...". Ben kim bir halka çörek emir itaat etmeyeceğim? Tamam dedim.

Bana üzerinde adı olan bir not verdi (şef değil, çörek): "Olaf'ın sana gönderdiğini söyle". Adı zaten nottaydı, bu yüzden bunun ne anlama geldiğini bilmiyorum, ama tamam.

Bankama bir buçuk saat sürdüm. Notu anlatan kişiye verdim; Ona Olaf'ın beni gönderdiğini söyledim. Bana "Ben okuyabiliyorum" diyen bu bakışlardan birini verdi.

Notumu aldı, kimliğimi istedi, bana ne kadar para verebileceğini sordu. Ona 30 dolar söyledim. Biraz karalama yaptı ve bana bir not daha verdi. Bunun üzerinde bir sürü rakam vardı, sanırım notları bu şekilde takip ediyorlar.

O noktada açlıktan ölüyorum. Oradan koştum, bir buçuk saat sonra geri döndüm, notum uzatılmış olarak Olaf'ın önünde durdum. Onu aldı, baktı ve "Geri döneceğim" dedi.

Donutumu aldığını sanıyordum, ama 30 dakika sonra şüphelenmeye başladım. Ben de tezgahın arkasındaki adama "Olaf nerede?" Diye sordum. "Para almaya gitti" dedi. "Ne demek istiyorsun?". "Bankaya not alıyor".

Hah ... Yani Olaf, bankanın bana verdiğini ve hesabımdan para almak için bankaya geri döndüğünü not etti. Bankanın bana verdiği notu aldığı için, banka onun bahsettiğim kişi olduğunu biliyordu ve banka ile konuştuğum için ona sadece 30 dolar vereceğini biliyorlardı.

Bunu anlamak uzun zaman almalıydı çünkü baktığımda Olaf nihayet bana donutumu teslim ederek önümde duruyordu . Ayrılmadan önce, "Olaf, hep bu şekilde çörek sattın mı?" Diye sormak zorunda kaldım. "Hayır, eskiden farklı yapardım."

Huh. Arabama geri dönerken telefonum çaldı. Cevap vermekten rahatsız olmadım, muhtemelen beni kovmak için işim buydu, patronum çok lanet olası. Ayrýca, az önce geçtiđim süreç hakkýnda düţünmüţtüm.

Demek istediğim: Olaf'ın hesap bilgilerimi vermek zorunda kalmadan Olaf'ın banka hesabımdan 30 dolar almasına izin verdim. Ve çok fazla para alacağından endişelenmem gerekmedi çünkü bankaya sadece 30 dolar almasına izin verildiğini söyledim. Ve banka onun doğru adam olduğunu biliyordu çünkü Olaf'a vermem için bana verdikleri notu almıştı.

Tamam, eminim ona cebimden 30 dolar vermeyi tercih ederim. Ama şimdi o bankaya her hafta 30 dolar almasına izin vermesini söyleyebildiğime göre, o zaman fırında görünebilirdim ve artık bankaya gitmek zorunda kalmadım. Hatta istersem telefonla çörek bile sipariş verebilirim.

Tabii ki bunu asla yapmam - o çörek iğrençti.

Bu yaklaşımın daha geniş uygulamalara sahip olup olmadığını merak ediyorum. Bunun ikinci yaklaşımı olduğunu söyledi, buna Olaf 2.0 diyebilirim. Her neyse eve dönsem iyi bir iş aramaya başlamalıyım. Ama bu çilek sarsıntılarından birini şehirdeki yeni yerden almadan önce, o çöreklerin tadını çıkarmak için bir şeye ihtiyacım yok.


41
Uygulamada Olaf, herhangi bir donut sipariş etmeseniz bile, istediği zaman hesabınızdan 30 $ alabilmelidir. İlginçtir, gerçek oauth2.0 senaryolarındaki ana hedef budur :) Bu kesinlikle harika bir cevaptır, ancak bunu kim okuyorsa, Paolo'nun soru yorumunda belirttiği git gistine gidin ( gist.github.com/mziwisky/ 10079157 ). Konsepti kristalleştirmek için iyi bir tamamlayıcı okuma.
Samiron

4
Büyük cevap ama yükseltmek için 2 puan: 1. @Samiron'un işaret ettiği gibi, Olaf istediği zaman 30 dolar alabilir. 2. Gerçek bir OAuth2.0 senaryosunda Olaf, bankadan para almadan önce çörek servis edemez. Bu örnekte iken, çekini koruyabilir ve Luis'e iyi kazanmış çörekini verebilirdi. Bu yüzden, bildiğim üçüncü bir partiden hamur elde etmek için Olaf'a yetki verdiğimi yapmak için örneği değiştirirsek, o zaman Olaf'ın çörek pişirmeye başlamadan önce hamur alması gerektiği için daha mantıklı olurdu (yalnız donut Olaf olduğunu varsayarak) sadece görüntüleme amaçlıydı!).
Ticker23

4
ticker23, donut hikayesi maalesef teknik düzeltmenizi yeniyor - Okuduğumda hikayede satıldım. Homer Simpson tarafından yazılmıştır.
shevy

4
@Prageeth Olaf, notu her zaman bankaya kurcalanırsa mürekkep sızdıran güvenli bir kutu içinde ve bankadan taşır, notun geri yüklenmesi uzun ömürlü olur. Banka ayrıca müşterilerinin ilk ziyaretlerinde parmak izlerini alır, Olaf bir fırın kazasında parmaklarını kaybederse, Luis'den banka havalesini tekrar ayarlamasını isteyecek ve bankanın Olaf'ı bir dahaki sefere Breaking Bread dövmesiyle tanımlaması gerekecek .
Chris

11
Sevimli cevapları bir sonraki kişi kadar seviyorum ve zekâları cevabı daha erişilebilir hale getirmeye yardımcı olduğunda bu harika ... ama günün sonunda Stack Overflow insanları eğitmekle ilgili ve bu sevimli hikaye bunu yapmıyor. Çörek benzetmesini bile anlamak için OAuth2'nin nasıl çalıştığını zaten anlamalısınız, ancak cevabın tüm amacının tam olarak bunu açıklamak olması gerekiyordu. Kavramları gerçekten açıklamak için lütfen bu (üstteki) cevabı düzenlemeyi düşünün, sadece sonunda bir eğik referansa başvurmayın ...
machineghost

133

Okuduğum şeye dayanarak, hepsi bu şekilde çalışır:

Soruda belirtilen genel akış doğrudur. 2. adımda, Kullanıcı X'in kimliği doğrulanır ve ayrıca Site A'nın Kullanıcı X'un Site B'deki bilgilerine erişimine izin verir. 4. adımda site, Kendisinin kimliğini ve Yetkilendirme Kodunu belirterek Site B'ye geri döner. (Kullanıcı X'in erişim belirteci) istiyor.

Genel olarak, OAuth 2 aslında çok basit bir güvenlik modelidir ve şifreleme asla doğrudan devreye girmez. Bunun yerine, hem Gizli hem de Güvenlik Simgesi esasen şifrelerdir ve her şey sadece https bağlantısının güvenliği ile güvence altına alınmıştır.

OAuth 2, Güvenlik Simgesinin veya Sırrının tekrar saldırılarına karşı hiçbir korumaya sahip değildir. Bunun yerine, tamamen Site B'nin bu öğelerden sorumlu olmasına ve bunların dışarı çıkmasına izin vermemesine ve geçiş sırasında https üzerinden gönderilmesine dayanır (https, URL parametrelerini koruyacaktır).

Yetkilendirme Kodu adımının amacı yalnızca kolaylık sağlamaktır ve Yetkilendirme Kodu kendi başına özellikle hassas değildir. Kullanıcı B'den Kullanıcı X'in erişim belirtecini sorarken, Kullanıcı X'un Site A için erişim belirteci için ortak bir tanımlayıcı sağlar. Yalnızca Kullanıcı X'un Site B'deki kullanıcı kimliği işe yaramazdı, çünkü aynı anda farklı sitelere dağıtılmayı bekleyen birçok olağanüstü erişim jetonu olabilir.


28
Yetkilendirme kodunun önemli bir işlevini gözden kaçırdınız. Yetkilendirme kodunu değiştirmek için fazladan bir adım atmak yerine, neden yenileme kodunu (Güvenlik Simgesi olarak adlandırırsınız) hemen geri vermiyorsunuz? Çünkü yenileme kodunu yakalamak tekrar saldırılarına izin verirken, yetkilendirme kodu yalnızca bir kez kullanılabilir.
Maurice Naftalin

3
Tamam, @mauricen, bu mantıklı .... Ama tekrar saldırısı yenileme jetonu ile de gerçekleşemedi, çünkü her istekte bu sonuç ortaya çıkıyor mu?
Bay Mikkél

15
Yetkilendirme kodu kullanıcı üzerinden geçirilir, bu nedenle (örneğin) bir çerez olarak saklanabilir (bkz. Stackoverflow.com/questions/4065657/… ). Yenileme belirteci doğrudan iki site arasında geçer, bu nedenle çok daha az savunmasızdır.
Maurice Naftalin

Meraktan, OAuth programın kullanması için benzersiz tanımlayıcılar döndürüyor mu? Örneğin, şu anda kullanıcı tanımlaması için MAC adresine güveniyorum, ancak bununla birlikte, MAC'ler güvenilir değil / kolaycaSpoofed / etc. Kullanıcıları benzersiz bir şekilde tanımlamama izin veriyorsa, MAC adres tanımlama mekanizmasını çıkarabilir ve OAuth'a gidebilirim.
theGreenCabbage

1
Bu şemaya dikkat edin: tools.ietf.org/html/rfc6749#section-4.1 "Gizli" nin gösterilmediğini, yalnızca İstemci Tanımlayıcısının (sorudaki ID) olduğunu unutmayın. Sır neden önemlidir ve RFC'ye neden dahil edilmemiştir? Ayrıca soruda, İstemci Kimliği'nin (A) ilk iletiminde geçirilmesi önerilen yerel durum ve XSSF'ye karşı koruma için yetkilendirme kodu ile birlikte istemciye yeniden yönlendirme de vardır.
David Williams

104

OAuth, 3 taraflı bir uygulamanın, hesabınız ve şifreniz olmadan başka bir web sitesinde depolanan verilerinize erişebileceği bir protokoldür. Daha resmi bir tanım için Wiki'ye veya spesifikasyona bakın.

İşte bir kullanım örneği demosu:

  1. LinkedIn'e giriş yapıyorum ve Gmail kişilerimdeki bazı arkadaşlarımı bağlamak istiyorum. LinkedIn bunu destekliyor. Gmail'den güvenli bir kaynak (gmail kişi listem) isteyecektir. Bu düğmeyi tıklıyorum:
    Bağlantı Ekle

  2. Bir web sayfası açılır ve hesabımı ve şifremi girdiğimde Gmail giriş sayfasını gösterir:
    Bağlantı Ekle

  3. Gmail daha sonra "Kabul Et" i tıkladığım bir onay sayfası gösterir: Bağlantı Ekle

  4. Artık LinkedIn Gmail'deki kişilerime erişebilir: Bağlantı Ekle

Aşağıda, yukarıdaki örneğin bir akış şeması bulunmaktadır:

Bağlantı Ekle

1. Adım: LinkedIn, Gmail'in Yetkilendirme Sunucusundan bir simge ister.

2. Adım: Gmail yetkilendirme sunucusu kaynak sahibinin kimliğini doğrular ve kullanıcıya onay sayfasını gösterir. (kullanıcının henüz giriş yapmadıysa Gmail’e giriş yapması gerekir)

3. Adım: Kullanıcı LinkedIn'in Gmail verilerine erişmesi için istekte bulunur.

4. Adım: Gmail yetkilendirme sunucusu bir erişim belirteciyle yanıt verir.

5. Adım: LinkedIn, bu erişim belirteciyle Gmail API'sını çağırır.

6. Adım: Erişim belirteci geçerliyse Gmail kaynak sunucusu kişilerinizi döndürür. (Simge Gmail kaynak sunucusu tarafından doğrulanacaktır)

OAuth hakkında daha fazla bilgiyi buradan edinebilirsiniz .


Tüm resimleriniz kayboldu. Herhangi bir şansı stack.imgur'a yükleyebilir misiniz?
ChrisF

1
Bu nasıl doğru olabilir? Bu işlem tarayıcının önünde oturan kullanıcı tarafından başlatılmaz, LinkedIn değil. Ama bunu 3. adımda var. Bunu elde edemiyorum.
Matt

17
En kolay açıklama. Teşekkürler, bir daha asla donut
almayacağım

4. adım Linkedin bir yetkilendirme belirteci ile döner. Bu, korumalı kaynaklar için daha fazla kullanılabilecek bir erişim belirteci ve bir yenileme belirteci alacağımız 5. adımda sağlanmalıdır.
amesh

@amesh Teşekkürler, haklısın, bu yetkilendirme kodu akışı, burada sadece OAuth 2'nin temel fikrini göstermek için basitleştirilmiş bir şekilde ifade ettim
Owen Cao

24

Şekil 1, RFC6750'den kaldırılmıştır :

     +--------+                               +---------------+
     |        |--(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

Bu makalede iyi anlatılan Oauth 2.0 böyle çalışır

resim açıklamasını buraya girin


OAUTH2'yi facebook veya diğer 3. tarafları kullanmama konusunda tarif edebilir, ancak web uygulamasını güvenli hale getirmek için telefon uygulamasıyla gizli anahtar ve TOTP belirteçleri kullanırsanız?
Al Grant

Facebook bu örnekte Facebook API'larına erişebilmeleri için herhangi bir istemciye erişim belirteci veren Yetkilendirme sunucusudur. API'larınızı korumak istiyorsanız, kendi Yetkilendirme sunucunuzu uygulamanız gerekir. Ardından, erişim belirteci almak için hangi Grant türünü kullanmak istediğinize karar verirsiniz. Bana tam olarak ne istediğini söyle? açıklar.
Suraj

Springboot güvenliği ile kuruluma bakıyorum. İstemci (telefon) ve web uygulaması kayıt sırasında gizlilik alışverişinde bulunur - daha sonra şifrenin yanı sıra giriş sırasında girmek için zaman / gizli tabanlı kod oluşturmak üzere google kimlik doğrulayıcıyı kullanın.
Al Grant

son yorumum artık seni aydınlatıyor mu? Twitter bilgisi için profile bak
Al Grant

Kayıt sırasında müşteri kimliği ve sırrı alabilirsiniz. Ardından, telefon web uygulamanıza (yetkilendirme sunucusu) istemci kimliği ile bir giriş isteği yapın. web uygulaması istemci kimliğini doğrular ve OTP'yi telefona gönderir. Telefon, OTP'yi erişim belirteciyle değiştirmek için webapp'a istemci sırrı ile başka bir istekte bulunur. telefonu web uygulamasındaki korumalı kaynaklara erişmek için bu accss jetonunu kullanın. Bence bu verilen senaryo için Oauth2 akışı olurdu. size yardımcı olup olmadığını bildirin.
Suraj

10

Bu bir mücevher:

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

Çok kısa özet:

OAuth dört rol tanımlar:

  1. Kaynak Sahibi
  2. müşteri
  3. Kaynak Sunucu
  4. Yetkilendirme Sunucusu

Sizin (Kaynak Sahibi) cep telefonunuz var. Birkaç farklı e-posta hesabınız var, ancak tüm e-posta hesaplarınızı tek bir uygulamada istiyorsunuz, bu nedenle geçiş yapmaya devam etmenize gerek yok. Böylece GMail'iniz (İstemci) Yahoo e-postalarınıza (Kaynak Sunucusu) erişmek (Yahoo'nun Yetkilendirme Sunucusu aracılığıyla) ister, böylece GMail uygulamanızdaki her iki e-postayı da okuyabilirsiniz.

OAuth'un var olmasının nedeni, GMail'in Yahoo kullanıcı adınızı ve şifrenizi saklamasının güvenli olmamasıdır.

resim açıklamasını buraya girin


8

Diğer cevap çok ayrıntılı ve OP tarafından sorulan soruların çoğunu ele alıyor.

Ayrıntılı olarak ve özellikle OP'nin "OAuth 2, Güvenlik Simgesini kullanarak tekrar saldırıları gibi şeylere karşı nasıl koruyor?" Sorusunu ele almak için, OAuth 2'yi uygulamak için resmi önerilerde iki ek koruma vardır :

1) Jetonların genellikle kısa bir sona erme süresi olacaktır ( http://tools.ietf.org/html/rfc6819#section-5.1.5.3 ):

Jetonlar için kısa bir sona erme süresi, aşağıdaki tehditlere karşı korunmanın bir yoludur:

  • tekrar ...

2) Simge A Sitesi tarafından kullanıldığında, öneri URL parametreleri olarak değil, Yetkilendirme isteği başlığı alanında ( http://tools.ietf.org/html/rfc6750 ) sunulması önerisidir :

İstemciler, "Yetkilendirme" istek üstbilgisi alanını "Taşıyıcı" HTTP yetkilendirme şemasına sahip bir taşıyıcı simgesiyle kimlik doğrulamalı istekler YAPMALIDIR. ...

"Application / x-www-form-urlencoded" yöntemi, katılımcı tarayıcıların "Yetkilendirme" istek üstbilgisi alanına erişemediği uygulama bağlamları dışında KULLANILMAMALIDIR. ...

Mevcut kullanımı belgelemek için URI Sorgu Parametresi ... dahil edilmiştir; güvenlik eksiklikleri nedeniyle kullanılması önerilmez


3

Belki de OAuth2'nin 4 hibe türü için nasıl çalıştığının en basit açıklaması, yani uygulamanın erişim belirtecini alabileceği 4 farklı akış.

Benzerlik

Tüm hibe türü akışların 2 bölümü vardır:

  • Erişim izni almak
  • Erişim belirtecini kullan

2. bölüm 'erişim belirtecini kullan' tüm akışlar için aynıdır

fark

Akışın birinci kısmı, her bir hibe türü için 'erişim belirteci al' değişir.

Bununla birlikte, genel olarak 'erişim belirteci al' kısmı 5 adımdan oluşan olarak özetlenebilir:

  1. İstemci kimliği / sırrı almak için uygulamanızı (istemcinizi) OAuth sağlayıcısına (ör. Twitter vb.) Önceden kaydedin.
  2. Tıklanan kullanıcı kimlik doğrulaması için OAuth sağlayıcısına yönlendirildiğinde müşteri kimliğini ve sayfanızda gerekli kapsamları / izinleri içeren bir sosyal giriş düğmesi oluşturun
  3. OAuth sağlayıcısı kullanıcıdan uygulamanıza (istemci) izin vermesini ister
  4. OAuth sağlayıcı sorunları kodu
  5. Uygulama (istemci) erişim belirteci aldı

Burada, her bir hibe türü akışının 5 adıma göre nasıl farklı olduğunu karşılaştıran yan yana bir diyagram verilmiştir.

Bu diyagram https://blog.oauth.io/introduction-oauth2-flow-diagrams/ adresinden alınmıştır.

resim açıklamasını buraya girin

Her biri farklı uygulama zorlukları, güvenlik ve kullanım durumlarına sahiptir. İhtiyaçlarınıza ve durumunuza bağlı olarak, bunlardan birini kullanmanız gerekecektir. Hangisi kullanılır?

Müşteri Kimlik Bilgileri : Uygulamanız yalnızca tek bir kullanıcıya hizmet veriyorsa

Kaynak Sahibi Parolası Kimlik Bilgisi : Bu, kullanıcının kimlik bilgilerini uygulamaya vermek zorunda olduğu için yalnızca son çare olarak kullanılmalıdır; bu, uygulamanın kullanıcının yapabileceği her şeyi yapabileceği anlamına gelir

Yetkilendirme Kodu : Kullanıcı yetkisi almanın en iyi yolu

Örtük : Uygulamanız mobil veya tek sayfalı bir uygulama ise

Burada daha fazla açıklama var: https://blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.