Geçiş kontrol katmanından önce doğrulama katmanının olması uygun mudur?


24

Bir API strcutured web uygulaması oluşturuyorum ve bu uygulamada kendi işlerini yapan farklı katmanlarımız var.

Birinci katman, kullanıcı girişini doğrulayan Doğrulama katmanıdır ve doğrulamayı geçerse bunu ikinci katmana ( Erişim Kontrol katmanı) taşırız, aksi halde hata iletisini döndürür

İkinci katman, kullanıcının yapmak istediği görevi gerçekleştirme izninin olup olmadığını kontrol eden Erişim Kontrolüdür , Kullanıcı iznine sahipse isteği bir sonraki katmana taşır, aksi halde hata mesajı döndürür

Üçüncü Katman, uygulama mantığına sahip olduğumuz Kontrol Katmanıdır.

Sorum şu ki, erişim kontrolünden önce doğrulama katmanının olması doğru mu? Kullanıcı izin vermediği bir görevi yerine getirmeye çalışıyorsa ve doğrulama hata mesajını geri gönderiyorsak ne olur? Kullanıcı bir uç noktaya istek gönderiyor ve doğrulama katmanıyla konuşuyor olacak ve doğrulamadan geçtikten sonra mesajı görecekYou can't access this!

Bana çok garip geliyor, bu böyle iyi mi, yoksa altyapıdaki diğer seçeneklerim neler olabilir?


10
Doğrulamaların genellikle işlerini yapmak için veritabanına veya bir dosya deposuna ulaşması gerektiğinden de bahsetmek gerekir. Erişim kontrolü ihlallerini kontrol etmeden önce bunu yaparsanız, esasen saldırganların söz konusu URL’ye yoğun miktarda trafik atarak veri tabanınızı veya dosya sisteminizi DDoS’e almasına izin vermiş olursunuz.
Greg Burghardt,

Benim durumumda aynısı Access Control Middleware için de geçerli, bir kaynağı kontrol ediyor ve kaynak türünün kullanıcı tarafından erişilebilir olup olmadığını görebiliyor, eğer ulaşılabilirse erişime izin veriyorum aksi halde izin vermiyorum
Muhammed

Bu doğru. Bir DDoS sırasında bu katman hala veri deponuzu vurur. Öncelikle bu katmanı çalıştırdığınızda, doğrulama ve doğrulama işlemleri için veri deponuzu vurmazsınız - yalnızca erişim kontrolü için vurursunuz. Tsunaminin boyutunu küçültür, ancak plaja çarpmasını engellemez. Size veya sunucu ekibinize, tüm sistem tıkanmadan önce bir saldırıya cevap verme mücadelesi verir.
Greg Burghardt,

5
Pratik bir bakış açısına göre, erişim kontrolü yine de doğrulamadan önce gelmelidir - talebe ilk başta erişemezlerse, kullanıcının isteğinin doğruluğunu nasıl doğrulayacaksınız?
Zibbobz

@ Zibbobz doğrulaması, kullanıcının tam şema olup olmadığına, tamsayı olması gereken bir parametre ya da başka bir şey gibi, doğru şema gönderip göndermediğini kontrol etmek gibi basittir
Muhammad

Yanıtlar:


57

Yapmanıza izin verilmeyen bir görevin bazı girdilerinin geçerliliğini bilmek bir güvenlik sızıntısı olup olmamasına bağlıdır. Eğer öyleyse, gerçekten tam tersi bir şekilde yapmalısınız.

Yetkisiz bir kullanıcıya verilen tek güvenli cevap "erişim reddedildi". Bazen yanıt "kötü istek" ve diğer zamanlar "erişim reddedildi" ise, yetkisiz bir kullanıcıya bilgi gönderiyorsunuzdur.

Örnek olarak, adlandırılmış belgenin var olduğu "belgeyi sil" görevinin doğrulanmasında bir kontrol sahibi olabilirsiniz. İzinsiz bir kişi, bir şeyi silmek isteyip istemediğini ve hangi hatayı geri aldıklarını karşılaştırarak var olup olmadığını ayırt edebilecektir. Özellikle belirlenmiş bir saldırgan, hangisinin mevcut olduğunu görmek için tüm belge adlarını (belirli bir uzunluktaki) sayabilir.


7
+1, kesinlikle. Verileriniz herhangi bir şekilde kişisel olarak tanımlanabilir veya başka bir şekilde hassassa, güvenlik uygulamaları kullanılabilirlik uygulamalarından çok, çok daha ciddidir.
Kilian Foth

4
@caleth aslında belirli bir belgenin sistemde olup olmadığını bilmez, bu tür bilgiler sadece kontrolör katmanına ulaştığınızda verilir. Doğrulama sadece şemaları kontrol eder, veritabanına erişmez - sadece erişim kontrolü ve daha derin katmanlar veritabanı erişimini yapar. Ayrıca, erişim kontrolü katmanı yalnızca bir kaynak var olsa da olmasa da aynı şeyleri gösterir. Tek uzlaşmacı şey, sorun olup olmadığını düşündüğüm
Muhammed

@Caleth Son yorumunuz hakkında ayrıntılı bilgi verebilir misiniz? OP'nin yorumunda durumun nasıl olduğunu bilmiyorum. Her durumda, şema kamuya açık bir şekilde belgelenirse geri gönderilen tek bilgi ayrıcalıklı bir bilgi değildir.
Rotem

11
@Rotem Bir saldırganın hangi bilgilerden faydalanabileceğini önceden belirlemek kesinlikle imkansızdır. Eğer henüz diye bulunamadı yapmamalısın şeyler öğrenmek için bir yol, böyle bir yolu yoktur anlamına gelmez. Aşırı bir örnek olarak, herhangi bir güvenlik açığı olmayabilir şimdi , ama gelecek birileri doğrulama katmanına bir çek ekleyebiliriz yapar onlar korunmayan bilmiyordum çünkü kaçak bilgiler.
Kamil Drakari

4
@KamilDrakari bu aşırı bir örnek değil, bu mükemmel bir örnek. Başka bir yolla - erişim kontrolünden önce doğrulama yaparsanız, geliştiricinin bir doğrulama adımı eklemek istediği herhangi bir zamanda, bu doğrulamanın hassas bir şey gösterip göstermediğine karar vermeleri gerekir. Her devin bu çağrıya ulaşma şansı çok küçük görünüyor.
mfrankli

24

Eh, birden fazla doğrulama türü vardır:

  1. Talebin açıkça yanlış biçimlendirilmediğini doğrulayan ucuz temel sağlık kontrolü.

    Bu, sık sık geri dönüş turlarından kaçınmak için, en azından kısmen kopyalanan müşteri tarafındadır.

    Her neyse, herhangi bir bilgi sızıntısı riski olmadığı için işleri kolaylaştırmak ve daha az hata yapmak için erişim kontrolünden önce yapılmalıdır.

  2. Herhangi bir korumalı uygulama verisine bağlı olmayan daha pahalı doğrulama.

    Böyle bir ekstra doğrulama varsa, veri kontrolünden kaçınmak için değil, DOS saldırılarını engellemek için erişim kontrolünden sonra olabilir.
    Bazen sadece isteği yerine getirmek, bu onaylamanın bir kısmını dolaylı olarak indirilmiş veya ücretsiz olarak yapar, bu nedenle burada bırakılabilir.

    İlk adımın tüm doğrulaması çoğaltılırsa, bu müşteri tarafındaki kısımları çoğaltmak mantıklı gelebilir.

  3. Korunan uygulama verilerine bağlı olarak ek doğrulama.

    Erişim kontrolünden önce yapmak, açıkça bilgi sızıntılarına neden olabilir. Böylece ilk önce erişim kontrolü yapılır.


3
API'nize ulaşmadan önce bile, altyapınızı kontrol altına almak için bir politika uygulama noktasında erişim kontrolü gerçekleştirmek ideal olacaktır. Temel bir statik doğrulama kümesi (Ör: OpenAPI), ardından daha derin bir işletme doğrulaması olacaktır. Bazı statik doğrulamaların bile eski ReDOS saldırılarınızın kullanılabilirliği üzerinde potansiyel bir etkisi olabilir .
felickz

@ felickz: Evet, DOS saldırıları yetkilendirmeden sonraya dek geçerliliği ertelemek için geçerli bir nedendir. Bu bir denge hareketidir. Her neyse, bunu dikkate almak için ilk noktamı böldüm.
Deduplicator

Erişim kontrolünden önce pahalı doğrulama yapmak aynı zamanda zamanlama saldırıları nedeniyle bilgi sızdırması riskini de taşır. Sisteminiz kaynağa bağlı olarak daha kısa veya daha uzun sürerse, saldırgan istenen kaynağın yönlerini ortaya çıkarabilir.
Yalan Ryan

@LieRyan: Erişim kontrolünden önce potansiyel olarak tüm onaylamaların korunan uygulama verilerine bağlı olmamasının nedeni budur.
Deduplicator

13

Erişim kontrolünden önce bir miktar doğrulama yapılmalıdır . SO'nun API'sinin bir son nokta "cevabı düzenle" olduğunu varsayalım, sonra kullanıcının belirli bir cevabı düzenleyip düzenleyemeyeceği cevaba bağlı olabilir (belirli bir itibarın altında bir kullanıcı yalnızca kendi cevaplarını düzenleyebilir). Bu nedenle, iyi biçimlendirilmiş "cevap kimliği" parametresi erişim kontrol katmanı devreye girmeden önce doğrulanmalıdır; Muhtemelen ayrıca cevabı var.

Caleth ve Greg'in dediği gibi OTOH, erişim kontrolünden önce daha kapsamlı bir doğrulama koymak potansiyel bir güvenlik riski oluşturuyor.

Yani zor kurallar

  1. Kullanıcının aksi takdirde öğrenemeyeceği varsayıldığının doğrulanması yoluyla hiçbir bilgi ifşa etmemelisiniz.
  2. Erişim kontrolünün, erişim kontrolünün ihtiyaç duyduğu ölçüde kullanabilmesi için önce verileri doğrulamanız gerekir.

Bu kuralların her ikisine de uymak, erişim kontrolünden önce ve sonra bazı kontrollerden geçmeniz gerektiği anlamına gelebilir.


3
Bu gerçekçi cevap. Basit, düz giriş veri yapısı doğrulaması yapılırsa, önce onu koyacak herhangi bir nitelik olmamalıdır. Access kontrol katmanını özel tasarlanmış girişlerden / paketlerden bile korur. Gerçekten güvenli bilgi sızıntısı veya tahmini gerektiren doğrulama, erişim kontrollerinden sonra yapılmalıdır.
SD

Cevapların halka açık olduğunu varsayar. Bir sürü API'nin size kimlik doğrulama ile ilgili verileri bile göstermeyeceğini söylemeye cüret ediyorum.
TomTom

6

Girişi onayladıktan sonra “erişim reddedildi” almanın olası hüsrana ek olarak ; Ayrıca Validasyon katmanının çok basit olmadığı sürece Kontrol Cihazından her zaman bilgiye ihtiyaç duyabileceğini unutmayın . Bu nokta göz önünde, ben konumlandırma inanmak Doğrulama arkasında Erişim Kontrolü yakın olan, Kontrolör daha mantıklı.


2

Bu, doğrulama katmanıyla ne demek istediğine bağlıdır - yalnızca isteğin sözdizimini kontrol etmek istiyorsan, bu güvenli ve yine de yapman gereken bir şey. "Doğrulamanız", imtiyazsız bir kullanıcının erişemediği herhangi bir bilgiyi kullanıyorsa , artık güvenli değildir.

Erişim kontrolüne başlamadan önce kesinlikle bir sağlık kontrolcüsüne sahip olmalısınız, ancak tüm taraflara (mevcut ve gelecek) bu bölümün ayrıcalıklı bilgileri kullanmaması gerektiğini açıkça belirtmeye dikkat etmelisiniz ; Bu tür kontroller, onaylamadan sonra ayrı bir onaylama adımında yapılmalıdır .

Temizlik kontrolörü için bir kontrol kontrolü olarak, kodunuzun hiçbir bölümünde kod bağımlılığına sahip olmamalı ve boru hattını düşürmeli ve herhangi bir sorun olmadan halka açık bir şekilde yayınlanabilecek kendi paketine ayrılmalıdır (olası yasal sorunlar dışında) . Bunu yapamazsanız, 'doğrulama katmanınız' çok fazla oluyordur (veya kod tabanınız dağınıktır).


1

Hayır, tamam değil.

Doğrulama katmanınızda bir hata varsa, güvenlik katmanını atlayabilir.

Güvenliği iş gereksinimlerinin bir parçası olarak görmek yaygın bir hatadır. "yalnızca rol satışı yapan kullanıcılar, üç aylık rakamları görebilmelidir" bir iş kuralı gibi görünüyor.

Ancak, güvende olmak istiyorsanız, "yalnızca satış rolündeki kullanıcılar, bu uç noktadaki kodu çalıştırabilmelisiniz" gibi bir kural okumalısınız. Sunucuya yazdığınız her türlü kod veya dosya.

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.