연결에 대한 가장 및 자격 증명
SQL Server CLR(공용 언어 런타임) 통합에서 Windows 인증을 사용하는 것은 복잡하지만 SQL Server 인증을 사용하는 것보다 더 안전합니다. Windows 인증을 사용하는 경우 다음 사항을 고려하십시오.
기본적으로 Windows에 연결하는 SQL Server 프로세스는 SQL Server Windows 서비스 계정의 보안 컨텍스트를 얻습니다. 그러나 CLR 함수를 프록시 ID에 매핑하여 해당 아웃바운드 연결이 Windows 서비스 계정과는 다른 보안 컨텍스트를 사용하도록 할 수 있습니다.
경우에 따라 서비스 계정으로 실행하는 대신 SqlContext.WindowsIdentity
속성을 사용하여 호출자를 가장할 수도 있습니다. WindowsIdentity
인스턴스는 호출 코드를 호출한 클라이언트의 ID를 나타내며, 클라이언트에서 Windows 인증을 사용한 경우에만 사용할 수 있습니다. WindowsIdentity
인스턴스를 얻은 후 Impersonate
를 호출하여 스레드의 보안 토큰을 변경한 다음 클라이언트 대신 ADO.NET 연결을 열 수 있습니다.
SQLContext.WindowsIdentity.Impersonate를 호출한 후에는 로컬 데이터에 액세스할 수 없으며 시스템 데이터에 액세스할 수 없습니다. 데이터에 다시 액세스하려면 WindowsImpersonationContext.Undo를 호출해야 합니다.
다음 예에서는 SqlContext.WindowsIdentity
속성을 사용하여 호출자를 가장하는 방법을 보여 줍니다.
Visual C#
WindowsIdentity clientId = null;
WindowsImpersonationContext impersonatedUser = null;
clientId = SqlContext.WindowsIdentity;
// This outer try block is used to protect from
// exception filter attacks which would prevent
// the inner finally block from executing and
// resetting the impersonation.
try
{
try
{
impersonatedUser = clientId.Impersonate();
if (impersonatedUser != null)
return GetFileDetails(directoryPath);
else return null;
}
finally
{
if (impersonatedUser != null)
impersonatedUser.Undo();
}
}
catch
{
throw;
}
참고
가장의 동작 변경에 대한 자세한 내용은 SQL Server 2014의 데이터베이스 엔진 기능 호환성이 손상되는 변경을 참조하세요.
또한 Microsoft Windows ID instance 가져온 경우 기본적으로 해당 instance 다른 컴퓨터로 전파할 수 없습니다. Windows 보안 인프라는 기본적으로 이를 제한합니다. 하지만 신뢰할 수 있는 여러 컴퓨터에 Windows ID를 전파할 수 있는 "위임"이라는 메커니즘이 있습니다. TechNet 문서 "Kerberos 프로토콜 전환 및 제한된 위임"에서 위임에 대해 자세히 알아볼 수 있습니다.