Коллекции только для записи в MongoDB - PullRequest
9 голосов
/ 08 марта 2010

В настоящее время я использую MongoDB для записи журналов приложений, и, хотя я вполне доволен как производительностью, так и возможностью записывать произвольные структурированные данные в записи журнала, меня беспокоит изменчивость записей журнала после их сохранения. .

В традиционной базе данных я бы структурировал гранты для моих журнальных таблиц таким образом, чтобы пользователь приложения имел привилегии INSERT и SELECT, но не UPDATE или DELETE. Точно так же в CouchDB я мог бы написать функцию проверки обновлений, которая отклоняла бы все попытки изменить существующий документ.

Однако мне не удалось найти способ ограничить операции с базой данных или коллекцией MongoDB за пределами трех уровней доступа (без доступа, только для чтения, "режим бога"), описанных в разделе о безопасности на вики MongoDB.

Кто-нибудь еще развернул MongoDB в качестве хранилища документов в условиях, когда требовалась неизменность (или, по крайней мере, отслеживание изменений) для документов? Какие приемы или методы вы использовали, чтобы гарантировать, что плохо написанный или вредоносный код приложения не сможет изменить или уничтожить существующие записи журнала? Нужно ли мне оборачивать мою запись в MongoDB на сервисном уровне, который обеспечивает политику только для записи, или я могу использовать некоторую комбинацию конфигурации, взлома запросов и репликации, чтобы обеспечить согласованность и возможность ведения аудита?

Ответы [ 3 ]

8 голосов
/ 09 марта 2010

Я бы сказал, что лучше всего было бы ограничить доступ к MongoDB на уровне обслуживания, который обеспечивает выполнение ваших конкретных контрактов. Мы не делаем много в плане детального контроля доступа, потому что есть так много разных случаев, что правильно решить их все сложно. Так что по большей части это зависит от прикладного уровня для реализации такого рода элементов управления.

2 голосов
/ 11 февраля 2016

Чтобы добавить пользователя только для записи (на уровне коллекции) в MongoDB, выполните следующие действия.

Скажем, вы хотите иметь пользователя, который может записывать только ( insert only) в определенную коллекцию в определенной базе данных.

Создать файл 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 collection col1 .

Побочным эффектом этого является то, что создается роль rolename . Если у вас уже есть пользователь, который должен иметь доступ только на запись к той же коллекции, предоставьте роль rolename этому существующему пользователю.

Не стесняйтесь использовать и изменять код, указанный выше:).

0 голосов
/ 09 марта 2010

В MongoDB 1.3.2+ вы можете добавить некоторые ограничения для пользователя:

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

Но он существует только сейчас, а не лучше. Может быть, вы можете добавить некоторые функции запроса

см. Информацию в документации MongoDB: http://www.mongodb.org/display/DOCS/Security+and+Authentication

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...