הגדרת מדיניות ביצוע עבור ניהול מדיניות ביצוע PowerShell

האם אי פעם הורדת סקריפט PowerShell, הפעלת אותו, ונתקלת בהודעת שגיאה השגורה למטה? אם כן, תצטרך את פקודת ה-Set-ExecutionPolicy ואת המדריך הזה!

PowerShell Script Execution Disabled Error

בפוסט זה, תלמד על מדיניות ביצוע PowerShell ואיך לנהל אותם עם פקודת ה-Set-ExecutionPolicy. עד סיום הפוסט הזה, תדע לא רק להפעיל סקריפטים אלא גם כיצד להשתמש במדיניות ביצועים!

המדריך הזה נכתב עם חשיבות על PowerShell של Windows בדעת, וכל הדגמים נעשו עם PowerShell של Windows. מדיניות הביצועים אינן ייחודיות ל-PowerShell של Windows, והן פועלות בדרך דומה מאוד ב-PowerShell 6+. אבל, אם אתה עובד עם PowerShell 6+, יתכן שתמצא הבדלים קטנים בהתנהגות.

מהו מדיניות הביצועים?

אם נתקלת כבר בשגיאה שתוארה למעלה, נתקלת במדיניות ביצוע. מדיניות הביצוע ב- PowerShell היא מנגנון אבטחה להגנת המערכת שלך מסקריפטים זדוניים. מדיניות ביצוע לא מונעת ממך להפעיל קוד PowerShell בקונסול כמעט כמו מפריע, אך היא מונעת ביצוע של סקריפטים.

Microsoft אומרת שמדיניות ביצוע אינה טכנית "אבטחה" ממש אלא יותר שער שאתה יכול לפתוח ולסגור. אחרי הכל, תוכל לעקוף מדיניות ביצוע מוגדרת בקלות, כפי שתלמד מאוחר יותר.

המדיניות הפעולה מבוססת על אמון. אם אתה סומך על סקריפט, יש סיכוי שהוא לא זדוני. מדיניות הביצוע בדרך כלל אינה מונעת באופן סטנדרטי את ביצוע הסקריפטים של כל. מטרתם העיקרית (ובעיקר כאשר הם מוגדרים בצורה יותר הגברתית) היא לוודא שסקריפט הפעולה שאתה מפעיל הוא חתום באמצעות אישור קריפטוגרפי.

קטגוריות מדיניות ביצוע

כפי שלמדת, מדיניות ביצוע מגבילה את ביצוע הסקריפטים, אך PowerShell יכול לבצע סקריפטים בהקשרים שונים רבים. PowerShell מפעיל סקריפטים בהקשר של משתמש מחובר או בהקשר של מחשב גלובלי, דרך משימות מתוזמנות שרצות כ-SYSTEM או בתחום של קונסולת PowerShell פתוחה יחידה.

כדי להתאים לכל ההקשרים אלו, יש ל-PowerShell חמישה הקשרים שונים או טווחים שבהם תוכל להגדיר מדיניות ביצוע.

  • MachinePolicy – הטווח הזה מוגבל למחשב יחיד. זה משפיע על כל המשתמשים המתחברים למחשב זה, ואובייקט מדיניות קבוצת Active Directory קובע אותו. כאשר מוגדר, הוא יקבע תפריט על כל טווחי ההקשרים האחרים.
  • LocalMachine. זהו הטווח הברירת מחדל שמשפיע על כל משתמשי המחשב ומאוחסן בתת־רישומים HKEY_LOCAL_MACHINE. כאשר אתה מגדיר מדיניות ביצוע באמצעות Set-ExecutionPolicy, הטווח הזה הוא הברירת מחדל.

מדיניות הביצוע עבור LocalMachine מאוחסנת במפתח הרישום HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.

  • UserPolicy – הטווח UserPolicy משפיע רק על משתמש יחיד במחשב, והוא מוגדר על ידי אובייקט מדיניות קבוצת Active Directory. אי אפשר לשנות מדיניות זו באמצעות Set-ExecutionPolicy.
  • CurrentUser. הטווח CurrentUser מגדיר את מדיניות הביצוע רק עבור המשתמש הנוכחי ומאוחסן תחת האשכול HKEY_CURRENT_USER ברישום. אי אפשר לשנות מדיניות זו באמצעות Set-ExecutionPolicy.

מדיניות הביצוע עבור CurrentUser מאוחסנת במפתח הרישום HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.

  • Process – הטווח הזה מגדיר את מדיניות הביצוע עבור הסשן הפולשני של PowerShell של משתמש יחיד. הטווח הזה הוא הטווח הכי דק של מדיניות ביצוע שאפשר להגדיר. להבחנה ממדיניות ביצוע אחרות, מדיניות זו נשמרת במשתנה סביבה בשם PSExecutionPolicyPreference במקום ברישום.

סוגי מדיניות ביצוע

הפעולות מזהות "רמות אבטחה" שונות. רמות אלו קובעות כמה נחוצה יהיה מדיניות הביצוע. לדוגמה, ניתן להגדיר מדיניות ביצוע המעצילה; היא מושבתת, אך לעומת זאת, מדיניות ביצוע יכולה לנטרל לחלוטין את הביצוע של סקריפטים.

בואו נדבר על כל הדרכים שבהן ניתן להגדיר את רמת האבטחה של מדיניות ביצוע מהפחות להגבר.

לא מוגבל

המדיניות הפחות מוגבלת היא זו שאינה משפיעה כלל; היא לא מוגבלת. מדיניות ביצוע מסוג זה מושבתת לחלוטין. משתמשים יכולים להפעיל את כל הסקריפטים ללא קשר לאמינותם כאשר מדובר במדיניות ביצוע שהיא לא מוגבלת.

עקיפה

כמו מסוג לא מוגבלת, מדיניות ביצוע המוגדרת כ-עקיפה אינה חוסמת כלום.

אף שיש למדיניות עקיפה ולמדיניות לא מוגבלת את אותו ההשפעה, מדיניות הביצוע מסוג עקיפה אינה סוג במובן הטכני. היא דולקת על מדיניות ביצוע מוגדרת באופן שלם.

לא מוגדר

אף שלא נהוג להשתמש בה, אפשר להסיר בעצם מדיניות ביצוע על ידי הגדרתה כ-לא מוגדר. כאשר מגדירים מדיניות ביצוע כ-לא מוגדרת, PowerShell מסירה לחלוטין את כל מדיניות הביצוע המוקצתת מהטווח המוקצה.

על מחשבים שאינם מפעילים מערכת הפעלה Windows, מדיניות הביצוע מוגדרת תמיד כ-לא מוגבלת ולא ניתן לשנות אותה.

כאשר כל הטווחים מוגדרים כלא מוגדרים, PowerShell טופלת את כל הטווחים כמוגבלים.

חתומה מרחוק

כפי שקראת קודם, מדיניות הביצוע מתייחסת לאמון שנרכש דרך חתימה דיגיטלית על קובצי סקריפטים. PowerShell גם מתחשב במקום ממנו הגיע הסקריפט. האם נוצר על המחשב המקומי שלך או מאדם אקראי באינטרנט?

סקריפטים שנבנו במקום אחר מחוץ למחשב המקומי שלך לא צריכים להיות באופן מובנה מהימנים. זו הסיבה שבפועל PowerShell מספק את מדיניות הביצוע RemoteSigned. מדיניות הביצוע RemoteSigned מכפילה כי כל הסקריפטים מועתקים ממקום אחר למחשב שלך חייבים להיות מחותמים בצורה קריפטוגרפית.

ניתן לעקוף מדיניות זו במידה מסוימת עבור קבצים שהורדו מהאינטרנט באמצעות הפקודה Unblock-File cmdlet. עוד מידע על התנהגות זו תוכל למצוא מעט מאוחר יותר בחלק איך מדיניות ה RemoteSigned פועלת.

עבור שרתי Windows, RemoteSigned מוקצה כמדיניות ברירת המחדל.

AllSigned

אם ברצונך לוודא שכל הסקריפטים ב- PowerShell מחותמים בצורה קריפטוגרפית, יש להגדיר את מדיניות הביצוע ל- AllSigned. כמו RemoteSigned, מדיניות זו מגבירה את דרישת החתימה ומכפילה כי כל הסקריפטים חייבים להיות מחותמים לפני הביצוע.

גם אם מדיניות הביצוע שלך היא AllSigned, ניתן עדיין לעקוף אותה באמצעות השימוש בהשבתה, כפי שתלמד מאוחר יותר.

Restricted

המדיניות הקפדנית ביותר לביצוע היא מוגבל. כאשר מדיניות הביצוע היא מוגבלת, אף סקריפט לא יכול להתבצע; בלתי תלוי באם הם מובילים או לא. מדיניות זו בעצם מנטרת את ביצוע סקריפטים באופן מוחלט.

גם, לעומת סוגי המדיניות הפחות הקפדניים, הסוג מוגבל מבטיח שקבצי עיצוב והגדרה של PowerShell (PS1XML), קבצי סקריפט מודול (PSM1) ופרופילים של PowerShell לא יוכלו להתבצע.

כל הלקוחות של Windows, כברירת מחדל, מוגדרים למדיניות ביצוע מוגבלת.

מבחינה טכנית, מיקרוסופט מגדירה מדיניות ביצוע שביעית נקראת ברירת מחדל, אך הסוג בעצם מהווה תו נוסף ל־RemoteSigned (ב-Windows Server) ול־Restricted (בלקוחות Windows).

כיצד מדיניות ה־RemoteSigned פועלת

סצינריו מסוים לציין הוא כיצד מדיניות הביצוע RemoteSigned פועלת. מדיניות ביצוע זו (כפי שלמדת) מונעת מסקריפטים לרוץ שנוצרו במקום אחר מאשר במחשב המקומי שלך.

אך איך PowerShell יודע שהסקריפט נוצר במקום אחר? זרמי נתונים.

הבנת ושאילתת נתוני NTFS

כל פעם שאתה יוצר קובץ במערכת הקבצים של NTFS, NTFS מחייב תכונת זרם נתונים חלופי (ADS) לקובץ. ל-ADS יש שתי תכונות קובץ: $Data ו־zone.Identifier. PowerShell משתמש בתכונת zone.Identifier כדי לזהות אם קובץ סקריפט של PowerShell נוצר במקום אחר.

לעומת מאפיינים אחרים כמו דחוס או לקריאה בלבד, מאפייני ADS מוסתרים בסייר הקבצים. אך, באמצעות PowerShell, ניתן לבדוק את נתוני הזרמים הללו.

הפעל את הפקודה Get-Item עם הנתיב לתסריט והפרמטר Stream כפי שמוצג למטה. בדוגמה זו, נכתב "Hello World.ps1" במחשב המקומי. שים לב שהמאפיין היחיד המשויך למאפיין Stream הוא $DATA. אין שום מאפיין ADS.

Get-Item '.\Hello World.ps1' -Stream *
ADS Stream output for local file

עכשיו, הפעל את אותה פקודה על תסריט שהורד מהאינטרנט. שים לב שעכשיו Get-Item מחזיר אובייקט אחר לחלוטין עם זרם של Zone.Identifier.

ADS Stream output for PowerShell file downloaded from internet

כשאתה יודע שיש לקובץ את ADS, תוכל להשתמש בפקודה Get-Content כדי לגלות את האזור. האזור מגדיר מאין הקובץ נשלח.

Get-Content .\Get-CertDetails.ps1 -Stream zone.identifier

Get-Content יחזיר ערך של ZoneId שמייצג את האזור ממנו הקובץ התקבל.

Zone ID Value

ערכי האזור האפשריים הם:

Zone ID Zone
------- ---------------------
0       My Computer
1       Local Intranet Zone
2       Trusted sites Zone
3       Internet Zone
4       Restricted Sites Zone

תדירות המדיניות של הפעלה

כפי שכוסבר לעיל, ישנן תדירויות הפעלה שונות שפועלות בו זמנית. כל מדיניות הפעלה אלו, כאשר משולבות, מקבעות את ההגדרות של ההפעלה הנוכחית שלך. כאשר יש לך מדיניות הפעלה מרובה בתוקף, יש להם תדירות.

תדירות המדיניות היא הסדר שבו PowerShell מחיל תדירויות שונות שהוגדרו בטווחים שונים. ישנן מדיניות הפעלה שיש להן עדיפות גבוהה מאחרות.

כאשר אתה מפעיל את הפקודה Get-ExecutionPolicy -List, תמצא את כל מדיניות הביצוע הפעילות כרגע ממוינת מהנמוכה ביותר לגבוהה ביותר. לדוגמה, מאחר שיש ל-MachinePolicy עדיפות נמוכה יותר, מדיניות LocalMachine ו־CurrentUser יחליפו אותה.

Get-ExecutionPolicy cmdlet output

עבודה עם מדיניות ביצוע

לאחר שהבנת את הרקע של מדיניות הביצוע, בוא נחקור איך לעבוד עם הם! כדי לעבוד עם מדיניות הביצוע של PowerShell, יש לך שתי פקודות לרשותך: Get-ExecutionPolicy לגילוי של מדיניות מוגדרת כרגע ו־Set-ExecutionPolicy להגדרת מדיניות חדשה.

קבלת מדיניות שהוקצתה כרגע

לפני שתוכל להתחיל לשנות מדיניות ביצוע, עליך ללמוד איזה מדיניות יש לך. כדי לעשות זאת, יש לך את הפקודה Get-ExecutionPolicy. הפקודה הזו מפרטת את כל המדיניות המוקצות כרגע במחשב.

כאשר אתה מפעיל ישירות את הפקודה Get-ExecutionPolicy בקונסול PowerShell ללא פרמטרים, היא תציג את מדיניות הביצוע שמוגדרת עבור הסשן הנוכחי שלך.

Get-ExecutionPolicy cmdlet output

כדי לראות את מדיניות הביצוע שהוגדרה לטווח, ציין את הפרמטר Scope באמצעות שם הטווח שתרצה לראות תוצאות עבורו.

Get-ExecutionPolicy -Scope Process
Get-ExecutionPolicy -Scope LocalMachine
Get-ExecutionPolicy cmdlet with scope parameter output

כדי לראות את כל הטווחים והמדיניות שלהם, השתמש בפרמטר List כמצוין למטה.

Get-ExecutionPolicy -list
Get-ExecutionPolicy cmdlet displaying all scopes

שינוי מדיניות ביצוע

פעם אחת שאתה יודע מה המדיניות של ביצוע כרגע מוקצות, אתה יכול לשנות אותן גם. כדי לשנות את המדיניות במחשב יחיד, יש לך את הפקודה Set-ExecutionPolicy לרשותך. אך, אם אתה בארגון, תרצה לשנות מדיניות בכמות. אם זה המקרה, תמיד יש לך מדיניות קבוצה אם אתה בתחום של פעולת ספריית פעילים.

שימוש ב־Set-ExecutionPolicy

בואו נכסה תחילה כיצד לשנות מדיניות עם הפקודה Set-ExecutionPolicy. כדי לעשות זאת, פתח את PowerShell כמנהל.

עכשיו הרץ את הפקודה Set-ExecutionPolicy עם פרמטר יחיד (ExecutionPolicy) וספק את שם המדיניות של הביצוע.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

כעת PowerShell ישאל האם ברצונך לשנות את מדיניות הביצוע. אם אתה רוצה, הקלד Y או A והקש Enter.

Change Execution Policy

פקודות PowerShell מסוימות צריכות להריץ מספר משימות נוספות כדי לפעול. אם בדוגמה למעלה הקלדת Y, PowerShell עשוי להציע לך להמשיך לכל שלב. אם תלחץ A, הוא ימשיך לכל השלבים הבאים.

הרצת Set-ExecutionPolicy בלי הודעות

באופן ברירת המחדל, כאשר אתה מפעיל את Set-ExecutionPolicy, זה יעזור לך בשאלה אם ברצונך לשנות את מדיניות הביצוע. תוכל לדלג על השאלה הזו על ידי הוספת הפרמטר Force לפקודתך. בשימוש בפרמטר Force תכחיש את כל הודעות האישור.

Set-ExecutionPolicy RemoteSigned -Force
Output of Set-ExecutionPolicy command when Force Parameter is used

הגדרת מדיניות ביצוע PowerShell דרך הרישום

מאחר ורוב מדיניות הביצוע מאוחסנות ברישום (למעט Process), באפשרותך גם לשנות מדיניות ישירות דרך הרישום.

כדי לשנות מדיניות ביצוע דרך הרישום:

  1. פתח את עורך רישום Windows (regedit) או כל כלי עריכת רישום אחר שתבחר.

2. נווט למפתח הרישום של טווח מדיניות הביצוע שברצונך לשנות.

LocalMachineHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

CurrentUserHKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

3. לחץ ימנית על מפתח הרישום וצור ערך מחרוזת חדש בשם ExecutionPolicy.

4. לחץ פעמיים על ערך המחרוזת ExecutionPolicy החדש שנוצר והכנס את שם מדיניות הביצוע הרצויה (Restricted, RemoteSigned, AllSigned, Unrestricted, או Undefined).

התוווה ערך מחרוזת נוסף באותו מפתח בשם Path. הערך מחרוזת של Path מייצג את נתיב מנוע הכוח של PowerShell. ודא שערך המחרוזת של Path הוא C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe אשר מצביע על מנוע הכוח של Windows PowerShell.

Registry path for ExecutionPolicy in registry for current user

מדיניות הביצוע של CurrentUser מחמירה על מדיניות של LocalMachine. אם יש לך מדיניות של CurrentUser שמוגדרת ברגיסטר ואתה מנסה לשנות את מדיניות הביצוע דרך Set-ExecutionPolicy, שבאופן ברירת מחדל מגדירה את המדיניות בתחום של LocalMachine, PowerShell יחזיר שגיאה המוצגת למטה.

Execution Policy Permission Denied

הגדרת מדיניות ביצוע של PowerShell דרך קבוצת מדיניות

אם אתה נמצא בארגון עם Active Directory, אתה לא רוצה להתקרב לכל המכונות של Windows שלך ולהפעיל את הפקודה Set-ExecutionPolicy. במקום זאת, אתה יכול לנהל מדיניות בצובר עם מדיניות קבוצתית.

כדי לנהל מדיניות ביצוע דרך GPO:

צור את אובייקט מדיניות הקבוצה

  1. פתח את יישום ניהול מדיניות הקבוצה בשרת רשות השולחן או בתחנת העבודה המצורפת לדומיין שלך.
Group Policy Management Console

2. הרחב Domains —> <your Active Directory forest> —> Group Policy Objects.

Select Group Policy Objects node

3. לחץ ימינה על Group Policy Objects ולחץ על New.

4. תן שם ל-GPO שלך. במדריך זה, ה-GPO נקרא מדיניות ביצוע PowerShell.

Create new Group Policy Object

5. לחץ ימנית על ה-GPO שנוצר לאחרונה ולחץ על עריכה.

6. נווט אל תצורת מחשב\מדיניות\תבניות מנהל\רכיבי Windows\Windows PowerShell.

Navigate to the setting in Group Policy Object

7. פתח את ההגדרה בחלון הימני, פתח את ההגדרה הפעלת ביצוע סקריפט.

Turn on Script Execution Policy

8. בתיבת ה-הפעלת ביצוע סקריפט, בחר באפשרות Enabled. כעת תוכל לבחור אחת מהאפשרויות הבאות:

9. שנה כעת את מדיניות הביצוע שלך למדיניות הרצויה.

  • להרשות רק סקריפטים מחותמים – מאפשר את ביצוע כל הסקריפטים כאשר הוצאו לאור על ידי מוציא רשיון מהימן.
  • להרשות סקריפטים מקומיים וסקריפטים מרוחקים מחותמים – מאפשר ריצת סקריפטים מקומיים אך סקריפטים שהורדו מהאינטרנט צריכים להיות מחותמים על ידי מוציא רשיון מהימן.
  • להרשות את כל הסקריפטים – מאפשר את ביצוע כל הסקריפטים.
List Execution Policy

הקצאת עצם מדיניות הקבוצה

לאחר שיצרת את ה-GPO, הגיע הזמן להקצות אותו למחשבי היעד שלך. כדי לעשות זאת, עליך להקצות את ה-GPO ליחידת ארגון של פעילות פעילה (OU) ב-Director הפעיל.

אם, במקום ליצור GPO חדש, ערכת GPO קיים, זה כבר ישמע שה-GPO הוקצה כבר ל-OU.

  1. ב-ניהול מדיניות קבוצה, נווט אל תיקיית ה OU שלך על ידי המעבר ל-דומיינים —> <יער הפעולה שלך ב-Active Directory> —> <ה OU שלך>.

2. לחץ ימינה על ה OU ובחר קישור ל-GPO קיים…

Link an Existing GPO…

3. בחר ב-GPO שנוצר כעת (מדיניות ביצוע PowerShell) ולחץ אישור.

Select the GPO

עכשיו תראה את ה-GPO שמשויך ל-OU כמו שמוצג למטה.

Link the Group Policy Object

בנקודה זו, תוכל לחכות למערכת הרענון של מדיניות קבוצה המוגדרת, או להריץ את הפקודה gpupdate על מחשב יעד כדי לכפות רענון.

נעילת שינויים במדיניות מקומית

פעם שה-GPO פעיל שמשנה את מדיניות הביצוע, משתמשים מקומיים לא יכולים עוד לשנות את המדיניות דרך מקום הפקודות של PowerShell. אם ינסו, הם יקבלו שגיאה, כפי שמוצג למטה.

Error on trying to changing execution policy manually

עובר על מדיניות הביצוע לחלוטין

כפי שאמור לפני כן, מדיניות הביצוע אינה בהכרח משמשת כהגנה. למה? כי אפשר לעבור עליה לחלוטין בכמה דרכים שונות.

שימוש בפרמטר -ExecutionPolicy Bypass

לעומת מדיניות הביצועים האחרות, מדיניות ה-Bypass נקבעת בדרך כלל לא במסוף PowerShell אלא מועברת למנוע ההרצה של powershell.exe הרץ בתור מנהל.

לדוגמה, כדי להריץ סקריפט בשם Hello World.ps1 ולדלג על כל מדיניות הביצועים, עליך לקרוא powershell.exe, להשתמש בפרמטר Bypass ולספק את נתיב הקובץ כפי שמוצג למטה.

powershell.exe -executionpolicy bypass -file '.\Hello World.ps1'
ByPass Execution Policy using bypass execution policy

קריאת סקריפטים וביצוע קוד גולמי

ניתן גם לעבור על כל מדיניות הביצועים על ידי קריאת תוכן הסקריפט ואז להעביר את התוכן הזה ישירות למנוע ההרצה של PowerShell. בכך, כל פקודה מורצת בנפרד ולא כסקריפט שלם בו זמנית.

כפי שניתן לראות למטה, מדיניות הביצועים מוגדרת כ-Restricted, אך על ידי קריאת הסקריפט והעברתו ל-powershell.exe, הכל עדיין פועל.

הגישה הזו דומה לפתיחת סקריפט בעורך PowerShell כגון PowerShell ISE או Visual Studio Code, בחירת שורה ולחיצה על F8.

Get-Content '.\Hello World.ps1' | powershell.exe -noprofile
Alternative way to Bypass Execution Policy

מסקנה

עכשיו אתה אמור לדעת הכל על מדיניות הביצועים של PowerShell. אף על פי שהן לא מדייניות אבטחה ממשית, עדיין עליך לנהל אותן בארגון שלך לפי מדיניות ארגונית.

Source:
https://adamtheautomator.com/set-executionpolicy/