Управление разрешениями с помощью хранимых процедур в SQL Server (ADO.NET)

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

Преимущества хранимых процедур

Хранимые процедуры обладают следующими преимуществами.

  • Логику данных и бизнес-правила можно инкапсулировать, чтобы пользователи получали доступ к данным и объектам только тем путем, который предусмотрен разработчиками и администраторами баз данных.

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

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

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

  • К написанным однажды хранимым процедурам могут обращаться многие приложения.

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

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

Выполнение хранимых процедур

Хранимые процедуры предоставляют доступ к данным с помощью цепочек владения таким образом, чтобы пользователям не требовались явные разрешения для работы с объектами базы данных. Цепочка владения возникает, когда объекты, последовательно получающие доступ друг к другу, принадлежат одному пользователю. Например, хранимая процедура может вызывать другие хранимые процедуры или обращаться к нескольким таблицам. Если все объекты в цепочке владения принадлежат одному владельцу, то SQL Server проверяет только разрешение EXECUTE вызывающего, но не разрешения вызывающего на другие объекты. Поэтому нужно предоставить только разрешения EXECUTE на хранимые процедуры и отменить или запретить все разрешения на базовые таблицы.

Наиболее оптимальные методы

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

  • Предоставьте разрешения EXECUTE на хранимые процедуры нужным ролям базы данных для доступа к данным.

  • Отмените или запретите все разрешения на базовые таблицы для всех ролей и пользователей базы данных, в том числе роль public. Все пользователи наследуют разрешения из роли public. Поэтому запрет разрешений для роли public означает, что доступ будут иметь только владельцы объектов и члены роли sysadmin, все остальные пользователи не смогут наследовать разрешения, будучи членами других ролей.

  • Не добавляйте пользователей или роли к ролям sysadmin и db_owner. Системные администраторы и владельцы базы данных имеют доступ ко всем объектам базы данных.

  • Отключите учетную запись guest. Это будет препятствовать соединению анонимных пользователей с базой данных. В новых базах данных учетная запись guest отключена по умолчанию.

  • Реализуйте обработку ошибок и ошибочных записей журнала.

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

  • Избегайте использования динамического SQL за исключением абсолютно необходимых случаев. Используйте функцию Transact-SQL QUOTENAME() для разделения строковых значений и избегайте любого вхождения разделителей в строке ввода.

Внешние ресурсы

Дополнительные сведения см. в следующих ресурсах.

Ресурс

Описание

Хранимые процедуры и Внедрение кода SQL в электронной документации по SQL Server 2008

Разделы описывают, как создавать хранимые процедуры и как работает внедрение кода SQL.

Хранимые процедуры и Внедрение кода SQL в электронной документации по SQL Server 2005

Разделы описывают, как создавать хранимые процедуры и как работает внедрение кода SQL.

Хранимые процедуры и Использование цепочек владения в электронной документации по SQL Server 2000

Разделы описывают, как создавать хранимые процедуры и как использовать преимущества цепочек владения в SQL Server 2000.

См. также

Основные понятия

Сценарии защиты приложений в SQL Server (ADO.NET)

Написание защищенного динамического SQL-кода в SQL Server (ADO.NET)

Подписывание хранимых процедур в SQL Server (ADO.NET)

Настройка разрешений с олицетворением в SQL Server (ADO.NET)

Изменение данных с помощью хранимых процедур (ADO.NET)

Другие ресурсы

Защита приложений ADO.NET

Общие сведения о безопасности SQL Server (ADO.NET)