Я ищу хороший шаблон для реализации контроля безопасности на уровне строк (например, через прокси, веб-службу посредника или хранимые процедуры), подходящий для использования в среде клиент-> базы данных. Я контролирую и клиента, и базу данных. Некоторые требования:
- Запрещение пользователям видеть в результатах запроса строки, на просмотр которых у них нет разрешения
- Разрешение пользователям ВСТАВЛЯТЬ и ОБНОВЛЯТЬ свои собственные строки в таблице, что дает им разрешение на их просмотр.
- (мягкое требование), позволяющее пользователям предоставлять другим доступ для чтения или записи их строк
- Недорогое решение с открытым исходным кодом, работающее в Linux. Насколько я понимаю, ни одна бесплатная база данных не реализует безопасность на уровне строк как таковую. Oracle поддерживает это, но это слишком $$$$. Postgres мог бы реализовывать это в 9.4, но изначально он был нацелен на 9.3, но соскользнул, и есть обсуждение машинного обучения. что он может снова поскользнуться. Я предварительно подумываю об использовании postgres только потому, что они кажутся наиболее продвинутыми в этой функции.
Некоторые (не очень хорошие) идеи у меня были:
- Используйте представления барьера безопасности postgresql и запретите пользователю доступ к базовой таблице. К сожалению, нет хорошего способа вставить строку в представление барьера безопасности, поэтому некоторые привилегированные прокси / веб-сервисы должны будут обрабатывать вставить инструкции. Кажется, это сложно сделать правильно.
- Используйте обычные представления и запретите пользователю доступ к базовой таблице. Это позволяет
insert
, но мне нужно было бы довольно жестко заблокировать разрешения (например, без функций создания) и Похоже, есть много ошибок (например, деление на ноль), которые приводят к утечке информации. - Определите некоторое подмножество SQL и создайте прокси-сервер, который будет вашей единственной точкой связи с базой данных. Прокси-сервер анализирует ваш SQL-запрос и перезаписывает его, чтобы обеспечить соблюдение требований безопасности. В целом это кажется трудным, но, возможно, я смогу обойтись очень маленьким подмножеством SQL, пока postgres не реализует безопасность на уровне строк по-настоящему.
- Просто имейте разные таблицы для разных пользователей (или даже разных БД). Однако я не уверен, насколько хорошо это масштабируется для многих пользователей. Кроме того, это не соответствует мягким требованиям.
- Найдите коммерческую, но недорогую БД, которая действительно поддерживает эту
- Используйте Veil, но похоже, что это не так. поддерживается, и у него есть большинство ограничений других решений
Я много гуглил по этой теме, но мне еще предстоит увидеть вскрытие того, как кто-то решил эту проблему в реальном сценарии. Есть некоторая документация для MS SQL, но, похоже, не рекомендуется в MySQL, а записи для postgres практически отсутствуют.
Это кажется очень распространенной проблемой, но я предполагаю, что многие люди пишут веб-приложения и довольны тем, что приковывают своих пользователей наручниками к определенным предварительно проверенным запросам, но мне действительно нужно предоставить моим пользователям как можно больше гибкости для запроса данных с помощью мой клиент.