Désactivation de TLS 1.0, TLS 1.1 et activation de TLS 1.2 sur Windows Server 2008 R2 et +

Il a été décidé par les responsables d’une plateforme sur laquelle je suis intervenu ce jour de la désactivation de TLS 1.0 et 1.1 au profit de 1.2 sur un serveur Windows 2008 R2 utilisant IIS 7. Je vais donc décrire dans cet article les modifications qui sont à réaliser en base de registre – je pense réaliser par la suite un script permettant l’automatisation de la création et peuplement de ces clefs.

En préalable, il est important de vérifier que le KB 3080079 soit installé sur le serveur si 2008 R2, sans quoi une fois la désactivation de TLS 1.0 effective il ne sera plus possible d’accéder en Remote Desktop sur le serveur. Je renvoie à cette page pour plus d’informations.

J’ai réalisé une archive ZIP des clefs de registre évoquées dans ce billet sur mon miroir de téléchargement.

Dans la base de registre, on ira jusqu’à la clef suivante :
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

Une fois dans cette clef, il suffira de créer une clef supplémentaire par protocole. On créé donc 3 clefs : TLS 1.0, TLS 1.1 et TLS 1.2. A noter qu’il est fort probable que soient déjà présentes d’autres clefs pour SSL, comme sur cette capture d’écran.

Dans chacune des clefs TLS, il faudra créer 2 sous-clefs : Client et Server. L’arborescence ressemble donc à cela :

Dans chacune des 6 clefs qui ont été crées, il faudra ajouter 2 valeurs DWORD en hexadécimal :

  • DisabledByDefault, qui aura toujours la valeur 0
  • Enabled, qui aura la valeur 0 pour TLS 1.0 et TLS 1.1 et la valeur 1 pour TLS 1.2.

Ce qui donne, pour TLS 1.0\Client, TLS 1.0\Server, TLS 1.1\Client et TLS 1.1\Server :

Pour TLS 1.2\Client et TLS 1.2\Server :

Ensuite, un redémarrage du serveur suffit pour que les modifications soient prises en compte. Les protocoles TLS 1.0 et 1.1 ne sont plus actifs. A noter que ces clefs de registre peuvent également être appliquées sur Windows Server 2012 et R2.

Si jamais le Remote Desktop ne fonctionne plus une fois TLS 1.0 désactivé et que le patch est bien installé sur le serveur (si antérieur à 2012), il faut forcer le Terminal Server à utiliser son encryption et non celle de TLS 1.0. Pour ce faire, on ouvrira tsconfig.msc, puis les propriétés du serveur. Cette fenêtre s’ouvre :

Il est important que le Security Layer soit basculé sur RDP Security Layer et non TLS 1.0, faute de quoi la connexion sera impossible.

Powershell : reset de Windows Update

Toujours dans la lignée de la campagne de patchs pour Meltdown et Spectre, j’ai développé un script permettant d’effectuer les manipulations nécessaires à remettre le composant Windows Update en bon état de marche. Il arrive que le service Windows Update soit incapable de trouver des patchs à installer ou qu’il bute sur des erreurs lors de l’installation des patchs. Une fois qu’on a écarté les causes système habituelles (pas de contact du serveur WSUS, espace disque insuffisant sur le système, service non démarré…), il peut être nécessaire de supprimer les fichiers de Windows Update pour le forcer à reprendre comme si le serveur était fraîchement installé, sans que cela ne retire les patchs, bien évidemment.

J’ai donc développé un script en Powershell qui va couper les services, renommer – et pourquoi pas – supprimer ces répertoires.

echo "Stopping Cryptographic Service Provider."
net stop cryptsvc
echo "Stopping the Windows Update service."
net stop wuauserv
echo "Checking presence of .old directories."
if ((Test-Path C:\Windows\SoftwareDistribution.old) -eq $true) {
$delSD = Read-Host -Prompt "The script needs to delete C:\Windows\SoftwareDistribution.old which probably is a backup of the SoftwareDistribution folder. Type 'N' if you want to abort."
if ($delSD -eq 'N') {break}
Remove-Item C:\Windows\SoftwareDistribution.old -Force -Recurse
}
if ((Test-Path C:\Windows\System32\catroot2.old) -eq $true) {
$delCR = Read-Host -Prompt "The script needs to delete C:\Windows\System32\catroot2.old which probably is a backup of the catroot2 folder. Type 'N' if you want to abort."
if ($delCR -eq 'N') {break}
Remove-Item C:\Windows\System32\catroot2.old -Force -Recurse
}
echo "Renaming WindowsSoftwareDistribution to SoftwareDistribution.old"
$SD = $true
try {
Rename-Item -Path C:\Windows\SoftwareDistribution -NewName C:\Windows\SoftwareDistribution.old -ErrorAction Stop
}
catch {
echo "Folder doesn't exist, can't rename."
$SD = $false
}
echo "Renaming Windows\System32\catroot2 to catroot2.old"
$CR = $true
try {
Rename-Item -Path C:\Windows\System32\catroot2 -NewName C:\Windows\System32\catroot2.old -ErrorAction Stop
}
catch {
echo "Folder doesn't exist, can't rename."
$CR = $false
if ($SD -eq $false -And $CR -eq $false) {
echo "Both folders are missing. Aborting."
break
}
}
$delYN = Read-Host -Prompt "Do you want to delete the old folders ? The script will only do so if you answer 'Y'"
if ($delYN -eq 'Y')
{
if ($SD -eq $true) {Remove-Item C:\Windows\SoftwareDistribution.old -Force -Recurse}
if ($CR -eq $true) {Remove-Item C:\Windows\System32\catroot2.old -Force -Recurse}
}
echo "Starting the services previously stopped."
net start cryptsvc
net start wuauserv
echo "Done."

Erreur 800722E2 sur Windows Update

Durant ma campagne de patchs pour Meltdown et Spectre, j’ai été confronté à quelques serveurs qui me remontaient une erreur 800722E2 sur Windows Update.

Le service Windows Update était bien démarré, espace disque suffisant sur le système.

Par contre, l’ouverture de l’adresse du serveur WSUS dans un navigateur ne donnait rien sur le serveur, tandis que j’obtenais une erreur 403 sur mon poste local, ce qui signifie qu’à priori, le serveur ne communiquait pas avec le serveur WSUS (port 80).

Une vérification avec PortQuery de l’ouverture des ports réalisée par la suite :

Windows Update a pu ensuite communiquer avec le WSUS et patcher le serveur correctement.

Powershell : récupération d’une liste des comptes utilisateurs et ordinateurs modifiés depuis une date donnée

Ne rencontrant pas de problèmes particuliers en ce moment, je prends un peu de temps pour scripter et être un peu plus à l’aise avec PowerShell et essayer de me constituer une petite banque de scripts pouvant être utiles.

Dans ce but, j’ai écrit un script listant les objets comptes utilisateurs et ordinateurs de l’ActiveDirectory qui ont été modifiés depuis la date donnée lors de l’exécution du script. Ce dernier génère deux fichiers, l’un contenant les informations par rapport aux objets « user » et l’autre aux objets « computer », avec leur nom, l’OU conteneur ainsi que le timestamp de dernière modification.

Write-Host "Fill in the date."
$D = Read-Host -Prompt 'Day'
$M = Read-Host -Prompt 'Month'
$Y = Read-Host -Prompt 'Year'
$ChangeDate=New-Object DateTime($Y,$M,$D)
Write-Host "Getting modified users..."
$ModifiedUsers = Get-ADObject -Filter 'whenChanged -gt $ChangeDate -and ObjectClass -eq "user" -and ObjectCategory -eq "person"' -Properties whenChanged | FT Name,DistinguishedName,WhenChanged
$ModifiedUsers > modifiedusers-since-$Y$M$D.txt
Write-Host "Getting modified computers..."
$ModifiedComps = Get-ADObject -Filter 'whenChanged -gt $ChangeDate -and ObjectClass -eq "computer"' -Properties whenChanged | FT Name,DistinguishedName,WhenChanged
$ModifiedComps > modifiedcomps-since-$Y$M$D.txt