WSASetSocketSecurity 함수(ws2tcpip.h)
WSASetSocketSecurity 함수는 소켓에 대한 보안을 사용하도록 설정하고 적용합니다.
구문
INT WSAAPI WSASetSocketSecurity(
[in] SOCKET Socket,
[in, optional] const SOCKET_SECURITY_SETTINGS *SecuritySettings,
[in] ULONG SecuritySettingsLen,
[in, optional] LPWSAOVERLAPPED Overlapped,
[in, optional] LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
);
매개 변수
[in] Socket
보안 설정이 적용되는 소켓을 식별하는 설명자입니다.
[in, optional] SecuritySettings
소켓의 트래픽에 적용할 보안 설정을 지정하는 SOCKET_SECURITY_SETTINGS 구조체에 대한 포인터입니다. 이 매개 변수가 NULL이면 기본 설정이 소켓에 적용됩니다.
[in] SecuritySettingsLen
SecuritySettings 매개 변수의 크기(바이트)입니다.
[in, optional] Overlapped
WSAOVERLAPPED 구조체에 대한 포인터입니다. 이 매개 변수는 겹치지 않는 소켓에 대해 무시됩니다.
[in, optional] CompletionRoutine
작업이 완료될 때 호출되는 완료 루틴에 대한 포인터입니다. 이 매개 변수는 겹치지 않는 소켓에 대해 무시됩니다.
반환 값
함수가 성공할 경우 반환 값은 0입니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.
몇 가지 가능한 오류 코드가 아래에 나열되어 있습니다.
오류 코드 | 의미 |
---|---|
지정된 주소 패밀리는 지원되지 않습니다. | |
잘못된 매개 변수가 전달되었습니다. Socket 매개 변수에 전달된 소켓이 AF_INET 또는 AF_INET6 주소 패밀리와 SOCK_DGRAM 또는SOCK_STREAM 소켓 형식으로 만들어지지 않은 경우 이 오류가 반환됩니다. SecuritySettings 매개 변수가 가리키는 SOCKET_SECURITY_SETTINGS 구조체에 잘못된 값이 있는 경우에도 이 오류가 반환됩니다. | |
소켓이 연결되어 있습니다. 이 함수는 소켓이 연결 지향인지 아니면 연결이 없는지 여부에 관계없이 연결된 소켓에서 허용되지 않습니다. | |
전달된 버퍼가 너무 작습니다. | |
Socket 매개 변수에 전달된 설명자가 유효한 소켓이 아닙니다. |
설명
WSASetSocketSecurity 함수의 주요 목적은 소켓이 관리 정책에서 아직 사용하도록 설정되지 않은 경우 소켓에 대한 보안을 설정하는 것입니다. IPsec의 경우 이 소켓을 보호하는 데 사용할 적절한 IPsec 필터 및 정책이 인스턴스화됩니다. WSASetSocketSecurity 함수를 사용하여 소켓에 대한 특정 보안 요구 사항을 설정할 수도 있습니다.
이 함수는 dwIoControlCode 매개 변수가 SIO_SET_SECURITY 설정된 WSAIoctl 함수를 호출할 필요가 간소화됩니다.
WSASetSocketSecurity 함수는 AF_INET또는 AF_INET6 주소 패밀리로 만든 Socket 매개 변수에서 호출될 수 있습니다.
연결 지향 소켓(IPPROTO_TCP 프로토콜)을 사용하는 클라이언트 애플리케이션의 경우 connect, ConnectEx 또는 WSAConnect 함수가 호출되기 전에 WSASetSocketSecurity 함수를 호출해야 합니다. connect, ConnectEx 또는 WSAConnect 함수 후에 WSASetSocketSecurity 함수가 호출되면 WSASetSocketSecurity가 실패합니다.
연결 지향 소켓(IPPROTO_TCP 프로토콜)을 사용하는 서버 애플리케이션의 경우 바인딩 함수가 호출되기 전에 WSASetSocketSecurity 함수를 호출해야 합니다. 바인딩 함수 후에 WSASetSocketSecurity 함수가 호출되면 WSASetSocketSecurity가 실패합니다.
연결 없는 소켓(IPPROTO_UDP 프로토콜)의 경우 애플리케이션은 소켓 또는 WSASocket 호출이 반환된 직후 WSASetSocketSecurity 함수를 호출해야 합니다.
서버 애플리케이션은 setsockopt 함수를 호출하여 소켓에서 사용하는 포트에 대한 단독 액세스를 획득해야 합니다. 이렇게 하면 다른 애플리케이션에서 동일한 포트를 사용할 수 없습니다. setsockopt 함수는 수준 매개 변수가 SOL_SOCKET, optname 매개 변수가 SO_EXCLUSIVEADDRUSE 설정되고 값 매개 변수가 0이 아닌 값으로 설정된 상태에서 호출됩니다. WSASetSocketSecurity 함수는 SO_EXCLUSIVEADDRUSE 사용하여 setsockopt를 내부적으로 호출하여 포트에 대한 단독 액세스를 얻습니다. 이는 소켓이 로컬 컴퓨터에서 실행되는 다른 애플리케이션의 공격에 취약하지 않도록 하기 위한 것입니다.
WSASetSocketSecurity를 사용하여 설정되지 않은 보안 설정은 시스템 기본 정책 또는 관리적으로 구성된 정책에서 파생됩니다. 대부분의 애플리케이션은 SecuritySettings 매개 변수가 가리키는 SOCKET_SECURITY_PROTOCOLSecurityProtocol 멤버의 SOCKET_SECURITY_PROTOCOL 열거형에 대한 SOCKET_SECURITY_PROTOCOL_DEFAULT 값을 지정하는 것이 좋습니다. 이렇게 하면 애플리케이션이 보안 프로토콜에 중립적이며 다양한 시스템 간에 더 쉽게 배포할 수 있습니다.
SecuritySettings 매개 변수가 SOCKET_SECURITY_SETTINGS_IPSEC 구조를 가리키는 경우 구조체의 SecurityProtocol 멤버는 SOCKET_SECURITY_PROTOCOL_DEFAULT 아니라 SOCKET_SECURITY_PROTOCOL_IPSEC 설정해야 합니다.
다음 조건이 충족되지 않으면 오류가 반환됩니다.
- Socket 매개 변수의 주소 패밀리는 AF_INET 또는 AF_INET6 합니다.
- 소켓 유형은 SOCK_STREAM 또는 SOCK_DGRAM.
- 애플리케이션은 바인딩, 연결, ConnectEx 또는 WSAConnect 함수를 호출하기 전에 보안 설정을 지정해야 합니다.
- WSASetSocketSecurity 함수는 소켓당 한 번만 호출할 수 있습니다.
기본 보안 소켓 IPsec 정책
SecuritySettings 매개 변수가 NULL로 설정되어 있고 컴퓨터에 관리적으로 지정된 다른 IPsec 정책이 없는 경우 IPsec을 기반으로 하는 기본 보안 정책이 애플리케이션의 트래픽을 보호하는 데 사용됩니다. IPsec이 기본 정책으로 성공하려면 일부 유형의 인증 자격 증명(예: 사용자 인증서 또는 도메인 멤버 자격)이 있어야 합니다.기본 IPsec 정책은 가능한 한 많은 시나리오에서 IPsec 보안을 협상할 수 있도록 설계되었습니다.
Authip MM policy =
{
Auth methods = {IKE_ANONYMOUS}
No impersonation
Proposals =
{
{
Crypto algos =
IKE_CIPHER_AES_128,
IKE_INTEGRITY_SHA1,
IKE_DH_ECP_256
MM lifetime = 2 hrs
QM = 0 (infinite)
}
{
Crypto algos =
IKE_CIPHER_3DES,
IKE_INTEGRITY_SHA1,
IKE_DH_GROUP_2
MM lifetime = 2 hrs
QM = 0 (infinite)
}
}
}
Authip QM policy =
{
QM proposals =
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_ESP_AUTH,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96
No PFS
}
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_ESP_AUTH_AND_CIPHER,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96,
IPSEC_CIPHER_TRANSFORM_ID_AES_128
No PFS
}
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_ESP_AUTH_AND_CIPHER,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96,
IPSEC_CIPHER_TRANSFORM_ID_CBC_3DES
No PFS
}
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_AH,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96
No PFS
}
IPSEC_POLICY_FLAG_ND_BOUNDARY
ndAllowClearTimeoutSeconds = 10
saIdleTimeout = {5mins, 1min}
UM policy =
{
{IKE_SSL, Null-Root-Config}
{IKE_KERBEROS}
{IKE_SSL, Null-Root-Config}
No impersonation
}
}
요구 사항
지원되는 최소 클라이언트 | Windows Vista [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2008 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | ws2tcpip.h |
라이브러리 | Fwpuclnt.lib |
DLL | Fwpuclnt.dll |