2010-03-08 2 views
9

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

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

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

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

+0

Поскольку, похоже, не было запеченного способа, я фактически реализовал простой прокси TCP, который находится перед MongoDB и фильтрует сообщения, отправленные на сервер, путем проверки кода операции: http: // gist.github.com/328486 – rcoder

+0

Спасибо, что разместили текст. Ваша настройка прокси-сервера довольно крутая и может пригодиться для проекта корпоративного типа, над которым я могу работать практически в одном и том же (контрольный журнал). –

+0

Я искал это одно и то же. ИМХО, это самый большой провал в MongoDB на данный момент. –

ответ

8

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

+0

Это то, что я подозревал. Я эффективно применяю доступ только для чтения прямо сейчас, не подвергая необработанное подключение к базе данных в любом месте кода приложения. Это не полностью защищает нас от ошибок пользователя или вредоносных обновлений, но я придумаю еще одно долговременное решение журнала аудита. – rcoder

0

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

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

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

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

+1

Как я уже упоминал в своем вопросе, я не хочу добавлять пользователя только для чтения; скорее, я хочу добавить пользователя, который может только * писать * записи, не будучи в состоянии изменить или удалить их после факта. – rcoder

1

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

Допустим, вы хотите, чтобы пользователь, который может только писать (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 и этот пользователь имеет только написать доступ к данным ase's yourdbcol1.

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

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