REST kimlik doğrulama düzenlerinin güvenliği


228

Arka fon:

Bir REST web hizmeti için kimlik doğrulama düzeni tasarlıyorum. Bu "gerçekten" güvenli olmak zorunda değildir (daha kişisel bir projedir) ama bunu bir egzersiz / öğrenme deneyimi kadar olabildiğince güvenli hale getirmek istiyorum. SSL'yi kullanmak istemiyorum çünkü güçlük ve çoğunlukla kurulum masrafını istemiyorum.

Bu SO soruları beni başlatmak için özellikle yararlıydı:

Amazon S3'ün kimlik doğrulamasının basitleştirilmiş bir sürümünü kullanmayı düşünüyorum ( OAuth'u seviyorum, ancak ihtiyaçlarım için çok karmaşık görünüyor). Tekrar saldırılarını önlemek için, sunucu tarafından sağlanan rasgele oluşturulmuş bir nonce ekliyorum .

Soruya ulaşmak için:

Hem S3 hem de OAuth, birkaç seçilen üstbilgiyle birlikte istek URL'sini imzalamaya dayanır. Her ikisi de POST veya PUT istekleri için istek gövdesini imzalamaz . Bu, URL'yi ve başlıkları tutan ve istek gövdesini saldırganın istediği verilerle değiştiren ortadaki adam saldırısına karşı savunmasız değil mi?

İmzalı dizeye istek gövdesinin bir karma değerini ekleyerek buna karşı koruyabileceğim gibi görünüyor. Bu güvenli mi?


6
Amazon S3, tanımladığınız MITM saldırısını önlemek için başlık dizesinin bir parçası olarak bir Content-MD5 içerebilir.
laz

8
MD5 çok zayıf bir karma işlevidir ve kullanımı yıllardır önerilmez: en.wikipedia.org/wiki/MD5 . Bugünlerde SHA2 kullanın. MD5, kimlik krizine sahip bir domuzun rujudur.
Henrik

6
Startcom , büyük tarayıcılarda sertifika uyarıları atmayan ücretsiz SSL sertifikaları sağlar
Plato

5
@SeanKAnderson (rant: İnternet zaten 2008'de bir sürü saldırı otomatik hale getiren casus ajansları tarafından kuşatma altındayken insanların yaklaşık 99.99999 s hakkında konuştuklarını saçma buluyorum - gerçek bir sorunla başa çıkmak için çok garip bir yol - "Naaah, sorun olmayacak; büyükannemin hackleyememesi"
Henrik

2
@Plato LetsEncrypt'i şu günlerde ücretsiz SSL sertifikaları için öneriyorum
shuttle87

Yanıtlar:


168

Önceki bir yanıt sadece veri aktarımı bağlamında SSL'den bahsetti ve aslında kimlik doğrulamayı kapsamıyordu.

Gerçekten REST API istemcilerinin güvenli bir şekilde kimlik doğrulamasını soruyorsunuz. TLS istemci kimlik doğrulamasını kullanmadığınız sürece, SSL tek başına bir REST API için geçerli bir kimlik doğrulama mekanizması DEĞİLDİR. İstemci authc olmadan SSL sadece doğrular sunucuyu gerçekten kimliğini doğrulamak istiyorum, çünkü çoğu DİNLENME API'ler için önemsizdir, müşteri .

TLS istemci kimlik doğrulaması kullanmıyorsanız, özet tabanlı kimlik doğrulama düzeni (Amazon Web Service'in özel düzeni gibi) veya OAuth 1.0a veya HTTP Temel kimlik doğrulaması (ancak yalnızca SSL üzerinden) gibi bir şey kullanmanız gerekir.

Bu şemalar, talebin beklenen biri tarafından gönderildiğini doğrular. TLS (SSL) (istemci kimlik doğrulaması olmadan), kablo üzerinden gönderilen verilerin etiketsiz kalmasını sağlar. Bunlar ayrı - fakat tamamlayıcı - endişelerdir.

İlgilenenler için, HTTP Kimlik Doğrulama Düzenleri ve nasıl çalıştıkları hakkında bir SO sorusunu genişlettim .


16
Kesinlikle. SSL'nin API'nız ile ilgili olarak doğruladığı tek şey, ele aldığı çağrının yol boyunca dağınık olmamasıdır. API'nın hâlâ kiminle konuştuğunu veya hiç erişip erişemeyeceğini bilmiyor.
Tim Gautier

1
İyi cevap. Ben de bu mükemmel kaynaklara bir göz .. sahip öneriyoruz owasp.org/index.php/Web_Service_Security_Cheat_Sheet ve owasp.org/index.php/REST_Security_Cheat_Sheet (TASLAK)
dodgy_coder

2
Sadece küçük bir nokta, ancak SSL kullanmanın, orta saldırılarda gizlice dinlemeyi ve insanı önlemenin ek faydası da var.
dodgy_coder

@Les Hazlewood Https üzerinden HTTP Temel kimlik doğrulamasının sunucunun kiminle konuştuğunu bildiğini belirlemeye nasıl yardımcı olabileceğini açıklayabilir misiniz?
İlkbahar

@Les Hazlewood burada bir soru sordum; tnx stackoverflow.com/questions/14043397/…
Bahar

60

REST, web standartlarıyla çalışmak anlamına gelir ve web üzerinde "güvenli" aktarım standardı SSL'dir. Başka bir şey korkak olacak ve şifreleme kitaplıkları olması gereken istemciler için ekstra dağıtım çabası gerektirecektir.

SSL'yi taahhüt ettiğinizde, prensipte kimlik doğrulama için gerçekten fantezi bir şey gerekmez. Yine web standartlarına gidebilir ve ayrıntılı bir imzalama protokolünden çok daha basit olduğu ve güvenli bir bağlantı bağlamında etkili olduğu için HTTP Temel kimlik doğrulamasını (her istekle birlikte gönderilen kullanıcı adı ve gizli simge) kullanabilirsiniz. Parolanın asla düz metin üzerinden geçmediğinden emin olmanız yeterlidir; parola düz metin bağlantısı üzerinden alınırsa, parolayı devre dışı bırakabilir ve geliştiriciye posta gönderebilirsiniz. Ayrıca, normal bir şifreyi kaydetmediğiniz gibi, kimlik bilgilerinin alındıktan sonra hiçbir yere kaydedilmediğinden de emin olmalısınız.

HTTP Digest, gizli kodun aktarılmasını engellediği için daha güvenli bir yaklaşımdır; bunun yerine, sunucunun diğer tarafta doğrulayabileceği bir karmadır. Yukarıda belirtilen önlemleri aldıysanız, daha az hassas uygulamalar için aşırıya kaçabilir. Sonuçta, kullanıcının şifresi, oturum açtıklarında (tarayıcıda süslü JavaScript şifrelemesi yapmadığınız sürece) ve aynı şekilde her istekte çerezlerini zaten düz metin olarak aktarılır.

API'larda, geliştiricinin web sitesine giriş yaptığı şifre yerine jetonları (rastgele oluşturulmuş dizeler) geçirmesinin daha iyi olduğunu unutmayın. Dolayısıyla, geliştirici sitenize giriş yapabilmeli ve API doğrulaması için kullanılabilecek yeni jetonlar oluşturabilmelidir.

Bir belirteç kullanmanın ana nedeni, güvenliği ihlal edildiğinde değiştirilebilmesidir, ancak şifre ihlal edilirse, sahibi geliştiricinin hesabına giriş yapabilir ve onunla istediği her şeyi yapabilir. Jetonların bir diğer avantajı, aynı geliştiricilere birden fazla jeton verebilmenizdir. Belki birden fazla uygulamaları olduğu veya farklı erişim düzeylerine sahip jetonlar istedikleri için.

(Bağlantıyı yalnızca SSL yapmanın sonuçlarını içerecek şekilde güncellendi.)


3
Sanırım yılda 30 dolar gibi bir GoDaddy SSL sertifikası alabilirsiniz. Verisign SSL sertifikalarının ne kadar sürdüğünü görmek için şok oldum (doğru hatırlarsam yılda 600 dolar veya bir şey?) Ama GoDaddy seçeneği mükemmel bir şekilde uygulanabilir.
Brian Armstrong

19
SSL / TLS karşılıklı kimlik doğrulamasını kullanmadığınız ve kullanıcı / istemci tarafından kullanılan sertifika sunucu tarafından güvenilmediği sürece, kullanıcının sunucu / uygulama için kimlik doğrulamasını yapmadınız. Kullanıcının sunucuya / uygulamaya kimliğini doğrulamak için daha fazla bir şey yapmanız gerekir.
PaulD

5
Ryan: SSL şifreleme bugünlerde Eğer Django veya Raylar vb gibi bir web uygulaması çerçevesinde bir yanıt oluşturmak için kullanmak istiyorum ne göre işlem gücü oldukça küçük bir miktar alır
Cameron Walsh

4
startcom'dan gelen sertifikalar ücretsizdir ve yaygın olarak tanınmaktadır. cacert.org daha az tanınan açık bir alternatif
Dima Tisnek

17
Bu, kimlik doğrulama ile ilgili soruyu ele almaz.
Sam Stainsby

8

Veya bu soruna bilinen çözümü kullanabilir ve SSL kullanabilirsiniz. Kendinden imzalı sertifikalar ücretsizdir ve kişisel bir proje değil mi?


2
Kendinden imzalı sertifikalar ücretsizdir, ancak AFAIK'in hala statik bir IP'ye ihtiyacınız vardır.
dF.

8
@dF, sertifikalar için ödenen ticari lisanslama gereksinimleri dışında statik bir IP'ye sahip olma zorunluluğu yoktur.
Chris Marisic

Her iki uçtaki (istemci ve sunucu) sertifika depolarının denetimine sahipseniz, bu uygun bir seçenek olabilir, ancak ... sertifika yönetimi ve dağıtımı, üretim ortamında bir geliştirme ortamından çok daha karmaşıktır. Taahhüt etmeden önce bu alternatifin karmaşıklıklarını anladığınızdan emin olun.
aled

5

Gövdenin karma değerini URL'deki parametrelerden biri olarak istiyorsanız ve bu URL özel bir anahtarla imzalanırsa, ortadaki adam saldırısı yalnızca gövdeyi, aynı karma. Şimdi en azından MD5 karma değerleri ile yapmak kolaydır ve SHA-1 bozulduğunda, resmi elde edersiniz.

Vücudun kurcalanmasını önlemek için, ortadaki adam saldırısının kırılma olasılığı daha düşük olacak, çünkü imzayı oluşturan özel anahtarı bilmeyeceklerdir. .


9
Geçerli içerikle aynı md5 karmasını oluşturacak bir dize oluşturmak, olması gerekenden çok daha kolay olabilir, ancak aynı değere hash olan geçerli bir içeriğin kötü bir sürümünü bulmak hala oldukça zor. Bu nedenle md5 artık parola karmaları için kullanılmıyor, ancak yine de indirmeleri doğrulamak için kullanılıyor.
Tim Gautier


1

Önerilerinizin, istemcilerin sunucuyla iletişim kurmasını zorlaştırdığını unutmayın. Yenilikçi çözümünüzü anlamaları ve verileri buna göre şifrelemeleri gerekir, bu model genel API için çok iyi değildir (amazon \ yahoo \ google .. değilseniz).

Her neyse, vücut içeriğini şifrelemeniz gerekiyorsa, mevcut standartları ve çözümleri kontrol etmenizi öneririm:

XML şifrelemesi (W3C standardı)

XML Güvenliği

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.