다음을 통해 공유


확장된 보호를 사용한 Windows 통합 인증

Windows 통합 인증의 처리 방식에 영향을 주는 향상이 HttpWebRequest, HttpListener, SmtpClient, SslStream, NegotiateStream 및 관련 클래스의 System.Net와 관련된 네임스페이스에 적용되었습니다. 보안을 강화하기 위해 확장된 보호를 위한 지원이 추가되었습니다.

이러한 변경 내용은 이러한 클래스를 사용하여 웹 요청을 수행하고 Windows 통합 인증이 사용되는 경우 응답을 받는 애플리케이션에 영향을 줄 수 있습니다. 이러한 변경은 Windows 통합 인증을 사용하도록 구성된 웹 서버 및 클라이언트 애플리케이션에도 영향을 미칠 수 있습니다.

이러한 변경 내용은 이러한 클래스를 사용하여 다른 유형의 요청을 수행하고 Windows 통합 인증이 사용되는 경우 응답을 받는 애플리케이션에도 영향을 줄 수 있습니다.

확장된 보호를 지원하기 위한 변경 내용은 Windows 7 및 Windows Server 2008 R2의 애플리케이션에서만 사용할 수 있습니다. 이전 버전의 Windows에서는 확장된 보호 기능을 사용할 수 없습니다.

개요

Windows 통합 인증을 디자인하면 일부 자격 증명 챌린지 응답이 범용이 될 수 있습니다. 즉, 다시 사용하거나 전달할 수 있습니다. 챌린지 응답은 최소한 대상 특정 정보를 사용하여 구성해야 하며, 바람직하게는 일부 채널 관련 정보도 함께 생성해야 합니다. 그런 다음 서비스는 자격 증명 챌린지 응답에 SPN(서비스 사용자 이름)과 같은 서비스 관련 정보를 포함하도록 확장된 보호를 제공할 수 있습니다. 자격 증명 교환에서 이 정보를 통해 서비스는 부적절하게 사용되었을 수 있는 자격 증명 챌린지 응답의 악의적인 사용으로부터 더 잘 보호할 수 있습니다.

확장된 보호 디자인은 인증 릴레이 공격을 완화하도록 설계된 인증 프로토콜의 향상된 기능입니다. 채널 및 서비스 바인딩 정보의 개념을 중심으로 진행됩니다.

전체 목표는 다음과 같습니다.

  1. 클라이언트가 확장된 보호를 지원하도록 업데이트된 경우 애플리케이션은 지원되는 모든 인증 프로토콜에 채널 바인딩 및 서비스 바인딩 정보를 제공해야 합니다. 채널 바인딩 정보는 바인딩할 TLS(채널)가 있는 경우에만 제공할 수 있습니다. 서비스 바인딩 정보는 항상 제공되어야 합니다.

  2. 올바르게 구성된 업데이트된 서버는 클라이언트 인증 토큰에 있을 때 채널 및 서비스 바인딩 정보를 확인하고 채널 바인딩이 일치하지 않는 경우 인증 시도를 거부할 수 있습니다. 배포 시나리오에 따라 서버는 채널 바인딩, 서비스 바인딩 또는 둘 다를 확인할 수 있습니다.

  3. 업데이트된 서버는 정책에 따라 채널 바인딩 정보를 포함하지 않는 하위 수준 클라이언트 요청을 수락하거나 거부할 수 있습니다.

확장된 보호에서 사용되는 정보는 다음 두 부분 중 하나 또는 둘 다로 구성됩니다.

  1. 채널 바인딩 토큰 또는 CBT입니다.

  2. 서비스 주체 이름 또는 SPN 형식의 서비스 바인딩 정보입니다.

서비스 바인딩 정보는 특정 서비스 엔드포인트에 인증하려는 클라이언트의 의도를 나타냅니다. 클라이언트에서 서버로 전달되는 속성은 다음과 같습니다.

  • SPN 값은 클라이언트 인증을 수행하는 서버에서 명확한 텍스트 형식으로 사용할 수 있어야 합니다.

  • SPN의 값은 public입니다.

  • SPN은 전송 중에 암호화되어 보호되어야 합니다. 따라서 중간 공격 중에는 해당 값을 삽입, 제거 또는 수정할 수 없습니다.

CBT는 내부 클라이언트 인증 채널을 통해 대화에 연결(바인딩)하는 데 사용되는 외부 보안 채널(예: TLS)의 속성입니다. CBT에는 다음 속성(IETF RFC 5056에서도 정의됨)이 있어야 합니다.

  • 외부 채널이 있는 경우 CBT의 값은 외부 채널 또는 서버 엔드포인트를 식별하는 속성이어야 하며, 대화의 클라이언트와 서버 쪽 모두에서 독립적으로 도착해야 합니다.

  • 클라이언트에서 보낸 CBT의 값은 공격자가 영향을 줄 수 있는 값이 아니어야 합니다.

  • CBT 값의 비밀에 대한 보장은 없습니다. 그러나 이는 CBT를 전달하는 프로토콜이 암호화될 수 있으므로 서비스 바인딩 및 채널 바인딩 정보의 값을 항상 다른 서버가 검사할 수 있다는 것을 의미하지는 않습니다.

  • CBT는 공격자가 해당 값을 삽입, 제거 또는 수정할 수 없으므로 전송 중에 암호화된 무결성을 보호해야 합니다.

채널 바인딩은 변조 방지 방식으로 SPN 및 CBT를 서버로 전송하는 클라이언트에 의해 수행됩니다. 서버는 해당 정책에 따라 채널 바인딩 정보의 유효성을 검사하고 자신이 의도한 대상이라고 생각하지 않는 인증 시도를 거부합니다. 이렇게 하면 두 채널이 암호화 방식으로 함께 바인딩됩니다.

기존 클라이언트 및 애플리케이션과의 호환성을 유지하기 위해 확장된 보호를 아직 지원하지 않는 클라이언트의 인증 시도를 허용하도록 서버를 구성할 수 있습니다. 이를 "완전히 강화된" 구성과는 달리 "부분적으로 강화된" 구성이라고 합니다.

System.NetSystem.Net.Security 네임스페이스의 여러 구성 요소는 호출 애플리케이션을 대신하여 Windows 통합 인증을 수행합니다. 이 섹션에서는 통합 Windows 인증을 사용할 때 확장된 보호를 추가하기 위해 System.Net 구성 요소의 변경 내용을 설명합니다.

확장된 보호는 현재 Windows 7에서 지원됩니다. 애플리케이션이 운영 체제에서 확장된 보호를 지원하는지 여부를 확인할 수 있도록 메커니즘이 제공됩니다.

확장된 보호 지원에 대한 변경 내용

Windows 통합 인증에 사용되는 인증 프로세스는 사용되는 인증 프로토콜에 따라, 대상 컴퓨터에서 발급된 챌린지가 포함되어 클라이언트 컴퓨터로 다시 전송되는 경우가 많습니다. 확장된 보호는 이 인증 프로세스에 새로운 기능을 추가합니다.

네임스페이 System.Security.Authentication.ExtendedProtection 스는 애플리케이션에 대한 확장된 보호를 사용하여 인증을 지원합니다. 이 네임스페이스의 클래스는 ChannelBinding 채널 바인딩을 나타냅니다. 이 네임스페이스의 클래스는 ExtendedProtectionPolicy 들어오는 클라이언트 연결의 유효성을 검사하기 위해 서버에서 사용하는 확장된 보호 정책을 나타냅니다. 다른 클래스 멤버는 확장된 보호와 함께 사용됩니다.

서버 애플리케이션의 경우 이러한 클래스에는 다음이 포함됩니다.

A ExtendedProtectionPolicy 에는 다음 요소가 있습니다.

  • OSSupportsExtendedProtection 운영 체제에서 확장된 보호를 사용하여 Windows 통합 인증을 지원하는지 여부를 나타내는 속성입니다.

  • PolicyEnforcement 확장된 보호 정책을 적용해야 하는 시기를 나타내는 값입니다.

  • ProtectionScenario 배포 시나리오를 나타내는 값입니다. 이는 확장된 보호를 확인하는 방법에 영향을 줍니다.

  • 클라이언트가 인증의 의도한 대상으로 제공한 SPN과 일치시키는 데 사용되는 사용자 지정 SPN 목록을 포함하는 선택 사항 ServiceNameCollection 입니다.

  • 유효성 검사에 사용할 사용자 지정 채널 바인딩을 포함하는 선택 사항 ChannelBinding 입니다. 이 시나리오는 일반적인 경우가 아닙니다.

네임스페이 System.Security.Authentication.ExtendedProtection.Configuration 스는 애플리케이션에 대한 확장된 보호를 사용하여 인증 구성을 지원합니다.

기존 System.Net 네임스페이스에서 확장된 보호를 지원하기 위해 여러 가지 기능이 변경되었습니다. 이러한 변경 내용은 다음과 같습니다.

기존 System.Net.Mail 네임스페이스의 SMTP 클라이언트 애플리케이션에 대한 확장된 보호를 지원하기 위해 기능이 변경되었습니다.

  • TargetName SMTP 클라이언트 애플리케이션에 SmtpClient 확장된 보호를 사용할 때 인증에 사용할 SPN을 나타내는 클래스의 속성입니다.

기존 System.Net.Security 네임스페이스에서 확장된 보호를 지원하기 위해 여러 가지 기능이 변경되었습니다. 이러한 변경 내용은 다음과 같습니다.

SmtpNetworkElement 네임스페이스의 SMTP 클라이언트에 대한 확장된 보호 구성을 지원하기 위해 속성이 System.Net.Security 추가되었습니다.

클라이언트 애플리케이션에 대한 확장된 보호

대부분의 클라이언트 애플리케이션에 대한 확장된 보호 지원은 자동으로 수행됩니다. HttpWebRequestSmtpClient 클래스는 Windows의 기반 버전에서 확장된 보호를 지원할 때마다 확장된 보호를 지원합니다. 인스턴스는 HttpWebRequest에서 생성된 SPN을 Uri로 보냅니다. 기본적으로 인스턴스는 SmtpClient SMTP 메일 서버의 호스트 이름에서 생성된 SPN을 보냅니다.

사용자 지정 인증의 경우, 클라이언트 애플리케이션은 HttpWebRequest.EndGetRequestStream(IAsyncResult, TransportContext) 또는 HttpWebRequest.GetRequestStream(TransportContext) 메서드를 사용하여 HttpWebRequest 클래스 내에서 TransportContext 및 CBT를 GetChannelBinding 메서드를 통해 얻을 수 있습니다.

인스턴스에서 HttpWebRequest Windows 통합 인증을 사용하여 지정된 서비스로 보내는 SPN은 속성을 설정하여 CustomTargetNameDictionary 재정의할 수 있습니다.

TargetName 속성을 사용하여 SMTP 연결에 대한 Windows 통합 인증에 사용할 사용자 지정 SPN을 설정할 수 있습니다.

서버 애플리케이션에 대한 확장된 보호

HttpListener 는 HTTP 인증을 수행할 때 서비스 바인딩의 유효성을 검사하기 위한 메커니즘을 자동으로 제공합니다.

가장 안전한 시나리오는 접두사에 대해 HTTPS:// 확장된 보호를 사용하도록 설정하는 것입니다. 이 경우, HttpListener.ExtendedProtectionPolicyExtendedProtectionPolicy로 설정하고, PolicyEnforcementWhenSupported 또는 Always로 설정합니다. 그리고 ProtectionScenarioTransportSelected로 설정합니다. 값 WhenSupportedHttpListener를 부분적으로 강화된 모드로 놓고, Always는 완전히 강화된 모드에 해당합니다.

이 구성에서는 외부 보안 채널을 통해 서버에 요청이 수행되면 외부 채널이 채널 바인딩에 대해 쿼리됩니다. 이 채널 바인딩은 인증 SSPI 호출에 전달되며, 인증 Blob의 채널 바인딩이 일치하는지 확인합니다. 다음과 같은 세 가지 가능한 결과가 있습니다.

  1. 서버의 기본 운영 체제는 확장된 보호를 지원하지 않습니다. 요청은 애플리케이션에 노출되지 않으며 권한 없는(401) 응답이 클라이언트에 반환됩니다. 오류 원인을 지정하는 HttpListener 메시지가 추적 원본에 기록됩니다.

  2. 클라이언트가 외부 채널에서 검색된 예상 값과 일치하지 않는 채널 바인딩을 지정했거나, 서버의 확장된 보호 정책이 Always에 대해 구성된 경우 채널 바인딩을 제공하지 못했음을 나타내는 SSPI 호출이 실패합니다. 두 경우 모두 요청이 애플리케이션에 노출되지 않고 권한 없는(401) 응답이 클라이언트에 반환됩니다. 오류 원인을 지정하는 HttpListener 메시지가 추적 원본에 기록됩니다.

  3. 클라이언트는 올바른 채널 바인딩을 지정하거나 서버의 확장된 보호 정책이 구성 WhenSupported 되므로 채널 바인딩을 지정하지 않고 연결할 수 있습니다. 요청은 처리를 위해 애플리케이션에 반환됩니다. 서비스 이름 확인이 자동으로 수행되지 않습니다. 애플리케이션은 속성을 사용하여 ServiceName 자체 서비스 이름 유효성 검사를 수행하도록 선택할 수 있지만 이러한 상황에서는 중복됩니다.

애플리케이션이 HTTP 요청 본문 내에서 앞뒤로 전달된 Blob을 기반으로 인증을 수행하기 위해 자체 SSPI를 호출하고 채널 바인딩을 지원하려는 경우 네이티브 Win32 HttpListener 함수에 전달하기 위해 외부 보안 채널에서 예상 채널 바인딩을 검색해야 합니다. 이렇게 하려면 TransportContext 속성을 사용하고 GetChannelBinding 메서드를 호출하여 CBT를 검색합니다. 엔드포인트 바인딩만 지원됩니다. Endpoint이 아닌 다른 것이 지정되면 NotSupportedException 오류가 발생합니다. 기본 운영 체제가 채널 바인딩 GetChannelBinding 을 지원하는 경우, 메서드는 ChannelBindingSafeHandle을 반환하여 AcceptSecurityContext 함수의 매개변수로 전달된 SecBuffer 구조 내 pvBuffer 멤버로 전달하는 데 적합한 채널 바인딩에 대한 포인터를 래핑합니다. 속성에는 Size 채널 바인딩의 길이(바이트)가 포함됩니다. 기본 운영 체제에서 채널 바인딩을 지원하지 않으면 함수가 반환 null됩니다.

또 다른 가능한 시나리오는 프록시를 사용하지 않을 때 접두사에 대해 HTTP:// 확장된 보호를 사용하도록 설정하는 것입니다. 이 경우, HttpListener.ExtendedProtectionPolicyExtendedProtectionPolicy로 설정하고, PolicyEnforcementWhenSupported 또는 Always로 설정합니다. 그리고 ProtectionScenarioTransportSelected로 설정합니다. 값 WhenSupportedHttpListener를 부분적으로 강화된 모드로 놓고, Always는 완전히 강화된 모드에 해당합니다.

허용되는 서비스 이름의 기본 목록은 에 등록된 HttpListener접두사를 기반으로 만들어집니다. 이 기본 목록은 속성을 통해 DefaultServiceNames 검사할 수 있습니다. 이 목록이 포괄적이지 않은 경우 애플리케이션은 기본 서비스 이름 목록 대신 사용할 클래스에 대한 ExtendedProtectionPolicy 생성자에서 사용자 지정 서비스 이름 컬렉션을 지정할 수 있습니다.

이 구성에서는 외부 보안 채널 인증 없이 서버에 대한 요청이 수행되면 일반적으로 채널 바인딩 검사 없이 진행됩니다. 인증에 성공하면 컨텍스트에서 클라이언트가 제공한 서비스 이름에 대해 쿼리되고 허용 가능한 서비스 이름 목록에 대해 유효성을 검사합니다. 다음과 같은 네 가지 가능한 결과가 있습니다.

  1. 서버의 기본 운영 체제는 확장된 보호를 지원하지 않습니다. 요청은 애플리케이션에 노출되지 않으며 권한 없는(401) 응답이 클라이언트에 반환됩니다. 오류 원인을 지정하는 HttpListener 메시지가 추적 원본에 기록됩니다.

  2. 클라이언트의 기본 운영 체제는 확장된 보호를 지원하지 않습니다. 구성에서 WhenSupported 인증 시도가 성공하고 요청이 애플리케이션에 반환됩니다. 구성에서 Always 인증 시도가 실패합니다. 요청은 애플리케이션에 노출되지 않으며 권한 없는(401) 응답이 클라이언트에 반환됩니다. 오류 원인을 지정하는 HttpListener 메시지가 추적 원본에 기록됩니다.

  3. 클라이언트의 기본 운영 체제는 확장된 보호를 지원하지만 애플리케이션은 서비스 바인딩을 지정하지 않았습니다. 요청은 애플리케이션에 노출되지 않으며 권한 없는(401) 응답이 클라이언트에 반환됩니다. 오류 원인을 지정하는 HttpListener 메시지가 추적 원본에 기록됩니다.

  4. 클라이언트가 서비스 바인딩을 지정했습니다. 서비스 바인딩은 허용된 서비스 바인딩 목록과 비교됩니다. 일치하는 경우 요청이 애플리케이션에 반환됩니다. 그렇지 않으면 요청이 애플리케이션에 노출되지 않으며 권한 없는(401) 응답이 클라이언트에 자동으로 반환됩니다. 오류 원인을 지정하는 HttpListener 메시지가 추적 원본에 기록됩니다.

허용된 서비스 이름 목록을 사용하는 이 간단한 방법이 충분하지 않은 경우 애플리케이션은 속성을 쿼리하여 ServiceName 자체 서비스 이름 유효성 검사를 제공할 수 있습니다. 위의 경우 1과 2에서는 속성이 null를 반환합니다. 3의 경우 빈 문자열을 반환합니다. 4의 경우 클라이언트에서 지정한 서비스 이름이 반환됩니다.

이러한 확장된 보호 기능은 서버 애플리케이션에서 다른 유형의 요청 및 신뢰할 수 있는 프록시를 사용하는 경우 인증에 사용할 수도 있습니다.

참고하십시오