2010-03-08 16 views
9

Şu anda uygulama günlüklerini kaydetmek için MongoDB kullanıyorum ve hem performanstan hem de rasgele yapılandırılmış verileri günlük kayıtlarına dökebilmekten oldukça memnunum. log kayıtlarının bir kez saklanabilirliği.Yalnızca yazma koleksiyonları MongoDB

Geleneksel bir veritabanında, uygulama kullanıcılarına INSERT ve SELECT ayrıcalıklarına sahip olacak, ancak UPDATE veya DELETE olmayacak şekilde günlük tablolarım için hibe yapılandıracağım. Benzer şekilde, CouchDB'de varolan bir belgeyi değiştirmek için tüm girişimleri reddeden bir güncelleme validator işlevi yazabilirim. Bununla birlikte, MongoDB veritabanı veya MongoDB wiki'sinde security topic belgesinde belgelenen üç erişim düzeyinin (erişim, salt okunur, "tanrı modu" dışında) toplama işlemlerini kısıtlamak için bir yol bulamadım. .

MongoDB'yi belge dökümanları olarak başka biri, belgeler için değişmezliğin (veya en azından değişimin izlenmesi) bir zorunluluk olduğu bir ortamda konuşlandırdı mı? Kötü yazılmış veya kötü niyetli uygulama kodunun mevcut günlük kayıtlarını değiştiremediğinden veya yok etmediğinden emin olmak için hangi hileleri veya teknikleri kullandınız? MongoDB günlüğümü, yalnızca yazma ilkesini uygulayan bir hizmet katmanında sarmalı mıyım yoksa tutarlı, denetlenebilir bir kaydın korunmasını sağlamak için bazı yapılandırma, sorgu kesmek ve çoğaltma kombinasyonlarını kullanabilir miyim?

db.addUser("guest", "passwordForGuest", true)

Ama sadece şimdi değil daha iyi varolan ediyor: Eğer kullanıcı bazı kısıtlama ekleyebilir 1.3.2+ MongoDB yılında

+0

Fırınlanmış bir şekilde görünmediğinden, aslında MongoDB'nin önüne yerleştirilen ve opcode: http: // 'ye bakarak sunucuya gönderilen iletileri filtreleyen basit bir TCP proxy'si uyguladım. gist.github.com/328486 – rcoder

+0

Ürünü kaydettiğiniz için teşekkür ederiz. Proxy kurulumunuz oldukça havalı ve hemen hemen aynı şey için çalışabileceğim bir işletme tipi proje için yararlı olabilir (denetim izi). –

+0

Ben de aynı şeyi arıyordum. IMHO, şu anda MongoDB'deki en büyük başarısızlık bu. –

cevap

8

: Belki

MongoDB belgelerinde bilgileri görmek bazı özellik isteği ekleyebilir. İnce ayarlı erişim kontrolünde pek bir şey yapmıyoruz, çünkü bunların hepsini doğru bir şekilde çözen çok farklı durumlar var. Bu nedenle, çoğu zaman bu tür kontrolleri uygulamak için uygulama katmanına kalmış.

+0

Şüphelendiğim şey bu. Uygulama kodunun herhangi bir yerinde veritabanına işlenmemiş bir bağlantı göstermeyerek, şu anda salt okunur erişimi etkin bir şekilde uygularım. Bu, bizi kullanıcı hatalarından veya kötü amaçlı güncellemelerinden tam olarak korumaz, ancak başka bir kalıcı denetim günlüğü çözümü uygularız. – rcoder

0

. Ben iyi bahis özel sözleşmeler zorlar bir hizmet katmanında MongoDB erişimi tamamlamayı olacağını söyleyebilirim http://www.mongodb.org/display/DOCS/Security+and+Authentication

+1

Sorumu belirttiğim gibi, salt okunur kullanıcı eklemek istemiyorum; daha doğrusu, gerekten sonra bunları değiştirmeden veya silmeden, sadece * yazabilen * bir kullanıcı eklemek istiyorum. – rcoder

1

eklemek için MongoDB'ye yalnızca kullanıcı düzeyinde (toplama düzeyinde) yazın.

Eğer sadece belli bir veritabanı üzerinde bir belirli koleksiyon- (sadece insert) yazabilirsiniz bir kullanıcı var istediğini farz edelim.

aşağıdaki içeriğe sahip bir dosyayı createuser.js oluşturun:

function createCollectionWriter(database, username, password, rolename, collection) 
{ 
    db.getSiblingDB(database).createUser({ 
     user : username, 
     pwd : password, 
     roles : [ ] 
    }); 

    db.getSiblingDB(database).createRole({ 
     role : rolename, 
     privileges : [ 
     { 
      resource : { db : database, "collection" : collection }, 
      actions : [ "insert" ] 
     } 
     ], 
     roles : [] 
    }); 

    db.getSiblingDB(database).grantRolesToUser(username, [ rolename ]); 
} 

Ve bu kullanıcı adıyla bir kullanıcı oluşturur

$ mongo --eval="load('createuser.js'); createCollectionWriter('yourdb', 'user1', 'pass1', 'rolename', 'col1')"

komut satırından bu yürütmek şifre pass1 ile kullanici1 ve Bu kullanıcı yazmaktadır. Sadece veritabanına erişim ase adresiniz koleksiyon col1.

Bunun bir yan etkisi, bu rolename rotamının oluşturulmasıdır.Aynı topluluğa yalnızca yazma erişimi olan mevcut bir kullanıcınız varsa, varolan kullanıcıya rolename numaralı rotayı ekleyin.

Yukarıda verilen kodu kullanmakta ve kullanmamakta kesinlikle özgürsünüz :).