программирование SQL Server и атрибуты защиты основного приложения
Возможность загрузки и выполнения управляемого кода в основном приложении SQL Server нуждается в выполнении требований, предъявляемых основным приложением, как к управлению доступом для кода, так и к защите ресурсов основного приложения. Требования к управлению доступом для кода указаны в одном из трех наборов разрешений SQL: SAFE, EXTERNAL-ACCESS или UNSAFE. Код, выполняемый в наборе разрешений SAFE или EXTERNAL-ACCESS, должен избегать использования определенных типов или элементов, в которых применяется атрибут HostProtectionAttribute. Атрибут HostProtectionAttribute не является разрешением безопасности, насколько это может быть гарантировано надежностью, так как он определяет некоторые конструкции кода (типы или методы), которые могут быть неразрешены в основном приложении. Использование атрибута HostProtectionAttribute принудительно включает модель программирования, которая способствует обеспечению стабильности основного приложения.
Атрибуты защиты основного приложения
Атрибуты защиты основного приложения идентифицируют типы или элементы, которые не вписываются в модель программирования основного приложения и представляют следующие угрозы безопасности, увеличенные по сравнению со стандартной моделью:
В других условиях являются малоэффективными.
Могут привести к дестабилизации пользовательского кода, управляемого сервером.
Могут привести к дестабилизации самого процесса сервера.
В SQL Server не разрешено использовать тип или элемент, который имеет атрибут HostProtectionAttribute, указывающий значение HostProtectionResource объектов SharedState, Synchronization, MayLeakOnAbort или ExternalProcessMgmt. Это не дает сборкам вызывать элементы, которые разрешают общее состояние, выполняют синхронизацию, могут привести к утечке ресурсов при завершении или влияют на целостность процесса SQL Server.
Запрещенные типы и элементы
В следующей таблице приведены типы и элементы, значения HostProtectionResource которых запрещены в SQL Server.
Наборы разрешений SQL Server
SQL Server позволяет пользователям указывать требования к надежности кода, развернутого в базе данных. Если сборки выгружены в базу данных, автор сборки может указать один из трех наборов разрешений для этой сборки: SAFE, EXTERNAL-ACCESS или UNSAFE.
Набор разрешений |
SAFE |
EXTERNAL-ACCESS |
UNSAFE |
---|---|---|---|
Управление доступом для кода |
Только выполнение |
Выполнение и доступ к внешним ресурсам |
Unrestricted |
Ограничения модели программирования |
Да |
Да |
Без ограничений |
Требование проверяемости |
Да |
Да |
Нет |
Возможность вызова машинного кода |
Нет |
Нет |
Да |
SAFE — это наиболее надежный и безопасный режим с соответствующими ограничениями в терминологии разрешенной модели программирования. Код SAFE имеет функциональные возможности высокой надежности и безопасности. Сборки SAFE имеют достаточно разрешений для выполнения, вычислений и имеют доступ к локальной базе данных. Сборки SAFE должны после проверки соответствовать безопасному типу и не могут вызывать неуправляемый код.
Режим EXTERNAL-ACCESS предоставляет промежуточный вариант безопасности. При его использовании код может получать доступ к внешним по отношению к базе данных ресурсам, однако имеет надежность и безопасность режима SAFE.
UNSAFE — это режим для кода с очень высоким уровнем доверия, который может быть создан только администраторами баз данных. Этот доверенный код не содержит ограничений на доступ кода и может вызывать неуправляемый (машинный) код.
В SQL Server используется уровень политики управления доступом для кода на уровне основного приложения для настройки политики основного приложения, предоставляющей один из трех наборов разрешений в зависимости от набора разрешений, хранящегося в каталогах SQL Server. Управляемый код, работающий внутри базы данных, всегда получает один из этих наборов разрешений доступа кода.
Ограничения модели программирования
Модель программирования для управляемого кода в SQL Server нуждается в функциях, процедурах и типах, которые не требует использования состояния различных вызовов или использования общего состояния различных пользовательских сеансов. Более того, как было описано ранее, присутствие общего состояния может привести к возникновению критических исключений, которые повлияют на масштабируемость и надежность приложения.
Учитывая эти условия, в SQL Server не разрешено использовать статические переменные и статические элементы данных. Для сборок SAFE и EXTERNAL-ACCESS SQL Server проверяет метаданные сборки во время CREATE ASSEMBLY и завершает создание таких сборок с ошибкой, если обнаружит использование статических элементов данных и статических переменных.