<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Francophonie, identité et sécurité</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/frid/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/frid/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 06:07:17 GMT</lastBuildDate>
    <language>fr_FR</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Kerberos, déléguerais-tu vraiment tes credentials à un chien ?</title>
      <link>https://docs.microsoft.com/archive/blogs/frid/kerberos-deleguerais-tu-vraiment-tes-credentials-a-un-chien</link>
      <pubDate>Thu, 29 Jun 2017 16:57:59 GMT</pubDate>
      <dc:creator><![CDATA[Pierre Audonnet [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/frid/?p=405</guid>
      <description><![CDATA[Dans cet article on regarde d’un peu plus près de ce que la délégation Kerberos implique en termes...]]></description>
      <content:encoded><![CDATA[Dans cet article on regarde d’un peu plus près de ce que la délégation Kerberos implique en termes de sécurité dans votre environnement Active Directory. Pourquoi un chien ? Puisqu'après tout, Kerberos n'est qu'un chien à trois têtes 🐶🐶🐶
<h2>La délégation Kerberos c’est quoi ?</h2>
Déjà il est bon de dire que cela n’a rien à voir avec la délégation des permissions sur les objets dans Active Directory. Donc rien à voir avec la délégation du Helpdesk sur la réinitialisation des mots de passes de tes comptes utilisateurs. D’ailleurs il s’agit en fait de quelque chose de bien plus puissant. L’idée originale c’est autoriser ("déléguer") un compte le droit de demander des tickets en tant que quelqu’un d’autre. En gros tu donnes l’autorisation à un compte de se faire passer pour quelqu’un d’autre. Déjà on peut voir que cela peut être un risque important. Bon, à côté de risques tels que : « j’ai 60 <em>domain admins </em>» ou bien « on utilise le même mot de passe administrateur sur toutes mes machines » on est un peu plus bas dans la liste de priorité. Mais quand même, voyons cela un peu plus en détails car Windows Server 2003 puis Windows Server 2012 R2 apportent des nouveautés dans cet espace.
<h2>Un mal nécessaire.</h2>
Donner la permission à un compte de se faire passer pour quelqu’un d’autre peut paraitre limite niveau sécurité… Mais cela répond en fait à un problème ancestral des applications multi-tiers. Le <em>double-hop</em>. Avant Kerberos (comprendre NTLM), lorsque tu te connectes à un service web, tu t’authentifies et le service sait qui tu es. Mais lorsque ce service appelle un autre service en arrière-plan (une base de données, d’autre service web…) il le fait avec son identité à lui, pas la tienne. Du coup niveau délégation des accès c’est assez limitant, tous les accès sont faits en tant que le compte de service du service web. Ou bien on peut demander à l’utilisateur de se réauthentifier mais cette fois-ci auprès de cet autre service, résultant la plupart du temps en en pop-up où l’utilisateur exaspéré doit de nouveau rentrer son mot de passe… Grâce à la délégation, si le compte de service du service web a le droit de se faire passer pour toi, et bien les accès aux services en arrière-plan conservent ton identité. Et la ça devient très intéressant en termes de permissions et d’audit ! C’est la délégation Kerberos.
<h2>Les 3 façons de faire de la délégation Kerberos.</h2>
Dans les trois exemples suivants, je regarde l'onglet <em>Delegation</em> du compte machine VSRV01. Notez que vous ne verrez pas l'onglet Delegation sur un compte utilisateur à moins que le compte en question ait une ou plusieurs valeurs définie dans l'attribut servicePrincipalName (pas de SPN = pas de délégation Kerberos, après tout ça a du sens).

Il y a la façon <em>old school</em> style Windows 2000 Server.

<img width="465" height="122" class="wp-image-415 alignnone" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG1.jpg" />

Il y a la façon Windows Server 2003 en mode Kerberos de bout en bout.

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG2.jpg"><img width="468" height="143" class="alignnone wp-image-416" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG2.jpg" /></a><a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG1.jpg">
</a>

Et il y la façon Windows Server 2003 en mode transition de protocole.

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG3.jpg"><img width="471" height="140" class="wp-image-425 alignnone" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG3.jpg" /></a>

L'option <em>Trust this computer for any service (Kerberos only)</em> est l'option datant de Windows 2000 server. En termes de risque cela signifie qu’un attaquant ayant des droits d’administrateur local sur le serveur VSRV01 peut se faire passer pour n’importe quel utilisateur utilisant le service pour lequel on a configuré la délégation. Par exemple, s’il s’agit d’un service web qui tourne dans le contexte machine (en <em>local system</em> par exemple) si Adam se connecte au service l’attaquant peut se faire maintenant passer pour Adam auprès de n’importe quels autres services (par exemple sa boite email, ou ses dossiers partagés). Bien sûr il faut qu’Adam se connecte une première fois au serveur compromis. Si l’attaquant a compromis le serveur Sharepoint, c’est une question de temps, si l’attaquant a compromis un serveur quelconque, un petit courriel d’hameçonnage fera l’affaire pour l’attirer.

Pour les deux autres options sous la section <em>Trust this computer for delegation to specified services only</em> c’est un peu différent puisque cette fois-ci, il faut aussi spécifier la liste des services (SPN, c'est comme cela qu'on identifie les services dans le royaume de Kerberos) pour lesquels VSRV01 a la permission de se faire passer pour quelqu’un d’autre. Donc si le service web n’a accès qu’à une base de données et un serveur de reporting SQL, bon l’attaquant peut toujours se faire passer pour Adam lorsqu’il se connecte au service mais uniquement auprès des services spécifiés. <strong>Il s’agit de la délégation contrainte.</strong> Donc plus d’accès aux emails ou aux données personnelles (à moins évidemment que ces services fassent partie de la liste des services autorisés…).

Attardons-nous un peu sur la deuxième option de délégation contrainte. Celle avec transition de protocole. Jusqu’à présent, le VSRV01 peut se faire passer pour Adam que si ce dernier s’est déjà connecté au service pour lequel on a configurer la délégation. Avec la transition de protocole, ça change un peu. Le problème de la délégation Kerberos, et excusez-moi de la Lapalissade, c’est que cela nécessite Kerberos. Donc si l’utilisateur ne s’est pas authentifié en utilisant Kerberos auprès du service (soit car Kerberos a échoué, ou bien car l’utilisateur ne peut pas utiliser ce protocole avec son client) et bien tout tombe à l’eau. La délégation Kerberos c’est un peu comme prendre le ticket d’un utilisateur et l’envoyer au contrôleur de domaine en disant « coucou c’est moi Adam ». Dans ce cas, il n’y a pas de ticket car on arrive avec NTLM, ou bien avec un formulaire, ou bien tout autre protocole que Kerberos. Et c’est là que la magie de la transition de protocole opère. Si le service estime que Adam a prouvé qui il était avec une autre protocole que Kerberos, sélectionner l’option <em>Use any authentication protocol</em> va permettre au service de demander au contrôleur de domaine un ticket à la place d’Adam. Mais comme il n’y a plus besoin d’attendre qu’Adam se connecte avec succès avec Kerberos, l’attaquant n’est plus obligé d’attendre qu’Adam se connecte et peut à n’importe quel moment se faire passer pour lui ! Seulement auprès de la liste contrainte de services mais tout de même. En gros, l'attaquant peut se faire passer pour n'importe qui, n'importe quand. Et ce n'est pas un <em>bug</em> ou un détournement. C'est comme ceci que le protocole est conçu et implémenté.

Dans cet exemple je prends un compte machine. Donc cela implique que l'attaquant soit administrateur local de la machine. Si la délégation est active sur un compte utilisateur (cas de compte de service), l'attaquant peut faire la même chose juste et connaissant ou découvrant le mot de passe du compte).
<h2>Exemple pratique : se faire passer pour n'importe qui.</h2>
Voici la configuration de la délégation Kerberos sur VSRV01:

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG4.jpg"><img width="702" height="272" class="alignnone wp-image-435" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG4.jpg" /></a>

Je me connecte à VSRV01 avec un compte local membre du groupe local Administrators.

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG5.jpg"><img width="540" height="284" class="alignnone wp-image-445" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG5.jpg" /></a>

J'ai aucune permission on VFILE01, et si j'essaye de lister le partage administratif C$ je me fais rembarrer :

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG6.jpg"><img width="198" height="24" class="alignnone wp-image-447" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG6.jpg" /></a>

J'ouvre une console PowerShell en <em>local system</em> avec PSEXEC :
<pre>PSEXEC -i -s -d PowerShell</pre>
Puis je décide de changer d'identitée et de me faire passer pour l'administrateur du domaine (dans mon cas piaudonnmsdn@verenatex.com) :
<pre>$u = New-Object System.Security.Principal.WindowsIdentity("piaudonnmsdn@verenatex.com") 
$u.Impersonate()</pre>
Et voici le resultat :

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG8.jpg"><img width="467" height="188" class="alignnone wp-image-455" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG8.jpg" /></a>

Et sur le câble réseau, à quoi cela ressemble-t-il ? Et bien on voit la demande de TGT suivie d'une demande de ticket de service pour CIFS/VFILE01 mais avec un fanion particulier :

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG7.jpg"><img width="664" height="298" class="alignnone wp-image-465" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG7.jpg" /></a>

Le fanion S4U2Proxy nous indique que ce ticket a été obtenu grâce à la transition de protocole.

Bref, l'attaquant est administrateur du service (ici le service de fichiers). Mais si l'attaquant avait choisi un autre service constraint comme le service SQL de VSQL01 dans mon example, on peut se faire passer pour le compte de service ou un compte administrateur du service en question.
<h2>On va tous mourir ! Il faut désactiver la délégation !</h2>
Pas si vite ! Encore une fois, la délégation Kerberos et même la transition de protocole, sont des fonctionalités très utiles et nécéssaires pour aussi augmenter le niveau de sécurité d'une application (puisque la connexion d'un utilisateur est authentifiée de bout en bout). Il faut tout simplement s'assurer que vous contrôlez qui est administrateur local des serveurs, et pour les cas des comptes de services, qui connait les mots de passe de ces comptes et/ou qui est administrateur local des machines où ces comptes sont utilisés. <strong>Un peu de rigueur suffit pour contrôler ce risque</strong>. Et cette rigueur est aussi recommandée même si tu ne fais pas de delegation Kerberos de toutes façons. Par contre, si la délégation n'est pas utilisée, ou est le resultat d'une erreur de configuration, il faut la corriger.
<ol>
 	<li>Il faut s'assurer que seulement les administrateurs de domaine peuvent configurer la delegation. C'est un paramètre de sécurité généralement configure dans la Default Domain Controller Policy:
<a href="https://msdnshared.blob.core.windows.net/media/2017/06/KDELEGPRIV.jpg"><img width="551" height="186" class="alignnone wp-image-485" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/KDELEGPRIV.jpg" /></a></li>
 	<li>Il faut s'assurer qu'on utilise la délégation sur le bon compte et que c'est bel et bien requis pour l'application. Configurer la delegation peut des fois s'avérer laborieux. On teste plein de possibilités, et puis hop cela marche et on touche plus... Du coup, il est bien possible que certains comptes ait été touchés pour rien. Il faut les corriger.</li>
 	<li>Il faut s'assurer qu'on utilise la délégation contrainte en spécifiant les services (SPN) plutôt que la méthode <em>old school</em> Windows 2000 Server lorsque la délégation est nécéssaire.</li>
 	<li>Et enfin securiser les groupes administrateurs locaux des serveurs où les comptes sont utilisés. En utilisant la fonctionalité de groupes restreints des stratégies de groupe par exemple.</li>
</ol>
On peut aussi désactiver la possibilité pour un compte d'être utilisé dans un scenario de délégation. C'est l'option suivante :

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG9.jpg"><img width="676" height="250" class="alignnone wp-image-466" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/FR-DELEG9.jpg" /></a>

C'est <em>Account is sensitive and cannot be delegated</em>. Il est recommandé d’activer cette option au minimum pour les comptes domain admins et les comptes avec de privilèges élevé et qui n’utilisent pas d'application nécéssitant la délégation Kerberos.  <strong>Il est recommandé de faire ça pour tous vos comptes admins</strong> <strong>AD</strong> puisqu'ils n'utilisent pas les applications métiers qui ont la besoin de la délégation (pour etre precis, il y a une situation d'administration AD qui requiert la delegation, c'est bouger un compte d'une domaine vers un autre en intra-forêt avec MOVETREE ou ADMT, mais bon on fait pas ça tous les jours, et on peut juste décocher la case avant de faire le move et la recocher ensuite).
<h2>Lister les comptes à risque.</h2>
Bon comprendre les comptes à vérifier.
<ol>
 	<li>Lister les comptes machines configurés pour la délégation à la mode 2000:
<pre>Get-ADObject -LDAPFilter:"(&amp;(objectCategory=computer)(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))"</pre>
Notez que cela retourne aussi les contrôleurs de domaine. Pas de panique, c'est attendu, pas besoin de les modifier.</li>
 	<li>Lister les comptes utilsateurs configurés pour la délégation à la mode 2000:
<pre>Get-ADObject -LDAPFilter:"(&amp;(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=524288))"</pre>
</li>
 	<li>Lister les comptes machines configurés pour la délégation avec transition de protocole :
<pre>Get-ADObject -LDAPFilter:"(&amp;(objectCategory=computer)(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=16777216))"</pre>
</li>
 	<li>Lister les comptes utilsateurs configurés pour la délégation avec transition de protocole :
<pre>Get-ADObject -LDAPFilter:"(&amp;(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=16777216))"</pre>
</li>
</ol>
Des questions ? Des commentaires ? C'est en bas !

<em>Merci à Pascal B. pour son aide dans la rédaction de ce billet !</em>]]></content:encoded>
    </item>
    <item>
      <title>Lister tous les évènements de sécurité possibles et leurs descriptions en PowerShell</title>
      <link>https://docs.microsoft.com/archive/blogs/frid/lister-tous-les-evenements-de-securite-possibles-et-leurs-descriptions-en-powershell</link>
      <pubDate>Tue, 25 Oct 2016 23:02:20 GMT</pubDate>
      <dc:creator><![CDATA[Pierre Audonnet [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/frid/?p=345</guid>
      <description><![CDATA[La liste de tous les évènements de sécurité possibles sur votre système est disponible ici :...]]></description>
      <content:encoded><![CDATA[La liste de tous les évènements de sécurité possibles sur votre système est disponible ici :
<ul>
 	<li><a href="https://www.microsoft.com/en-us/download/details.aspx?id=50034">Windows security audit events </a></li>
</ul>
Il s'agit d'un ficher Excel bien pratique puisqu'il liste tous les évènements, leurs IDs, leurs descriptions ainsi que la catégorie d'audit a activer pour les générer.

Cela dit, il est possible de faire appel a PowerShell pour générer cette liste dynamiquement sur votre système (en fait pas tout a fait la meme liste puisque la commande suivante ne vous donne pas la catégorie d'audit à activer, toujours bien pratique).

[code language="PowerShell"](Get-WinEvent -ListProvider &quot;Microsoft-Windows-Security-Auditing&quot;).Events | `
    Select-Object @{Name='Id';Expression={$_.Id -band 0xffffff}}, Description, @{Name='Parameters';Expression={([xml]$_.Template).template.data}} | `
        Out-GridView -Title &quot;Audit Event IDs&quot; -PassThru | `
            Format-List[/code]

Voici la sortie :

<a href="https://msdnshared.blob.core.windows.net/media/2016/10/AUDIT_PS_1.jpg"><img width="846" height="605" class="alignnone size-full wp-image-355" alt="AUDIT_PS_1" src="https://msdnshared.blob.core.windows.net/media/2016/10/AUDIT_PS_1.jpg" /></a>

Le format <strong>GridView </strong>est bien pratique puisqu'on peut appliquer un filtre :

<a href="https://msdnshared.blob.core.windows.net/media/2016/10/AUDIT_PS_2.jpg"><img width="832" height="337" class="alignnone size-full wp-image-365" alt="AUDIT_PS_2" src="https://msdnshared.blob.core.windows.net/media/2016/10/AUDIT_PS_2.jpg" /></a>

Et puisque on positionne le paramètre <strong>-passthrough</strong>, si vous selection un ou plusieurs elements dans le GridView et cliquez sur OK, le details va s'afficher dans la console :

<a href="https://msdnshared.blob.core.windows.net/media/2016/10/AUDIT_PS_3.jpg"><img width="1014" height="317" class="alignnone size-full wp-image-375" alt="AUDIT_PS_3" src="https://msdnshared.blob.core.windows.net/media/2016/10/AUDIT_PS_3.jpg" /></a>

Merci à Chris Wu pour l'astuce de lister les évènements d'un fournisseur spécifique.

Notez que vous pouvez faire cela pour n'importe quelle autre fournisseur (User32, ADFS Audit,...).]]></content:encoded>
    </item>
    <item>
      <title>Adieu NTLMv1 - Partie 2 - Consolidation</title>
      <link>https://docs.microsoft.com/archive/blogs/frid/adieu-ntlmv1-partie-2-consolidation</link>
      <pubDate>Wed, 24 Aug 2016 15:33:12 GMT</pubDate>
      <dc:creator><![CDATA[Pierre Audonnet [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/frid/?p=105</guid>
      <description><![CDATA[Vous venez d'activer l'audit comme indiqué dans la partie : Adieu NTLMv1 - Partie 1 - Détection. On...]]></description>
      <content:encoded><![CDATA[Vous venez d'activer l'audit comme indiqué dans la partie : Adieu NTLMv1 - Partie 1 - Détection. On est maintenant capable de détecter que NTLMv1 est utilisé sur vos serveurs ainsi que sur vos contrôleurs de domaine. Par contre, à moins que vous ayez un <a href="https://fr.wikipedia.org/wiki/Security_information_management_system">SIEM</a> sur tous vos serveurs, consolider l'information afin de déterminer facilement où est utilisé NTLMv1 ne paraît pas une simple affaire... Ce billet vous indique comment collecter l'information de façon centralisée sans déployer aucun agent, sans même utiliser un SIEM, juste en utilisant les fonctionnalités par défaut de Windows: <a href="https://msdn.microsoft.com/fr-fr/library/cc748890%28v=ws.11%29.aspx">Event Forwarding (transfert d'évènements)</a>.
<h3>Le transfert d'évènements, c'est quoi ?</h3>
Depuis Windows Server 2003 R2, Windows dispose d'une fonctionnalité qui permet d'envoyer des évènements correspondant à un filtre que vous aurez prédéfini vers un serveur qui les collecte. Ceci utilise en fait deux composants de Windows, l'Event Forwarding Plug-in (qui écoute les journaux et compare ce qui est généré avec le filtre défini) et un service Windows : Event Collection Service (Service de collecte d'événements). Notez que le transfert d'évènements en Windows Server 2003 fonctionne un tout petit peu différemment, mais bon, <a href="https://www.microsoft.com/fr-fr/server-cloud/products/windows-server-2003/">2003 c'est de l'histoire ancienne</a> :) Voilà à quoi cela va ressembler au final :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/FOR_1.jpg"><img width="450" height="262" class="size-full wp-image-115 aligncenter" alt="FOR_1" src="https://msdnshared.blob.core.windows.net/media/2016/08/FOR_1.jpg" /></a>

Les serveurs à gauche sont tous les serveurs hébergeant des ressources pour lesquelles des utilisateurs et des systèmes peuvent utiliser NTLM afin de s'authentifier, donc encore une fois tous vos contrôleurs de domaine et tous vos serveurs membres. En gros, les serveurs sur lesquels les évènements 4624 vont être générés. À droite, juste un serveur membre qui va recevoir une copie des évènements 4624 correspondant à une authentification ayant utilisé NTLMv1 sur les serveurs de gauche.
<h3>Magie ?</h3>
Comment les serveurs de gauche savent-ils ce qu'il faut transférer, à quelle fréquence, et comment savent-ils que le tout doit aller vers le serveur de droite? Cela se gère grâce à des abonnements. Les abonnements sont des configurations qui sont stockées sur le serveur de droite. Les serveurs de gauche doivent être configurés pour retirer la liste d'abonnements disponibles, les analyser afin de déterminer s'ils doivent s'y abonner et commencer le travail de surveillance et de transfert le cas échéant. Comment dire aux serveurs de gauche d'aller retirer les abonnements du serveur de droite ? Tout simplement par stratégie de groupe. On crée une GPO qui dicte aux serveurs de gauche d'aller vérifier s'ils ont des abonnements avec l'intervalle que l'on choisit.
<h3>Préparer le serveur qui va recevoir les évènements</h3>
Ce serveur peut être un Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 ou Windows Server 2012 R2 (ou leurs équivalents clients, oui le transfert et la collecte d'évènements fonctionnent aussi sur les OS clients). Les manipulations nécessitent d'être membre du groupe des administrateurs locaux du serveur.
<ol>
 	<li>S'il n'est pas déjà configuré pour écouter sur le réseau, configurer le service WinRM (Windows Remote Management). Il est déjà activé et configuré pour écouter par défaut avec Windows Server 2012 et Windows Server 2012 R2. Si ce n'est pas le cas, ou si vous souhaitez vérifier, vous pouvez exécuter les commandes suivantes (notez que si c'est déjà configuré sur votre système et que vous re-exécutez les commandes, cela ne cassera rien et vous dira juste que c'est en fait déjà configuré). Pour configurer le service, ouvrez une console en mode administrateur et tapez :
<pre>winrm qc</pre>
Le message suivant va s'afficher :
<pre><a href="https://msdnshared.blob.core.windows.net/media/2016/08/WINRM_1.jpg"><img width="643" height="126" class="alignnone size-full wp-image-125" alt="WINRM_1" src="https://msdnshared.blob.core.windows.net/media/2016/08/WINRM_1.jpg" /></a></pre>
Tapez Y puis [Enter]. Le message suivant va s'afficher :
<pre><a href="https://msdnshared.blob.core.windows.net/media/2016/08/WINRM_2.jpg"><img width="642" height="71" class="alignnone size-full wp-image-135" alt="WINRM_2" src="https://msdnshared.blob.core.windows.net/media/2016/08/WINRM_2.jpg" /></a></pre>
Cela va automatiquement activer les règles de pare feux pour autoriser les connections entrantes pour WinRM.
<a href="https://msdnshared.blob.core.windows.net/media/2016/08/WINRM_3.jpg"><img width="737" height="533" class="alignnone size-full wp-image-145" alt="WINRM_3" src="https://msdnshared.blob.core.windows.net/media/2016/08/WINRM_3.jpg" /></a></li>
 	<li>Activez le service de transfert et de collection des évènements. Ouvrez l'observateur d'évènements et cliquez sur la section Abonnements (Subscriptions).
<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_0.jpg"><img width="800" height="359" class="alignnone size-full wp-image-155" alt="SUB_0" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_0.jpg" /></a>
Cliquez sur Oui (Yes). Cela va activer le service Windows Event Collector. Notez que dorénavant, lorsque vous allez dans la partie Abonnements, on ne vous demandera plus d'activer le service. Notez aussi que le service est configuré en Delayed Start. Donc si la machine vient juste de démarrer et que vous accédez à la partie Abonnements de l'Observateur d'évènements tout de suite, il se peut que le service ne soit pas encore démarré et dans ce cas vous verrez de nouveau le pop-up (cela n'efface rien des éventuelles configurations que vous auriez pu faire auparavant).
<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_1.jpg"><img width="649" height="418" class="alignnone size-full wp-image-165" alt="SUB_1" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_1.jpg" /></a></li>
</ol>
C'est tout pour la partie infrastructure. Notez que nous allons utiliser HTTP pour le transport et non HTTPS. Si vous souhaitez utiliser HTTPS, n'hésitez pas à poster un commentaire (en gros cela utilise un autre port et nécessite d'importer et de spécifier un certificat en ligne de commande). Bien que nous utilisions HTTP, le contenu des évènements ne transite pas en clair sur le réseau et les clients vont utiliser Kerberos pour l'authentification. Qui dit Kerberos dit SPN (servicePrincipalName). Assurez-vous que le compte machine de notre serveur de collection a le SPN suivant: WSMAN\hostname et WSMAN\FQDN (exemples : WSMAN\serveur1 et WSMAN\serveur1.contoso.com).
<h3>Préparer l'abonnement</h3>
On peut maintenant créer un nouvel abonnement. Clic droit <em>Créer un abonnement</em>.

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_2.jpg"><img width="267" height="317" class="alignnone size-full wp-image-175" alt="SUB_2" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_2.jpg" /></a>

On l'appelle <em>Transférer les authentifications NTLMv1</em> :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_3.jpg"><img width="581" height="484" class="alignnone size-full wp-image-185" alt="SUB_3" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_3.jpg" /></a>

On laisse la destination <strong>Forwarded Events</strong>. Cela signifie que les évènements arrivant des autres serveurs seront stockés localement dans le journal des évènements transférés.
On choisit <strong>Source computer initiated</strong> (la deuxième option, dans notre cas, les serveurs vont devoir s'abonner). Cliquez sur <strong>Select Computer Groups</strong>. On va y ajouter <strong>Ordinateurs du domaine</strong> (Domain Computers) et <strong>Contrôleurs de domaine</strong> (Domain Controllers). Ce sont des groupes par défaut donc on cible tous les serveurs et tous les contrôleurs de domaine. Cela ne veut pas dire que par magie tous les ordinateurs et contrôleurs de domaine vont s'abonner. Encore faut-il sur ces serveurs et contrôleurs de domaine, les configurer pour aller vérifier leurs abonnements.

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_4.jpg"><img width="532" height="255" class="alignnone size-full wp-image-195" alt="SUB_4" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_4.jpg" /></a>

Cliquez ensuite sur <strong>Select events</strong> et cliquez sur l'onglet <strong>XML</strong> puis <strong>Edit query manually</strong>. On va y saisir le filtre vu dans le billet précédent :
<pre>&lt;QueryList&gt;
 &lt;Query Id="0" Path="Security"&gt;
  &lt;Select Path="Security"&gt;
  Event[
   System[
    EventID=4624
   ] and EventData[
      Data[@Name="LmPackageName"]="NTLM V1" and Data[@Name="TargetUserSid"]!="S-1-5-7"
   ]
  ]
  &lt;/Select&gt;
 &lt;/Query&gt;
&lt;/QueryList&gt;
</pre>
Voici le résultat dans la fenêtre :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_5.jpg"><img width="546" height="545" class="alignnone size-full wp-image-205" alt="SUB_5" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_5.jpg" /></a>

On ne change rien dans la partie <strong>Advanced</strong>. Ceci doit ressembler à :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_6.jpg"><img width="496" height="220" class="alignnone size-full wp-image-215" alt="SUB_6" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_6.jpg" /></a>

On doit voir l'abonnement crée avec le nombre d'abonné égal à 0.

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_7.jpg"><img width="652" height="23" class="alignnone size-full wp-image-225" alt="SUB_7" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_7.jpg" /></a>

On a un serveur prêt à recevoir les évènements, on a un abonnement qui décrit quels évènements transférer et où les stocker. Maintenant, il faut que les serveurs et les contrôleurs de domaine s'y abonnent.
<h3>Préparer et abonner les serveurs</h3>
Afin de s'assurer que tous les serveurs et contrôleurs de domaine vont aller chercher leurs abonnements, on va créer une stratégie de groupe. Cela dit, rien ne vous empêche de créer plusieurs stratégies de groupe liées à différentes unités d'organisation. Bref, dans notre exemple, notre GPO on va faire 2 choses :
<ol>
 	<li>Configurer l'adresse à laquelle le serveur va aller vérifier s'il a des abonnements.</li>
 	<li>S'assurer que le plug-in responsable de scruter les évènements 4624 a bien la permission de lire le journal de sécurité.</li>
</ol>
Pour le premier, on va créer une GPO (encore une fois, libre à vous de créer plusieurs GPO et d'y appliquer des filtres WMI différents ou d'y ajouter du filtrage d'application par groupe de sécurité). On prend ici l'exemple d'une GPO qui s'applique au niveau du domaine, qui s'applique à Authenticated Users (donc potentiellement tous les machines) mais avec un filtre WMI pour que cela ne s'applique en fait qu'aux serveurs membres et contrôleurs de domaine (et non aux stations de travail). Voici le filtre WMI utilise pour l'exemple :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_8.jpg"><img width="564" height="153" class="alignnone size-full wp-image-235" alt="SUB_8" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_8.jpg" /></a>

<span style="color: #000000">Et voici, </span>on configure dans la GPO sur quel serveur (à quelle adresse) les machines appliquant la GPO vont aller chercher leurs abonnements :
<ul>
 	<li><strong>Computer Configuration &gt; Policies &gt; Administrative Templates &gt; Windows Components &gt; Event Forwarding &gt; Configure target Subscription Manager</strong>. Activez le paramètre et entrez l'URL suivante : <span><strong>Server=https://&lt;serveur configure pour la collection&gt;:5985/wsman/SubscriptionManager/WEC </strong>(le port sera ouvert et vous avez exécuté WimRM qc sur la machine de destination et cela a aussi activé la règle de pare feu). N'oubliez pas le début <strong>Server=</strong>. Cela fait bien partie du paramètre comme vous pouvez le voir dans la capture suivante : </span><a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_9.jpg">
<img width="841" height="639" class="alignnone size-full wp-image-245" alt="SUB_9" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_9.jpg" /></a></li>
</ul>
Pour le second point (les permissions du plug-in du transfert d'évènements) il va falloir modifier la sécurité du système. Le plug-in scrutant les évènements le fait avec le contexte de sécurité NETWORK SERVICE. Et NETWORK SERVICE n'a pas le droit de lire le journal de sécurité où les évènements 4624 vont arriver. Du coup, il va falloir donner la permission à NETWORK SERVICE de lire le journal de sécurité. On peut le faire en ajouter le compte dans le groupe <strong>Eventlog Readers</strong> ou bien en modifiant le DACL du journal de sécurité. Dans notre exemple, on va le faire en modifiant la sécurité du journal de sécurité. Cela peut aussi se faire par stratégie de groupe dans la section suivante :
<ul>
 	<li><strong>Computer Configuration &gt; Policies &gt; Administrative Templates &gt; Windows Components &gt; Event Log Service &gt; Security</strong>. Dans la partie <strong>Log Access</strong>, entrez la valeur suivante: <strong>O:BAG:SYD:(A;;0xf0005;;;SY)(A;;0x5;;;BA)(A;;0x1;;;S-1-5-32-573)(A;;0x1;;;S-1-5-20) </strong>La partie <strong>(A;;0x1;;;S-1-5-20)</strong> est celle qui ajoute NETWORK SERVICE la permission de lire le journal (si cette notation vous parait mystérieuse, je vous invite à vous documenter sur le <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa379567(v=vs.85).aspx">format SDDL</a> (en anglais). Voici à quoi cela ressemble dans la stratégie de groupe :
<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_10.jpg"><img width="813" height="227" class="alignnone size-full wp-image-246" alt="SUB_10" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_10.jpg" /></a></li>
</ul>
Notez que cela ne s'applique pas tout de suite... Il va falloir que la machine redémarre. Mais bon, on utilise NTLMv1 depuis des années, on n'est pas à un cycle de patch management près. Donc soyons patients, petit à petit les machines vont redémarrer (j'espère que vos patchs, au moins une fois par mois) les serveurs vont être configurés correctement. Lorsque la machine applique la stratégie de groupe, on va voir l'évènement suivant dans le journal Eventlog-ForwardingPlugin (notez que si vous optez pour ajouter NETWORK SERVICE dans le groupe Eventlog Readers, il faut également attendre que le serveur redémarre pour que cela prenne effet) :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_11.jpg"><img width="761" height="539" class="alignnone wp-image-255" alt="SUB_11" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_11.jpg" /></a>

Et sur le serveur qui reçoit les évènements, vous devez voir le nombre d'abonnés s'incrémenter. Si vous cliquez droit sur l'abonnement et sélectionnez <strong>Runtime Status</strong>, vous pouvez voir la liste d'abonnés :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_12.jpg"><img width="660" height="484" class="alignnone size-full wp-image-265" alt="SUB_12" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_12.jpg" /></a>
<h3>Voilà !</h3>
Lentement, au fur et à mesure que les serveurs appliquent la stratégie de groupe (et ont redémarré au moins une fois) on va voir les évènements 4624 arriver dans notre journal <strong>Forwarded Events</strong> :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_13.jpg"><img width="1007" height="674" class="alignnone size-full wp-image-275" alt="SUB_13" src="https://msdnshared.blob.core.windows.net/media/2016/08/SUB_13.jpg" /></a>

On peut voir que la colonne <em>Computer</em> nous dit d'où l'événement provient.

Maintenant qu'on a la liste, consultez le prochain billet pour savoir quoi en faire ! <em>(en cours d'écriture, soyez patients)</em>]]></content:encoded>
    </item>
    <item>
      <title>Adieu NTLMv1 - Partie 1 - Détection</title>
      <link>https://docs.microsoft.com/archive/blogs/frid/adieu-ntlmv1-partie-1-detection</link>
      <pubDate>Tue, 23 Aug 2016 21:57:02 GMT</pubDate>
      <dc:creator><![CDATA[Pierre Audonnet [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/frid/?p=35</guid>
      <description><![CDATA[Nous voici à la première étape à passer pour désactiver NTLMv1. Détecter qui et quoi l'utilisent...]]></description>
      <content:encoded><![CDATA[Nous voici à la première étape à passer pour désactiver NTLMv1. Détecter qui et quoi l'utilisent dans votre environnement. Avant d'aller dans les détails, on va rapidement parler de compatibilité. J'entends souvent les commentaires suivants:
<ul>
 	<li>"On a toujours un serveur Windows NT4, du coup on ne peut pas désactiver NTLM v1"</li>
 	<li>"On a une relation d'approbation externe avec un vieux domaine, on a besoin de NTLMv1"</li>
 	<li>"On a toujours une vieille appli qui tourne sous Windows 2000 Server"</li>
</ul>
Si vous êtes dans un de ces cas, vous avez un gros problème. Et ce n'est pas NTLM1 :) Si vous vous souciez de la sécurité dans votre environnement, faites donc une priorité de se débarrasser de ces vieux systèmes d'exploitation ! D'un point de vue NTLM maintenant, pas de soucis. Voici un rapide tableau montrant depuis quand NTLMv2 est supporté:
<table width="659">
<tbody>
<tr>
<td width="175" style="text-align: left"><strong>Version</strong></td>
<td width="148" style="text-align: left"><strong>Support de NTLMv2</strong></td>
<td width="108" style="text-align: left"><strong>Date</strong></td>
</tr>
<tr>
<td>Windows NT4</td>
<td>Service pack 4</td>
<td>Octobre 1998</td>
</tr>
<tr>
<td>Windows 95</td>
<td>Directory Services client</td>
<td>Février 2000</td>
</tr>
<tr>
<td>Windows 98</td>
<td>Directory Services client</td>
<td>Février 2000</td>
</tr>
<tr>
<td>Windows Me</td>
<td>Directory Services client</td>
<td>Février 2000</td>
</tr>
<tr>
<td>Windows 2000</td>
<td>RTM</td>
<td>Février 2000</td>
</tr>
<tr>
<td>Samba</td>
<td>Version 3</td>
<td>Septembre 2003</td>
</tr>
<tr>
<td style="text-align: left">JCIFS</td>
<td style="text-align: left">Version 1.3</td>
<td style="text-align: left">Octobre 2008</td>
</tr>
</tbody>
</table>
&nbsp;

Bref, vous n'avez pas d'excuses d'un point de vue OS. Cela étant dit, ce n'est pas parce que l'OS supporte NTLMv2 qu'il n'utilise pas NTLMv1. Et ce qui gouverne l'utilisation de la version de NTLM sur le système est la valeur de registre suivante: <strong>LMCompatibilityLevel</strong>. Avant d'aller dans les détails, un bref détour sur le tableau blanc pour récapituler comment NTLM fonctionne dans un environnement Active Directory.
<h3>NTLM 101</h3>
Voici les échanges simplifiés lors d'une authentification NTLM d'un utilisateur de domaine qui accède à un partage réseau sur un serveur membre:

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_0.jpg"><img width="544" height="213" class="size-full wp-image-36 aligncenter" alt="NTLM_0" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_0.jpg" /></a>
<ol>
 	<li>Alice accède au partage.</li>
 	<li>Le serveur de fichier lui signale qu'il faut s'authentifier avec NTLM, et pour cela, le serveur de fichier génère un <strong>Challenge</strong> (un nombre aléatoire) et l'envoie à Alice.</li>
 	<li>Alice utilise ce <strong>Challenge</strong>, elle prend le condensé de son mot de passe (hash), le passe dans une fonction avec le <strong>Challenge</strong> et obtient une <strong>Réponse</strong> (NTLM Response). Elle envoie le tout au serveur de fichier.</li>
 	<li>Idéalement, le serveur de fichier doit vérifier si la <strong>Réponse</strong> est la bonne. Et pour ce faire, le serveur a besoin du condensé de mot de passe pour Alice puis, a besoin d'effectuer le même calcul qu'elle pour vérifier s'il obtient la même réponse. Mais Alice étant une utilisatrice du domaine, le serveur de fichier ne connaît pas son condensé de mot de passe... Et du coup le serveur envoie le tout à un serveur qui lui connaît le condensé et pourra faire le calcul : le contrôleur de domaine. C'est un concept clé de l'authentification NTML appelé : <strong>NTLM Pass-Through</strong> (on passe à travers le serveur pour l'authentification).</li>
 	<li>Le contrôleur de domaine a reçu du serveur de fichier le nom d'utilisateur, le <strong>Challenge</strong> et la <strong>Réponse</strong>. Il calcule sa propre réponse basée sur sa connaissance du condensé de mot de passe pour Alice (c'est dans la base de données Active Directory) et la compare avec la réponse envoyée. Si c'est la même, il répond au serveur de fichier que c'est bon. Si ce n'est pas bon, il en fait de même.</li>
 	<li>Si le serveur de fichier a reçu l'accord du contrôleur de domaine, Alice peut continuer d'accéder au serveur de fichier, sinon Alice n'a pas accès.</li>
</ol>
Notez que ceci est juste la partie authentification, il se peut qu'Alice n'ait pas accès au partage, car elle n'a pas les autorisations, mais dans ce cas-ci, l'authentification a bel et bien fonctionné.
<h3>Et la version alors?</h3>
Si on regarde dans les détails, la machine cliente depuis laquelle Alice se connecte va négocier la version d'NTLM à utiliser. Et cela est gouverné par une valeur de registre, la fameuse <a href="https://technet.microsoft.com/en-us/library/cc960646.aspx">LMCompatibilityLevel</a>. Il y a <a href="https://technet.microsoft.com/en-us/magazine/2006.08.securitywatch.aspx">beaucoup de confusion</a> autour de cette valeur, car elle affecte la version de NTLM à utiliser de deux façons. Elle indique qu'elles sont les versions supportées par le système lorsque ce dernier agit en tant que client. Mais elle indique aussi qu'elles sont les versions supportées par le système lorsqu'il agit en tant que serveur. Dans notre exemple précèdent, Alice est en fait connectée depuis sa station de travail, du coup sa machine agit en tant que client dans cette négociation de version. Si Alice crée un partage sur sa machine et que Bob tente d'y accéder, Bob devrait s'authentifier. Et dans ce cas si, la machine d'Alice agira en tant que serveur.

Voici les différentes valeurs possibles... Lorsque la machine agit en tant que client (ce que la machine accepte de négocier, accepte d'envoyer) :
<table width="840">
<tbody>
<tr>
<td width="168"><strong>Valeur</strong></td>
<td width="168"><strong>LM</strong></td>
<td width="168"><strong>NTLMv1</strong></td>
<td width="168"><strong>NTLMv2 Session Security</strong></td>
<td width="168"><strong>NTLMv2</strong></td>
</tr>
<tr>
<td>0</td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #ff0000">Non</span></td>
</tr>
<tr>
<td>1</td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #ff0000">Non</span></td>
</tr>
<tr>
<td>2</td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #ff0000">Non</span></td>
</tr>
<tr>
<td>3</td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>4</td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>5</td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
</tbody>
</table>
&nbsp;

Plusieurs remarques... Déjà c'est quoi ce NTLMv2 Session Security... Le nom prête à confusion, il s'agit d'une évolution de NTLMv1, en gros plutôt que d'utiliser le condensé du mot de passe pour calculer la réponse du challenge, on utilise une clé de session négociée entre le client et le serveur... Mais bon, considérons ça comme du NTLMv1 ++. Ensuite, d'un point de vue client (lorsque la machine agit en tant que client dans la négociation NTLM), les valeurs 3, 4 ou 5 ont le même effet.

Maintenant, regardons à quoi correspond la valeur de registre lorsque la machine agit en tant que serveur (ce que la machine accepte de négocier, accepte de recevoir) :
<table width="672">
<tbody>
<tr>
<td width="168"><strong>Valeur</strong></td>
<td width="168"><strong>LM</strong></td>
<td width="168"><strong>NTLMv1</strong></td>
<td width="168"><strong>NTLMv2</strong></td>
</tr>
<tr>
<td>0</td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>1</td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>2</td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>3</td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>4</td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #008000">Oui</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
<tr>
<td>5</td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #ff0000">Non</span></td>
<td><span style="color: #008000">Oui</span></td>
</tr>
</tbody>
</table>
&nbsp;

Là encore plusieurs remarques. Les valeurs de 0 à 3 ne changent rien pour la machine lorsqu'elle agit en tant que serveur. Aussi, il semble souvent étrange que la même valeur gouverne à la fois le comportement server et le client. Mais quand on y regarde de près, il y a une logique. Lorsqu'on met la valeur 4 par exemple, côté client, la machine ne fera jamais de LM. Par contre, elle peut faire du NTLMv1 et NTLMv2. Et lorsque la machine agit en tant que serveur, lorsqu'elle reçoit une connexion entrante qu'elle a besoin d'identifier, cette fois-ci elle n'acceptera que du NTLMv2, assurant un bon compromis entre compatibilité et sécurité. Lorsque toutes les machines d'un environnement ont la même valeur pour LMCompatibilityLevel, on garantit qu'elles peuvent toutes utiliser NTLM sans problème de comptabilité.

<strong>L'objectif ultime est de mettre la valeur 5</strong> <strong>pour toutes les machines dans l'environnement </strong>(par default la valeur est a 3 pour Windows Vista et Windows Server 2008 et supérieur). Nous verrons dans la partie 3 de cette série comment procéder pour ne rien casser.
<h3>Auditer tout cela...</h3>
Le concept d'NTLM Pass-Through est fondamental, car il nous indique où les évènements d'authentification vont être générés. On va voir 2 évènements:
<ul>
 	<li>Sur le serveur où se trouve la ressource : <strong>4624</strong></li>
 	<li>Sur le contrôleur de domaine : <strong>4776</strong></li>
</ul>
Notez que si la ressource à laquelle le client essaie d'accéder est sur le contrôleur de domaine, l'évènement 4624 va aussi être sur le contrôleur de domaine (agissant en tant que serveur dans ce cas).

Pour s'assurer que l'évènement 4624 apparaît bien sur tous vos serveurs (et cela inclut les contrôleurs de domaine), la catégorie d'audit suivante doit être activée :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_1.jpg"><img width="774" height="391" class="alignnone size-full wp-image-45" alt="NTLM_1" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_1.jpg" /></a>

Regardons de plus près ce que contient l'évènement 4624 :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_3.jpg"><img width="570" height="578" class="alignnone size-full wp-image-65" alt="NTLM_3" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_3.jpg" /></a>

On est sur la machine SRV01 qui partage un répertoire. On voit l'utilisateur AD\pierre se connecter depuis la machine SRV02 (on a même son adresse IP: 10.0.1.12). On voit qu'on utilise NTLM comme authentification et on y voit même la version NTLMv1. Juste regarder cet évènement nous permet d'établir 3 faits :
<ol>
 	<li>SRV01 accepte NTLMv1.</li>
 	<li>SRV02 envoie du NTLMv1.</li>
 	<li>Le contrôleur de domaine à qui l'authentification NTLM Pass-Through a été transférée accepte aussi NTLMv1.</li>
</ol>
Que voit-on sur le contrôleur de domaine ? D'abord pour y voir quelque chose, il faut s'assurer que la catégorie d'audit suivante est activée :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_2.jpg"><img width="773" height="391" class="alignnone size-full wp-image-55" alt="NTLM_2" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_2.jpg" /></a>

Et voici à quoi ressemble l'évènement 4776:

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_4.jpg"><img width="569" height="346" class="alignnone size-full wp-image-75" alt="NTLM_4" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_4.jpg" /></a>

On n'y voit pas grand-chose. On sait qu'il s'agit du compte de Pierre, que ça vient de SRV02 (bien que techniquement, ce champ est ici à titre indicatif...) et on ne sait pas s'il s'agit de NTLMv1 ou bien de NTLMv2. En bref, activer l'audit pour cet évènement peut être utile pour suivre d'où les utilisateurs se connectent, mais ne nous aide pas pour identifier les machines faisant du NTLMv1. La catégorie d'audit importante dans notre cas sera bel est bien celle qui nous permettra d'afficher la version d'NTLM utilisée, donc celle qui va générer l'évènement 4624.

En général cette catégorie d'audit est déjà activée (configuration par défaut). Donc pas grand-chose à faire de votre côté. Pour s'assurer que c'est le cas, vous pouvez utiliser la commande suivante:
<pre>auditpol /get /category:"Logon/Logoff"</pre>
Exemple de sortie :
<pre>System audit policy
Category/Subcategory                      Setting
Logon/Logoff
  Logon                                   Success and Failure
...</pre>
Tant qu'on a <em>Success</em>, on est bon. Il est également possible de créer une stratégie de groupe qui va appliquer cette configuration d'audit partout.

Notez que j'utilise ici la stratégies <em>Audit Avancé</em>, par la stratégie d'audit <em>legacy</em>. Pour en savoir davantage sur l'<em>Audit Avancé</em>, référez-vous à l'article suivant: <a href="https://technet.microsoft.com/en-us/library/df0e28a2-1332-4422-bc88-d700fcba8c78">Advanced Security Audit Policy Step-by-Step Guide</a> (en anglais).

Il conviendra d'activer l'audit de success de connexion sur toutes les machines hébergeant des ressources dans votre environnement (serveurs et contrôleurs de domaine). Je vous laisse le choix de votre configuration par stratégie de groupe. Si jamais cette configuration est un défi, n'hésitez à publier des questions et commentaires dans la section en bas de page.
<h3>Filtrer les évènements relatifs a l'utilisation de NTLMv1</h3>
Maintenant qu'on a les évènements 4624, il faut identifier ceux qui sont relatifs à une authentification NTLMv1. Il faut donc filtrer le reste (Kerberos, NTLMv1 et autres protocoles). Pour cela, nous allons créer un <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/dd996910(v=vs.85).aspx">filtre XPath</a> qu'on va pouvoir utiliser à la fois dans l'interface graphique de l'observateur d'évènements, mais aussi en PowerShell.
<pre>&lt;QueryList&gt;
 &lt;Query Id="0" Path="Security"&gt;
  &lt;Select Path="Security"&gt;
  Event[
   System[
    EventID=4624
   ] and EventData[
      Data[@Name="LmPackageName"]="NTLM V1"
   ]
  ]
  &lt;/Select&gt;
 &lt;/Query&gt;
&lt;/QueryList&gt;</pre>
Exemple dans l'observateur d'évènements :

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_6.jpg"><img width="856" height="561" class="alignnone size-full wp-image-95" alt="NTLM_6" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_6.jpg" /></a>

[code language="PowerShell"]
$_filtre_xml = @&quot;
&lt;QueryList&gt;
 &lt;Query Id=&quot;0&quot; Path=&quot;Security&quot;&gt;
  &lt;Select Path=&quot;Security&quot;&gt;
  Event[
   System[
    EventID=4624
   ] and EventData[
      Data[@Name=&quot;LmPackageName&quot;]=&quot;NTLM V1&quot;
   ]
  ]
  &lt;/Select&gt;
 &lt;/Query&gt;
&lt;/QueryList&gt;
&quot;@
Get-WinEvent -FilterXml $_filtre_xml

#ou bien directement la requête XPath
$_filtre_xpath = &quot;Event[ System[ EventID=4624 ] and EventData[ Data[@Name=&quot;&quot;LmPackageName&quot;&quot;]=&quot;&quot;NTLM V1&quot;&quot; ] ]&quot;
#notez les doubles guillemets ainsi que le paramètre LogName pour spécifier le journal
Get-WinEvent -LogName Security -FilterXPath $_filtre_xpath[/code]

Ici le filtre XPath en capsule dans les balises &lt;select...&gt; &lt;/select&gt; va uniquement faire afficher les évènements 4624 qui ont la propriété LmPackageName égale à "NTLM V1".

<a href="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_5.jpg"><img width="568" height="575" class="alignnone size-full wp-image-85" alt="NTLM_5" src="https://msdnshared.blob.core.windows.net/media/2016/08/NTLM_5.jpg" /></a>
<h3>Bruit anonyme et filtre final</h3>
Il semble que certains services Windows ainsi que certains protocoles vont générer des évènements 4624 avec du NTLMv1 alors qu'il ne s'agit pas vraiment à proprement dit d'authentification (dans la mesure où désactiver NTLMv1 ne va pas empêcher ces services et protocoles de fonctionner). Bref, il va falloir filtrer ces évènements si la propriété TargetUserName est ANONYMOUS LOGON. On va filtrer basé sur le TargetUserSid (S-1-5-7) comme ceci:
<pre>&lt;QueryList&gt;
 &lt;Query Id="0" Path="Security"&gt;
  &lt;Select Path="Security"&gt;
  Event[
   System[
    EventID=4624
   ] and EventData[
      Data[@Name="LmPackageName"]="NTLM V1" and Data[@Name="TargetUserSid"]!="S-1-5-7"
   ]
  ]
  &lt;/Select&gt;
 &lt;/Query&gt;
&lt;/QueryList&gt;
</pre>
Ou en PowerShell:

[code language="PowerShell"]
$_filtre_xpath = &quot;Event[ System[ EventID=4624 ] and EventData[ Data[@Name=&quot;&quot;LmPackageName&quot;&quot;]=&quot;&quot;NTLM V1&quot;&quot; and Data[@Name=&quot;&quot;TargetUserSid&quot;&quot;]!=&quot;&quot;S-1-5-7&quot;&quot;] ]&quot;
Get-WinEvent -LogName Security -FilterXPath $_filtre_xpath[/code]

<h3>Étape suivante, collecter l'information sur tous les serveurs</h3>
Cela parait une étape périlleuse, c'est en fait très simple. On va utiliser le service de transfert d'évènements qui est déjà inclus dans Windows. Rendez-vous au <a href="https://blogs.technet.microsoft.com/frid/2016/08/24/adieu-ntlmv1-partie-2-consolidation/">prochain billet</a>.]]></content:encoded>
    </item>
    <item>
      <title>Adieu NTLMv1 - Partie 0 - Introduction</title>
      <link>https://docs.microsoft.com/archive/blogs/frid/adieu-ntlmv1-partie-0-introduction</link>
      <pubDate>Mon, 22 Aug 2016 19:38:58 GMT</pubDate>
      <dc:creator><![CDATA[Pierre Audonnet [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/frid/?p=25</guid>
      <description><![CDATA[Ce bon vieil NTLM... On en a connu des aventures... De OS2 à Windows Server 2016, en passant par...]]></description>
      <content:encoded><![CDATA[Ce bon vieil NTLM... On en a connu des aventures... De OS2 à Windows Server 2016, en passant par Samba et Windows 98... Mais il est temps de passer à autre chose. Il est temps de désactiver NTLMv1. Une précision importante est due dès à présent. On parle de désactiver NTLMv1, pas de désactiver NTLM complètement. Idéalement, toutes vos applications utilisent Kerberos, donc désactiver toutes les versions de NTLM n'est pas une mauvaise idée d'un point de vue de la sécurité de votre environnement. Par contre, cela peut amener un terrible impact en termes de compatibilité (notez que l'on ne peut pas désactiver NTLM au niveau de système d'exploitation, par contre, on peut <a href="https://technet.microsoft.com/en-us/library/jj865676(v=ws.10).aspx">le bloquer</a>, ou bien l'interdire grâce aux <a href="https://technet.microsoft.com/fr-fr/library/dn486813(v=ws.11).aspx">silos d'authentification</a> ou bien au groupe <a href="https://technet.microsoft.com/fr-fr/library/dn466518(v=ws.11).aspx">Protected Users</a>).

Cette série de billets propose une méthodologie pour détecter et se débarrasser de NTLMv1. Ce premier billet est une introduction. Les autres billets comportent la suite des opérations techniques à réaliser pour atteindre l'objectif.

Adieu NTLMv1 - Partie 0 - Introduction

<a href="https://blogs.technet.microsoft.com/frid/2016/09/19/adieu-ntlmv1-partie-1-detection/">Adieu NTLMv1 - Partie 1 - Détection</a>

<a href="https://blogs.technet.microsoft.com/frid/2016/08/24/adieu-ntlmv1-partie-2-consolidation/">Adieu NTLMv1 - Partie 2 - Consolidation</a>

Adieu NTLMv1 - Partie 3 - Remédiation<em> (en cours d'écriture)</em>

&nbsp;
<h3>Pourquoi désactiver NTLMv1?</h3>
NTLMv1 c'est le mal. Il y a même une KB qui en parle : <a href="https://support.microsoft.com/fr-fr/kb/2793313">Directives en matière de sécurité pour l'authentification réseau NTLMv1 et LM</a>. En fait, NTLM c'est le mal, comme en témoigne l'extrait suivant:

<em>"Implementers need to be aware that NTLM does not support any recent cryptographic methods, such as AES or SHA-256. It uses cyclic redundancy check (CRC) or message digest algorithms ([RFC1321]) for integrity, and it uses RC4 for encryption. Deriving a key from a password is as specified in [RFC1320] and [FIPS46-2]. Therefore, applications are generally advised not to use NTLM."</em>
<p style="text-align: right"><a href="https://msdn.microsoft.com/en-us/library/cc236715.aspx">Section: Security Considerations for Implementers tirée de [MS-NLMP]: NT LAN Manager (NTLM) Authentication Protocol</a></p>
Mais bon, j'entends déjà les cris effrayés des équipes applicatives. AAHHH MAIS VOUS ÊTES FOUS! Bref, commençons par nous débarrasser de la version 1... La version 1 utilise des challenges plus courts, et pour lesquels des tas d'attaques sont publiés sur Internet depuis des décennies...
<h3>Je n'ai aucune idée de qui (ou quoi) l'utilise dans mon environnement...</h3>
"Et donc je préfère ne rien faire: la garantie de ne rien casser." Quand on désactive une fonctionnalité pour des raisons de sécurité, on a plusieurs options:
<ol>
 	<li>La manière forte: désactiver la fonctionnalité, et regarder fixement le téléphone en espérant que l'on n'a rien cassé.</li>
 	<li>La manière faible: envoyer un message à toutes les applications et leur demander, s'ils leur plaisent, de ne pas utiliser NTLMv1. Bon, en général, soit ils ne savent pas qu'ils l'utilisent, soit ils ignorent le message et quand tu le désactives, ils ont l'impression que vous avez utilisé la première manière...</li>
 	<li>La manière geek! On active l'audit (la plupart du temps, une grande partie de cet audit est déjà configuré par défaut), et on observe qui l'utilise (en éventuellement, on peut travailler avec eux -une fois identifié- pour s'en débarrasser).</li>
</ol>
Vous l'aurez compris, on va explorer la manière geek !

Cela nous emmène à la phase 1 de la désactivation de NTMLv1.
<h3>Phase 1 : Identifier qui et quoi utilisent NTLMv1 dans votre environnement.</h3>
cf <a href="https://blogs.technet.microsoft.com/frid/2016/09/19/adieu-ntlmv1-partie-1-detection/">Adieu NTLMv1 - Partie 1 - Détection</a>
<h3>Phase 2 : Consolider l'information.</h3>
cf <a href="https://blogs.technet.microsoft.com/frid/2016/08/24/adieu-ntlmv1-partie-2-consolidation/">Adieu NTLMv1 - Partie 2 - Consolidation</a>
<h3>Phase 3 : Contacter les applications.</h3>
cf Adieu NTLMv1 - Partie 3 - Remédiation <em> (en cours d'écriture)</em>]]></content:encoded>
    </item>
  </channel>
</rss>