다음을 통해 공유


보안 식별자

Windows는 보안 엔터티를 서로 구분하기 위해 SID(보안 식별자)를 최종 값으로 사용합니다. 예를 들어 고유한 보안 식별자는 시스템의 개별 사용자를 위해 만든 각 새 계정에 할당됩니다. 파일 시스템의 경우 이 SID만 사용됩니다.

다음 그림에서는 보안 식별자 구조를 보여 줍니다.

보안 식별자 구조를 보여 주는 다이어그램

Windows 시스템은 고유한 SID 외에도 잘 알려진 식별자 집합을 정의합니다. 예를 들어 로컬 관리자는 잘 알려진 SID입니다.

Windows는 커널 환경 내에서 SID와 사용자 이름 간에 변환하기 위한 커널 내 메커니즘을 제공합니다. 이러한 함수 호출은 사용자 모드 도우미 서비스를 사용하여 이러한 함수를 구현하는 ksecdd 드라이버에서 사용할 수 있습니다. 따라서 파일 시스템 내에서의 사용은 사용자 모드 서비스와의 통신에 대한 일반적인 규칙을 준수해야 합니다. 이러한 호출은 페이징 파일 I/O 중에 사용할 수 없습니다.

이러한 함수 중 일부는 다음과 같습니다.

  • SecMakeSPN 은 특정 보안 서비스 공급자와 통신할 때 사용할 수 있는 서비스 공급자 이름 문자열을 만듭니다.

  • SecMakeSPNEx는 Windows XP에서 도입된 SecMakeSPN보강된 버전입니다.

  • SecMakeSPNEx2는 Windows Vista 및 Windows Server 2008부터 사용할 수 있는 SecMakeSPNEx보강된 버전입니다.

  • SecLookupAccountSid 는 지정된 SID의 계정 이름을 반환합니다.

  • SecLookupAccountName 은 지정된 계정 이름의 SID를 검색합니다.

  • SecLookupWellKnownSid 는 잘 알려진 지정된 SID 형식에 대한 올바른 SID를 반환합니다. 이 함수는 Windows Server 2003 이상에서 사용할 수 있습니다.

또한 커널 드라이버는 다음 표준 런타임 라이브러리 루틴을 사용하여 SID를 만들 수 있습니다.

  • RtlInitializeSid 는 새 SID에 대한 버퍼를 초기화합니다.

  • RtlLengthSid 는 지정된 버퍼 내에 저장된 SID의 크기를 결정합니다.

  • RtlValidSid 는 지정된 SID 버퍼가 유효한 형식의 버퍼인지 확인합니다.

RtlLengthSidRtlValidSid 는 SID에 대한 8바이트 고정 헤더가 있다고 가정합니다. 따라서 드라이버는 이러한 함수를 호출하기 전에 SID 헤더의 최소 길이를 확인해야 합니다.

다른 여러 RTL 함수가 있지만 이 목록은 SID를 생성할 때 필요한 기본 함수를 제공합니다.

다음 코드 예제에서는 "로컬 시스템" 엔터티에 대한 SID를 만드는 방법을 보여 줍니다. Windows Server 2003에 도입된 더 간단한 SecLookupWellKnownSid 함수도 사용할 수 있습니다.

{
    //
    // temporary stack-based storage for an SID
    //
    UCHAR sidBuffer[128];
    PISID localSid = (PISID) sidBuffer;
    SID_IDENTIFIER_AUTHORITY localSidAuthority = 
        SECURITY_NT_AUTHORITY;

    //
    // build the local system SID
    //
    RtlZeroMemory(sidBuffer, sizeof(sidBuffer));
 
    localSid->Revision = SID_REVISION;
    localSid->SubAuthorityCount = 1;
    localSid->IdentifierAuthority = localSidAuthority;
    localSid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID;
 
    //
    // make sure it is valid
    //
    if (!RtlValidSid(localSid)) {
        DbgPrint("no dice - SID is invalid\n");
        return(1);
    }
}

다음 코드 예제에서는 "로컬 시스템" 엔터티에 대해 SecLookupWellKnownSid 함수를 사용하여 SID를 만드는 방법을 보여 줍니다.

{
    UCHAR sidBuffer[128];
    PISID localSid = (PISID) sidBuffer;
    SIZE_T sidSize;
    status = SecLookupWellKnownSid(WinLocalSid,
                                   &localSid,
                                   sizeof(sidBuffer),
                                   &sidSize);

    if (!NT_SUCCESS(status)) {
      //
      // error handling
      //
    }
  }

두 방법 중 하나가 유효하지만 후자의 코드가 선호됩니다. 이러한 코드 예제에서는 SID를 저장하기 위해 로컬 버퍼를 사용합니다. 이러한 버퍼는 현재 호출 컨텍스트 외부에서 사용할 수 없습니다. SID 버퍼를 영구적이어야 하는 경우 풀 메모리에서 버퍼를 할당해야 합니다.