2010-03-08 18 views
9

में केवल लिखने वाले संग्रह मैं वर्तमान में आवेदन लॉग रिकॉर्ड करने के लिए मोंगोडीबी का उपयोग कर रहा हूं, और जब मैं दोनों प्रदर्शनों के साथ काफी खुश हूं और लॉग रिकॉर्ड में मनमाने ढंग से संरचित डेटा को डंप करने में सक्षम हूं, तो मैं परेशान हूं एक बार संग्रहीत लॉग रिकॉर्ड की mutability।मोंगोडीबी

एक पारंपरिक डेटाबेस में, मैं अपनी लॉग टेबल के लिए अनुदान तैयार करता हूं जैसे एप्लिकेशन उपयोगकर्ता में INSERT और चयन विशेषाधिकार थे, लेकिन अद्यतन या हटाएं नहीं। इसी प्रकार, कॉच डीबी में, मैं एक अद्यतन सत्यापनकर्ता फ़ंक्शन लिख सकता था जिसने मौजूदा दस्तावेज़ को संशोधित करने के सभी प्रयासों को खारिज कर दिया था।

हालांकि, मैं मोंगोडीबी डेटाबेस पर security topic में दस्तावेज किए गए मोंगोडीबी डेटाबेस या तीन पहुंच स्तरों (कोई पहुंच, केवल पढ़ने के लिए, "भगवान मोड") से परे संग्रह को प्रतिबंधित करने का कोई तरीका नहीं ढूंढ पाया है। ।

क्या किसी और ने मोंगो डीबी को एक दस्तावेज़ स्टोर के रूप में तैनात किया है जहां दस्तावेजों के लिए अपरिवर्तनीयता (या कम से कम ट्रैकिंग) एक आवश्यकता थी? यह सुनिश्चित करने के लिए कि आपने खराब-लिखित या दुर्भावनापूर्ण एप्लिकेशन कोड मौजूदा लॉग रिकॉर्ड को संशोधित या नष्ट नहीं कर सके, यह सुनिश्चित करने के लिए आप किस चाल या तकनीकों का उपयोग करते थे? क्या मुझे अपनी मोंगोडीबी लॉगिंग को एक सेवा परत में लपेटने की ज़रूरत है जो केवल-लिखने वाली नीति को लागू करती है, या क्या मैं निरंतर, ऑडिट-सक्षम रिकॉर्ड बनाए रखने के लिए कॉन्फ़िगरेशन, क्वेरी हैकिंग और प्रतिकृति के कुछ संयोजन का उपयोग कर सकता हूं?

+0

चूंकि ऐसा लगता है कि बेक्ड-इन तरीके से प्रतीत नहीं होता है, इसलिए मैंने वास्तव में एक साधारण टीसीपी प्रॉक्सी लागू की है जो मोंगोडीबी के सामने बैठती है और ऑपोड का निरीक्षण करके सर्वर पर भेजे गए संदेशों को फ़िल्टर करती है: http: // gist.github.com/328486 – rcoder

+0

जिस्ट पोस्ट करने के लिए धन्यवाद। आपका प्रॉक्सी सेटअप बहुत अच्छा है और एंटरप्राइज़-टाइप प्रोजेक्ट के लिए उपयोगी हो सकता है, मैं काफी वही चीज़ (ऑडिट ट्रेल) के लिए काम कर रहा हूं। –

+0

मैं इस सटीक चीज़ की तलाश में था। आईएमएचओ, इस समय मोंगो डीबी में यह सबसे बड़ी विफलता है। –

उत्तर

8

मैं कहूंगा कि सबसे अच्छा शर्त एक सेवा परत है कि अपने विशिष्ट अनुबंध लागू करता है में MongoDB के लिए उपयोग लपेट के लिए किया जाएगा: हो सकता है आप कुछ सुविधा का अनुरोध

MongoDB दस्तावेज में जानकारी देखने के जोड़ सकते हैं। हम बढ़िया पहुंच नियंत्रण के रास्ते में बहुत कुछ नहीं करते हैं क्योंकि ऐसे कई अलग-अलग मामले हैं जो उन सभी को सही ढंग से हल करने के लिए सही हैं। इसलिए अधिकांश भाग के लिए यह उन प्रकार के नियंत्रणों को लागू करने के लिए एप्लिकेशन लेयर पर निर्भर करता है।

+0

इस तरह की मुझे संदेह है। मैं आवेदन कोड में कहीं भी डेटाबेस में कच्चे कनेक्शन को उजागर न करके अभी केवल पढ़ने-योग्य पहुंच को लागू कर रहा हूं। यह पूरी तरह से हमें उपयोगकर्ता त्रुटि या दुर्भावनापूर्ण अपडेट से सुरक्षित नहीं करता है, लेकिन मैं एक और टिकाऊ ऑडिट लॉग समाधान तैयार करूंगा। – rcoder

0

MongoDB में 1.3.2+ आप उपयोगकर्ता में कुछ प्रतिबंध जोड़ सकते हैं:

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

लेकिन यह केवल अब बेहतर नहीं मौजूदा रहा है। http://www.mongodb.org/display/DOCS/Security+and+Authentication

+1

जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मैं केवल पढ़ने-योग्य उपयोगकर्ता को जोड़ने की तलाश नहीं कर रहा हूं; बल्कि, मैं एक ऐसे उपयोगकर्ता को जोड़ना चाहता हूं जो तथ्य के बाद उन्हें संशोधित या हटाए बिना, केवल * लिखने * रिकॉर्ड कर सके। – rcoder

1

जोड़ने के लिए केवल (संग्रह स्तर पर) उपयोगकर्ता को मोंगोडीबी को निम्नलिखित लिखें।

आप एक उपयोगकर्ता कि केवल एक निश्चित डेटाबेस पर एक निश्चित संग्रह (केवल insert) लिख सकते हैं करने के लिए चाहते हैं।

निम्नलिखित सामग्री के साथ एक फ़ाइल createuser.js बनाएँ:

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 ]); 
} 

और

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

इस उपयोगकर्ता नाम के साथ एक उपयोगकर्ता बनाता कमांड लाइन से इस पर अमल user1 पासवर्ड pass1 साथ और इस उपयोगकर्ता के पास है केवल डाटाबेस तक पहुंच एएसई yourdb संग्रह col1

इसका दुष्प्रभाव यह है कि रोलेनाम बनाया गया है।यदि आपके पास मौजूदा उपयोगकर्ता है जो केवल एक ही संग्रह तक पहुंच लिखना चाहिए, उस मौजूदा उपयोगकर्ता को rolename अनुदान दें।

ऊपर दिए गए कोड का उपयोग और संशोधित करने के लिए स्वतंत्र महसूस करें :)।