WWSAPI(Windows Web Services API)의 보안 프레임워크는 다음을 제공합니다.
- 전송 보안을 사용하는 메시지 무결성, 기밀성, 재생 검색 및 서버 인증.
- SOAP 메시지 보안 또는 전송 보안을 사용하는 보안 토큰 유효성 검사, 인증서 신뢰 및 해지 검사와 같은 클라이언트 인증
보안 프로그래밍 모델
보안은 통신 채널과 관련이 있다. 채널 보안은 다음 단계로 구성됩니다.
- 애플리케이션의 보안 요구 사항에 적합한하나 이상의보안 바인딩을 만들고 초기화합니다.
- 이러한 보안 바인딩을 포함하는 보안 설명 만듭니다.
- 채널 또는 서비스 프록시 만들거나(클라이언트 쪽에서) 해당 보안 설명을 전달하는 수신기 또는 서비스 호스트 만듭니다.
- 열기, 수락, 보내기, 받기, 닫기 등의 일반 채널 프로그래밍 단계를 수행합니다.
채널에서 보내고 받은 메시지는 제공된 보안 설명에 따라 런타임에 의해 자동으로 보호됩니다. 필요에 따라 보안 설명에 하나 이상의 채널 전체 보안 설정을 지정하거나 보안 바인딩에서 바인딩 전체 보안 설정을 이러한 단계를 미세 조정할 수 있습니다.
보낸 사람 ID의 필수 권한 부여는 수신된 각 메시지에 연결된 보안 처리 결과를 사용하여 애플리케이션에서 수행해야 합니다. 권한 부여 단계는 보안 설명에 지정되지 않으며 런타임에 의해 자동으로 수행되지도 않습니다.
지원되지 않는 바인딩, 적용할 수 없는 속성/필드, 필수 속성/필드 부족 또는 잘못된 속성/필드 값과 같은 보안 설명의 오류로 인해 채널 또는 수신기 만들기가 실패합니다.
보안 바인딩 선택
애플리케이션에 대한 보안을 디자인할 때 주요 결정은 보안 설명에 포함할 보안 바인딩을 선택하는 것입니다. 다음은 애플리케이션의 보안 시나리오에 적합한 보안 바인딩을 선택하기 위한 몇 가지 지침입니다. 유용한 추론은 먼저 애플리케이션에서 사용할 수 있는 보안 자격 증명 유형(예: X.509 인증서, Windows 도메인 사용자 이름/암호, 애플리케이션 정의 사용자 이름/암호)을 이해하고 해당 자격 증명 형식을 사용할 수 있는 보안 바인딩을 선택하는 것입니다.
전송 바이트 스트림 수준(SOAP 메시지 경계 아래)에서 보안이 적용되는 전송 보안이 고려해야 할 첫 번째 옵션입니다.
인터넷 시나리오 및 X.509 인증서를 서버에 배포할 수 있는 인트라넷 시나리오의 경우 애플리케이션에서 WS_SSL_TRANSPORT_SECURITY_BINDING사용할 수 있습니다. 다음 예제에서는 이 옵션을 보여 줍니다. 클라이언트: HttpClientWithSslExample Server: HttpServerWithSslExample.
HTTP 헤더 인증을 통한 클라이언트 인증을 원하는 경우 해당 기능을 제공하기 위해 WS_HTTP_HEADER_AUTH_SECURITY_BINDING 추가할 수 있습니다.
Kerberos, NTLM 및 SPNEGO와 같은 Windows 통합 인증 프로토콜이 적절한 인트라넷 시나리오의 경우 애플리케이션에서 WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING사용할 수 있습니다. 다음 예제에서는 이 옵션을 보여 줍니다: 클라이언트: RequestReplyTcpClientWithWindowsTransportSecurityExample 서버: RequestReplyTcpServerWithWindowsTransportSecurityExample. (Note: 'RequestReplyTcpClientWithWindowsTransportSecurityExample'와 'RequestReplyTcpServerWithWindowsTransportSecurityExample'는 Windows 전송 보안이 적용된 TCP 요청-응답 방식 클라이언트와 서버를 각각 나타냅니다.)
명명된 파이프를 통해 클라이언트: RequestReplyNamedPipesClientWithWindowsTransportSecurityExample
명명된 파이프를 통해 서버: RequestReplyNamedPipesServerWithWindowsTransportSecurityExample
Kerberos, NTLM 및 SPNEGO와 같은 Windows 통합 인증 프로토콜이 적절한 로컬 컴퓨터 시나리오의 경우 애플리케이션에서 WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING 또는 WS_NAMEDPIPE_SSPI_TRANSPORT_SECURITY_BINDING사용할 수 있습니다. 이러한 시나리오에서는 트래픽이 머신에서 나가지 않도록 보장하기 때문에WS_NAMEDPIPE_CHANNEL_BINDING 선호됩니다(WS_NAMEDPIPE_CHANNEL_BINDING속성).
전송 보안이 연결을 보호하고 SOAP 메시지의 WS-Security 헤더가 클라이언트 인증을 제공하는 혼합 모드 보안이 고려해야 할 다음 옵션입니다. 다음 바인딩은 이전 섹션에서 설명한 전송 보안 바인딩 중 하나와 함께 사용됩니다.
클라이언트가 애플리케이션 수준 사용자 이름/암호 쌍으로 인증되면 애플리케이션은 WS_USERNAME_MESSAGE_SECURITY_BINDING 사용하여 인증 데이터를 제공할 수 있습니다. 다음 예제에서는 이 바인딩을 WS_SSL_TRANSPORT_SECURITY_BINDING함께 사용하는 방법을 보여 줍니다.
클라이언트가 Kerberos 티켓에 의해 인증되면 애플리케이션은 WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING 사용하여 인증 데이터를 제공할 수 있습니다.
보안 컨텍스트사용하는 경우 클라이언트는 먼저 서버와 보안 컨텍스트를 설정한 다음 해당 컨텍스트를 사용하여 메시지를 인증합니다. 이 기능을 사용하려면 보안 설명에 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING포함되어야 합니다. 일단 설정되면 간단한 토큰을 통해 보안 컨텍스트를 전송할 수 있으므로 모든 메시지와 함께 잠재적으로 크고 계산 비용이 많이 드는 클라이언트 자격 증명을 보낼 필요가 없습니다.
페더레이션 보안 시나리오에서 클라이언트는 먼저 STS(보안 토큰 서비스)에서 발급한 보안 토큰을 가져온 다음, 발급된 토큰을 서비스에 제공합니다. 클라이언트 쪽: STS에서 보안 토큰을 가져오려면 애플리케이션에서 WsRequestSecurityToken사용할 수 있습니다. 또는 애플리케이션은 CardSpace 또는 LiveID와 같은 클라이언트 쪽 보안 토큰 공급자 라이브러리를 사용한 다음 출력을 사용하여 WsCreateXmlSecurityToken사용하여 보안 토큰을 로컬로 만들 수 있습니다. 어느 쪽이든 클라이언트에서 보안 토큰을 사용할 수 있게 되면 WS_XML_TOKEN_MESSAGE_SECURITY_BINDING포함하는 보안 설명을 사용하여 서비스에 표시될 수 있습니다. 서버 쪽: STS에서 발급한 보안 토큰이 SAML 토큰인 경우 서버는 WS_SAML_MESSAGE_SECURITY_BINDING보안 설명을 사용할 수 있습니다.
메모
Windows 7 및 Windows Server 2008 R2: WWSAPI는 LWSSP(경량 웹 서비스 보안 프로필)로 정의된 Ws-Trust 및 Ws-SecureConversation 만 지원합니다. Microsoft의 구현에 대한 자세한 내용은 LWSSP의 MESSAGE 구문 섹션을 참조하세요.
고려해야 할 마지막 옵션은 WS_SSL_TRANSPORT_SECURITY_BINDING같은 보호 바인딩을 사용하지 않고 인증 바인딩을 사용하는 것입니다. 이렇게 하면 자격 증명이 명확한 텍스트로 전송되고 보안에 영향을 줄 수 있습니다. 결과적으로 취약성이 없는지 확인하기 위해 이 옵션의 사용을 신중하게 평가해야 합니다. 잠재적인 사용의 예는 보안 프라이빗 네트워크를 통해 백 엔드 서버 간에 메시지를 교환하는 것입니다. 다음 구성은 이 옵션을 지원합니다.
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING 모든 구성에서 이 옵션을 지원합니다.
- WS_USERNAME_MESSAGE_SECURITY_BINDING HTTP를 전송으로 사용할 때 서버에서 이 옵션을 지원합니다.
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING HTTP를 전송으로 사용할 때 서버에서 이 옵션을 지원합니다.
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING HTTP를 전송으로 사용할 때 서버에서 이 옵션을 지원합니다.
- WS_SAML_MESSAGE_SECURITY_BINDING HTTP를 전송으로 사용할 때 서버에서 이 옵션을 지원합니다.
이 옵션을 사용하려면 WS_PROTECTION_LEVELWS_PROTECTION_LEVEL_SIGN_AND_ENCRYPT이외의 값으로 명시적으로 설정해야 합니다.
채널 및 보안
위에서 설명한 대로 보안은 채널로 범위가 지정됩니다. 또한 채널 운영은 모든 보안 바인딩에서 일관되게 보안 단계에 매핑됩니다.
- 채널 만들기: 보안 설명에 지정된 보안 바인딩 집합의 유효성이 검사되고 이후 채널에 대해 고정된 상태로 유지됩니다. WS-Trust 기반 협상에 사용할 사이드 채널을 포함하여 채널 스택의 모양도 결정됩니다.
- 채널 열기: 보안 바인딩의 일부로 제공되는 모든 자격 증명이 로드되고 보안 세션이 설정됩니다. 일반적으로 열린 채널에는 '라이브' 보안 상태가 포함됩니다. 클라이언트 채널을 열면 런타임에 의해 수행될 서버 인증에 대한 서버의 엔드포인트 주소도 지정됩니다.
- 채널 열기와 닫기 사이: 이 단계에서 메시지를 안전하게 보내고 받을 수 있습니다.
- 메시지 보내기: 필요에 따라 보안 컨텍스트 토큰을 가져오거나 갱신하며 보안 설명에 따라 전송된 각 메시지에 보안이 적용됩니다. 보안을 적용할 때 발생하는 오류는 보내기 오류로 애플리케이션에 반환됩니다.
- 메시지 수신: 보안 설명에 따라 수신된 각 메시지에서 보안이 확인됩니다. 메시지 보안 확인 오류는 수신 오류로 애플리케이션에 반환됩니다. 이러한 메시지별 오류는 채널 상태 또는 후속 수신에 영향을 미치지 않습니다. 애플리케이션은 실패한 수신을 취소하고 다른 메시지에 대한 수신을 다시 시작할 수 있습니다.
- 채널 중단: 채널의 모든 I/O를 중지하려면 언제든지 채널이 중단될 수 있습니다. 중단 시 채널은 오류 상태로 전환되고 더 이상 송신 또는 수신을 허용하지 않습니다. 그러나 채널은 여전히 일부 '라이브' 보안 상태를 유지할 수 있으므로 모든 상태를 완전히 삭제하려면 후속 채널 닫기가 필요합니다.
- 채널 닫기: 열린 상태에서 만든 보안 상태가 삭제되고 세션이 중단됩니다. 보안 컨텍스트 토큰이 취소됩니다. 채널 스택은 남아 있지만 '라이브' 보안 상태 또는 로드된 자격 증명을 포함하지 않습니다.
- 채널 해제: 생성 시 빌드된 채널 스택과 모든 보안 리소스가 해제되어 메모리에서 삭제됩니다.
보안 API
보안에 대한 API 설명서는 다음 항목으로 그룹화됩니다.
안전
WWSAPI 보안 API를 사용하는 경우 애플리케이션은 다음과 같은 몇 가지 보안 위험에 직면합니다.
-
잘못된 구성
-
WWSAPI는 다양한 보안 관련 구성 옵션을 지원합니다. 예제 WS_SECURITY_BINDING_PROPERTY_ID참조하세요. WS_SECURITY_BINDING_PROPERTY_ALLOW_ANONYMOUS_CLIENTS 같은 이러한 옵션 중 일부는 애플리케이션이 다양한 보안 바인딩에서 제공하는 기본 보안 수준을 낮출 수 있도록 합니다. 이러한 옵션의 사용은 결과 공격 벡터가 없는지 확인하기 위해 신중하게 평가해야 합니다.
또한 위에서 설명한 대로 WWSAPI를 사용하면 애플리케이션에서 보안 자격 증명이 전송되더라도 암호화를 사용하지 않도록 설정하는 등 메시지 교환을 완전히 보호하는 데 필요한 특정 단계를 의도적으로 사용하지 않도록 설정할 수 있습니다. 특정 시나리오를 사용하도록 설정할 수 있으며 일반 통신에는 사용하지 않아야 합니다. 이 시나리오를 사용하도록 설정하려면 WS_PROTECTION_LEVEL 구체적으로 낮춰야 하며, 애플리케이션은 반드시 필요한 경우가 아니면 해당 값을 변경해서는 안 됩니다. 이렇게 하면 보안 구성을 보장하도록 설계된 많은 검사가 비활성화됩니다.
-
메모리에 기밀 정보 저장
-
메모리에 저장된 암호와 같은 기밀 정보는 권한 있는 공격자(예: 페이지 파일)에 의해 추출되는 것에 취약합니다. WWSAPI는 제공된 자격 증명의 복사본을 만들고 해당 복사를 암호화하여 원래 데이터를 보호하지 않습니다. 원래 인스턴스를 보호하는 것은 애플리케이션의 책임입니다. 또한 암호화된 복사본은 사용되는 동안 잠시 암호 해독되어 추출할 창을 엽니다.
-
서비스 거부
-
보안 처리는 상당한 리소스를 사용할 수 있습니다. 모든 추가 보안 바인딩은 이러한 비용을 증가합니다. WWSAPI는 보안 확인 오류가 발생하는 즉시 보안 처리를 중단하지만, 중요한 작업이 수행될 때까지 권한 부여 결정과 같은 특정 검사가 수행되지 않을 수 있습니다.
메시지가 서버에서 처리되는 동안 보안 상태는 메시지 힙에 저장됩니다. 애플리케이션은 WS_MESSAGE_PROPERTY_HEAP_PROPERTIES 통해 해당 힙의 크기를 줄여 보안 처리 중에 메모리 사용을 제한할 수 있습니다. 또한 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING 같은 특정 보안 바인딩으로 인해 서버가 클라이언트를 대신하여 리소스를 할당할 수 있습니다. 이러한 리소스에 대한 제한은 다음 WS_SECURITY_BINDING_PROPERTY_ID 값을 통해 구성할 수 있습니다.
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_PENDING_CONTEXTS
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_ACTIVE_CONTEXTS
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_RENEWAL_INTERVAL (보안 컨텍스트 갱신 간격 설정)
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_ROLLOVER_INTERVAL
이러한 제한을 낮은 값으로 설정하면 최대 메모리 사용량이 줄어들지만 할당량에 도달하면 합법적인 클라이언트가 거부될 수 있습니다.