Олицетворение и средства обеспечения безопасности при интеграции со средой 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
Олицетворение и учетные данные для соединений