Access Token – Jeton de sécurité

Un jeton d’accès ou jeton de sécurité identifie le contexte de sécurité d’un processus ou plus précisément d’un thread.

Pendant l’ouverture de session interactive/non-interactive, un jeton de sécurité est crée pour représenter l’utilisateur qui se connecte.

Tous les programmes qu’exécute l’utilisateur héritent d’une copie de ce jeton initial.

La structure d’un  « Access Token » est représentée ci-après :

Champ

Description

Token source

Texte court décrivant l’entité qui a créé le jeton Les programmes qui ont besoin de savoir où un jeton a pris son origine utilisent ces champs pour distinguer la provenance du jeton (Session Manager, serveur de fichier, serveur RPC).

Impersonation Type

Primary token – jeton qui identifie le contexte de sécurité d’un processus Impersonation token – jeton de thread qui est utilisé pour prendre temporairement une autre identité

Token ID

Identifiant local unique (LUID) que le SRM affecte à un jeton quand celui-ci est créé.

Authentication ID

Indique à quelle logon session est relié le jeton. LSASS affecte cet ID. Un programme peut obtenir cet ID afin de déterminer si le jeton appartient à la même session de logon que les autres jetons examinés par le programme

Modified ID

Valeur modifiée à chaque fois que les caractéristiques d’un jeton sont modifiées.

Expiration Time

Champ non utilisé pour le moment qui pourrait permettre la mise en place réelle de l’expiration d’un compte.

Default primary group

Affecté à des objets créés par le processus/thread.

Default DACL

Affecté à des objets créés par le processus/thread.

User Account SID

Indique le SID du principal.

Group 1.. n SID

Indique les groupes d’appartenances.

Restricted SID 1..n

Indique les SID interdits.

Privilege 1..n

Indique les privilèges.

A l’aide de l’utilitaire kd (Kernel Debugger), il est possible d’afficher la structure d’un jeton de sécurité.
Pour cela, la commande dt _TOKEN doit être utilisée.

image

Les jetons de sécurité ont des tailles différentes car les comptes utilisateur ont différents ensembles de privilèges et groupes.
La structure d’un jeton de sécurité est « sophistiquée » et il n’est pas évident d’en connaitre la taille.
Néanmoins une approximation peut être faite en utilisant la formule suivante :

Taille (octets) = [token overhead] + [44 x (Nombre de groupes + SID utilisateur)] + [12 x Nombre de privileges]

  • Token Overhead :
    représente la taille nécessaire pour stocker les informations comme Token Source, Expiration time…
    Une approximation communément admise est de 452 octets.
  • Privilèges  :
    Un utilisateur de domaine standard possède, par défaut, 4 privilèges qui sont :
    SeChangeNotifyPrivilege
    SeShutdownPrivilege
    SeUndockPrivilege
    SeCreateGlobalPrivilege
    La taille nécessaire pour stocker ces 4 privilèges est de 48 octets
  • Groupes de sécurité :
    Un utilisateur de domaine standard appartient à 7 groupes de sécurité par défaut qui sont :

SID 0 Group: <NOM DU DOMAINE>\Domain Users(S-1-5-21-xxxx-xxxx-xxxx-513)
SID 1 Group: \Everyone(S-1-1-0)
SID 2 Group: BUILTIN\Users(S-1-5-32-545)
SID 3 Group: NT AUTHORITY\INTERACTIVE(S-1-5-4)
SID 4 Group: NT AUTHORITY\Authenticated Users(S-1-5-11)
SID 5 Group: NT AUTHORITY\NONE_MAPPED(S-1-5-5-0-1246863)
SID 6 Group: \LOCAL(S-1-2-0)
Note : Il est nécessaire de rajouter le SID de l’utilisateur qui est également contenu dans cette structure.

A l’aide de cette formule, nous en déduisons la taille d’un « access token » pour un utilisateur de domaine standard ne possédant aucun privilège particulier et n’étant membre d’aucun groupe de sécurité restreint. Cet utilisateur possédera un « access token » ayant pour taille 852 octets.

Taille (octets) = 500 + 44 x 8 = 852

Une limite connue et documentée d’un « access token » est qu’un utilisateur ne peut pas appartenir à plus de 1023 groupes de sécurité différents (comprenant les groupes Built-in par défaut).
https://technet.microsoft.com/en-us/kb/kb00322970.aspx

Si l’utilisateur appartient à plus de 1023 groupes de sécurité, l’ouverture de session est impossible et le message suivant apparait :

image