Soru CouchDB Nasıl Güvenli


Bir dinlenme servisi olarak CouchDB erişimi güvensiz görünüyor. Veritabanına herkes girebilir ve açığa çıktığında belgeleri silebilir / ekleyebilir.

CouchDB'yi güvence altına almak için hangi stratejiler var?


30
2017-12-17 17:35


Menşei


Bu sorunla ilgili herhangi bir güncelleme var mı? Eminim 2 yılda çok değişti ... - Jason S


Cevaplar:


2009'dan beri çok şey değişti, bu yüzden buraya bir cevap vereceğim. Bu cevap bu sayfa wiki'de.

CouchDB'de bir _users Kullanıcıları tanımlama amacına hizmet eden veritabanı. İşte wiki'den doğrudan alıntı:

  • Anonim bir kullanıcı sadece yeni bir belge oluşturabilir.
  • Kimliği doğrulanmış bir kullanıcı yalnızca kendi dokümanlarını güncelleyebilir.
  • Bir sunucu veya veritabanı yöneticisi tüm dokümanlara erişebilir ve güncelleyebilir.
  • Yalnızca sunucu veya veritabanı yöneticileri tasarım belgeleri oluşturabilir ve görünümlere ve _all_docs ve _changes'e erişebilir.

Daha sonra, herhangi bir veritabanı için izinleri ad veya role göre tanımlayabilirsiniz. Kimlik doğrulamanın uygulandığı yol bir _session Veritabanı. _Session DB'ye geçerli bir kullanıcı adı ve şifre göndermek bir kimlik doğrulama bilgisi döndürür. Bu, CouchDB Kimlik Doğrulaması için birkaç seçenekten biridir. Birkaç seçenek daha var:

  • Bu seçenek Biraz eski 1.0 bir kaç ay oldu, bugün itibariyle 1.2'deyiz. Ama hala çok iyi bir şekilde özetleniyor.
  • Ve Bu "Kesin Kılavuz" dan

Ayrıca, hangi barındırma hizmetini kullandığınıza bağlı olarak, SSL üzerinden kanepeye erişimi kısıtlama seçeneğine sahip olacaksınız.

Düğüm, Couch ve etkili bir şekilde ölçeklendiren çeşitli başka teknolojiler (daha fazla sunucu ekleyerek) arasında, geliştiricilere bu şekilde iyi ölçeklenmiş uygulamalar yapmak için ilginç bir baskı ya da teşvik vardır. Ama bu hep birlikte ayrı bir sorun.


18
2017-07-04 16:13





Şu anda güvenlikle çalışan tek şey, CouchDB yapılandırmanızda böyle bir şeydir.

[couch_httpd_auth]
require_valid_user=true
[admins]
admin = sekrit

Bu, tüm CouchDB'lere temel HTTP auth'ını koyar. Bu bile istemci kütüphanelerinde iyi bir destek değildir. Python için, ör. ihtiyacın var yamalı kitaplık.

İkinci yaklaşım CouchDB'nin önüne bir proxy koymak ve proxy'nin yetkilendirme ve yetkilendirme çalışması yapmasına izin vermektir. CouchDB'nin RESTful tasarımı nedeniyle bu oldukça kolaydır.

Diğer tüm yaklaşımlar şimdi çok deneysel olarak kabul edilmelidir.


9
2017-12-26 19:18



Couch'in önüne bir vekil koymak harika bir fikir, ama biraz yük katıyor. Şu anda bir proxy olarak apache var. Bence bu soru stackoverflow üzerinde yeni bir soru olarak yeniden anlatacağım - steveolyo


Bu, orijinal sorunuzdan biraz farklı olabilir. Couchdb'niz yalnızca bir tam sunucu uygulaması için bir arka uç deposu ise, sunucu uygulamasının kullanması için özel bir hesap oluşturabilir ve bu kanepeye erişim için bu kimlik bilgilerini isteyebilirsiniz.

Öte yandan, insanların doğrudan bir javascript istemcisinden vurdukları saf bir kanepe uygulaması güvenli olmak için çok fazla dikkat gerektiriyor.

Yeniden yazmaların kullanılması isteğe bağlı değildir. Yeniden yazmalarınız aracılığıyla alanınıza istekleri zorlayan bir vhosts yapılandırmasına ihtiyacınız var.

Yolları yeniden yazınız * / _ all_docs ve / * / _ design / * bir 404 sayfasına. Aksi halde kullanıcılar her belgeyi listeleyebilir veya tüm uygulamanızı alabilir.

Kullanıcının belgeyi görmesine izin verilmiyorsa, erişimi reddedebilecek bir gösterime genel nesne erişimi, yani / dbname /: kimliği yeniden yazın. Maalesef, eklerin doc tabanlı erişim kontrolü için eşdeğer bir çözüm yoktur.

_Users üzerinde GET isteklerini filtrelemek için haproxy kullandık. Dışarıdan birinin kullanıcı kaydı alması veya tüm kullanıcılarınızı listelemesi için yasal bir neden yoktur. Kullanıcıların kayıt olabilmelerini istiyoruz, bu yüzden yazma erişimine ihtiyacımız var. Şu anda koltuk bir db'ye okuma erişimini engelleyemez ve aynı anda yazmalara izin veremez. Bu bir böcek. Halproxy gibi bir şeyle filtreleme, şimdilik en iyi çözümümüzdür.

_Users tarafından sağlanan iletişim bilgilerine ek olarak kendi veritabanınızı kullanın. Bu erişim üzerinde daha fazla kontrol sağlar.

validate_doc_update, izin verilmemesi gereken tüm yazıları dikkatli bir şekilde reddetmelidir.

Her durumda, sistemi anlayan birinin onu yıkmak ve saldırı yollarını kilitlemek için neler yapabileceğini hayal etmeniz gerekir.


7
2017-12-05 17:52





Şubat 2013 itibariyle (ve CouchDB 1.2) CouchDB'nin güvenlik modeli benim için yeterince esnek görünmüyor. Güvenlikle ilgilenmemeniz durumunda, kötü davranmak ve size çok fazla zaman kazandıramazken, gerçek dünyadaki kullanıcılar için üretime geçiyorsanız bu geçerli değildir.

İkinci durumda ayrı bir kimlik doğrulama ara katmanına gitmelisiniz. Bu, özel kimlik doğrulamanın nispeten kolay bir şekilde uygulanmasına olanak tanır. OAuth, Çerezler veya SSL olsun, bunun üzerinde tam kontrole sahip olacaksınız ve üçüncü taraf hizmetlerini (veya kendi özel mekanizmalarınızı) doğrulayan kimlik doğrulaması göreceli olarak basit görünecektir. Güvenlikten bahsetmişken, DoS saldırılarını da önemserdim ve CouchDB'nin kendisi ile CouchDB'ye olan taleplerin miktarını kısıtlayamayacaksınız.

Belge başına yetkilendirme için net bir destek olmadığından, kendi katmanınıza da ihtiyacınız olacaktır (bkz. bu detaylar için). Mükemmel bir örnek, birbiriyle veri paylaşmayan birçok kullanıcının bulunduğu bir mobil uygulamayı sürdürmektir. TouchDB Bunun için mükemmel bir seçimdir, ancak muhtemelen CouchDB ile arka uçtaki her kullanıcı için ayrı bir veritabanı oluşturmayacaksınız, çünkü bu mükemmel bir şekilde ölçeklendirilemez. Ayrı bir ara katman ile, bu belgenin ait olduğu kullanıcıyı tanımlayan veya istediğiniz başka bir ACL'yi kullanan bir belgede özel bir alan olup olmadığını kontrol edebilirsiniz.

Güvenlik sorunları çözülmeden önce gerçek dünyadaki bir uygulamada herhangi bir performans sorunu düşünmüyorum. Bu nedenle, URL'leri yeniden yazmak için nginx'i dağıtmak bile, genel bir sunucuda basit bir CouchDB dağıtmaktan çok daha iyidir. Ayrıca, nginx ile yapılan isabet de ihmal edilebilir.


1
2018-02-26 12:02



Bu bilgi için teşekkürler. Bizi bu katman yazılımı yaklaşımını biraz daha ayrıntılı olarak anlatacak bir blog gönderisine veya makalesine yönlendirebilir misiniz? Bu konuda birçok insanın güreşmesine gerçekten yardımcı olur. - psp


CouchDB çerezleri, SSL, oauth ve çoklu kullanıcıları sadece iyi yapar:

İşte python'daki bazı gerçek kodlar:

from couchdb import Server
s = Server("https://user:password@example.com:6984")

Çerez isteyin: tabii ki yukarıda ve aşağıda kodlanmış

İlk çerezi kullanmaya başlamak için kimlik bilgilerini iki kez yazmanız gerekiyor Hem Server () yapıcısında hem de _session POST gövdesinde

code, message, obj = s.resource.post('_session',headers={'Content-Type' : 'application/x-www-form-urlencoded'}, body="name=user&password=password")
assert(code == 200)

Şimdi bir çerez aldınız, ayıklayın

cookie = message["Set-Cookie"].split(";", 1)[0].strip()

Şimdi python'dan çık ve tekrar başla

Ardından, bir sunucu nesnesi isteyin, ancak bu kez kullanıcı adı ve şifre olmadan

s = Server("https://example.com:6984")

s.resource.headers["Cookie"] = cookie

Şifre, şifre yok, veritabanına erişmeye çalışın:

db = s["database"]

İsteğe bağlı olarak, çerezin daha uzun süre dayanmasını sağlamak için sunucu tarafında "kalıcı" çerez seçeneğini ayarlayın.


1
2017-09-02 16:08





CouchDB belgelerini okudunuz mu http://couchdb.apache.org/docs/overview.html? Bazı endişelerinizi ele alan "Güvenlik ve Doğrulama" bölümüne sahip.


0
2017-12-17 17:39



Evet, paragrafı okudum. Okuyucu Listeleri hakkında konuşur ve bir güvenlik modeli olduğunu söyler, nasıl yapılır, örnekler, okuyucu listesine eklemek için api gibi özellikleri ararım - steveolyo
Anladım, çoktan araştırma yaptın gibi. Bunun yardımcı olacağından emin değil: books.couchdb.org/relax/reference/security Eğer yapmadıysanız bir bak. - Jay Zeng
Bu iyi bir bilgiye sahip, hala işe ihtiyaç var. Sofadb'nin henüz emekleme döneminde olduğunu anlıyorum. Belki okuma listeleri henüz uygulanmamıştır. - steveolyo
Tamam, önce couchdb için belge güvenliği sağlayacak bir okuyucu listesi var gibi görünüyor, sonra bir JIRA girişini belirten: Genel bakış sayfasındaki "Okuyucu Erişimi" bölümü, şu anda temin etmeyen ve olası bir özelliktir. yakın gelecekte (veya muhtemelen (issues.apache.org/jira/browse/COUCHDB-496) - steveolyo
Dediğin gibi, CouchDB "hala emekleme aşamasında". - Jay Zeng