سؤال

أنا الآن باستخدام MongoDB لتسجيل سجلات التطبيق، وبينما أكون سعيدا جدا بكل من الأداء وكنت قادرا على تفريغ البيانات المنظمة التعسفية في سجلات السجل، أشعر بالقلق بواسطة تغيير سجلات السجل بمجرد تخزينها.

في قاعدة بيانات تقليدية، أود أن تقوم بتنظيم المنح على جداول السجل الخاصة بي بحيث يحتوي مستخدم التطبيق على امتيازات وتحديد امتيازات، ولكن لا يتم تحديث أو حذف. وبالمثل، في CouchDB، يمكنني كتابة وظيفة التحقق من صحة التحديث التي رفضت جميع محاولات تعديل مستند موجود.

ومع ذلك، لم أتمكن من إيجاد طريقة لتقييد العمليات على قاعدة بيانات أو مجموعة من MongoDB خارج مستويات الوصول الثلاثة (بدون إمكانية الوصول، للقراءة فقط، "وضع الله") موثق في موضوع الأمن على mongodb wiki.

هل قام أي شخص آخر بنشر Mongodb كمخزن مستند في إعداد حيث كان التحمل (أو على الأقل تغيير التتبع) للمستندات بمتطلبات؟ ما هي الحيل أو التقنيات التي استخدمتها للتأكد من أن رمز التطبيق بشكل سيئ أو خبيث لا يمكن تعديل أو تدمير سجلات السجل الموجودة؟ هل أحتاج إلى لف تسجيل الدخول Mongodb الخاص بي في طبقة الخدمة التي تفرض سياسة الكتابة فقط، أو هل يمكنني استخدام بعض الجمع بين التكوين، والاستعلام عن الاختراق، وتكرار النسخ المتماثل لضمان الحفاظ على سجل متسق أو مراجعة الحسابات؟

هل كانت مفيدة؟

المحلول

أود أن أقول أن أفضل رهان سيكون لالتقاط الوصول إلى MongoDB في طبقة الخدمة التي تفرض عقودك المحددة. نحن لا نفعل الكثير في طريق التحكم بالوصول الدقيق للوصول لأن هناك العديد من الحالات المختلفة التي تحل جميعها بشكل صحيح صعبة للغاية. لذلك بالنسبة للجزء الأكبر، الأمر متروك لطبقة التطبيق لتنفيذ هذا النوع من الضوابط.

نصائح أخرى

لإضافة أ اكتب فقط (على مستوى التجميع) المستخدم إلى MongoDB القيام بما يلي.

قل أنك تريد أن يكون لديك مستخدم ذلك يمكن فقط كتابة (إدراج فقط) إلى مجموعة معينة في قاعدة بيانات معينة.

إنشاء ملف 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..

التأثير الجانبي لهذا هو هذا الدور اسم الدور أنشئ. إذا كان لديك مستخدم موجود يجب أن يكون لديه حق الوصول فقط إلى نفس المجموعة، دور المنح اسم الدور إلى ذلك المستخدم الحالي.

لا تتردد في استخدام وتعديل الرمز المقدم أعلاه :).

في MongoDB 1.3.2+ يمكنك إضافة بعض التقييد في المستخدم:

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

لكنها موجودة فقط الآن ليست أفضل. ربما يمكنك إضافة بعض طلبات الميزة

انظر المعلومات في وثائق MongoDB: http://www.mongodb.org/display/docs/security+authentication.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top