Compartilhar via


Identificador de segurança

O Windows usa o SID (identificador de segurança) como o valor definitivo para distinguir as entidades de segurança umas das outras. Por exemplo, um identificador de segurança exclusivo é atribuído a cada nova conta criada para usuários individuais no sistema. Para um sistema de arquivos, somente esse SID é usado.

A figura a seguir ilustra a estrutura do identificador de segurança.

diagrama que ilustra a estrutura do identificador de segurança.

Além de SIDs exclusivos, o sistema Windows define um conjunto de identificadores bem conhecidos. Por exemplo, o administrador local é um SID bem conhecido.

O Windows fornece um mecanismo no kernel para conversão entre SIDs e nomes de usuário no ambiente do kernel. Essas chamadas de função estão disponíveis no driver ksecdd que implementa essas funções usando serviços auxiliares do modo de usuário. Assim, seu uso em sistemas de arquivos deve obedecer às regras usuais de comunicação com serviços de modo de usuário. Essas chamadas não podem ser usadas durante a E/S do arquivo de paginação.

Algumas dessas funções são:

  • SecMakeSPN cria uma cadeia de caracteres de nome do provedor de serviços que pode ser usada ao se comunicar com provedores de serviços de segurança específicos.

  • SecMakeSPNEx é uma versão aumentada do SecMakeSPN que foi introduzida no Windows XP.

  • SecMakeSPNEx2 é uma versão aumentada do SecMakeSPNEx que está disponível a partir do Windows Vista e Windows Server 2008.

  • SecLookupAccountSid retorna um nome de conta para um SID especificado.

  • SecLookupAccountName recupera o SID de um nome de conta especificado.

  • SecLookupWellKnownSid retorna o SID correto para um tipo de SID bem conhecido especificado. Essa função está disponível no Windows Server 2003 e posterior.

Além disso, qualquer driver de kernel pode criar um SID usando as seguintes rotinas de biblioteca de runtime padrão:

  • RtlInitializeSid inicializa um buffer para um novo SID.

  • RtlLengthSid determina o tamanho do SID armazenado no buffer fornecido.

  • RtlValidSid determina se o buffer SID fornecido é um buffer formatado válido.

RtlLengthSid e RtlValidSid pressupõem que o cabeçalho fixo de 8 bytes para um SID esteja presente. Portanto, um driver deve verificar esse comprimento mínimo para um cabeçalho SID antes de chamar essas funções.

Embora existam várias outras funções RTL, esta lista fornece as funções primárias necessárias ao construir um SID.

O exemplo de código a seguir demonstra como criar um SID para a entidade "sistema local". A função SecLookupWellKnownSid mais simples introduzida no Windows Server 2003 também pode ser usada.

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

O exemplo de código a seguir demonstra como criar um SID usando a função SecLookupWellKnownSid para a entidade "sistema local":

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

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

Qualquer uma dessas abordagens é válida, embora o último código seja preferido. Esses exemplos de código usam buffers locais para armazenar o SID. Esses buffers não podem ser usados fora do contexto de chamada atual. Se o buffer SID precisar ser persistente, o buffer deverá ser alocado da memória do pool.