Windows i PowerShell imaju ugrađene sigurnosne značajke i zadane konfiguracije čiji je cilj spriječiti krajnje korisnike da slučajno pokrenu skripte tijekom njihovih svakodnevnih aktivnosti. Međutim, ako vaše dnevne aktivnosti rutinski uključuju pisanje i pokretanje vlastitih PowerShell skripti, to može biti više smetnja nego koristi. Ovdje ćemo vam pokazati kako raditi oko ovih značajki bez potpunog ugrožavanja sigurnosti.
PowerShell je zapravo naredba ljuska i skriptni jezik koji je namijenjen za zamjenu CMD i skupno skripte na Windows sustavima. Kao takav, PowerShell skripta može se prilično konfigurirati za sve što možete učiniti ručno iz naredbenog retka. To podrazumijeva praktičnu izmjenu na vašem sustavu, do ograničenja koja su na vašem korisničkom računu. Dakle, ako samo dvaput kliknete PowerShell skriptu i pokrenete ga s punim administratorskim ovlastima, jednostavan ovakav linijski ovakav model mogao bi zapravo uništiti vaš dan:
Get-ChildItem "$ env: SystemDrive \" -Preuzmi -ErrorAction silentlyContinue | Ukloni stavku -Force -Recurse -ErrorAction silentlyContinue
NEMOJTE pokrenuti gore navedenu naredbu!
To jednostavno prolazi kroz datotečni sustav i briše sve što može. Zanimljivo je da sustav ne može funkcionirati onoliko brzo koliko možete misliti - čak i kada se izvodi s povišene sesije. No, ako vas netko pozove nakon pokretanja ove skripte, jer iznenada ne mogu pronaći svoje datoteke ili pokrenuti programe, "isključivanje i ponovno uključivanje" vjerojatno će ih dovesti samo u Windows Startup Repair gdje će im se reći da postoji ništa što se može učiniti da se riješi problem. Što bi moglo biti gore, umjesto da dobije skriptu koja samo odbaci njihov datotečni sustav, vaš prijatelj može biti prevaren u pokretanje jedne koja preuzima i instalira keylogger ili daljinski pristup uslugu. Zatim, umjesto da vam postavljaju pitanja o popravci pri pokretanju, mogu završiti postavljanjem policijskih pitanja o bankovnim prijevarama!
Do sada bi trebalo biti očito zašto su određene stvari potrebne kako bi se zaštitili krajnji korisnici od sebe, tako da govore. No, korisnici energije, administratori sustava i drugi gejevi općenito (iako postoje iznimke) malo su oprezniji od tih prijetnji, znajući kako ih prepoznati i lako ih izbjeći, a samo se žele nastaviti sa svojim radom. Da biste to učinili, morat će onemogućiti ili raditi na nekoliko blokova za ceste:
Ti se problemi pojavljuju u odjeljku Kako koristiti batch datoteku kako bi PowerShell skripte lakše pokrenuli, gdje vas hodamo kroz pisanje batch datoteke kako bismo ih privremeno okupili. Sada ćemo vam pokazati kako postaviti svoj sustav s dugoročnim rješenjem. Imajte na umu da te promjene ne bi trebale generalno provoditi na sustavima koji vas ne upotrebljavaju isključivo - inače stavljate druge korisnike da imaju veći rizik od pokretanja istih problema s kojima te značajke žele spriječiti.
Prva, a možda i najvažnija smetnja za kretanje je zadana povezanost za .PS1 datoteke. Povezivanje tih datoteka na bilo što drugo osim PowerShell.exe ima smisla za sprječavanje slučajnog izvođenja neželjenih skripti. No, s obzirom da PowerShell dolazi s integriranim scenarijskim okruženjem (ISE), koji je posebno dizajniran za uređivanje PowerShell skripti, zašto bismo htjeli otvoriti .PS1 datoteke u programu Notepad prema zadanim postavkama? Čak i ako niste spremni za potpuno prebacivanje na omogućivanje funkcije dvostrukog klika za pokretanje, vjerojatno ćete htjeti uvećati ove postavke.
Možete promijeniti asocijaciju datoteke .PS1 na bilo koji program koji želite pomoću upravljačke ploče Zadane programe, ali kopiranje izravno u registar daje vam malo više nadzora nad točno kako će se datoteke otvarati. To vam omogućuje i postavljanje ili promjenu dodatnih opcija dostupnih u kontekstnom izborniku za .PS1 datoteke. Nemojte zaboraviti napraviti sigurnosnu kopiju registra prije nego što to učinite!
Postavke registra koje kontroliraju otvaranje PowerShell skripti spremaju se na sljedećem mjestu:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
Da biste istražili te postavke prije nego što ih promijenimo, pogledaj taj ključ i njegove podključeve s Regeditom. Shell ključ bi trebao imati samo jednu vrijednost, "(Default)", koja je postavljena na "Open".To je pokazivač zadane radnje za dvostruk klik na datoteku, što ćemo vidjeti u podključima.
Proširite Shell ključ i vidjet ćete tri podključa. Svaka od njih predstavlja radnju koju možete izvesti, a koja je specifična za PowerShell skripte.
Možete proširiti svaki ključ da biste istražili vrijednosti unutar, ali u osnovi se razlikuju prema sljedećim zadanim postavkama:
Ako se želite pridržavati unaprijed izgrađenih zapovjednih nizova koji su već dostupni, možete jednostavno promijeniti vrijednost "(zadano)" u Shell ključu kako biste podudarali naziv ključa koji odgovara onome što želite učiniti dvostrukim klikom. To se lako može obaviti iz Regedita ili možete koristiti lekcije naučene iz našeg vodiča o istraživanju registra pomoću programa PowerShell (uz malu PSDrive ugađanje) za početak izgradnje ponovljive skripte koja vam može konfigurirati svoje sustave. Daljnje naredbe moraju biti pokrenute iz povišene PowerShell sesije, slično pokretanju CMD-a kao administratora.
Prvo, trebate konfigurirati PSDrive za HKEY_CLASSES_ROOT jer to nije postavljeno prema zadanim postavkama. Naredba za ovo je:
Novi HKCR Registar HKEY_CLASSES_ROOT
Sada možete kretati i urediti ključeve i vrijednosti registra u HKEY_CLASSES_ROOT baš kao i kod redovnih HKCU i HKLM PSDrives.
Za konfiguriranje dvostrukog klika za pokretanje skripti PowerShell izravno:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(zadano)' 0
Da biste konfigurirali dvostruko klikom da biste otvorili PowerShell skripte u PowerShell ISE-u:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Zadano) "Uredi"
Da biste vratili zadanu vrijednost (postavite dvaput da biste otvorili PowerShell skripte u Notepad):
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Zadano) "Otvori"
To su samo osnove promjene zadane radnje dvostrukog klika. U nastavku ćemo detaljnije prilagoditi način na koji se PowerShell skripte obrađuju kada se otvore u programu PowerShell iz Explorera u sljedećem odjeljku. Imajte na umu da ograničenje sprječava PSDrives da nastavi tijekom sesija. Dakle, vjerojatno ćete htjeti uključiti novu liniju PSDrive na početak svake konfiguracijske skripte koju izrađujete za tu svrhu ili ga dodati u profil PowerShell. U suprotnom, morat ćete ručno pokrenuti taj bit prije nego što pokušate izvršiti promjene na ovaj način.
PowerShell's ExecutionPolicy je još jedan sloj zaštite od izvršenja zlonamjernih skripti. Postoji više mogućnosti za to i nekoliko različitih načina na koje se može postaviti. Od najviše do najmanje sigurne, dostupne opcije su:
Kao što je sugerirao opis nedefiniranog, gornja pravila mogu se postaviti u jednom ili više od nekoliko opsega. Možete koristiti Get-ExecutionPolicy, s parametrom -List, da biste vidjeli sve opsege i njihovu trenutnu konfiguraciju.
Ciljevi su navedeni u redoslijedu prethodnika, s najvišim definiranim opsegom koji nadilazi sve ostale. Ako nijedna pravila nisu definirana, sustav se vraća na zadanu postavku (u većini slučajeva to je ograničeno).
Budući da se ovaj članak uglavnom odnosi na približavanje sigurnosti kako bi se olakšala upotreba, samo smo zabrinuti za niže tri opsega. Postavke MachinePolicy i UserPolicy doista su korisne samo ako želite uvesti restriktivnu politiku koja se ne može jednostavno zaobići. Čuvanje naših promjena na razini Procesa ili niže, lako možemo koristiti bilo koju postavku pravila koja smatramo prikladnima za određenu situaciju u bilo kojem trenutku.
Da bi se zadržala neka ravnoteža između sigurnosti i upotrebljivosti, pravila prikazana na snimci zaslona vjerojatno su najbolja. Postavljanje pravila LocalMachine na Ograničeno uglavnom sprječava pokretanje skripti od strane bilo koga osim vas. Naravno, to se može zaobići korisnicima koji znaju što rade bez puno truda. No, on bi trebao zadržati bilo koji ne-tech-pamet korisnici od slučajno pokreće nešto katastrofalno u PowerShell. Ako vam CurrentUser (tj. Vi) postavite kao Neograničeno, ručno izvodite skripte iz naredbenog retka, međutim vam se sviđa, ali zadržava podsjetnik opreza za skripte preuzete s Interneta. Postavka RemoteSigned na razini Procesa trebala bi biti izvršena u prečacu PowerShell.exe ili (kao što ćemo učiniti dolje) u vrijednostima registra koje kontroliraju ponašanje PowerShell skripti. To će omogućiti jednostavnu funkcionalnost dvostrukog klika za sve skripte koje pišete, a istodobno povećavate prepreku od nenamjernog izvođenja (potencijalno zlonamjernih) skripti iz vanjskih izvora. Želimo to učiniti ovdje jer je puno lakše slučajno dvaput kliknuti na skriptu nego što je općenito ručno nazvati s interaktivne sesije.
Da biste postavili pravila CurrentUser i LocalMachine kao na gore opisanom screenshotu, pokrenite sljedeće naredbe s povišene sesije programa PowerShell:
Set-ExecutionPolicy Restricted Set-ExecutionPolicy Neograničeno -Scope CurrentUser
Da biste izvršili pravila o RemoteSignedu na skriptama koje pokreću Explorer, morat ćemo promijeniti vrijednost unutar jednog od ključeva registra koji smo ranije gledali. To je osobito važno jer, ovisno o PowerShell ili verziji sustava Windows, zadana konfiguracija može biti zaobilaženje svih postavki izvršne politike osim AllSigned. Da biste vidjeli koja je trenutna konfiguracija za vaše računalo, možete pokrenuti ovu naredbu (provjerite je li HKCR PSDrive prvo mapiran):
Get-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command | Odabir objekta "(zadano)"
Vaša zadana konfiguracija vjerojatno će biti jedna od sljedećih dva nizova ili nešto slično:
(Vidio na Windows 7 SP1 x64, s PowerShell 2.0)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "- datoteka" "% 1"
(Vidio u sustavu Windows 8.1 x64, s PowerShell 4.0)
"(Ako ((Get-ExecutionPolicy) - 'AllSigned') Set-ExecutionPolicy -Scope Process Bypass; & '% 1 „”
Prvi nije previše loš, jer sve to čini izvršavanje skripte pod postojećim postavkama izvršne policije. To bi se moglo poboljšati, primjenom strožih ograničenja za akciju koja je sklona nesrećama, ali to nije izvorno bilo namijenjeno dvostrukim klikom i svejedno je zadana pravila obično ograničena. Druga je opcija, međutim, puni zaobilaženje bilo kojeg izvršnog pravila za koju ste vjerojatno imali na mjestu - čak i ograničeno. Budući da će zaobići biti primijenjen u sklopu Procesa, ona utječe samo na sesije koje se pokreću kada se skripte izvode iz Explorera. Međutim, to znači da biste mogli završiti pokretanje skripti koje biste inače mogli očekivati (i žele) da se vaša pravila zabrane.
Da biste postavili procjenu izvedbe na razini procesa za skripte pokrenute iz programa Explorer, u skladu s gornjim screenshotom, morat ćete izmijeniti istu vrijednost registra koju smo upitali. To možete učiniti ručno u regeditu, promjenom na ovo:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "% 1"
Postavku možete promijeniti i iz programa PowerShell ako želite. Ne zaboravite to učiniti s povišene sesije, s mapom HKCR PSDrive.
"" -ExecutionPolicy "" RemoteSigned "" -file "" Postavite stavku "HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command" (zadano) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe " % 1" ”
Baš kao što je loša ideja onemogućiti UAC u potpunosti, također je loša sigurnosna praksa za pokretanje skripti ili programa s povišenim povlasticama, osim ako ih zaista ne trebate obavljati operacije koje zahtijevaju pristup administratoru. Dakle, izgradnja UAC upita u zadanu akciju za PowerShell skripte nije preporučljivo. Međutim, možemo dodati novu opciju kontekstualnog izbornika kako bismo mogli jednostavno pokrenuti skripte u povišenim sesijama kada trebamo. To je slično metodi koja se koristi za dodavanje "Open with Notepad" u kontekstni izbornik svih datoteka - ali ovdje ćemo samo ciljati PowerShell skripte.Također ćemo preusmjeriti neke tehnike korištene u prethodnom članku, gdje smo koristili batch datoteku umjesto hakera registra za pokretanje PowerShell skripte.
Da biste to učinili u regeditu, vratite se u Shell ključ na:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
Tamo stvorite novu podključ. Nazovite ga "Run with PowerShell (Admin)". Ispod toga stvorite još jednu potključnicu pod nazivom "Naredba". Zatim postavite "(Zadano)" vrijednost u naredbi na ovo:
"% 1 \" "-Verb RunAs" "-Verb RunAs" "-Verrata RunAs ”
Učinite isto u PowerShellu, ovaj put će trebati tri reda. Jedan za svaki novi ključ i jedan za postavljanje "(zadano)" vrijednost za naredbu. Nemojte zaboraviti elevaciju i mapiranje HKCR-a.
HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Pokreni s PowerShell (Administrator) \ Command 'Set-ItemProperty' 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Pokreni s PowerShell (Zadano) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -Command "" "& HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Pokreni s PowerShell Start-Process PowerShell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs "'
Također, pripazite na razlike između niza koji se stavlja kroz PowerShell i stvarnu vrijednost koja ulazi u Registar. Posebno, moramo zamotati cijelu stvar u jednokratnim citatima, i dvostruko povećati interne jednokratne citate, kako bismo izbjegli pogreške u parsiranju naredbe.
Sada biste trebali imati novi unos izbornika u kontekstu za PowerShell skripte, nazvane "Run with PowerShell (Admin)".
Nova opcija će stvoriti dvije uzastopne PowerShellove primjerke. Prvi je samo pokretač za drugi, koji koristi Start-Process s "-Verb RunAs" parametrom za zatraživanje visine za novu sesiju. Od tamo, vaša skripta bi trebala biti u mogućnosti pokrenuti s pravilima administratora nakon što kliknete UAC prompt.
Postoji samo još par tweakova koji mogu pomoći da život još lakše postane. Za jednu, kako se riješiti funkcije Notepad u cijelosti? Jednostavno kopirajte vrijednost "(zadano)" iz naredbe Command u odjeljku Uredi (dolje), na istu lokaciju pod stavkom Otvori.
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "% 1"
Ili, možete upotrijebiti ovaj dio PowerShell-a (s administratorom i HKCR-om, naravno):
"" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe ""% 1 "'Postavite opciju HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command
Još jedan manji smetnja je konzola navika nestanka nakon što je skripta završena. Kada se to dogodi, nemamo nikakve šanse da pregledamo izlaz skeniranja za pogreške ili druge korisne informacije. To se može pobrinuti stavljanjem pauze na kraju svake vaše skripte, naravno. Alternativno, možemo promijeniti "(Default)" vrijednosti za naše Command tipke za uključivanje "-NoExit" parametar. Ispod su izmijenjene vrijednosti.
(Bez administratorskog pristupa)
"" "-ExecutionPolicy" "RemoteSigned" "-file" "% 1" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe"
(S pristupom administratoru)
"% 1 \" "- \"% 1 \ "'- \"% 1 \ "\"% 1 \ "- Glagol RunAs "
I naravno, dat ćemo vam i one u PowerShell naredbi. Posljednji podsjetnik: Elevation & HKCR!
(Non-Admin)
Postavke za postavljanje stavke HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command (zadano) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -NoExit "" -ExecutionPolicy "" RemoteSigned " -file ""% 1 "'
(Administrator)
(Zadano) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" Command "(Postavke)" HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run with PowerShell "" & Start-Process PowerShell.exe -ArgumentList "-NoExit -ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs "'
Da biste ovo testirali, koristit ćemo skriptu koja nam može pokazati postavke ExecutionPolicy i hoće li se skripta pokrenuti s dozvolama administratora. Skripta će se zvati "MyScript.ps1" i pohraniti u "D: \ Script Lab" na našem uzorku sustava. Kôd je niže za referencu.
ako je (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole (Security.Principal.WindowsBuiltInRole] "Administrator")) Write-Output "Trčanje kao administrator!" else Write-Output 'Trčanje ograničeno!' Get-ExecutionPolicy -List
Upotreba radnje "Pokreni s PowerShellom":
Pomoću radnje "Pokreni s PowerShell (Admin)", nakon što kliknete UAC:
Kako bismo demonstrirali izvršnu politiku u akciji u okviru Procesa, možemo Windowsu misliti da je datoteka došla s Interneta s ovim bitom PowerShell koda:
Dodatak -Path 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer]" nZoneId = 3 "-Stream 'Zone.Identifier'
Srećom, imali smo -NoExit omogućen. Inače bi ta pogreška upravo mogla treptati, a mi ne bismo znali!
Zone.Identifier se može ukloniti s ovim:
Clear-Content-Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone.Identifier'
Korisne reference: