امنیت در PowerShell: اهداف، مکانیزم‌ها و سیاست اجرای اسکریپت‌ها

PowerShell از ابتدا با رویکردی «امنیت‌محور اما بی‌طرف» طراحی شده است. هدف آن جلوگیری از اجرای ناخواسته اسکریپت‌ها توسط کاربران ناآگاه است—not جلوگیری از اقدامات عمدی یا سوءاستفاده‌های دارای مجوز. PowerShell امنیت ویندوز را تقویت نمی‌کند و چیزی از آن کم نمی‌کند؛ تنها لایه‌هایی برای جلوگیری از اشتباهات رایج اضافه می‌کند. این مقاله سه لایه امنیتی PowerShell—نیاز به مسیر برای اجرای اسکریپت، عدم وابستگی پسوندها به اجرای مستقیم، و سیاست اجرای اسکریپت‌ها—را بررسی می‌کند و سپس به امضای دیجیتال، ساخت گواهی، و نحوه اعمال Execution Policy می‌پردازد.

PowerShell SecurityExecution PolicyScript SigningDigital SignatureMakeCertAuthenticodePath Execution Rules

~3 دقیقه مطالعه • بروزرسانی ۳۰ آذر ۱۴۰۴

1. اهداف امنیتی PowerShell


PowerShell تنها یک هدف امنیتی دارد: جلوگیری از اجرای ناخواسته اسکریپت‌ها توسط کاربران ناآگاه. این ابزار قرار نیست جلوی اقدامات عمدی یا مخرب کاربران دارای مجوز را بگیرد. اگر کاربری اجازه حذف کاربران Active Directory را دارد، PowerShell نیز همان اجازه را خواهد داشت.

PowerShell یک «دروازه امنیتی» نیست، زیرا تقریباً هیچ کاری وجود ندارد که فقط از طریق PowerShell قابل انجام باشد. امنیت واقعی باید از طریق مجوزها، نقش‌ها و سیاست‌های ویندوز اعمال شود.


2. مکانیزم‌های امنیتی PowerShell


PowerShell سه لایه امنیتی دارد که همگی به‌صورت پیش‌فرض فعال هستند:

2.1 نیاز به مسیر برای اجرای اسکریپت

  • PowerShell هرگز اسکریپت‌ها را از مسیر جاری اجرا نمی‌کند مگر اینکه مسیر مشخص شود.
  • اجرای dir هرگز dir.ps1 را اجرا نمی‌کند.
  • برای اجرای اسکریپت باید مسیر کامل یا نسبی مانند .\script.ps1 مشخص شود.
  • این کار از «هک نام فرمان» جلوگیری می‌کند.

2.2 عدم وابستگی پسوندها به اجرای مستقیم

  • فایل‌های .ps1، .psm1، .psd1 و… به‌صورت پیش‌فرض قابل اجرا نیستند.
  • دابل‌کلیک کردن یک اسکریپت آن را اجرا نمی‌کند—فقط باز می‌شود.
  • این کار از اجرای ناخواسته فایل‌های مخرب جلوگیری می‌کند.

2.3 سیاست اجرای اسکریپت‌ها (Execution Policy)

مهم‌ترین لایه امنیتی PowerShell است و تعیین می‌کند چه اسکریپت‌هایی اجازه اجرا دارند.


3. امضای دیجیتال و Script Signing


PowerShell از امضای دیجیتال برای تضمین دو چیز استفاده می‌کند:

  • هویت نویسنده اسکریپت
  • عدم تغییر اسکریپت پس از امضا

3.1 ساخت گواهی امضای دیجیتال

برای تست می‌توان از ابزار MakeCert.exe استفاده کرد:

makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 ...

3.2 امضای اسکریپت

Set-AuthenticodeSignature .\script.ps1 -Certificate $cert

اگر حتی یک کاراکتر در اسکریپت تغییر کند، امضا نامعتبر می‌شود و باید دوباره امضا شود.


4. Execution Policy در PowerShell


Execution Policy تعیین می‌کند چه اسکریپت‌هایی اجازه اجرا دارند. این سیاست امنیتی نیست—فقط یک «هشدار اولیه» است.

سطوح مختلف Execution Policy

  • Restricted: هیچ اسکریپتی اجرا نمی‌شود.
  • RemoteSigned: اسکریپت‌های محلی آزاد؛ اسکریپت‌های دانلودی نیازمند امضا.
  • AllSigned: همه اسکریپت‌ها باید امضا شده باشند.
  • Unrestricted: همه اسکریپت‌ها اجرا می‌شوند.
  • Bypass: بدون هیچ محدودیت.

مشاهده و تغییر Execution Policy

Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned

این مقدار در رجیستری ذخیره می‌شود و با Group Policy قابل کنترل است.


5. رفتار PowerShell هنگام اجرای اسکریپت‌ها


PowerShell هنگام اجرای اسکریپت‌ها موارد زیر را بررسی می‌کند:

  • آیا اسکریپت امضا شده است؟
  • آیا امضا معتبر است؟
  • آیا Execution Policy اجازه اجرا می‌دهد؟

اگر امضا نامعتبر باشد، خطای HashMismatch نمایش داده می‌شود.


نتیجه‌گیری


PowerShell امنیت ویندوز را جایگزین نمی‌کند؛ بلکه لایه‌ای برای جلوگیری از اشتباهات ناخواسته اضافه می‌کند. با درک مکانیزم‌های امنیتی، امضای دیجیتال و Execution Policy، می‌توان محیطی امن، قابل کنترل و حرفه‌ای برای اجرای اسکریپت‌ها ایجاد کرد.

نوشته و پژوهش شده توسط دکتر شاهین صیامی