Compartir a través de


Identificador de seguridad

Windows usa el identificador de seguridad (SID) como valor definitivo para distinguir las entidades de seguridad entre sí. Por ejemplo, se asigna un identificador de seguridad único a cada cuenta nueva creada para cada uno de los usuarios del sistema. En el caso de un sistema de archivos, solo se usa este SID.

En la imagen siguiente se muestra la estructura del identificador de seguridad.

diagrama donde se ve la estructura del identificador de seguridad.

Además de los SID únicos, el sistema de Windows define un grupo de identificadores conocidos. Por ejemplo, el administrador local es un SID conocido.

Windows incluye un mecanismo basado en kernel para la conversión entre SID y nombres de usuario dentro del entorno del kernel. Estas llamadas de funciones están disponibles en el controlador ksecdd, que implementa estas funciones mediante servicios auxiliares en modo de usuario. En consecuencia, al usarse en los sistemas de archivos, debe cumplir las reglas habituales en materia de comunicación con los servicios en modo de usuario. Estas llamadas no se pueden usar durante las operaciones de E/S de paginación de archivos.

Estas son algunas de las funciones:

  • SecMakeSPN crea una cadena de nombre del proveedor de servicios que se puede usar al comunicarse con proveedores de servicios de seguridad específicos.

  • SecMakeSPNEx es una versión mejorada de SecMakeSPN que se incluyó en Windows XP.

  • SecMakeSPNEx2 es una versión aumentada de SecMakeSPNEx que está disponible desde Windows Vista y Windows Server 2008.

  • SecLookupAccountSid devuelve un nombre de cuenta para un SID determinado.

  • SecLookupAccountName recupera el SID de un nombre de cuenta determinado.

  • SecLookupWellKnownSid devuelve el SID correcto para un tipo de SID conocido determinado. Esta función está disponible en Windows Server 2003 y versiones posteriores.

Además, cualquier controlador de kernel puede crear un SID mediante las siguientes rutinas de biblioteca estándar en tiempo de ejecución:

  • RtlInitializeSid inicializa un búfer para un nuevo SID.

  • RtlLengthSid determina el tamaño del SID almacenado en el búfer determinado.

  • RtlValidSid determina si el búfer del SID determinado es un búfer con formato válido.

RtlLengthSid y RtlValidSid asumen que el encabezado fijo de 8 bytes de un SID está presente. Por tanto, el controlador debe comprobar esta longitud mínima en un encabezado de SID antes de llamar a estas funciones.

Aunque hay otras funciones RTL, en esta lista figuran las funciones principales necesarias al construir un SID.

En el ejemplo de código siguiente se muestra cómo crear un SID para la entidad "sistema local". También se puede usar la función más sencilla SecLookupWellKnownSid disponible en 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);
    }
}

En el ejemplo de código siguiente se muestra cómo crear un SID mediante la función SecLookupWellKnownSid para la entidad "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
      //
    }
  }

Cualquiera de estos métodos es válido, aunque se prefiere usar el último código. Estos ejemplos de código usan búferes locales para almacenar el SID. Estos búferes no se pueden usar fuera del contexto de la llamada actual. Si es necesario que el búfer del SID sea persistente, el búfer se debe asignar a partir de la memoria del grupo.