Condividi tramite


Identificatore di sicurezza

Windows usa l'identificatore di sicurezza (SID) come valore definitivo per distinguere le entità di sicurezza l'una dall'altra. Ad esempio, un identificatore di sicurezza univoco viene assegnato a ogni nuovo account creato per singoli utenti nel sistema. Per un file system, viene usato solo questo SID.

La figura seguente illustra la struttura dell'identificatore di sicurezza.

diagramma che illustra la struttura dell'identificatore di sicurezza.

Oltre ai SID univoci, il sistema Windows definisce un set di identificatori noti. Ad esempio, l'amministratore locale è un SID noto.

Windows fornisce un meccanismo in kernel per la conversione tra SID e nomi utente all'interno dell'ambiente kernel. Queste chiamate di funzione sono disponibili dal driver ksecdd , che implementa queste funzioni usando i servizi helper in modalità utente. Di conseguenza, l'uso all'interno dei file system deve rispettare le normali regole per la comunicazione con i servizi in modalità utente. Queste chiamate non possono essere usate durante l'I/O del file di paging.

Alcune di queste funzioni sono:

  • SecMakeSPN crea una stringa del nome del provider di servizi che può essere usata durante la comunicazione con provider di servizi di sicurezza specifici.

  • SecMakeSPNEx è una versione aumentata di SecMakeSPN introdotta in Windows XP.

  • SecMakeSPNEx2 è una versione aumentata di SecMakeSPNEx disponibile a partire da Windows Vista e Windows Server 2008.

  • SecLookupAccountSid restituisce un nome di account per un SID specificato.

  • SecLookupAccountName recupera il SID per un nome di account specificato.

  • SecLookupWellKnownSid restituisce il SID corretto per un tipo SID noto specificato. Questa funzione è disponibile in Windows Server 2003 e versioni successive.

Inoltre, qualsiasi driver del kernel può creare un SID usando le routine della libreria di runtime standard seguenti:

  • RtlInitializeSid inizializza un buffer per un nuovo SID.

  • RtlLengthSid determina le dimensioni del SID archiviato all'interno del buffer specificato.

  • RtlValidSid determina se il buffer SID specificato è un buffer formattato valido.

RtlLengthSid e RtlValidSid presuppongono che sia presente l'intestazione fissa a 8 byte per un SID. Pertanto, un driver deve verificare la lunghezza minima di un'intestazione SID prima di chiamare queste funzioni.

Anche se sono presenti diverse altre funzioni RTL, questo elenco fornisce le funzioni principali necessarie per la costruzione di un SID.

Nell'esempio di codice seguente viene illustrato come creare un SID per l'entità "sistema locale". È anche possibile usare la funzione SecLookupWellKnownSid più semplice introdotta in Windows Server 2003.

{
    //
    // 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);
    }
}

L'esempio di codice seguente illustra come creare un SID usando la funzione SecLookupWellKnownSid per l'entità "sistema locale":

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

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

Uno di questi approcci è valido, anche se il secondo codice è preferibile. Questi esempi di codice usano buffer locali per archiviare il SID. Questi buffer non possono essere usati all'esterno del contesto di chiamata corrente. Se il buffer SID deve essere persistente, il buffer deve essere allocato dalla memoria del pool.