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


Безопасность доступа к коду интеграции CLR

Область применения:SQL Server

Среда CLR поддерживает модель безопасности, называемую управлением доступом для кода. В этой модели разрешения предоставляются сборкам на основе идентификатора кода. Дополнительные сведения см. в безопасности доступа к коду.

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

  • политика компьютера. Эта политика действует для всего управляемого кода, работающего на компьютере, на котором установлен SQL Server.

  • политика пользователя. Эта политика действует для управляемого кода, размещенного процессом. Для SQL Server политика пользователя зависит от учетной записи Windows, в которой выполняется служба SQL Server.

  • политика узла. Эта политика настраивается узлом среды CLR (в данном случае SQL Server), которая действует для управляемого кода, работающего в этом узле.

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

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

Наборы разрешений уровня политики узла SQL Server

Набор разрешений безопасности доступа к коду, предоставленных сборкам уровня политики узла SQL Server, определяется набором разрешений, указанным при создании сборки. Существует три набора разрешений: SAFE, EXTERNAL_ACCESSи UNSAFE (указанные с помощью параметра PERMISSION_SETCREATE ASSEMBLY).

SQL Server предоставляет уровень политики безопасности на уровне узла среде CLR при его размещении. Эта политика является дополнительным уровнем политики ниже двух уровней политики, которые всегда применяются. Эта политика устанавливается для каждого домена приложения, созданного SQL Server. Эта политика не предназначена для домена приложения по умолчанию, который действует при создании экземпляра СРЕДЫ CLR SQL Server.

Политика уровня узла SQL Server — это сочетание фиксированной политики SQL Server для системных сборок и пользовательской политики для пользовательских сборок.

Исправленная политика для сборок СРЕДЫ CLR и системных сборок SQL Server предоставляет им полное доверие.

Указанная пользователем часть политики узла SQL Server основана на владельце сборки, указывающей один из трех контейнеров разрешений для каждой сборки. Дополнительные сведения о следующих разрешениях безопасности см. в пакете SDK для .NET Framework.

SAFE

Разрешаются только внутренние вычисления и локальный доступ к данным. SAFE является самым строгим набором разрешений. Код, выполняемый сборкой с разрешениями SAFE, не может получить доступ к ресурсам внешней системы, таким как файлы, сеть, переменные среды или реестр.

SAFE сборки имеют следующие разрешения и значения:

Разрешение Значения и описание
SecurityPermission Execution: разрешение на выполнение управляемого кода.
SqlClientPermission Context connection = true, context connection = yes: можно использовать только контекст-соединение, а строка подключения может указывать только значение context connection=true или context connection=yes.

AllowBlankPassword = false: пустые пароли не разрешены.

EXTERNAL_ACCESS

EXTERNAL_ACCESS сборки имеют те же разрешения, что и сборки SAFE, с дополнительной возможностью доступа к внешним ресурсам системы, таким как файлы, сети, переменные среды и реестр.

EXTERNAL_ACCESS сборки также имеют следующие разрешения и значения:

Разрешение Значения и описание
DistributedTransactionPermission Unrestricted: разрешены распределенные транзакции.
DNSPermission Unrestricted: разрешение на запрос сведений с серверов доменных имен.
EnvironmentPermission Unrestricted: разрешен полный доступ к переменным системы и пользовательской среды.
EventLogPermission Administer: разрешены следующие действия: создание источника событий, чтение существующих журналов, удаление источников событий или журналов, реагирование на записи, очистка журнала событий, прослушивание событий и доступ к коллекции всех журналов событий.
FileIOPermission Unrestricted: разрешен полный доступ к файлам и папкам.
KeyContainerPermission Unrestricted: разрешен полный доступ к контейнерам ключей.
NetworkInformationPermission Access: разрешена проверка pinging.
RegistryPermission Позволяет HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIGи HKEY_USERS.
SecurityPermission Assertion. Возможность утверждать, что все вызывающие данные этого кода имеют необходимое разрешение для операции.

ControlPrincipal: возможность управления основным объектом.

Execution: разрешение на выполнение управляемого кода.

SerializationFormatter. Возможность предоставления служб сериализации.
SmtpPermission Access: разрешены исходящие подключения к порту узла SMTP 25.
SocketPermission Connect: разрешены исходящие подключения (все порты, все протоколы) на адресе транспорта.
SqlClientPermission Unrestricted: разрешен полный доступ к источнику данных.
StorePermission Unrestricted: разрешен полный доступ к хранилищам сертификатов X.509.
WebPermission Connect: разрешены исходящие подключения к веб-ресурсам.

UNSAFE

UNSAFE позволяет сборкам неограниченный доступ к ресурсам как внутри, так и за пределами SQL Server. Код, выполняемый из UNSAFE сборки, также может вызывать неуправляемый код.

UNSAFE сборки предоставляются FullTrust.

SAFE — это рекомендуемый параметр разрешения для сборок, выполняющих задачи вычисления и управления данными без доступа к ресурсам за пределами SQL Server.

EXTERNAL_ACCESS рекомендуется для сборок, обращаюющихся к ресурсам за пределами SQL Server. EXTERNAL_ACCESS сборки по умолчанию выполняются как учетная запись службы SQL Server. Для EXTERNAL_ACCESS кода можно явно олицетворить контекст безопасности проверки подлинности Windows вызывающей стороны. Так как по умолчанию используется учетная запись службы SQL Server, разрешение на выполнение EXTERNAL_ACCESS должно быть предоставлено только именам входа, доверенным для запуска от имени учетной записи службы.

С точки зрения безопасности EXTERNAL_ACCESS и UNSAFE сборки идентичны. Однако EXTERNAL_ACCESS сборки обеспечивают различные защиты надежности и надежности, которые не содержатся в UNSAFE сборках.

Указание UNSAFE позволяет коду в сборке выполнять незаконные операции с пространством процессов SQL Server, поэтому может компрометировать надежность и масштабируемость SQL Server. Дополнительные сведения о создании сборок СРЕДЫ CLR в SQL Server см. в разделе Управление сборками интеграции CLR.

Внимание

SQL Server содержит сборки СРЕДЫ CLR, которые ядро СУБД использует для предоставления определенных функциональных возможностей. Сборка Microsoft.SQLServer.Types, включенная в установку SQL Server, отображается в метаданных как сборка UNSAFE. Это сделано намеренно. Эти сборки считаются доверенными и безопасными по умолчанию.

Доступ к внешним ресурсам

Если определяемый пользователем тип (UDT), хранимая процедура или другая сборка конструктора зарегистрирована в наборе разрешений SAFE, то управляемый код, выполняемый в конструкции, не может получить доступ к внешним ресурсам. Однако если заданы EXTERNAL_ACCESS или UNSAFE наборы разрешений, а управляемый код пытается получить доступ к внешним ресурсам, SQL Server применяет следующие правила:

If Следующее действие
Контекст выполнения соответствует имени входа SQL Server. Попытки получить доступ к внешним ресурсам отклоняются, и активизируется исключение безопасности.
Контекст выполнения соответствует имени входа Windows, и контекстом выполнения является первоначальный вызывающий объект. Доступ к внешнему ресурсу осуществляется в контексте безопасности учетной записи службы SQL Server.
Вызывающий объект не является исходным вызывающим элементом. Доступ запрещается, и активизируется исключение безопасности.
Контекст выполнения соответствует имени входа Windows, а контекст выполнения — исходный вызывающий объект, и вызывающий объект олицетворен. Access использует контекст безопасности вызывающего объекта, а не учетную запись службы.

Сводка набора разрешений

На следующей диаграмме перечислены ограничения и разрешения, предоставленные SAFE, EXTERNAL_ACCESSи наборы разрешений UNSAFE.

Функция SAFE EXTERNAL_ACCESS UNSAFE
Разрешения безопасности доступа к коду Только выполнение Выполнение и доступ к внешним ресурсам Неограниченное (включая P/Invoke)
Ограничения модели программирования Да Да Без ограничений
Требование к проверяемости Да Да Нет
Локальный доступ к данным Да Да Да
Возможность вызова машинного кода Нет Нет Да