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.
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 :