2014-11-18 2 views
5

я получаю следующие ошибки в моей базе данных разработки:риски безопасности установления доверия = на В SQL Server 2012

A .NET Framework error occurred during execution of user-defined routine or aggregate "SpCreateTable": 
System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host. 

The protected resources (only available with full trust) were: All 
The demanded resources were: Synchronization, ExternalThreading 

Правильно ли решение установить надежные = на? Что такое проблемы безопасности?

ответ

8

TRUSTWORTHY свойства базы данных (если установлено в ON) по существу декларирует к SQL Server, что код, содержащийся в этой базе данных, и исполняющий в олицетворенном контексте, должен быть позволено достичь за пределами этой базы данных, сохраняя при этом, что изображал контекст безопасности , Он также допускает все SQLCLR Агрегаты в этой базе данных должны быть установлены в EXTERNAL_ACCESS и UNSAFE, независимо от того, распространяется ли этот код за пределы сервера (вне контекста: доступ к сети, доступ к файловой системе, доступ к реестру, доступ к среде и т. Д.).

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

Установка базы данных на TRUSTWORTHY также позволяет любому процессу, начиная с этой базы данных, доходить до уровня сервера и/или переходить в другие базы данных. Обычно процесс ограничивается/помещается на карантин в базу данных, где он был запущен. Если база данных принадлежит «sa» Login, то любой процесс, инициированный в этой базе данных и работающий как «dbo», будет иметь «sa» привилегии (yikes!).

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

Вам следует избегать установки базы данных на TRUSTWORTHY в максимально возможной степени. Если у вас действительно есть многопоточные/асинхронные вызовы И если у вас есть исходный код и компилируете сборку, то я не могу придумать причину использования опции SET TRUSTWORTHY ON. Вместо этого, вы должны подписать сборку с паролем и использовать следующие команды, чтобы установить предпочтительный способ позволять EXTERNAL_ACCESS и UNSAFE сборки:

USE [master]; 
    CREATE ASYMMETRIC KEY [ClrPermissionsKey] 
    AUTHORIZATION [dbo] 
    FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll'; 

CREATE LOGIN [ClrPermissionsLogin] 
    FROM ASYMMETRIC KEY [ClrPermissionsKey]; 

GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin]; 

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

ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE; 

Или вы могли бы включили WITH PERMISSION_SET = UNSAFE в конце команды CREATE ASSEMBLY.

+0

Они фактически подписаны с асимметричным ключом и установлены на небезопасные, но все же получают эту ошибку. не знаю, почему – cdub

+2

+1 для предложения допустимого обходного пути, но вы действительно не рассматривали реальный вопрос (конкретные и явные риски в отношении TRUSTWORTHY в целом). –

+0

@chris Вы уверены, что сборка настроена на UNSAFE? Ошибка, которую вы опубликовали, - это то, что вы получаете, когда сборка не настроена на небезопасную. Или, когда он был установлен в UNSAFE, но затем был удален или был удален, или, по крайней мере, было удалено разрешение «UNSAFE ASSEMBLY». Если это не так, то какие методы структуры вы вызываете в своем методе proc? –

0

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

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

Смежные вопросы