Windows и PowerShell имат вградени функции за сигурност и конфигурации по подразбиране, предназначени да предпазят крайните потребители от случайно стартиране на скриптове в хода на ежедневните си дейности. Ако обаче ежедневните ви дейности редовно включват писане и изпълнение на собствени скриптове PowerShell, това може да бъде повече неудобство, отколкото полза. Тук ще ви покажем как да обновите тези функции, без да правите компромиси със сигурността.
PowerShell е ефективно командния четец и скриптовия език, предназначен да замени CMD и партидните скриптове на системите на Windows. Като такъв, скриптът PowerShell може да бъде конфигуриран да прави всичко, което можете да направите ръчно от командния ред. Това означава, че правите практически всяка промяна, която е възможна във вашата система, до ограниченията на вашите потребителски акаунти. Така че, ако можете просто да кликнете два пъти върху PowerShell скрипт и да го изпълнявате с пълни администраторски права, обикновен модул като този може наистина да разруши вашия ден:
Get-ChildItem "$ env: SystemDrive \" -Рекусия -ErrorAction Безшумно прекратяване | Премахване на елемент -Force -Recurse -ErrorAction SilentlyContinue
НЕ изпълнявайте горната команда!
Това просто минава през файловата система и изтрива каквото може. Интересното е, че това може да не направи системата неработеща толкова бързо, колкото си помислите - дори когато се движите от повишена сесия. Но ако някой ви се обади след стартирането на този скрипт, защото внезапно не може да намери файловете си или да стартира програми, "да го изключите и отново да включите" вероятно ще ги доведе само до Windows Startup Repair, където ще им се каже, нищо, което може да се направи, за да се реши проблемът. Това, което може да е по-лошо, е, вместо да получите скрипт, който просто срива файловата си система, вашият приятел може да бъде подмамен да стартира такъв, който изтегля и инсталира услугата keylogger или отдалечен достъп. След това, вместо да ви задават въпроси относно поддръжката при стартиране, те могат в крайна сметка да поискат от полицията някои въпроси за банкови измами!
Досега трябва да е очевидно защо са необходими някои неща, за да се защитят крайните потребители от себе си, така да се каже. Но потребителите на власт, системните администратори и други ентусиасти обикновено (макар да съществуват изключения) малко по-предпазливи от тези заплахи, знаят как да ги разпознават и лесно ги избягват и просто искат да продължат работата си. За да направите това, те ще трябва или да забранят или да работят около няколко пътни блока:
Тези същите проблеми са повдигнати в "Как да използвате пакетен файл, за да направят PowerShell скриптове по-лесни за изпълнение", където ще ви преведем в писането на партиден файл, за да ги преместите временно. Сега ще ви покажем как да настроите системата си с по-дългосрочно решение. Имайте предвид, че обикновено не трябва да правите тези промени на системи, които не се използват изключително от вас - в противен случай поставяте други потребители на по-висок риск да се появят същите проблеми, които тези функции са предназначени да предотвратят.
Първото, а може би и най-голямото неприятно разстройство, е асоциацията по подразбиране за .PS1 файлове. Свързването на тези файлове с нещо различно от PowerShell.exe има смисъл за предотвратяване на случайно изпълнение на нежелани скриптове. Но, като се има предвид, че PowerShell идва с интегрирана среда за скриптове (ISE), която е специално създадена за редактиране на PowerShell скриптове, защо бихме искали да отворим .PS1 файлове в Notepad по подразбиране? Дори и да не сте готови да превключите напълно към активирането на функцията за двойно щракване, можете да промените тези настройки.
Можете да промените свързването на файловете .PS1 с каквато програма искате с контролния панел по подразбиране, но копането директно в регистъра ще ви даде малко повече контрол върху това как точно ще се отворят файловете. Това също така ви позволява да зададете или промените допълнителни опции, които са налице в контекстното меню за файлове .PS1. Не забравяйте да направите резервно копие на системния регистър, преди да направите това!
Настройките на системния регистър, които контролират начина на отваряне на PowerShell скриптовете, се съхраняват на следното място:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
За да проучите тези настройки, преди да ги променим, погледнете този ключ и неговите под-клавиши с Regedit. Ключът Shell трябва да има само една стойност, "(по подразбиране)", която е настроена на "Open".Това е указание за действието по подразбиране за двойно кликване върху файла, което ще видим в под-клавишите.
Разгънете клавиша Shell и ще видите три подключа. Всяко от тях представлява действие, което можете да изпълните, което е специфично за PowerShell скриптове.
Можете да разгънете всеки ключ, за да изследвате стойностите в него, но те основно се приравняват към следните стойности по подразбиране:
Ако искате да се придържате към вече създадените командващи низове, можете просто да промените стойността "(по подразбиране)" в клавиша "Shell", за да съответства на името на ключа, съответстващо на това, което искате да направите с двоен клик. Това може лесно да бъде направено от Regedit, или можете да използвате извлечените поуки от нашия урок за изследване на регистъра с PowerShell (плюс малък PSDrive tweak), за да започнете да създавате скрипт за повторно използване, който да конфигурира вашите системи за вас. Командите по-долу трябва да се изпълняват от повишена PowerShell сесия, подобна на изпълняващата CMD като администратор.
Първо, ще искате да конфигурирате PSDrive за HKEY_CLASSES_ROOT, тъй като това не е зададено по подразбиране. Командата за това е:
Нов PSDrive HKCR регистър HKEY_CLASSES_ROOT
Сега можете да навигирате и да редактирате ключове и стойности на регистър в HKEY_CLASSES_ROOT, точно както бихте направили в обикновените HKCU и HKLM PSDrives.
За да конфигурирате двойно кликване, за да стартирате директно PowerShell скриптове:
Настройка на елементна собственост HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(по подразбиране)' 0
За да конфигурирате двойно кликване, за да отворите PowerShell скриптове в PowerShell ISE:
Настройка на елемента на елемента HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(по подразбиране) "Edit"
За да възстановите стойността по подразбиране (задайте двойно кликване, за да отворите скриптовете PowerShell в Notepad):
Настройка на елементна собственост HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(по подразбиране) "Open"
Това са само основите на промяната на действието по подразбиране с двойно щракване. Ще разгледаме по-подробно как се обработват PowerShell скриптовете, когато се отворят в PowerShell от Explorer в следващия раздел. Имайте предвид, че обхватът не позволява на PSDrives да продължи да съществува в сесиите. Така че, вероятно ще искате да включите линията New-PSDrive в началото на всеки скрипт за конфигуриране, който създавате за тази цел или да го добавите към вашия PowerShell профил. В противен случай ще трябва да изпълните ръката, преди да се опитате да направите промени по този начин.
PowerShell's ExecutionPolicy е друг защитен слой срещу зловреден скрипт. Има няколко опции за това и няколко различни начина, по които може да се зададе. От най-малко до най-малко сигурни, наличните опции са:
Както се предлага от описанието на Undefined, горепосочените правила могат да бъдат зададени в един или повече от няколко области. Можете да използвате Get-ExecutionPolicy с параметъра -List, за да видите всички сфери и текущата им конфигурация.
Сферите са изброени по ред на приоритет, като най-горният дефиниран обхват заменя всички останали. Ако не са дефинирани никакви правила, системата се връща към стандартната си настройка (в повечето случаи това е ограничено).
Тъй като тази статия се отнася основно до намирането на охрана за улесняване на ползваемостта, ние сме загрижени за ниските три обхвата. Настройките на MachinePolicy и UserPolicy са наистина полезни само ако искате да наложите ограничителна политика, която не е толкова заобиколена. Като запазим промените ни на ниво Процес или по-долу, можем лесно да използваме всякакви правила, които считаме за подходящи за дадена ситуация по всяко време.
За да запазите известно равновесие между сигурността и използваемостта, правилата, показани на скрийншота, вероятно са най-добри. Настройването на правилата на LocalMachine на Restricted обикновено предотвратява изпълнението на скриптове от никой друг освен вас. Разбира се, това може да бъде заобиколено от потребители, които знаят какво правят без много усилия. Но той трябва да държи всички потребители, които не са от технолози, от случайно да задействат нещо катастрофално в PowerShell. Наличието на CurrentUser (т.е. вие), зададено като неограничено, ви позволява ръчно да изпълнявате скриптове от командния ред, колкото искате, но запазва напомняне за предпазливост за скриптове, изтеглени от Интернет. Настройката RemoteSigned на ниво процес трябва да се извърши в пряк път до PowerShell.exe или (както ще направим по-долу) в стойностите в регистъра, които контролират поведението на PowerShell скриптове. Това ще ви позволи лесно да използвате функцията за двойно кликване за изпълнение на скриптове, които пишете, като същевременно създавате по-силна бариера срещу непреднамерено изпълнение на (потенциално злонамерени) скриптове от външни източници. Искаме да направим това тук, тъй като е много по-лесно случайно да кликнете два пъти върху даден скрипт, отколкото да го наречете ръчно от интерактивна сесия.
За да зададете правилата CurrentUser и LocalMachine, както е показано на екрана по-горе, изпълнете следните команди от повишена PowerShell сесия:
Set-ExecutionPolicy Ограничен Set-ExecutionPolicy Неограничено -Scope CurrentUser
За да приложим правилата на RemoteSigned за скриптове, които се изпълняват от Explorer, ще трябва да сменим стойността на един от клавишите на системния регистър, на които разгледахме по-рано. Това е особено важно, тъй като в зависимост от версията ви PowerShell или Windows, конфигурацията по подразбиране може да е заобикаляща всички настройки на ExecutionPolicy, с изключение на AllSigned. За да видите каква е текущата конфигурация за вашия компютър, можете да изпълните тази команда (като се уверите, че HKCR PSDrive е настроено първо):
Получаване на елемент на елемент HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command | Избор на обект (по подразбиране)
Конфигурацията по подразбиране вероятно ще бъде един от следните два струни или нещо съвсем подобно:
(Видян на Windows 7 SP1 x64, с PowerShell 2.0)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-файл" "% 1"
(Видян на Windows 8.1 x64, с PowerShell 4.0)
"(C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "ако ((Get-ExecutionPolicy) -ne 'AllSigned') Set-PecutionPolicy -Scope Process Bypass ""
Първият не е много лош, тъй като всичко, което прави, е да изпълни скрипта под съществуващите настройки на ExecutionPolicy. Това би могло да стане по-добро, като се наложат по-строги ограничения за действие, по-податливо на злополуки, но първоначално това не беше предназначено да бъде задействано с двоен клик, а стандартната политика обикновено е Ограничена. Вторият вариант обаче е пълен байпас на каквато и да е ExecutionPolicy, която е вероятно да има на място - дори Restricted. Тъй като байпасът ще бъде приложен в обхвата на процеса, той засяга само сесиите, които се стартират, когато скриптовете се изпълняват от Explorer. Това обаче означава, че бихте могли да завършите стартирането на скриптове, които иначе бихте очаквали (и искате) правилата ви да забраняват.
За да настроите Процедура за изпълнение на ниво процес за скриптове, стартирани от Explorer, в съответствие с екранната снимка по-горе, ще трябва да промените същата стойност на регистъра, която току-що зададохме. Можете да го направите ръчно в Regedit, като го промените на следното:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "Изпълнение на политиката" "RemoteSigned" "-file" "% 1"
Можете също така да промените настройката от PowerShell, ако предпочитате. Не забравяйте да направите това от повишена сесия, като се преобразува HKCR PSDrive.
Настройка на елементна собственост HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command (по подразбиране) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" Изпълнение "" RemoteSigned " % 1 ""
Точно както е лоша идея да деактивирате изцяло UAC, това е също така лоша практика за сигурност за стартиране на скриптове или програми с повишени привилегии, освен ако действително не е необходимо да изпълняват операции, изискващи достъп от администратора. Така че не се препоръчва изграждането на подкана на UAC в действието по подразбиране за PowerShell скриптове. Въпреки това, можем да добавим ново опция за контекстно меню, за да можем лесно да изпълняваме скриптове в повишени сесии, когато е необходимо. Това е подобно на метода, използван за добавяне на "Open with Notepad" в контекстното меню на всички файлове - но тук ще се насочим само към PowerShell скриптове.Също така ще пренесем някои техники, използвани в предходната статия, където използвахме партиден файл вместо хакове за регистрация, за да пуснем нашия скрипт PowerShell.
За да направите това в Regedit, върнете се обратно в клавиша Shell на адрес:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
В него създайте нов под-ключ. Наречете го "Стартирайте с PowerShell (Admin)". Под него създайте друг под-ключ, наречен "Команда". След това задайте стойността "(по подразбиране)" под командата:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Стартиране на процеса PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File \ "% 1 \"' "
Правейки същото в PowerShell, ще са ви необходими три реда този път. Един за всеки нов ключ и един за задаване на стойността "(по подразбиране)" за командата. Не забравяйте издигането и картографирането на HKCR.
HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run със PowerShell (Admin) \ Command "Set-ItemProperty" (" HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run с PowerShell (Admin) \ Command "(по подразбиране)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" Стартиране на процеса PowerShell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -Файл \"% 1 \ "" - Verb RunAs "'
Също така обърнете специално внимание на разликите между низа, която се вкарва чрез PowerShell, и действителната стойност, която се вписва в регистъра. Особено трябва да обвием всичко в единични цитати и да удвоим вътрешните единични кавички, за да избегнем грешки в командния анализ.
Сега трябва да имате нов запис в контекстното меню за PowerShell скриптове, наречен "Run with PowerShell (Admin)".
Новата опция ще зареди две последователни PowerShell копия. Първият е само стартер за втория, който използва "Старт-Процес" с параметъра "-Verb RunAs", за да поиска повишение за новата сесия. Оттам, скриптът ви трябва да може да се изпълнява с администраторски права, след като кликнете върху подкана на UAC.
Има само още две подобрения, които могат да помогнат за още по-лесен живот. За една, какво ще кажете да се отървете от функцията на Notepad изцяло? Просто копирайте стойността "(по подразбиране)" от клавиша "Команда" под "Редактиране" (по-долу) в същото място под Отвори.
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "% 1"
Или можете да използвате този бит на PowerShell (с Admin & HKCR разбира се):
Настройка на елементна собственост HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command (по подразбиране) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe "
Още едно незначително дразнене е навикът на конзолата да изчезне, след като сценария е завършен. Когато това се случи, нямаме шанс да прегледаме изхода на скрипта за грешки или друга полезна информация. Това може да се погрижи, като поставите пауза в края на всеки от скриптовете си, разбира се. Алтернативно, можем да променим стойностите "(по подразбиране)" за командите, за да включим параметъра "-NoExit". По-долу са модифицираните стойности.
(Без администраторски достъп)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-NoExit" "ИзпълнениеПолитика" "Отдалечен подпис" ""
(С администраторски достъп)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "&" Стартиране на процеса PowerShell.exe -ArgumentList "-NoExit -ExecutionPolicy RemoteSigned -File \"% 1 \ Verb RunAs "
И, разбира се, ще ви дадем и тези в PowerShell команди. Последно напомняне: Надморска височина & HKCR!
(Non-Администриране)
Задаване на елементна собственост HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command (по подразбиране) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -NoExit ""-ExecutionPolicy" "RemoteSigned" -файл ""% 1 "
(Admin)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Сомпютър" \ n "" Изпълнява се с PowerShell (Admin) \ Command " "" & Стартиране на процеса PowerShell.exe -ArgumentList "-NoExit -ExecutionPolicy Отдалечен подпис -Файл \"% 1 \ "" - Verb RunAs "'
За да изпробваме това, ще използваме скрипт, който може да ни покаже настройките за ExecutionPolicy на място и дали скриптът е бил стартиран с разрешения от Administrator. Сценарият ще се нарича "MyScript.ps1" и ще се съхранява в "D: \ Script Lab" в нашата примерна система. Кодът е по-долу, за справка.
ако (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()) IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) Write-Output 'Running as Administrator! Write-Output 'Running Limited!' Get-ExecutionPolicy-Списък
Използване на действието "Стартиране с PowerShell":
Използвайки действието "Пусни с PowerShell (Admin)", след като кликнеш през UAC:
За да демонстрираме ExecutionPolicy в действие в обхвата на процеса, можем да направим Windows да мисли, че файлът идва от Интернет с този бит от PowerShell код:
Добавяне на съдържание - Път "D: \ Лаборатория на скрипта \ MyScript.ps1" -Value "[ZoneTransfer] 'nZoneId = 3" -Стрийм' Zone.Identifier '
За щастие, ние бяхме активирани с "-NoExit". В противен случай, тази грешка би трябвало да мига и не бихме знаели!
Зоната.Идентификатор може да бъде премахната с това:
Clear-Content -Path "D: \ Лаборатория на скрипта \ MyScript.ps1" -Stream "Zone.Identifier"
Полезни референции: