PowerShell-skriptien allekirjoittaminen

I ❤️ PowerShell. Se on todella hyödyllinen työkalu niiden tehtävien automatisointiin, joita teet useita kertoja. Mutta se voi olla myös ammottava tietoturva-aukko, jos annat sen olla.

PowerShellin avulla voit hallinnoida lähes kaikkea koneellasi, joten joku, joka pystyy suorittamaan haitallisia skriptejä ympäristöissäsi, voi aiheuttaa paljon vahinkoa.

Aiemmin se rajoittui vain Windowsiin, mutta versiosta 6 lähtien ja nyt PowerShell 7.0:n julkaisun myötä sitä voi käyttää myös Linuxissa ja MacOS:ssa. Tässä artikkelissa puhutaan kuitenkin Execution Policies -käytännöistä, joita ei voi muuttaa muissa kuin Windows-ympäristöissä, joten niistä ei ole hyötyä Linux/MacOS-käyttäjille (pahoittelut).

Execution Policies

Yksi keino rajoittaa skriptien suorittamista Windows-ympäristöissä on käyttää PowerShellin suorituskäytäntöjä. Tldr on, ett niiden avulla voidaan rajoittaa ympäristss suoritettavia komentosarjoja. Käytettävissä olevat vaihtoehdot vähiten suojatusta turvallisimpaan ovat:

Bypass

Mitään ei estetä.

Unrestricted (Sovelletaan aina muihin kuin Windows-koneisiin)

Sama kuin ByPass, mutta se kysyy käyttäjältä ennen komentosarjojen suorittamista internetistä.

RemoteSigned (oletusarvo Windows-palvelimilla)

Skriptit, jotka on ladattu internetistä, voidaan suorittaa vain, jos ne on allekirjoitettu. Koneella kirjoitetut komentosarjat voidaan suorittaa

AllSigned

Kaikki komentosarjat on allekirjoitettava, ennen kuin ne voidaan suorittaa

Restricted (oletusarvo Windows-asiakkaille)

Estä komentosarjojen suorittamisen. Voi suorittaa vain yksittäisiä komentoja.

Skriptien suorittaminen

Tahdot siis suorittaa omia PowerShell-skriptejäsi palvelimella. Saat kuitenkin seuraavan kaltaisen PSSecurityException:n.

PS C:\Users\Administrator\Downloads> .\wibble.ps1.\wibble.ps1 : File .\wibble.ps1 cannot be loaded. The file.\wibble.ps1 is not digitally signed. You cannot run this script on the current system.For more information about running scripts and setting execution policy, see about_Execution_Policies athttp://go.microsoft.com/fwlink/?LinkID=135170.At line:1 char:1+ .\wibble.ps1+ ~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) , PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
Enter fullscreen mode Exit fullscreen mode

Yksi tapa ratkaista tämä ongelma on muuttaa suorituskäytäntöä Set-ExecutionPolicy-komennon avulla ja vähentää koneen turvallisuutta. Tämä on yleensä huono ajatus.

Henkilökohtaisesti en koskaan käyttäisi palvelimella mitään vähemmän turvallista kuin RemoteSigned, mutta mieluiten AllSigned.

Mikä on komentosarjan allekirjoitus?

Valvottavasti haluat säilyttää koneen tietoturvan etkä avata haavoittuvuutta, joten jäljelle jäänyt vaihtoehto on komentosarjojen allekirjoittaminen.

Skriptin allekirjoittaminen tarkoittaa, että joku, jolla on pääsy koodin allekirjoitusvarmenteen yksityiseen avaimeen, on lisännyt skriptitiedoston loppuun allekirjoituslohkon.

function Get-Wibble { return "Wibble"}# SIG # Begin signature block# vpnIUpm2XxLRhU1no0iuA62xKxYzR6m95z9Ax21ppeTC9NoRd8ocoSGr1zAd# qlMOlz4lZoVWR4ZmtdCgzde1dVxzv4jjHb6ziDiY2o05UXswD2bl6XaOrUpd# Li0Qjg3d3y2r1nrpO8hos906bgXQswysvouegUJcpt8ftmqBKfEYNeBgnBFm# SIG # End signature block
Siirry koko näytön tilaan Poistu koko näytön tilasta

(Vain esimerkki. Allekirjoituslohko on tavallisesti paljon pidempi)

Allekirjoituslohko sisältää yksityisellä avaimella salatun komentosarjan hashin. Kun komentosarjaa yritetään ajaa, tämä puretaan julkisella avaimella ja sitä verrataan todelliseen hashiin. Jos se täsmää, voidaan vahvistaa, että komentosarjaa ei ole peukaloitu, koska hash muuttuisi heti, kun näin tapahtuisi.

Itse allekirjoittavat varmenteet

Jos komentosarjoja ajetaan vain organisaatiosi koneilla, voit todennäköisesti allekirjoittaa varmenteet itse. Vaihtoehtona on käyttää $$$ ja ostaa koodin allekirjoitusvarmenne joka vuosi.

Ensisignointi tarkoittaa, että tuotat varmenteen itse ja allekirjoitat skriptit sen avulla.

Miten luodaan itsesigneerausvarmenne

PowerShellissä on erittäin hyödyllinen New-SelfSignedCertificate-komento itsesigneerattujen varmenteiden tuottamiseen. Voimme sitten viedä ne ja sijoittaa ne eri varastoihin.

Komento luo oletusarvoisesti varmenteen, joka vanhenee 1 vuoden kuluttua. Voit muuttaa tätä käyttämällä -NotAfter-parametria ja antamalla sille päivämäärän, jolloin haluat varmenteen vanhentuvan.

Luoaksesi varmenteen käynnistä PowerShell-istunto ja suorita seuraavat

$CertificateName = Read-Host "Input your certificate name"$OutputPFXPath = "$CertificateName.pfx"$OutputCERPath = "$CertificateName.cer"$Password = Get-Credential -UserName Certificate -Message "Enter a secure password:"$certificate = New-SelfSignedCertificate -subject $CertificateName -Type CodeSigning -CertStoreLocation "cert:\CurrentUser\My"$pfxCertificate = Export-PfxCertificate $certificate -FilePath $OutputPFXPath -password $Password.passwordExport-Certificate -Cert $certificate -FilePath $OutputCERPathImport-PfxCertificate $pfxCertificate -CertStoreLocation cert:\CurrentUser\Root -Password $password.passwordWrite-Output "Private Certificate '$CertificateName' exported to $OutputPFXPath"Write-Output "Public Certificate '$CertificateName' exported to $OutputCERPath"
Siirry kokoruututilaan Poistu kokoruututilasta

Tämä luo varmenteen ja vie sen kahteen erillistä tiedostoon, joilla on päätteet .pfx ja .cer.

PFX

PFX-varmenne on varmenne, joka on asennettava koneisiin, jotka suorittavat allekirjoituksen. Meidän tapauksessamme se on jokainen kehittäjäkoneemme.

Se on asennettava cert:\CurrentUser\Root-varastoon, joka tunnetaan myös nimellä ”Trusted Root Certification Authorities” -varasto.

Tämä tiedosto on säilytettävä jossakin turvallisessa paikassa. Salasana tulisi sitten suojata erikseen (käytä salasanahallintaohjelmaa). Jos pahantekijä saa haltuunsa nämä molemmat, hän voi allekirjoittaa haitalliset skriptinsä ikään kuin hän olisi sinä.

CER

CER-varmentamistiedosto on se, joka sinun on asennettava koneisiin, joilla skriptit suoritetaan. Tämän asentaminen ei vaadi salasanaa, mutta sitä ei voi käyttää skriptien allekirjoittamiseen. Se sisältää vain julkisen avaimen, jota käytetään allekirjoituksen purkamiseen.

Koska se ei sisällä yksityistä avainta, tämä varmenne voidaan jakaa vapaasti kaikkiin ympäristöihin, joissa skriptejä ajetaan.

Tämä varmenne on asennettava kahteen varmennevarastoon koneisiin, joissa skriptejä ajetaan; cert:\LocalMachine\Root– ja cert:\LocalMachine\TrustedPublisher-varastoihin.

Skriptien allekirjoittaminen

Skriptien allekirjoittamista varten on olemassa Set-AuthenticodeSignature-toiminto. Meidän on syötettävä skriptin polku ja varmenne varastosta. Kirjoitimme wrapper-funktion, jolla skriptit voidaan allekirjoittaa.

function Set-ScriptSignatures { param ( $pathToScripts = "." ) $certificateName = "PowerShell Signing Certificate" $scripts = Get-ChildItem -Path "$pathToScripts\*" -Include *.ps1, *.psm1 -Recurse $certificate = @(Get-ChildItem cert:\CurrentUser\My -codesign | Where-Object { $_.issuer -like "*$certificateName*" } ) foreach ($script in $scripts) { Write-Host "Signing $script" Set-AuthenticodeSignature $script -Certificate $certificate }}
Enter fullscreen mode Exit fullscreen mode

Muuttujan $certificateName tulee sisältää varmenteen luomisessa käytetty nimi.

Toimintoa voi käyttää antamalla polun hakemistoon, joka sisältää skriptit, ja se käy ne silmukassa läpi allekirjoittaen ne kaikki.

Kun olet asentanut skriptit kohdekoneelle, sinun pitäisi nyt pystyä ajamaan skriptit ilman ongelmia.

Vastaa

Sähköpostiosoitettasi ei julkaista.