Serveur NPS (Radius) : configurer et analyser les logs
I. Présentation
Sur un serveur NPS, sous Windows Server donc, il est indispensable de bien configurer les logs afin qu'il soit facile de les récupérer. Nous avons la possibilité d'avoir des logs dans un fichier, mais aussi via l'Observateur d'événements de Windows.
Personnellement, pour le fichier, j'aime bien utilisé le format "IAS" car on se retrouve avec un fichier texte avec les traces à l'intérieur, séparée par des virgules, ce qui le rend facilement exploitable : dans Excel, par exemple. Le problème avec le NPS, c'est que s'il est fortement sollicité il va créer des fichiers de logs très conséquent, et ça peut devenir la galère pour les ouvrir... C'est pour cette raison que j'ai tendance à le configurer afin qu'il génère un fichier de log par jour.
II. Configurer les logs NPS
Pour configurer le format des logs générés par NPS, il faut accéder à la console "Serveur NPS (Network Policy Server)" puis à la section "Gestion". On retrouve alors un bouton "Modifier les propriétés du fichier journal" sous "Propriétés du fichier journal".
Une fenêtre s'ouvre... Accédez à l'onglet "Fichier journal", et à ce moment-là, je vous invite à définir un répertoire pour stocker les logs (vous pouvez conserver celui par défaut). Choisissez également le format "IAS (hérité)" et juste en dessous cochez "Chaque jour" si vous souhaitez qu'il y ait un fichier de log par jour.
Lorsque c'est fait, validez. Il ne reste plus qu'à redémarrer le service NPS pour être sur que ce soit bien pris en charge. Pour cela, ouvrez une console PowerShell et saisissez la commande suivante :
Restart-Service IAS
J'en profite pour vous indiquer que dans l'Observateur d'événements de votre serveur NPS, vous pouvez retrouver également des journaux liés à ce rôle. En fait, on les retrouve à l'emplacement suivant : Affichages personnalisés, Rôles de serveurs, Services de stratégie et d'accès réseau.
III. Comprendre les logs NPS
Avoir des logs c'est bien, mais être capable de les interpréter c'est mieux. Le fichier texte généré par défaut sur un serveur NPS, bien qu'exploitable facilement, n'est pas pour autant facile à interpréter car il n'y a pas le nom des colonnes.
La bonne nouvelle, c'est qu'il existe un script PowerShell sur le Technet afin de parser et de mettre en forme ce fameux fichier de log au format IAS. Il s'agit du script "NAP_Logs_Interpreter.ps1" que l'on peut récupérer à cette adresse : Interpreter logs NPS
Note : il existe une alternative, directement en ligne, où il suffit de coller les lignes de logs à analyser et elles seront mises en forme automatiquement. Le site est : iso.csusb.edu/tools/nps-log-interpreter
Nous allons maintenant utiliser le script PS1, mais il faut savoir que pour qu'il fonctionne il faut configurer les logs d'une façon spécifique : format IAS et un log par jour. Cela tombe bien, c'est ce que l'on a fait ?
Ce qui est intéressant avec ce script, au-delà du fait qu'il y ait le nom des colonnes, c'est que les codes d'état indiqué dans le fichier de log sont directement traduits en texte, ce qui est sans aucun doute plus facile à comprendre.
Par exemple, si type de paquet (Packet-Type) est à "1" dans le fichier de log, le script va directement indiquer "Packet-Type : Access-Request". Si le code est à "2" alors le texte sera "Packet-Type : Access-Accept", etc. Le script peut servir de documentation en même temps puisqu'il y a des tables de correspondances entre les codes et le texte associé, par exemple :
Pour exécuter le script, on peut :
- Configurer la variable $logs en modifiant le script, il suffit de lui spécifier le chemin UNC vers le dossier qui contient les logs du serveur NPS. On en profitera pour mettre à jour la variable $Servers pour indiquer le nom du serveur NPS.
- Exécuter le script en spécifiant directement un fichier de log
Par exemple, cela donne :
.\NAP_Logs_Interpreter.ps1 -filename .\IN200305.log
Ce qui retournera, au format liste, un objet par ligne :
SwitchIP : 192.168.1.120 Username : host/PC-01.it-connect.local Date-Time : 21:01:34 03/05/2020 RADIUS-Server : SRV-NPS Packet-Type : Access-Challenge Fully-Qualified-User-Name : it-connect.local/Ordinateurs/PC-01 Acct-Session-ID : 5E61049B-859BEE04 Session-Timeout : 60 Filter-ID : 4142 NAS-Port : 4108 Switch-IP-Address : 192.168.1.120 Connection-Request-Policy : Utiliser l'authentification Windows pour tous les utilisateurs NPS-Policy-Name : AUTORISER-PC-ACTIVE-DIRECTORY NAS-Manufacturer : 0 SAM-Account-Name : IT-CONNECT\PC-01$ Not_Documented : 1 Class : 311 1 192.168.0.100 03/05/2020 20:02:38 1 Reason-Code : IAS_SUCCESS Switch-Friendly-Name : AP-WIFI-01 Authentication-Type : EAP
On peut visualiser assez facilement différentes informations :
- Le nom du PC qui a tenté de se connecter (valeurs : Username / Fully-Qualified-User-Name / SAM-Account-Name) - On peut aussi ajouter la propriété Workstation-Mac pour voir l'adresse MAC
- Le nom du serveur NPS interrogé (valeur : RADIUS-Server)
- L'adresse IP du client Radius qui a relayé la requête auprès du serveur NPS, ce qui peut-être un switch, une borne Wi-Fi, etc. (valeurs : SwitchIP / Switch-IP-Address) et son nom (valeur : Switch-Friendly-Name)
- Le nom de la politique d'accès NPS associée à la demande de connexion (valeur : NPS-Policy-Name)
- Le type de paquet pour suivre l'échange entre l'appareil qui souhaite se connecter et le serveur NPS, ce qui sera très pratique pour le debug (valeur : Packet-Type)
On remarque généralement la suite de requête suivante : Access-Request -> Access-Challenge -> Access-Request -> Access-Accept
Pour que le script affiche seulement les infos de base, avec notamment la date/heure, le nom du PC/utilisateur, l'hôte Radius, le nom de la politique NPS, le type de paquet et l'état de la demande, on peut spécifier le paramètre -BaseInfo à la fin de la commande. Ce qui donnera :
.\NAP_Logs_Interpreter.ps1 -filename .\IN200305.log -BaseInfo
Avec un retour sous forme de tableau épuré, ligne par ligne :
Date-Time Username Workstation-MAC SwitchIP SwitchInterface NPS-Policy-Name Packet-Type Reason-Code --------- -------- --------------- -------- --------------- --------------- ----------- ----------- 21:01:34 03/05/2020 host/PC-01.it-connect.local 192.168.1.120 AUTORISER-PC-ACTIVE-DIRECTORY Access-Accept IAS_SUCCESS
Voici, en complément, quelques exemples pour utiliser ce script.
- Rechercher des données dans le fichier de log
Par exemple, cela peut servir à retrouver les logs d'un PC spécifique ou les requêtes d'un type spécifique, etc.
.\NAP_Logs_Interpreter.ps1 -filename .\IN200305.log -SearchData "PC-01"
- Afficher les logs des 3 derniers jours
.\NAP_Logs_Interpreter.ps1 -filename .\IN200305.log -SearchDays 3
- Afficher les logs condensé dans un seul tableau
.\NAP_Logs_Interpreter.ps1 -filename .\IN200305.log -NotStreaming
Cette vue est vraiment très pratique ! Testez vous verrez ?
Bien sûr, les différentes paramètres que l'on vient de voir dans les exemples précédents sont cumulables, ce qui permet d'optimiser votre recherche dans les logs.
Avec des journaux correctement configurés et un script bien pratique pour rechercher à l'intérieur et interpréter plus facilement les logs, vous voilà bien équipé pour faire du troubleshooting sur votre serveur NPS ?
Dommage, le contenu du site est bon, mais les pubs… de pire en pire sérieux. Avec des publicité plus que douteuse. On se croirait maintenant sur un site de warez…
Dommage.
Bonjour Alex,
Tu ne devrais pas en avoir autant et en tout cas pas des pubs douteuses, ce n’est pas notre souhait et il n’y a pas eu de modifications sur l’emplacement des pubs depuis près d’un an. Si tu as une copie d’écran… Tu peux me l’envoyer par e-mail stp.
Merci
Florian
Bonjour,
merci pour ton travail et ces explications bien claires!
A bientôt
Peut on avoir le script complet on ne le trouve plus sur la page Microsoft…? Merci
Bonjour Et merci pour cet article.
Comme Malicia, je souhaiterai savoir ou trouver le script powershell car il n’est plus sur le site de microsoft et sans lui ….
Bine à vous
Bonjour, super cet article !
Mais comme les posts précédents, je ne trouve plus le script sur le technet…
Où pourrais-je le trouver ?
Merci
Bonjour Samuel,
Je viens de déposer le script sur mon GitHub car je ne trouve pas de nouveau lien. 🙂
Bonne journée
Florian
Salut,
Le script ne fonctionne plus en l’état (j’utilise Powershell v5)
Voici la correction :
if([string]::IsNullOrEmpty($SearchData)){
$content = Get-Content (Get-Childitem $Logpaths -Filter *.log | ?{($_.Name.Length -lt ’13’ -and $_.Name -ge $after -and $_.Name -le $before)}).FullName
}else{
$content = Get-Content (Get-Childitem $Logpaths -Filter *.log | ?{($_.Name.Length -lt ’13’ -and $_.Name -ge $after -and $_.Name -le $before)}).FullName | Select-String -Pattern $SearchData
}
Et parce que je suis fainéant, voici les commandes pour configurer les journaux comme il se doit :
netsh nps set filelog format=IAS
netsh nps set filelog frequency=DAILY
Restart-Service IAS
Bonjour Messieurs
Comment définir le VLAN en fonction du compte utilisateur de l’Active Directory.
Un PC peut avoir plusieurs utilisateur et des accès a des ressource différente de l’invite, a l’admin, en passant au développeur comment les mètres dans des Vlan différant?
cordialement
Jean-Philippe
Bonjour florent
Merci pour ton site web adminsys
Peux-tu m’indiquer quel paramétrer il faut mettre pour rechercher les connections réussis « Access-Accept »
cordialement