계층화된 서비스 공급자와 앱 분류
참고 항목
계층화된 서비스 공급자는 더 이상 사용되지 않습니다. Windows 8 및 Windows Server 2012부터 Windows 필터링 플랫폼을 사용하세요.
Winsock 2는 계층화된 프로토콜을 수용합니다. 계층화된 프로토콜은 기본 전송 스택을 사용하여 원격 엔드포인트와 데이터를 실제로 교환하면서 더 높은 수준의 통신 함수만 구현하는 프로토콜입니다. 계층화된 프로토콜 또는 계층화된 서비스 공급자의 예는 연결 프로세스에 프로토콜을 추가하여 인증을 수행하고 상호 합의된 암호화 체계를 확인하는 보안 계층입니다. 이러한 보안 프로토콜에는 일반적으로 TCP나 SPX 같이 신뢰할 수 있는 기본 전송 프로토콜의 서비스가 필요합니다. 기본 공급자가 구현하는 베이스 프로토콜이라는 용어는 원격 엔드포인트로 데이터 통신을 수행할 수 있는 TCP나 SPX 같은 프로토콜을 구현하는 Winsock 공급자를 나타냅니다. 계층화된 프로토콜이라는 용어는 단독으로 사용할 수 없는 프로토콜을 설명할 때 사용됩니다. 이 계층화된 프로토콜은 Winsock LSP(계층화된 서비스 공급자)로 설치됩니다.
클라이언트에서 ISA(인터넷 보안 및 인증 서버)의 일부로 설치된 Microsoft 방화벽 클라이언트 서비스 공급자가 LSP의 예입니다. Microsoft 방화벽 클라이언트 서비스 공급자는 TCP와 UDP용 Winsock 기본 공급자를 통해 설치됩니다. ISA 방화벽 클라이언트 소프트웨어의 DLL(동적 연결 라이브러리)은 모든 Winsock 애플리케이션에서 투명하게 사용되는 Winsock 계층화된 서비스 공급자가 됩니다. 이렇게 ISA 방화벽 클라이언트 LSP는 클라이언트 애플리케이션에서 Winsock 함수 호출을 가로챈 후, 대상이 로컬인 경우에는 원래 기본 기본 서비스 공급자로 요청을 라우팅하고, 대상이 원격인 경우 ISA 서버 컴퓨터의 방화벽 서비스로 요청을 라우팅할 수 있습니다. 유사한 LSP가 클라이언트에서 Microsoft Forefront Firewall Service 및 TMG(위협 관리 게이트웨이) 클라이언트의 일부로 설치됩니다.
LSP 초기화 시에는 LSP가 여러 Winsock SPI(서비스 공급자 인터페이스) 함수에 포인터를 제공해야 합니다. 이러한 함수는 LSP(다른 LSP 또는 Ws2_32.DLL) 바로 위에 있는 계층에서 정상적으로 처리할 때 호출됩니다.
LSP가 구현하는 SPI 함수의 하위 집합과 각 함수에 수행되는 추가 처리의 특성에 따라 LSP 범주를 정의할 수 있습니다. LSP를 분류하고 Winsock 소켓을 사용하는 애플리케이션까지 분류하면 런타임 시 LSP가 지정된 프로세스에 포함되어야 하는지 여부를 선택적으로 확인할 수 있게 됩니다.
Windows Vista 이상에서는 특정 LSP만 로드하도록 Winsock 계층화된 서비스 공급자와 애플리케이션을 모두 분류하는 새 메서드가 제공됩니다. 이러한 기능을 추가한 이유가 몇 가지 있습니다.
주된 이유 중 하나는 winlogon과 lsass 같이 중요한 특정 시스템 프로세스에서는 소켓을 만들지만 이러한 프로세스에서 이러한 소켓을 사용하여 네트워크에서 트래픽을 보내지 않기 때문입니다. 따라서 대부분의 LSP는 이러한 프로세스에 로드되면 안 됩니다. 버그가 있는 LSP로 인해 lsass.exe 충돌이 야기될 수 있는 여러 사례도 문서화되었습니다. lsass 크래시가 발생하면 시스템에서 강제로 종료됩니다. LSP를 로드하는 이러한 시스템 프로세스의 부작용은 이러한 프로세스가 종료되지 않아 LSP가 설치되거나 제거되면 다시 부팅해야 한다는 것입니다.
부차적인 이유는 애플리케이션이 특정 LSP를 로드하면 안 되는 경우가 있기 때문입니다. 예를 들어, 일부 애플리케이션은 암호화 LSP를 로드하면 안 되는 경우가 있는데 애플리케이션이 암호화 LSP가 설치되지 않은 다른 시스템과 통신하지 못할 수 있기 때문입니다.
끝으로, 다른 LSP에서 LSP 범주를 사용하여 Winsock 프로토콜 체인에서 직접 설치해야 하는 위치를 결정할 수 있습니다. 그 동안 다양한 LSP 개발자들이 LSP가 어떻게 동작할지를 알 수 있는 방법을 원했습니다. 예를 들어, 데이터 스트림을 검사하는 LSP는 데이터를 암호화하는 LSP 위에 있어야 합니다. 물론 이 LSP 분류 방법은 타사 LSP를 사용하여 적절하게 분류하므로 그렇게 간단하지 않습니다.
Windows Vista 이상의 LSP 분류 및 기타 보안 향상 기능은 사용자가 의도치 않게 악성 LSP를 설치하지 못하도록 설계되었습니다.
LSP 범주
Windows Vista 이상에서는 LSP가 Windows 소켓 호출 및 데이터와 상호 작용하는 방식에 따라 분류할 수 있습니다. LSP 범주는 Winsock SPI 함수의 하위 집합에서 식별 가능한 동작 그룹입니다. 예를 들어, HTTP 콘텐츠 필터는 데이터 검사기(LSP_INSPECTOR 범주)로 분류될 것입니다. LSP_INSPECTOR 범주는 데이터 전송 SPI 함수에 대한 매개 변수를 검사합니다(변경하지는 않음). 애플리케이션이 LSP의 범주를 쿼리하고 LSP 범주 및 애플리케이션의 허용된 LSP 범주 집합에 따라 LSP를 로드하지 않도록 선택할 수 있습니다.
다음 표에는 LSP를 분류할 수 있는 범주가 나열되어 있습니다.
LSP 범주 | 설명 |
---|---|
LSP_CRYPTO_COMPRESS | 이 LSP는 암호화 또는 데이터 압축 공급자입니다. |
LSP_FIREWALL | 이 LSP는 방화벽 공급자입니다. |
LSP_LOCAL_CACHE | 이 LSP는 로컬 캐시 공급자입니다. |
LSP_INBOUND_MODIFY | 이 LSP는 인바운드 데이터를 수정합니다. |
LSP_INSPECTOR | 이 LSP는 데이터를 검사하거나 필터링합니다. |
LSP_OUTBOUND_MODIFY | 이 LSP는 아웃바운드 데이터를 수정합니다. |
LSP_PROXY | 이 LSP는 프록시 역할을 하며 패킷을 리디렉션합니다. |
LSP_REDIRECTOR | 이 LSP는 네트워크 리렉터입니다. |
LSP_SYSTEM | 이 LSP는 서비스 및 시스템 프로세스에서 사용할 수 있습니다. |
하나의 LSP가 둘 이상의 범주에 속할 수 있습니다. 예를 들어, 방화벽/보안 LSP는 검사기(LSP_INSPECTOR)와 방화벽(LSP_FIREWALL) 범주에 모두 속할 수 있습니다.
LSP에 범주 집합이 없으면 기타 모든 범주에 있는 것으로 간주됩니다. 이 LSP 범주는 서비스 또는 시스템 프로세스(예: lsass, winlogon 및 여러 svchost 프로세스)에 로드되지 않습니다.
LSP 분류
Windows Vista 이상에서는 LSP 분류에 몇 가지 새로운 함수를 사용할 수 있습니다.
LSP를 분류하기 위해 WSCSetProviderInfo 또는 WSCSetProviderInfo32 함수가 GUID와 함께 호출되어 LSP 숨겨진 항목, 이 LSP 프로토콜 항목에 설정할 정보 클래스, 함수 동작 수정에 사용되는 플래그 집합을 식별합니다.
WSCGetProviderInfo 또는 WSCGetProviderInfo32 함수도 LSP에 대한 정보 클래스와 연결된 데이터를 검색하는 데 사용됩니다.
애플리케이션 분류
Windows Vista 이상에서는 애플리케이션 분류에 몇 가지 새로운 함수를 사용할 수 있습니다.
애플리케이션을 분류하기 위해 WSCSetApplicationCategory 함수가 실행 이미지의 로드 경로로 호출되어 애플리케이션, 애플리케이션을 시작할 때 사용되는 명령줄 인수, 이 애플리케이션의 모든 인스턴스에 허용되는 LSP 범주를 식별합니다.
WSCGetApplicationCategory 함수도 애플리케이션과 연결된 LSP(계층화된 서비스 공급자) 범주를 검색하는 데 사용됩니다.
로드될 LSP 결정
LSP 분류의 마지막 부분은 어떤 LSP가 어떤 프로세스로 로드될지를 결정하는 것입니다. 한 프로세스에서 Winsock을 로드할 때 설치된 모든 LSP에 대한 LSP 범주와 애플리케이션 범주를 다음과 같이 비교합니다.
- 애플리케이션이 분류되지 않은 경우에는 모든 LSP를 프로세스로 로드하도록 허용합니다.
- 애플리케이션과 LSP 둘 다 범주가 할당된 경우에는 다음이 모두 true여야 합니다.
- LSP 범주 중 하나 이상이 애플리케이션의 지정된 범주에 있습니다.
애플리케이션에서 지정된 범주에 지정된 범주만 LSP 범주에서 지정됩니다. 예를 들어, 애플리케이션이 범주를 지정하는 경우 LSP의 범주에 있어야 합니다.
LSP_SYSTEM 범주가 애플리케이션의 범주에 있는 경우에는 LSP의 범주에 있어야 합니다.
참고 항목
LSP가 분류되지 않은 경우에 그 범주는 사실상 0입니다. 일치가 발생하려면, LSP의 지정된 모든 범주가 애플리케이션의 범주(애플리케이션의 범주는 LSP 범주의 상위 집합이어야 함)에 있어야 합니다. 단, LSP_SYSTEM이 애플리케이션 범주에 있는 경우 LSP 범주에도 있어야 합니다.
다음 예시를 참조하세요.
Foo.exe 애플리케이션은 LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS로 분류됩니다. 애플리케이션 Bar.exe는 LSP_FIREWALL + LSP_CRYPTO_COMPRESS로 분류됩니다. 시스템에 LSP 네 개가 설치되어 있습니다.
- LSP1은 LSP_SYSTEM 범주를 설정했습니다.
- LSP2는 범주가 설정되지 않아 그 범주는 0입니다.
- LSP3은 LSP_FIREWALL 범주를 설정했습니다.
- LSP4는 LSP_SYSTEM + LSP_FIREWALL + LSP_CRYPTO_COMPRESS + LSP_INSPECTOR 범주를 설정했습니다.
이 예제에서 Foo.exe 애플리케이션은 LSP1만 로드하고, Bar.exe 애플리케이션은 LSP3을 로드할 것입니다.
설치된 Winsock 공급자 확인
Microsoft Windows SDK(소프트웨어 개발 키트)에는 로컬 컴퓨터에 설치된 Winsock 전송 공급자를 확인하는 데 사용할 수 있는 샘플 Winsock 프로그램이 포함되어 있습니다. 기본적으로, 이 Winsock 샘플의 소스 코드는 Windows 7용 Windows SDK의 다음 디렉터리에 설치됩니다.
C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\NetDs\winsock\LSP
이 샘플은 계층화된 서비스 공급자를 설치하고 테스트하기 위한 유틸리티입니다. 그러나 로컬 컴퓨터의 Winsock 카탈로그에서 자세한 정보를 프로그래밍 방식으로 수집하는 데에도 사용할 수 있습니다. 기본 공급자와 계층 서비스 공급자를 모두 포함하는 현재 Winsock 공급자를 모두 나열하려면 이 Winsock 샘플을 빌드하고 다음 콘솔 명령을 실행합니다.
instlsp -p
출력은 계층화된 서비스 공급자를 포함해 로컬 컴퓨터에 설치된 Winsock 공급자 목록입니다. 출력에는 Winsock 공급자의 카탈로그 ID와 문자열 이름이 나열됩니다.
모든 Winsock 공급자에 대한 자세한 정보를 수집하려면 다음 콘솔 명령을 실행합니다.
instlsp -p -v
출력은 로컬 컴퓨터에서 지원되는 WSAPROTOCOL_INFO 구조 목록입니다.
로컬 컴퓨터에 설치된 계층화된 서비스 공급자만 나열하려면 다음 콘솔 명령을 실행합니다.
instlsp -l
LSP 구조를 매핑하려면 다음 콘솔 명령을 실행합니다.
instlsp -m
참고 항목
TDI 기능이 더 이상 사용되지 않아 이후 버전의 Microsoft Windows에서는 제거될 예정입니다. TDI 사용 방법에 따라 WSK(Winsock 커널) 또는 WFP(Windows 필터링 플랫폼)를 사용합니다. WFP 및 WSK에 대한 자세한 내용은 Windows 필터링 플랫폼 및 Winsock 커널을 참조하세요. WSK 및 TDI에 대한 Windows Core 네트워킹 블로그 항목은 WSK(Winsock Kernel) 소개를 참조하세요.