보안 주체 이름
클라이언트가 서버 프로그램과 함께 상호 인증된 세션을 만들려면 서버의 예상 보안 주체 이름을 제공해야 합니다. Kerberos와 같은 일부 프로토콜에는 인증된 세션에 올바른 서버 보안 주체 이름이 필요합니다. 보안 주체는 보안 시스템에서 인식하는 엔터티입니다. 여기에는 시스템 서비스뿐만 아니라 사용자도 포함됩니다. 모든 보안 주체 이름은 지정된 SSP(보안 지원 공급자)에 대해 비슷한 형식을 사용합니다. SSP는 보안 유효성 검사를 수행하는 소프트웨어 모듈입니다. 자세한 내용은 SSPI 아키텍처 개요를 참조하세요. 균일성을 유지하기 위해 보안 공급자는 일반적으로 사용자와 유사한 이름을 시스템 서비스에 제공합니다. 일부 보안 공급자에서 시스템 서비스에는 보안 주체 이름이 없을 수 있습니다.
서버는 RpcServerRegisterAuthInfo 함수를 사용하여 보안 공급자의 보안 주체 이름을 등록합니다. 각 보안 공급자에 대해 하나의 서버 보안 주체 이름만 사용할 수 있습니다. 둘 이상의 이름이 등록되면 하나의 이름이 임의로 선택되고 사용됩니다. SSP는 보안 주체 이름의 형식을 지정합니다. 예를 들어 시스템 서비스에 대한 Kerberos/Negotiate SSP는 machine_name$@childdomain.parentdomain1.parentdomain2.COM 유사합니다.
보안 주체 이름을 생성하는 데 권장되는 절차는 문자열에서 보안 주체 이름을 함께 꿰뚫는 대신 문서화된 API(예: DsMakeSpn 함수)를 사용하는 것입니다. 문서화된 API를 사용하면 다양한 배포 환경 간의 이식성이 향상되고 오류 가능성이 제거됩니다.
잘못된 보안 주체 이름을 지정하면 클라이언트와 서버가 인증된 세션을 설정하지 못할 수 있습니다. SCHANNEL SSP는 다음 두 가지 형식 중 하나로 보안 주체 이름을 사용합니다.
- 첫 번째 SCHANNEL 보안 주체 이름 양식은 msstd 양식입니다. msstd 형식의 이름은 일반적으로 msstd:servername@serverdomain.com패턴을 따릅니다. 이를 전자 메일 이름 속성이라고 합니다. 인증서에 이메일 이름 속성이 포함되어 있고 at 기호(@)가 포함된 경우 보안 주체 이름은 msstd:email name입니다. 그렇지 않으면 공용 이름 속성을 포함해야 합니다. 내부 백슬라이시는 문자열 바인딩과 마찬가지로 두 배가 됩니다.
- 두 번째 SCHANNEL 보안 주체 이름 양식은 fullsic 형식입니다. 이것은 꺾쇠 괄호로 제한되고 백슬래시로 구분된 일련의 RFC1779 규격 이름입니다. 일반적으로 fullsic:\<\Authority\SubAuthority\.....\Person> 또는 fullsic:\\<Authority\SubAuthority\.....\ServerProgram> 패턴을 따릅니다.
이름이 인증서와 일치하지 않으면 ERROR_ACCESS_DENIED 반환됩니다. 이름 형식이 잘못된 경우 SCHANNEL SSP는 ERROR_INVALID_PARAMETER 코드를 반환합니다.
서버의 보안 주체 이름을 쿼리하기 위해 애플리케이션은 RpcMgmtInqServerPrincName을 호출할 수 있습니다. 이렇게 하면 보안 주체 이름을 보유할 null로 끝나는 문자열이 할당됩니다. 애플리케이션이 종료되기 전에 RpcStringFree를 호출하여 이 문자열이 차지하는 메모리를 해제해야 합니다.
이러한 방식으로 서버 이름을 쿼리하는 것은 안전하지 않으므로 피해야 합니다. 서버 인증의 경우 클라이언트 프로그램은 연결하는 서버를 알고 있어야 하며 서버 보안 주체 이름을 처음부터 만들어야 합니다.