J'ai déjà expliqué comment établir un VPN IPsec entre deux hôtes dans un environnement Microsoft Windows en utilisant une PSK. Pour plus de détails, voir ici. Passons ici à l'étape supérieure, en remplaçant la PSK par des certificats x509. Dans ce guide, nous allons explorer comment configurer un VPN IPsec sécurisé entre des hôtes Microsoft Windows au sein du même LAN afin d'améliorer considérablement la sécurité du réseau. Avec cette configuration, toutes les communications entre les machines seront chiffrées sans exception.
Pour les besoins de cet article, nous conserverons une architecture simple. Nous établirons une connexion sécurisée en utilisant un VPN IPsec avec une authentification x509 entre un ordinateur exécutant Windows 11 et un serveur exécutant Windows Server 2022. Les deux ordinateurs seront sur le même réseau local.
Comme discuté précédemment, nous allons utiliser des certificats X.509 pour établir une connexion IPsec entre notre serveur et notre client. Pour ce faire, nous devons créer une PKI : une Autorité de Certification (CA) Racine qui signera les certificats, et deux certificats, un pour chacun de nos deux hôtes.
Toutes les commandes ci-dessous seront exécutées à partir d'une console PowerShell avec des droits administrateur.
PS C:\> $rootCert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName RootCA -KeyUsage CertSign,CRLSign,DigitalSignature -NotAfter (Get-Date).AddYears(10)
PS C:\> $serverCert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName ServerName -Signer $rootCert -NotAfter (Get-Date).AddYears(5)
PS C:\> $serverCert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -eq "CN=ServerName" }
PS C:\> $cert = New-SelfSignedCertificate -DnsName "W11" -CertStoreLocation "cert:\LocalMachine\My" -Signer $rootCert -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(5)
PS C:\> $password = ConvertTo-SecureString -String "PassPass" -Force -AsPlainText
PS C:\> Export-PfxCertificate -Cert $cert -FilePath "C:\W11.pfx" -Password $password
PS C:\> $cert1Proposal = New-NetIPsecAuthProposal -Machine -Cert -Authority "CN=RootCA" -AuthorityType Root
PS C:\> $certAuthSet = New-NetIPsecPhase1AuthSet -DisplayName "Computer Certificate Auth Set" -Proposal $cert1Proposal
PS C:\> New-NetIPsecRule -DisplayName "IPsec" -Name "IPsec" -Mode Transport -InboundSecurity Require -OutboundSecurity Require -LocalAddress 192.168.1.200 -RemoteAddress 192.168.1.30 -Enable True -Phase1AuthSet $certAuthSet.Name
Nous avons maintenant terminé la configuration du serveur. Il est maintenant temps de passer à la configuration du client.
Nous allons la créer une règle de pare-feu pour permettre les flux chiffrés.
PS C:\> New-NetFirewallRule -DisplayName "IPsec ALLOW" -Direction Inbound -Enabled True -Action Allow -LocalAddress 192.168.1.200 -RemoteAddress 192.168.1.0/24 -Protocol Any -Encryption Dynamic -Authentication Required
Je vais toutes les décrire, mais les étapes sont à peu près les mêmes que celles que nous avons suivies pour le serveur.
À partir de maintenant, tout devrait fonctionner et les connexions sont déjà chiffrées. Ici, nous allons voir comment renforcer davantage la sécurité en choisissant des protocoles IPsec plus robustes que ceux offerts par défaut. Toutes les commandes listées ci-dessous doivent être saisies à la fois sur le client et sur le serveur.
PS C:\> Set-NetIPsecRule -DisplayName "IPsec" -KeyModule IKEv2 -ForwardPathLifetime 120
PS C:\> $proposal1 = (New-NetIPsecQuickModeCryptoProposal -Encapsulation ESP -Encryption AES256 -ESPHash SHA256)
PS C:\> $mMCryptoSet=(New-NetIPsecQuickModeCryptoSet -DisplayName "Quick Mode Rule" -Proposal $proposal1)
PS C:\> Set-NetIPsecRule -DisplayName IPsec -QuickModeCryptoSet $mMCryptoSet.Name
PS C:\> Get-NetIPsecRule -DisplayName IPsec
PS C:\> Remove-NetIPsecRule -DisplayName IPsec
PS C:\> Get-NetIPsecMainModeRule -DisplayName IPsecMain
PS C:\> Remove-NetIPsecMainModeRule -Name "{XXX-XXX-XXX}"
PS C:\> Get-NetIPsecMainModeSA
PS C:\> Get-NetIPsecQuickModeSA
Contact :