SQL-доступ для веб-приложений

Предыстория. Наша команда создает собственное веб-приложение для интрасети. Мы используем стандартный трехуровневый подход. Уровень представления (веб-приложение mvc), бизнес-уровень и уровень доступа к данным.

База данных Sql используется для сохранения.

Веб-приложение/iis обрабатывает аутентификацию пользователя (аутентификацию Windows). Ведение журнала выполняется на уровне бизнеса и доступа к данным.

Учетная запись службы вопросов и учетные записи Sql для конкретных пользователей: Использовать учетную запись службы/приложения: Команда разработчиков предлагает настроить учетную запись службы (настроить только для приложения). Этой учетной записи службы требуется доступ для записи и чтения к базе данных.

Vs

Передача учетных данных пользователя в SQL ИТ-операторы говорят, что использование учетной записи службы (специально созданной только для приложения) для доступа к базе данных не считается лучшей практикой. Настройте делегирование Kerberos, настроенное с веб-сервера на сервер SQL, чтобы вы могли передавать учетные данные Windows конечных пользователей и создавать роль базы данных, которая предоставляет соответствующие уровни доступа к данным для конечных пользователей.

Какова наилучшая практика для настройки учетных записей в sql, когда все запросы к базе данных будут поступать через интерфейсный клиент (т.е. через уровень шины, а затем уровень данных)


person Mark    schedule 08.08.2015    source источник


Ответы (2)


Лучшей практикой здесь является позволить человеку/команде, ответственной за базу данных, принять решение. Похоже, что команда разработчиков хочет переслать (или выдать себя за) некоторые учетные данные в БД, что, как я знаю, нравится делать некоторым небольшим командам, но да, это может оставить ситуацию слишком открытой. Приложение может делать с базой данных все, что захочет, что не так уж важно, если вы занимаетесь такими вещами.

Лично я, если я понимаю то, что вы говорите выше, я делаю больше того, о чем думает ИТ-команда (я использую Postgres). Другими словами, мое приложение развертывается через SSH с использованием данной учетной записи (скажем, это учетная запись AppName). Это означает, что мне нужно, чтобы мои SSH-ключи были настроены для безопасного развертывания (используя PEM, known_keys или что-то еще).

В домашнем корне для AppName у меня есть файл с именем .pgpass который имеет довольно специфическую защиту (0600). Это означает, что моя учетная запись AppName будет использовать для входа локальную безопасность, а не имя пользователя/пароль.

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

В конце концов, подумайте через 5 лет о том, как будут выглядеть ваш проект и команда. Будьте оптимистичны – возможно, это будет ошеломительный успех! Как будет выглядеть техническое обслуживание? Какие ошибки будет совершать ваша команда? Гибкость сейчас — это хорошо, но убедитесь, что решение будет принимать тот, кто попадет в беду, если в вашей базе данных возникнут проблемы с безопасностью.

person Community    schedule 08.08.2015
comment
Спасибо и согласен - команда, ответственная за базу данных, должна позвонить. Один вопрос reg ваш ответ. Вы упомянули, что используете учетную запись appname. Итак, выполняются ли какие-либо вызовы базы данных в учетной записи имени приложения (и учетная запись приложения имеет полные права на базу данных) или вы по-прежнему передаете учетные данные пользователя (через слои, если таковые имеются) и выполняете вызов в контексте пользователя? - person Mark; 09.08.2015

Лучше всего иметь индивидуальные учетные записи. Это позволяет вам использовать средства базы данных для определения того, кто обращается к базе данных.

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

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

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

person Gordon Linoff    schedule 08.08.2015
comment
Я добавлю, что приложение выполняет аутентификацию/аудит/регистрацию (т.е. происходит на бизнес-уровне или уровне доступа к данным). Таким образом, нет смысла использовать аутентификацию и ведение журнала sql, которые я вижу. - person Mark; 08.08.2015
comment
Я также хотел бы подчеркнуть, что пользователи не могут совершать звонки напрямую в db. Они всегда идут через клиента. - person Mark; 08.08.2015
comment
@МаркХ. . . Это редкое приложение, для которого не было бы полезно знать, кто какие функции использует для обслуживания и разработки. - person Gordon Linoff; 08.08.2015