Является ли когда-либо хорошей практикой использование отдельной учетной записи базы данных для каждого пользователя приложения?

13

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

Существуют ли какие-либо успешные сложные бизнес-приложения, в которых каждому человеку нужна своя учетная запись базы данных, а сервер баз данных полагается для обеспечения соблюдения правил политики в отношении того, что каждому пользователю следует разрешать и запрещать делать?

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

Также есть имя для этого типа установки?

bdsl
источник
1
Давайте перевернем это с ног на голову, разве это будет хорошей практикой?
Stevetech
Это, конечно, стандартная практика, не слишком в некоторых ситуациях. Во многих приложениях есть много конечных пользователей, но только один пользователь базы данных - например, WordPress, Drupal, RoundCube, Redmine. Насколько я знаю, рекомендуемая установка для каждого из этих приложений имеет только одну учетную запись пользователя на уровне базы данных, но могут легко быть сотни или тысячи пользователей.
bdsl
@ Stevetech звучит так, будто твой ответ на мой вопрос "Да". Вы можете расширить это в полный ответ?
bdsl

Ответы:

6

Если вам нужен действительно жесткий контроль на уровне данных. Например обширный аудит. Аудит не очень хорош, если несколько пользователей используют одну и ту же учетную запись. Если у вас есть пользователи, которым нужен прямой доступ к базе данных.

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

В веб-приложении база данных (например, порт 1433) обычно не отображается напрямую, поэтому у вас есть уровень безопасности. Даже если веб-приложение обращается к базе данных напрямую, пользователи по-прежнему не имеют прямого доступа к базе данных.

Если логин и пароль есть в клиентском приложении, его можно взломать. Если домен, вы можете использовать встроенную безопасность.

В базе данных вы можете иметь довольно точный контроль. Но контроль уровня строки - это немного работы. База данных не является хорошим инструментом для бизнес-правил. Бизнес-правила и детальная безопасность обычно применяются на уровне приложений.

У вас может быть смешанный режим, в котором есть некоторые хранимые процедуры, используемые администраторами, и вы хотите отслеживать, какой администратор. И вы можете предоставить доступ только для чтения пользователям, которые генерируют отчет напрямую.

папараццо
источник
5

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

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

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

введите описание изображения здесь

Если вы чувствуете необходимость такого рода доступа, вы хотите использовать управление доступом на основе ролей . Вы должны определить роли на основе того, какие разрешения необходимы в вашей базе данных, а затем сгруппировать отдельных пользователей по этим ролям. Это дает вам лучший аудит и контроль над вашей моделью безопасности, которая может быстро выйти из-под контроля при управлении прямым доступом.

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

Майк Фал
источник
4

Вы должны начать обеспечивать безопасность на самом детальном уровне как можно скорее. Роли помогают в этом отношении - предоставление людям доступа к нескольким столам одновременно не является кошмаром.

Единый аккаунт для всех - отличный источник вопросов здесь и в других местах: «Запись x была удалена, как мне узнать, кто это сделал?» - ответ вы не можете - без индивидуальных счетов и аудита .

Под «одитингом» я подразумеваю, что хотя у всех очень хорошо иметь учетную запись для всех, это не означает, что у вас есть настоящая безопасность. Если, скажем, запись в таблице HR удалена, все, что вы можете сказать, это то, что кто-то, имеющий доступ к таблице HR, сделал это - это x количество человек.

Вам нужны триггеры в вашей системе, которые регистрируют действия, чтобы иметь возможность отследить до индивидуального уровня, кто выполнил действие X (если у вас нет СУБД, такой как Oracle, где это можно сделать автоматически).

В любом случае, вы должны всегда делать свою безопасность как можно более детализированной, как можно скорее - дать людям доступ к таблицам только на основе «необходимости знать». И всегда включайте временные метки для действий в таблицы - люди часто сообщают свои идентификаторы другим - если вы можете сказать: «Джимми, ты был единственным в офисе в 17:49 ...» - опять же, это не железно, просто еще одна стрела в твоем колчане.

Может быть, если бы вы дали нам свою СУРБД, вы могли бы получить совет, более конкретный / соответствующий вашей ситуации?

Verace
источник
Я не думаю, что это напрямую связано с моей ситуацией, я работал, спрашивая в основном из любопытства. Я работаю с веб-приложениями и MySQL.
BDSL
1
Похоже, вы говорите, что все базы данных должны требовать, чтобы у каждого конечного пользователя был уникальный логин, но я знаю о многих серверных приложениях, которые просто используют одного пользователя СУБД для всего приложения, и я не видел, чтобы это осуждали как меньшее, чем лучшее практика.
BDSL
1
В интеллектуальном любопытстве нет ничего плохого - ваш пост, похоже, получил хороший прием. MySQL, вероятно, худший в плане безопасности (как и во многих других ...), но у MariaDB они есть, и он также с открытым исходным кодом. В ответ на комментарий - то, о чем вы говорите, - не лучшая практика, а худшая .
Vérace
1
@bdsl Вы смешиваете сервер с бизнес-приложением, и это является источником путаницы. Бизнес-приложения включают в себя настольные приложения.
Папараццо
1
@bdsl Тогда прекратите использовать термин серверные приложения, если вы не хотите исключать настольное приложение.
Папараццо
3

Да, это так. Подключение к базе данных из приложения в качестве одного мощного пользователя является нарушением принципа наименьших привилегий . Это основная причина большинства атак SQL-инъекций.

Обычно это делается из-за невежества, ради простоты или иногда из-за производительности.

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

Вы хотели бы выбрать сервер БД, который поддерживает безопасность строк, безопасность столбцов и олицетворение / аутентификацию через прокси-сервер (который поддерживает реальных пользователей БД + пул соединений)

Это также было бы более безопасно для приложений на основе плагинов, таких как Wordpress, где трудно избежать SQL-инъекций из-за неквалифицированных авторов плагинов. Каждый плагин получает логин db, а не приложение в целом.

Нил Макгиган
источник
Можно ли заставить каждого пользователя сайта Wordpress подключаться к базе данных с разными учетными данными?
BDSL
@ BDSL Да, это так.
Нил Макгиган
1
Можете ли вы дать ссылку на любое руководство о том, как это сделать? У меня был быстрый поиск и я не нашел его. Означает ли это, что на странице входа в wordpress запрашиваются учетные данные, необходимые для входа в БД?
BDSL
@bdsl мой php довольно ржавый. Вот как вы могли бы сделать это с помощью Spring (Java) и PostgreSQL. blog.databasepatterns.com/2015/03/… . stackoverflow.com/questions/2998597/…
Нил Макгиган
1
Wordpress был просто примером системы на основе плагинов. Это плохо сделано с точки зрения безопасности.
Нил Макгиган