Heb je nodig om ervoor te zorgen dat niemand wijzigingen aanbrengt in je scripts en ze als origineel doorgeeft? Zo ja, dan moet je leren hoe je PowerShell-scripts ondertekent. Ondertekening voegt de identiteit van de uitgever toe aan het script, zodat gebruikers kunnen beslissen of ze de bron van het script vertrouwen.
In dit artikel leer je hoe je ervoor zorgt dat alleen vertrouwde scripts worden uitgevoerd in je omgeving door te leren hoe je PowerShell-scripts ondertekent.
Vereisten
Als je de voorbeelden in dit artikel wilt volgen, heb je het volgende nodig.
- A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
- Windows PowerShell 5.1 of PowerShell 6+. De voorbeelden in dit artikel zullen gebruikmaken van PowerShell v7.1.3.
- A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Het verkrijgen van een code-ondertekeningscertificaat
Voordat je leert hoe je PowerShell-script ondertekent, moet je eerst een code-ondertekeningscertificaat verkrijgen. In de wereld van Microsoft staan code-ondertekeningscertificaten ook bekend als Authenticode-certificaten.
A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.
Waar je een code-ondertekeningscertificaat krijgt, hangt af van waar je van plan bent om je ondertekende scripts te implementeren of te distribueren. En zoals altijd is de kostprijs ook een belangrijke factor.
- Globaal / Openbaar – Je hebt een certificaat nodig waarvan de uitgever een wereldwijd vertrouwde Certificaatautoriteit (CA) is. Voorbeelden van dergelijke CAs zijn GeoTrust en DigiCert. Deze certificaten zijn niet gratis. Bijvoorbeeld, een DigiCert Authenticode-certificaat kost je $474/jaar op het moment van schrijven.
- Intern / Lokaal Intranet – Als je een interne certificaatautoriteit (CA)-server hebt, kun je een ondertekeningscertificaat aanvragen en downloaden van je interne CA-server.
- Persoonlijk / Ontwikkeling – Voor persoonlijke tests of ontwikkeling is een zelfondertekend certificaat prima. Dit type ondertekeningscertificaat is wat je in dit artikel zult gebruiken.
Het maken van een zelfondertekend certificaat voor codeondertekening
Je hebt in het vorige gedeelte gelezen dat je voor het ondertekenen van PowerShell-scripts eerst een codeondertekeningscertificaat nodig hebt. Aangezien je in deze tutorial alleen persoonlijke tests zult uitvoeren, is een zelfondertekend certificaat voldoende. Maar waar haal je dat vandaan?
Zoals de naam al aangeeft, betekent zelfondertekend dat je lokale computer een codeondertekeningscertificaat aan zichzelf zal uitgeven. Volg deze stappen om een zelfondertekend certificaat te genereren.
1. Open PowerShell als beheerder op je computer.
2. Kopieer de onderstaande opdracht en voer deze uit in PowerShell. Deze opdracht maakt gebruik van de New-SelfSignedCertificate
cmdlet om een nieuw ondertekeningscertificaat voor code te maken. De naam van het certificaat is ATA Authenticode binnen de Persoonlijke certificaatopslag van de lokale computer.
De
New-SelfSignedCertificate
cmdlet ondersteunt alleen het maken van certificaten in de persoonlijke certificaatopslag van de huidige gebruiker (cert:\CurrentUser\My) of de persoonlijke certificaatopslag van de lokale machine (cert:\LocalMachine\My). Certificaten in cert:\LocalMachine\My zijn beschikbaar voor de hele computer.
De opdracht slaat ook het certificaatobject op in de variabele $authenticode
voor gebruik in de volgende stap.
3. Om je computer het nieuwe certificaat te laten vertrouwen, voeg je het zelfondertekende certificaat toe aan de Vertrouwde root-certificeringsinstantie en Vertrouwde uitgevers certificaatopslag van de computer. Kopieer hiervoor de onderstaande code en voer deze uit in PowerShell.
Er zijn drie belangrijke redenen om de zelfondertekende certificaten in drie verschillende certificaatopslagplaatsen te installeren.
- Het certificaat dat je hebt gemaakt in de Personal-certificaatopslag is wat je zult gebruiken als het ondertekeningscertificaat voor de code.
- Het kopiëren van hetzelfde certificaat naar de Trusted Publishers-opslag zorgt ervoor dat je lokale computer de uitgever van het script vertrouwt. PowerShell controleert dit certificaat in deze opslag om de handtekening van een script te valideren.
- Eindelijk zorgt het toevoegen van het zelfondertekende certificaat aan de Vertrouwde certificeringsinstanties voor root ervoor dat uw lokale computer de certificaten in de Persoonlijk en Vertrouwde uitgevers opslag vertrouwt.
4. Om te bevestigen dat het certificaat met het onderwerp ATA Authenticode aanwezig is in de Persoonlijk, Root en Vertrouwde uitgever certificaatopslag, voert u de onderstaande commando’s uit in PowerShell.

5. Om het certificaat in een GUI te bekijken, open de Certificaat Snap-in en zoek naar het certificaat dat u hebt gemaakt onder de Certificaten map binnen de Persoonlijk, Vertrouwde certificeringsinstanties voor root, en Vertrouwde uitgevers certificaatopslag.

Hoe PowerShell-scripts te ondertekenen
Nu je je code-ondertekeningscertificaat hebt gemaakt en geïnstalleerd in de drie certificaatopslagplaatsen, ben je klaar om het te gebruiken om je voorbeeld PowerShell-script te ondertekenen. Wanneer je scripts moet ondertekenen, is de Set-AuthenticodeSignature
cmdlet de belangrijkste speler.
Om het PowerShell-script te ondertekenen, voer je de onderstaande code uit in PowerShell. Het eerste commando haalt het code-ondertekeningscertificaat op uit de persoonlijke certificaatopslag van de lokale machine. Het tweede commando voegt een digitale handtekening toe aan het PowerShell-scriptbestand.
De meest vertrouwde certificaatverstrekkers hebben een tijdserver, en je kunt ze vinden op de websites van de aanbieders. Bijvoorbeeld, de tijdserver van DigiCert is http://timestamp.digicert.com en Comodo heeft http://timestamp.comodoca.com.
Na het ondertekenen van het script, zou je een vergelijkbare uitvoer moeten zien als op de onderstaande screenshot.

Het controleren van de digitale handtekening van een PowerShell-script
Tot nu toe heb je een PowerShell-script ondertekend met het zelfondertekende certificaat dat je hebt gemaakt. Maar hoe weet je of het script daadwerkelijk een digitale handtekening heeft?
Het Code Openen
Één manier om de digitale handtekening van een script te bevestigen, is door het script te openen en de code te bekijken in een teksteditor. Zoals het voorbeeld hieronder, heeft het ondertekende script een handtekeningblok aan het einde van de code. Het handtekeningblok begint met # SIG # Begin handtekeningblok
en eindigt met # SIG # Einde handtekeningblok
.

Het handtekeningblok van de digitale handtekening verwijderen uit de code van het script zal het script terugzetten naar niet-ondertekend.
Het Eigenschappen Openen van het Bestand van het Script
Een andere manier om de digitale handtekening van het script te controleren, is door de bestandseigenschappen van het script te openen in de Verkenner van Windows. Doe het als volgt:
- In Windows Verkenner, navigeer naar de locatie van het PowerShell-script. In dit voorbeeld staat het script in C:\ATA\myscript.ps1.
- Klik met de rechtermuisknop op het script en klik op Eigenschappen.
- In het venster Eigenschappen van het bestand klikt u op het tabblad Digitale handtekeningen en u zou een digitale handtekening moeten zien onder de Lijst met handtekeningen.

Met behulp van Get-AuthenticodeSignature
Zou het u verrassen dat u ook de handtekening van een script kunt controleren binnen PowerShell? Waarschijnlijk niet. Het cmdlet dat u kunt gebruiken om de handtekening van een bestand op te halen is Get-AuthenticodeSignature
.
Om de digitale handtekening van het script te krijgen, voert u de onderstaande opdracht uit. Deze opdracht haalt de handtekening op van het C:\ATA\myscript.ps1 bestand. Het Select-Object -Property *
cmdlet toont alle details van de handtekening.
Na het uitvoeren van de opdracht zou u een vergelijkbaar resultaat moeten zien als op de onderstaande screenshot. Zoals u kunt zien, toont de SignerCertificate
eigenschap de details van het ondertekeningscertificaat. Terwijl de TimerStamperCertificate
eigenschap het certificaat van de tijdstempelserver toont.

Het uitvoeren van een Ondertekend PowerShell-script
Op dit punt heeft u een PowerShell-script ondertekend en bevestigd dat de digitale handtekening aanwezig is. Maar, de ultieme test om te controleren of u alle stappen correct hebt uitgevoerd, is het uitvoeren van het script en bevestigen dat het werkt.
PowerShell heeft een veiligheidsfunctie die gebruikers beschermt tegen het onbedoeld uitvoeren van scripts. Deze veiligheidsfunctie wordt Uitvoeringsbeleid genoemd. Afhankelijk van het uitvoeringsbeleid kan PowerShell scripts voorkomen of toestaan om uit te voeren.
Om meer te weten te komen over de verschillende uitvoeringsbeleiden en hoe ze de scriptuitvoering beïnvloeden, raadpleeg PowerShell Uitvoeringsbeleiden: Begrip en Beheer.
Om een ondertekend PowerShell-script uit te voeren, volg deze stappen.
Ten eerste, wijzig het uitvoeringsbeleid naar AllSigned om ervoor te zorgen dat alleen ondertekende scripts kunnen worden uitgevoerd. Zonder deze stap te doen, kunt u niet nauwkeurig testen of uw ondertekende script werkt. Doe dit door het Set-ExecutionPolicy
cmdlet aan te roepen door het onderstaande commando uit te voeren in PowerShell als beheerder.
Vervolgens, voer het ondertekende PowerShell-script uit.
Het script zou moeten draaien zonder fouten of waarschuwingen, zoals u kunt zien in het onderstaande resultaat.

Maar als het script om de een of andere reden niet correct is ondertekend of helemaal niet is ondertekend, krijg je een foutmelding vergelijkbaar met de onderstaande afbeelding. In dat geval moet je je stappen opnieuw bekijken en proberen het script opnieuw te ondertekenen.

Wat als je uiteindelijk je script hebt bijgewerkt? Zal de digitale handtekening nog steeds geldig zijn? Het antwoord is nee. Elke wijziging in het ondertekende script maakt de digitale handtekening ongeldig. Het uitvoeren van het gewijzigde script zal mislukken en leiden tot een foutmelding.
Volg deze stappen om een gewijzigd ondertekend script te testen.
1. Open het ondertekende myscript.ps1-script in een code- of teksteditor.
2. Wijzig de code om een karakter toe te voegen, zoals een underscore in dit voorbeeld. Verander verder niets.

3. Sla het script op nadat je de code hebt gewijzigd.
4. Voer ten slotte het gewijzigde script uit in PowerShell door de onderstaande opdracht uit te voeren.
Omdat je het ondertekende script hebt gewijzigd, zal het uitvoeren van het script leiden tot de onderstaande fout. Je moet het script opnieuw ondertekenen om de digitale handtekening bij te werken en te herstellen.

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.
Conclusie
In dit artikel heb je geleerd waarom het ondertekenen van PowerShell-scripts noodzakelijk kan zijn, afhankelijk van de uitvoeringsbeleidsregels. Je hebt ook geleerd hoe je een ondertekend en niet-ondertekend script kunt onderscheiden. Ten slotte heb je geleerd hoe je PowerShell-scripts digitaal kunt ondertekenen en hoe je ze kunt testen en uitvoeren.
Nu je weet hoe je PowerShell-scripts moet ondertekenen, ga je ze nu ondertekenen voordat je ze verspreidt of implementeert?
Source:
https://adamtheautomator.com/how-to-sign-powershell-script/