WinRM via SSL activeren voor het opzetten van PSRemoting [Stap voor stap]

Als je al externe opdrachten uitvoert met PowerShell Remoting (PSRemoting), dan weet je hoe handig deze functie is. Je kunt verbinding maken met één of meer externe computers en ze beheren alsof ze lokaal zijn. PSRemoting is afhankelijk van Windows Remote Management (WinRm) om dit mogelijk te maken, en als je geen gebruik maakt van WinRM via SSL, loop je mogelijk enkele beveiligingsrisico’s.

In deze praktische handleiding leer je hoe je Windows op de client en server kunt instellen om WinRM via HTTPS (SSL) te gebruiken, en hoe je certificaten kunt gebruiken om te authenticeren bij het gebruik van WinRM via HTTPS.

Vereisten

Als je deze handleiding wilt volgen, zorg er dan voor dat je het volgende hebt:

  • A Windows 7+ or Server 2008 R2 machine to serve as the client machine. This tutorial will use Windows 10.
  • A Windows 7+ or Server 2008 R2+ machine to serve as the server machine. This tutorial will use Windows Server 2019.
  • Toegang tot een lokaal beheerdersaccount of een account met lokale beheerdersrechten op zowel de client- als de servermachines.
  • Een Active Directory Certificate Services (ADCS) Public Key Infrastructure (PKI) opzet. Het zou handig zijn als je ADCS implementeert voor productieomgevingen, maar het is optioneel voor deze handleiding en testen. De handleiding gaat ervan uit dat de PKI is ingesteld als een enterprise of standalone CA.

Waarom WinRM via SSL gebruiken?

PSRemoting maakt standaard gebruik van WinRM en stelt je in staat om clientmachines op afstand te beheren. Zodra PSRemoting een sessie opzet via WinRM, versleutelt het alle communicatie van client naar server. Ook is de installatieprocedure om PSRemoting zonder HTTPS te implementeren vrij eenvoudig.

Als PSRemoting al de communicatie van de sessie versleutelt, waarom zou je dan de moeite nemen om iets als ADCS op te zetten en certificaten beheren wanneer het al versleuteld is?

Omdat tijdens het authenticatieproces inloggegevens in onveilige formaten kunnen worden verzonden, afhankelijk van het gebruikte type authenticatie.

Een van de eenvoudigste manieren om PSRemoting veiliger te maken, is WinRM te gebruiken via HTTPS in plaats van HTTP. HTTPS omhult je gehele verbindingsstroom, inclusief authenticatie binnen de versleutelingslaag die WinRM al gebruikt. HTTPS biedt ook tegelijkertijd een manier om te controleren of de server waarmee je verbinding maakt is wat je denkt dat het is.

WinRM configureren met een zelfondertekend certificaat

Laten we nu overgaan naar de demonstraties. Voor de eerste truc ga je leren hoe je PSRemoting-communicatie kunt versleutelen met WinRM via SSL via een zelfondertekend certificaat.

Het gebruik van een zelfondertekend certificaat is een geweldige manier om een testomgeving op te zetten zonder te hoeven omgaan met een PKI zoals ADCS. Wanneer je een zelfondertekend certificaat gebruikt, genereer je een certificaat dat door de server zelf wordt ondertekend en dat in feite voor zichzelf instaat.

Certificaten dienen meestal twee taken uit te voeren: een verbinding authentiseren en versleutelen. Het gebruik van een zelfondertekend certificaat implementeert alleen het laatste. Om de identiteit van een server te valideren, moet je altijd door PKI verstrekte certificaten gebruiken. PKI-verstrekte certificaten bieden één bron van vertrouwen in plaats van dat je elk zelfondertekend certificaat individueel handmatig moet vertrouwen.

Het configureren van WinRM over SSL met een zelfondertekend certificaat vereist vier hoog-niveau stappen:

  1. Het genereren van het zelfondertekend certificaat op de bestemmingsmachine.
  2. Het configureren van de WinRM-webserver (luisteraar) op de server om het zelfondertekend certificaat te gebruiken voor authenticatie.
  3. Het openen van de juiste poorten op de Windows-firewall van de bestemmingsmachine.
  4. Het uitvoeren van een opdracht om een externe verbinding te initiëren op de client met behulp van een PowerShell-cmdlet zoals Enter-PSSession.

Laten we nu elke stap doorlopen.

Het genereren van een zelfondertekend certificaat

De eerste stap is het genereren van een zelfondertekend certificaat op de server. Bij het verbinden zal PSRemoting dit certificaat gebruiken om alle communicatie te versleutelen.

Terwijl u op ServerB bent met een Windows PowerShell-console open als beheerder, voert u het New-SelfSignedCertificate cmdlet uit zoals hieronder weergegeven. Het uitvoeren van de onderstaande opdracht genereert een certificaat voor ServerB.domain.com in de persoonlijke certificaatopslag van de lokale machine.

New-SelfSignedCertificate -Subject 'CN=ServerB.domain.com' -TextExtension '2.5.29.37={text}1.3.6.1.5.5.7.3.1'
Creating self-signed certificate.

De Subject-parameter moet de volledig gekwalificeerde domeinnaam van de server zijn. WinRM gebruikt het onderwerp om de identiteit van de server te valideren.

Zelfs als de server in een werkgroep staat, moet u altijd een domeinnaam opgeven, bijvoorbeeld domain.com of lab.local. Bij het verbinden met de bestemmingsmachine moet de DNS-naam waarmee u verbinding maakt exact overeenkomen met deze onderwerpsnaam, anders mislukt de verbinding.

De TextExtension stelt u in staat om het gebruik van de sleutel van het certificaat te definiëren (2.5.29.37), wat bepaalt waarvoor het certificaat mag worden gebruikt. Definieer sleutelgebruik voor Server-authenticatie ({text}1.3.6.1.5.5.7.3.1) om ervoor te zorgen dat het certificaat alleen kan worden gebruikt om de identiteit van een server te authenticeren.

Nadat New-SelfSignedCertificates is uitgevoerd, wordt de duimafdruk van het gegenereerde certificaat geretourneerd. Sla dit op, want u heeft het nodig voor de volgende opdracht.

Configureren van de WinRM Listener

Zodra je het zelfondertekende certificaat op de server hebt aangemaakt, configureer dan de WinRM luisteraar om dat certificaat te gebruiken voor authenticatie. Gebruik hiervoor het winrm create commando zoals hieronder getoond.

De Address=* in het onderstaande commando informeert de luisteraar om te luisteren op elk IP-adres geconfigureerd op de server. Als de server meerdere IP-adressen geconfigureerd heeft, kun je hier een specifiek IP-adres definiëren.

Zorg ervoor dat je de <cert duimafdruk hier> tijdelijke aanduiding vervangt door de duimafdruk die teruggegeven is in de laatste stap.

winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ServerB.domain.com"; CertificateThumbprint="<cert thumbprint here>"}'
Creating WinRM listener with self-signed certificate.

Het Openen van de WinRM SSL Firewallpoort

Vervolgens, als je de Windows firewall gebruikt, moet je HTTPS-verkeer naar de server toestaan via de standaard HTTPS-poort 5986.

Open de firewallpoort voor WinRM via HTTPS door PowerShell te gebruiken en het onderstaande commando uit te voeren.

$FirewallParam = @{
    DisplayName = 'Windows Remote Management (HTTPS-In)'
    Direction = 'Inbound'
    LocalPort = 5986
    Protocol = 'TCP'
    Action = 'Allow'
    Program = 'System'
}
New-NetFirewallRule @FirewallParam

Verbinding maken met de Server via SSL

Je hebt nu de externe Windows Server geconfigureerd om WinRM-verbindingen via SSL te accepteren. Kom nu terug naar de client en initieer eventuele PSRemoting-commando’s die je wilt testen. Je kunt bijvoorbeeld proberen de Enter-PSSession of Invoke-Command cmdlet. Alleen nu maak je verbinding op een iets andere manier dan met de standaard HTTP-verbinding.

Het verbinden via HTTPS vereist typisch een enkele parameter UseSSL. Deze parameter vertelt het commando om te zoeken naar een HTTPS WinRM luisteraar in plaats van een HTTP luisteraar zoals standaard het geval zou zijn. De UseSSL parameter is beschikbaar bij meer PSRemoting commando’s.

Voor het testen, voer Enter-PSSession uit met opgave van de FQDN van de server zoals gedefinieerd door het zelfondertekende certificaatonderwerp, een PSCredential object om de gebruikersnaam en het wachtwoord te definiëren, en tot slot, de UseSSL schakelparameter.

Enter-PSSession -ComputerName ServerB.domain.com -Credential (Get-Credential) -UseSSL

Als je het bovenstaande commando uitvoert, ontvang je een foutmelding omdat je de WinRM luisteraar op de server hebt geconfigureerd om een zelfondertekend certificaat te gebruiken. Telkens wanneer de PSRemoting client probeert zich te authenticeren bij de server, zal het proberen het certificaat te valideren, en dit lukt niet. Een zelfondertekend certificaat heeft geen vertrouwensketen die het commando kan volgen en dus mislukt het.

Failing certificate authority trust check with self-signed certificate.

Om verbinding te maken met de server met een zelfondertekend certificaat, moet je de certificaatverificatie overschrijven. Dit kun je doen door een PSSessionOption genaamd SkipCACheck te creëren met behulp van de New-PSSessionOption-cmdlet en deze door te geven aan het commando zoals hieronder getoond.

$PSSessionOption = New-PSSessionOption -SkipCACheck
Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -SessionOption $PSSessionOption -UseSSL

Je kunt veel verschillende PSSessionOption-objecten definiëren om opties toe te voegen voor je externe verbinding die niet rechtstreeks zijn opgenomen in de Enter-PSSession

-cmdlet. Probeer opnieuw verbinding te maken en PowerShell zou je nu om referenties moeten vragen. Eenmaal verstrekt, zou je nu verbinding moeten kunnen maken met de server via WinRM over SSL!

WinRM configureren met een door een CA ondertekend certificaat

Als je van plan bent PSRemoting te gebruiken met WinRM in productie en zo veilig mogelijk wilt blijven, moet je je richten op WinRM via SSL met een certificaatautoriteit (CA)-ondertekend certificaat.

CA-ondertekende certificaten handhaven een vertrouwensketen en zijn veiliger dan eenvoudige zelfondertekende certificaten omdat ze de identiteit van de certificaatuitgever valideren.

Als je in een Active Directory-omgeving bent, is een van de meest voorkomende manieren om een CA op te zetten met ADCS. Met ADCS kun je certificaten implementeren op apparaten en WinRM configureren om die certificaten te gebruiken.

Deze handleiding gaat ervan uit dat je ADCS al hebt opgezet en werkend hebt in je omgeving.

Voor een snelle installatie kun je de documentatie van Microsoft volgen, maar voor een productie-implementatie zou je de configuratie grondig moeten onderzoeken, aangezien een certificaatautoriteit centraal staat in de versleutelingsinspanningen van een organisatie.

Het aanmaken van het certificaatverzoek

De eerste stap bij het gebruik van een door een CA uitgegeven certificaat is het aanmaken van het certificaat. Om het certificaat aan te maken, moet je eerst een certificaatverzoek uitgeven met behulp van een certificaataanvraag (CSR). Zodra gegenereerd, kan dit CSR vervolgens naar de CA worden gestuurd om het certificaat uit te geven.

De stappen in dit gedeelte zullen werken bij ADCS-implementaties, of het nu een bedrijfs-CA of een op zichzelf staande CA is. Als je een AD-geïntegreerde bedrijfs-CA gebruikt, kun je het inschrijven van certificaten versnellen zonder de stappen in dit gedeelte te doorlopen met behulp van certificaatautomatisering of certificaatsjablonen.

Terwijl je op de server (ServerB in deze tutorial) bent, maak de CSR aan:

  1. Voer certlm.msc uit om de Windows-certificaatbeheerder te openen.

2. Klik met de rechtermuisknop op de Persoonlijk-opslag en selecteer Alle taken —> Geavanceerde bewerkingen —> Aangepast verzoek maken.

3. Laat voor deze tutorial alle velden standaard totdat je bij de Certificaatinformatie-pagina komt zoals hieronder weergegeven. Wanneer je hier bent, klik op de vervolgkeuzelijst Details en selecteer Eigenschappen.

Creating a custom certificate request.

4. Klik op het tabblad Onderwerp en wijzig het Type naar Gemeenschappelijke naam.

5. Voer nu de volledig gekwalificeerde domeinnaam van de server in als deze is aangesloten op een domein of alleen de hostnaam als dat niet het geval is en klik op Toevoegen.

Specifying subject for certificate request.

Merk op dat voor gebruik met een WinRM SSL-luisteraar, je de gemeenschappelijke naam moet gebruiken. De andere opties in de lijst kunnen worden opgenomen, maar zijn niet vereist voor deze implementatie.

6. Klik op het tabblad Extensie.

7. Als u geen certificaatgebaseerde authenticatie gebruikt, die later zal worden behandeld, breid dan de header van uitgebreid sleutelgebruik uit en voeg Serverauthenticatie toe. Dit sleutelgebruikstype vertelt Windows dat het certificaat moet worden gebruikt voor het authenticeren van een server. Andere opties zijn Clientauthenticatie, Codesignering en Documentversleuteling.

8. Als u certificaatgebaseerde authenticatie wilt instellen, zorg er dan voor dat u Clientauthenticatie kiest, zoals hieronder weergegeven.

Requesting a client authentication certificate.

9. Klik vervolgens op het tabblad Privésleutel en let op de Sleutelopties. Wijzig de standaard sleutelgrootte van 1024 naar minstens 2048 om de beveiliging van het sleutelpaar te versterken.

Er zijn ook sterkere cryptografische providers beschikbaar in Windows, maar u kunt compatibiliteitsproblemen hebben met oudere software.

10. Sluit het venster Certificaateigenschappen en sla uw instellingen op door te klikken op OK en klik op Volgende om door te gaan met de instructies.

11. Geef nu een pad op om het certificaataanvraagbestand uit te voeren waar u het later kunt ophalen en klik op Voltooien.

Zodra dit is voltooid, zou u een certificaataanvraagbestand moeten hebben.

Een certificaat aanvragen

Zodra u de aanvraag hebt gemaakt, moet u deze nu indienen bij uw CA, die het certificaat zal genereren. Om dat te doen:

  1. Navigeer naar uw ADCS-server op http://<servernaam FQDN>/certsrv/certrqxt.asp.
Certificate request submission web page.

2. Open het certificaataanvraagbestand dat eerder is aangemaakt met Kladblok en kopieer de tekst uit het certificaataanvraagbestand naar het aanvraagvak. Er is niets vereist voor Aanvullende attributen voor dit certificaat.

3. Klik op Verzenden. Hiermee wordt uw verzoek naar de CA verzonden. Vervolgens zou het u het verzoek-ID moeten tonen, dat later nodig zal zijn. Sla dit op! U heeft het later nodig.

4. Maak nu verbinding met de CA-server die deel uitmaakt van uw ADCS-omgeving met behulp van de Windows-certificaatbeheerder op uw lokale computer of via RDP door certsrv.msc uit te voeren.

5. Klik op Wachtende verzoeken.

Winrm over SSL : Issuing certificate from pending request.

6. Klik met de rechtermuisknop op het wachtende verzoek, klik op Alle taken, en klik op Uitgeven. Hiermee wordt het verzoek dat u zojuist heeft ingediend, goedgekeurd op basis van het verzoek-ID uit de vorige stap.

Inschrijving van het certificaat

Nu u een certificaat heeft uitgegeven op de CA, is het tijd om het certificaat in te schrijven op de server waarop u WinRM configureert. Om dat te doen:

  1. Vanaf de server waarop u WinRM via SSL instelt, navigeert u naar http://<servernaam FQDN>/certckpn.asp. U zou een enkel in behandeling zijnde certificaatverzoek moeten zien.
Viewing status of pending certificate request.

U kunt het openbare certificaat ophalen vanaf een andere machine indien nodig, maar beginnen vanaf de server waarop u WinRM instelt via HTTPS vereenvoudigt het proces.

2. Selecteer het verzoek dat je hebt ingediend uit de lijst en download de certificaatketen. Je moet de volledige certificaatketen downloaden als de server waarmee je WinRM via HTTPS configureert, je CA heeft als rootserver.

Downloading certificate chain.

3. Open het certificaatketenbestand. Je zou een certificaat voor je server moeten zien, en eventuele certificaatautoriteitscertificaten hoger in de keten. Onder win2.lab.int bevindt zich het aangevraagde certificaat, en WIN2-CA is het certificaat voor de CA die het certificaat heeft uitgegeven voor win2.lab.int.

Showing certificates inside of the certificate chain.

4. Dubbelklik op een van de certificaten en klik in het venster dat verschijnt op de Installeer Certificaat knop. Aangezien dit certificaat door de server wordt gebruikt en niet door een specifieke gebruiker, wijzig de optie naar Lokale Machine.

Importing certificate into the local machine certificate store.

5. Ga verder door de prompt en laat alles standaard. De standaardinstellingen moeten het certificaat in de Trusted Root Certification Store plaatsen.

6. Herhaal nu stappen 3-5 voor elk van de andere certificaten in de lijst. Als je meer dan één certificaat hebt, zorg ervoor dat alle andere certificaten in de Intermediate Certificate Authorities-store worden geplaatst.

Maak een WinRM HTTPS Listener aan en stel deze in

Nu dat alle certificaten zijn geïnstalleerd, is het tijd om WinRM op je server te configureren om dat certificaat voor de listener te gebruiken.

Met PowerShell geopend op de WinRM-server:

  1. Voer de onderstaande opdracht uit om automatisch de WinRM luisteraar in te stellen. Het winrm commando doet dit door de lokale machinecertificaatopslag te doorzoeken naar een certificaat dat voldoet aan de eisen voor WinRM.
winrm quickconfig -transport:https

2. De Windows Firewall blokkeert standaard de WinRM HTTPS-poort 5986. Om ervoor te zorgen dat de firewall inkomende poort 5986 toestaat, voer je het volgende PowerShell-commando uit:

$FirewallParam = @{
     DisplayName = 'Windows Remote Management (HTTPS-In)'
     Direction = 'Inbound'
     LocalPort = 5986
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

Het testen van de WinRM SSL-verbinding

Op dit punt ben je klaar om verbinding te maken. Gebruik je favoriete PSRemoting cmdlets zoals Invoke-Command of Enter-PSSession om verbinding te maken met de server en gebruik de parameter UseSSL.

Enter-PSSession -ComputerName ServerB.domain.com -UseSSL -Credential (Get-Credential)

Zorg er altijd voor dat de waarde voor de parameter ComputerName exact overeenkomt met de gemeenschappelijke naam die is opgegeven tijdens het maken van het certificaat. Als je probeert verbinding te maken met een andere hostnaam of misschien het IP-adres van de host, ontvang je een certificaatfout waardoor de verbinding mislukt.

Het instellen van certificaatgebaseerde authenticatie

Op dit moment zou je al een WinRM luisteraar moeten hebben ingesteld om HTTPS te gebruiken. Als dat het geval is, kun je ook een gebruikersauthenticatiecertificaat gebruiken om te authenticeren als een lokale gebruiker op de externe server. Het gebruik van een gebruikerscertificaat is een van de meest veilige methoden, maar het duurt even om in te stellen. Je zult merken dat het ook veel herhaald werk is, aangezien elk certificaat uniek is voor de individuele clientmachine.

Certificaatgebaseerde authenticatie werkt alleen met lokale gebruikersaccounts en niet met domeingebruikers.

Assuming you requested a certificate for Client Authentication as covered in the Creating the Certificate Request section, lees verder:

Inschakelen van certificaat-authenticatie en toewijzen van de gebruiker op de server

  1. Op de server, voer het Set-Item-commando uit om certificaatgebaseerde authenticatie toe te staan.
Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true

2. Voer vervolgens Get-ChildItem uit om de vertrouwde root-certificeringsinstanties opslag te bekijken om de thumbprint van de CA te vinden die het client-authenticatiecertificaat heeft uitgegeven. Doe dit door certificaten te filteren op het onderwerp dat de naam van uw CA bevat.

Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -like 'CA-Name'}

3. Voer het onderstaande commando uit waarbij de SubjectName het onderwerp is van het gebruikerscertificaat dat u heeft opgegeven bij het maken van het certificaat

De CAThumbprint is de thumbprint van de CA verzameld met het vorige commando, en vervolgens worden inloggegevens gevraagd voor de gebruikersnaam en het wachtwoord van de lokale gebruiker die zal worden gebruikt voor certificaatgebaseerde authenticatie.

New-Item WSMan:\localhost\ClientCertificate -Subject SubjectName -URI * -Issuer CAThumbprint -Credential (Get-Credential)

Testen van certificaatgebaseerde authenticatie

Nu de koppeling van certificaat naar gebruiker is ingesteld, gebruik het certificaat op de clientmachine om te authenticeren zonder inloggegevens op te geven.

Op de client in PowerShell, krijg de thumbprint van het clientcertificaat door te kijken in de Persoonlijke certificaatopslag.

Get-ChildItem Cert:\CurrentUser\My

Specificeer nu de thumbprint in de CertificateThumbprint-parameter voor een PSRemoting-commando zoals hieronder.

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

Merk op dat aangezien certificaatgebaseerde authenticatie alleen bruikbaar is met een HTTPS-luisteraar, wordt -UseSSL geïmpliceerd, in tegenstelling tot andere authenticatiemethoden waarbij je moet specificeren dat SSL moet worden gebruikt.

Volgende stappen

Nu je hebt geleerd hoe je WinRM over SSL moet instellen, kun je meer te weten komen over PSRemoting in onze post over PowerShell Remoting: de ultieme gids!

Wil je meer weten over PowerShell in het algemeen, inclusief veel informatie over PSRemoting? Bekijk PowerShell voor systeembeheerders, het boek!

Source:
https://adamtheautomator.com/winrm-ssl/