Поделиться через


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

Обновлен: November 2007

Начиная с SQL Server 2005, хранимую процедуру можно подписать сертификатом или асимметричным ключом. Эта возможность предназначена для сценариев, в которых разрешения не могут наследоваться по цепочке владения или если цепочка владения разорвана, например в динамическом SQL. Можно создать пользователя, сопоставленного с сертификатом, предоставляя разрешения пользователя сертификата на объекты, доступ к которым нужен хранимым процедурам.

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

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

Bb669102.alert_note(ru-ru,VS.90).gifПримечание.

Можно создать сертификат в базе данных master, чтобы предоставить разрешения уровня сервера.

Создание сертификатов

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

Подписание модуля выполняется в четыре шага.

  1. Создание сертификата с использованием инструкции Transact-SQL CREATE CERTIFICATE [certificateName]. Эта инструкция имеет несколько параметров для настройки даты начала и даты окончания, а также пароля. По умолчанию срок действия сертификата истекает через год.

  2. Создание пользователя базы данных, связанного с этим сертификатом, с использованием инструкции Transact-SQL CREATE USER [userName] FROM CERTIFICATE [certificateName]. Этот пользователь существует только в базе данных и не связан с именем входа.

  3. Предоставление пользователю сертификата необходимых разрешений на объекты базы данных.

Bb669102.alert_note(ru-ru,VS.90).gifПримечание.

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

  1. Подписание процедуры при помощи сертификата с использованием инструкции Transact-SQL ADD SIGNATURE TO [procedureName] BY CERTIFICATE [certificateName].

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

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

Ресурс

Описание

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

Описывает подписывание модулей, демонстрирует образец сценария и содержит ссылки на соответствующие разделы по языку Transact-SQL.

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

Описывает подписывание модулей, демонстрирует образец сценария и содержит ссылки на соответствующие разделы по языку Transact-SQL.

Подписание хранимых процедур с помощью сертификата в электронной документации по SQL Server 2005

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

См. также

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

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

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

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

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

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

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

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

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