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


Олицетворение и средства обеспечения безопасности при интеграции со средой CLR

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

Примечание

Сведения об изменениях поведения в олицетворении см. в статье Критические изменения в функциях ядра СУБД в SQL Server 2014 г.

Поставщик внутрипроцессного доступа к данным предоставляет прикладной программный интерфейс, SqlContext.WindowsIdentity, который может использоваться для получения токена, связанного с текущим контекстом безопасности. В управляемом коде сборок EXTERNAL_ACCESS и UNSAFE этот метод может использоваться для получения контекста, а метод WindowsIdentity.Impersonate платформы .NET Framework служит для олицетворения этого контекста. При проведении явного олицетворения в пользовательском коде применяются следующие ограничения.

  • Внутрипроцессный доступ к данным не допускается, если управляемый код находится в состоянии, прошедшем олицетворение. В коде можно выполнить откат олицетворения, а затем вызвать средства внутрипроцессного доступа к данным. Следует отметить, что для отката олицетворения требуется сохранить возвращаемое значение (объект WindowsImpersonationContext) исходного метода Impersonate и вызвать метод Undo применительно к этому контексту WindowsImpersonationContext.

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

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

Если код выполняется в контексте, прошедшем олицетворение, отличном от контекста SQL Server, то в нем нельзя выполнять вызовы внутрипроцессного доступа к данным; в коде необходимо отменить контекст олицетворения перед выполнением вызовов внутрипроцессного доступа к данным. Если внутрипроцессный доступ к данным осуществляется из управляемого кода, то для проверки прав доступа в управляемом коде всегда используется первоначальный контекст выполнения точки входа Transact-SQL.

Как сборки, так EXTERNAL_ACCESS и UNSAFE сборки обращаются к ресурсам операционной системы с помощью учетной записи службы SQL Server, если они не добровольно олицетворяют текущий контекст безопасности, как описано выше. В связи с этим требуется более высокий уровень доверия к авторам сборок EXTERNAL_ACCESS, чем к авторам сборок SAFE, что выражается в наличии разрешения EXTERNAL ACCESS на уровне имени входа. Разрешение должно быть предоставлено EXTERNAL ACCESS только тем именам входа, которым доверено выполнение кода в учетной записи службы SQL Server.

См. также:

Безопасность интеграции со средой CLR
Олицетворение и учетные данные для соединений