كيفية توقيع نص PowerShell (وتشغيله بشكل فعّال)

يجب عليك التأكد من عدم قيام أي شخص بتعديل النصوص الخاصة بك وتمريرها على أنها أصلية؟ إذا كان الأمر كذلك، فعليك أن تتعلم كيفية توقيع نصوص PowerShell. يضيف التوقيع هوية الناشر إلى النص بحيث يمكن للمستخدمين تحديد ما إذا كانوا يثقون في مصدر النص.

في هذا المقال، تعلم كيفية ضمان تشغيل النصوص الموثوق بها فقط في بيئتك عن طريق تعلم كيفية توقيع نصوص PowerShell.

المتطلبات

إذا كنت تنوي متابعة الأمثلة في هذا المقال، فستحتاج إلى ما يلي.

  • A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
  • Windows PowerShell 5.1 أو PowerShell 6+. ستستخدم الأمثلة في هذا المقال PowerShell v7.1.3.
  • A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Write-Host "Script Execution - OK"

الحصول على شهادة توقيع الكود

قبل أن تتعلم كيفية توقيع نص PowerShell، عليك أن تحصل أولاً على شهادة توقيع الكود. في عالم مايكروسوفت، تعرف شهادات توقيع الكود أيضًا باسم شهادات Authenticode.

A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.

من أين يمكنك الحصول على شهادة توقيع الكود يعتمد على المكان الذي تنوي فيه نشر أو توزيع النصوص الموقعة. وكالعادة، يعتبر التكلفة عاملًا كبيرًا أيضًا.

  • عالمي / عام – ستحتاج إلى شهادة صادرة عن سلطة إصدار الشهادات (CA) الموثوق بها عالميًا. أمثلة على مثل هذه السلطات هي GeoTrust و DigiCert. هذه الشهادات ليست مجانية. على سبيل المثال، ستكلفك شهادة DigiCert Authenticode ما يقرب من 474 دولارًا سنويًا حسب هذا الكتابة.
  • داخلي / شبكة داخلية محلية – إذا كان لديك خادم سلطة إصدار الشهادات (CA) الداخلي، يمكنك طلب وتنزيل شهادة توقيع من خادم CA الداخلي الخاص بك.
  • شخصي / تطوير – للاختبار الشخصي أو استخدام التطويري، يجب أن تكون الشهادة ذاتية التوقيع مقبولة. هذا هو نوع شهادة التوقيع الذي ستستخدمه في هذا المقال.

إنشاء شهادة ذاتية التوقيع لتوقيع الشفرة

لقد قرأت في الجزء السابق أنه لتوقيع سكريبت PowerShell، تحتاج أولاً إلى شهادة توقيع الشفرة. نظرًا لأنك ستقوم بالاختبار الشخصي فقط في هذا البرنامج التعليمي، فإن شهادة التوقيع ذاتية التوقيع ستكون كافية. ولكن أين يمكنك الحصول عليها؟

كما يوحي الاسم، يعني التوقيع ذاتي الوقع أن جهاز الكمبيوتر المحلي سيصدر شهادة توقيع الشفرة لنفسه. لتوليد شهادة توقيع ذاتية التوقيع، اتبع هذه الخطوات.

1. افتح PowerShell كمسؤول على جهاز الكمبيوتر الخاص بك.

2. انسخ الأمر أدناه وقم بتشغيله في PowerShell. يستخدم هذا الأمر cmdlet New-SelfSignedCertificate لإنشاء شهادة توقيع رمز جديدة. اسم الشهادة هو ATA Authenticode داخل متجر الشهادات الشخصية للكمبيوتر المحلي.

يدعم cmdlet New-SelfSignedCertificate إنشاء الشهادات فقط في متجر الشهادات الشخصية الخاص بالمستخدم الحالي (cert:\CurrentUser\My) أو متجر الشهادات الشخصية للكمبيوتر المحلي (cert:\LocalMachine\My). الشهادات في cert:\LocalMachine\My متاحة على مستوى الكمبيوتر.

يقوم الأمر أيضًا بتخزين كائن الشهادة في متغير $authenticode للاستخدام في الخطوة التالية.

# قم بإنشاء شهادة Authenticode ذاتية التوقيع في متجر الشهادات الشخصية للكمبيوتر المحلي.
 $authenticode = New-SelfSignedCertificate -Subject "ATA Authenticode" -CertStoreLocation Cert:\LocalMachine\My -Type CodeSigningCert

3. بعد ذلك، لجعل الكمبيوتر يثق في الشهادة الجديدة التي قمت بإنشائها، أضف الشهادة ذاتية التوقيع إلى مصدر الجذر المعتمد للشهادات و الناشرين المعتمدين في الكمبيوتر. للقيام بذلك، انسخ الكود أدناه وقم بتشغيله في PowerShell.

# أضف شهادة Authenticode ذاتية التوقيع إلى متجر الشهادات الجذر على الكمبيوتر.
## أنشئ كائنًا لتمثيل متجر الشهادات الجذر LocalMachine\Root.
 $rootStore = [System.Security.Cryptography.X509Certificates.X509Store]::new("Root","LocalMachine")
## افتح متجر الشهادات الجذر للقراءة والكتابة.
 $rootStore.Open("ReadWrite")
## أضف الشهادة المخزنة في المتغير $authenticode.
 $rootStore.Add($authenticode)
## أغلق متجر الشهادات الجذر.
 $rootStore.Close()
 
# أضف شهادة Authenticode ذاتية التوقيع إلى متجر الشهادات الموثوق بها على الكمبيوتر.
## أنشئ كائنًا لتمثيل متجر الشهادات الموثوق بها LocalMachine\TrustedPublisher.
 $publisherStore = [System.Security.Cryptography.X509Certificates.X509Store]::new("TrustedPublisher","LocalMachine")
## افتح متجر الشهادات الموثوق بها للقراءة والكتابة.
 $publisherStore.Open("ReadWrite")
## أضف الشهادة المخزنة في المتغير $authenticode.
 $publisherStore.Add($authenticode)
## أغلق متجر الشهادات الموثوق بها.
 $publisherStore.Close()

هناك ثلاثة أسباب رئيسية لتثبيت الشهادات ذاتية التوقيع في ثلاثة متاجر شهادات مختلفة.

  • الشهادة التي أنشأتها في متجر الشهادات الشخصية هي ما ستستخدمه كشهادة توقيع الكود.
  • نسخ نفس الشهادة إلى متجر الناشرين الموثوق بهم يضمن أن يثق جهاز الكمبيوتر المحلي في الناشر الذي وقع النص البرمجي. يتحقق PowerShell من الشهادة في هذا المتجر للتحقق من توقيع النص البرمجي.
  • أخيرًا ، إضافة الشهادة ذاتية التوقيع إلى سلطات شهادات الجذور الموثوق بها يضمن أن يثق جهاز الكمبيوتر المحلي بالشهادات في متاجر الشخصية و الناشرين الموثوق بهم.

4. للتأكد من أن الشهادة ذات الموضوع ATA Authenticode موجودة في متاجر الشهادات الشخصية و الجذر و الناشرين الموثوق بهم في جهاز الكمبيوتر ، قم بتشغيل الأوامر أدناه في PowerShell.

# تأكيد ما إذا كانت الشهادة ذاتية التوقيع Authenticode موجودة في متجر الشهادات الشخصية للكمبيوتر
 Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
# تأكيد ما إذا كانت الشهادة ذاتية التوقيع Authenticode موجودة في متجر الشهادات الجذر للكمبيوتر
 Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
# تأكيد ما إذا كانت الشهادة ذاتية التوقيع Authenticode موجودة في متجر شهادات الناشرين الموثوق بهم للكمبيوتر
 Get-ChildItem Cert:\LocalMachine\TrustedPublisher | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}
Confirming the creation of the new self-signed certificate

5. لعرض الشهادة بواجهة رسومية بدلاً من ذلك ، افتح Snap-in الشهادات وابحث عن الشهادة التي أنشأتها تحت مجلد الشهادات داخل متاجر الشهادات الشخصية، سلطات شهادات الجذور الموثوق بها، و الناشرين الموثوق بهم.

Viewing certificates in the Microsoft Management Console (MMC)

كيفية توقيع نصوص PowerShell

الآن بعد أن قمت بإنشاء شهادة توقيع الشيفرة الخاصة بك وقمت بتثبيتها في ثلاثة مخازن للشهادات، أنت الآن جاهز لاستخدامها لتوقيع نص PowerShell الخاص بك. عندما تحتاج إلى توقيع النصوص، يعتبر الأمر Set-AuthenticodeSignature هو النجم الرئيسي.

لتوقيع نص PowerShell، قم بتشغيل الكود أدناه في PowerShell. يقوم الأمر الأول بالحصول على شهادة توقيع الشيفرة من مخزن الشهادات الشخصية على الجهاز المحلي. الأمر الثاني يضيف توقيعًا رقميًا إلى ملف النص PowerShell.

# احصل على شهادة توقيع الشيفرة من مخزن الشهادات على الكمبيوتر المحلي بالاسم *ATA Authenticode* وقم بتخزينها في المتغير $codeCertificate.
$codeCertificate = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=ATA Authenticode"}

# قم بتوقيع النص PowerShell
# المعلمات:
# مسارالملف - يحدد مسار الملف لنص PowerShell الذي سيتم توقيعه، على سبيل المثال C:\ATA\myscript.ps1.
# الشهادة - يحدد الشهادة المستخدمة عند توقيع النص.
# TimeStampServer - يحدد خادم الطابع الزمني الموثوق الذي يضيف طابع زمني إلى توقيع النص الرقمي الخاص بك. إضافة طابع زمني يضمن أن يظل رمزك صالحًا حتى ينتهي صلاحية شهادة التوقيع. 
Set-AuthenticodeSignature -FilePath C:\ATA\myscript.ps1 -Certificate $codeCertificate -TimeStampServer *<http://timestamp.digicert.com>*

معظم موفري الشهادات الموثوق بهم يمتلكون خادم الطابع الزمني ويمكنك العثور عليها من مواقع موفري الشهادات. على سبيل المثال، يكون خادم الطابع الزمني لـ DigiCert هو http://timestamp.digicert.com و Comodo لديها http://timestamp.comodoca.com.

بعد توقيع النص البرمجي، يجب أن ترى نتيجة مماثلة للتقاط الشاشة أدناه.

How to Sign PowerShell Scripts

فحص توقيع النص البرمجي في PowerShell

حتى الآن، قمت بتوقيع نص برمجي في PowerShell باستخدام الشهادة الموقعة ذاتيًا التي أنشأتها. ولكن كيف تعرف ما إذا كان النص البرمجي يحمل توقيعًا رقميًا؟

فتح الكود

طريقة واحدة لتأكيد توقيع رقمي للنص البرمجي هي فتح النص البرمجي وعرض الكود في محرر نصوص. مثل الشرح أدناه، يحتوي النص البرمجي الموقع على كتلة توقيع في نهاية الكود. تبدأ كتلة التوقيع بـ # SIG # Begin signature block وتنتهي بـ # SIG # End signature block.

Viewing the digital signature in the script’s content

حذف كتلة التوقيع الرقمي من كود النص البرمجي سيجعل النص البرمجي غير موقع.

فتح خصائص ملف النص البرمجي

طريقة أخرى للتحقق من التوقيع الرقمي للنص البرمجي هي فتح خصائص ملف النص البرمجي في مستكشف Windows. للقيام بذلك:

  1. في مستكشف Windows، انتقل إلى موقع النص البرمجي PowerShell. في هذا المثال، يكون النص البرمجي في C:\ATA\myscript.ps1.
  2. انقر بزر الماوس الأيمن فوق النص البرمجي ثم انقر فوق الخصائص.
  3. في نافذة خصائص الملف، انقر على علامة التبويب التوقيعات الرقمية، ويجب أن ترى توقيعًا رقميًا تحت قائمة التوقيعات.
Viewing the digital signature in the script’s file properties

باستخدام Get-AuthenticodeSignature

هل ستفاجأ إذا علمت أنه يمكنك أيضًا التحقق من توقيع النص البرمجي داخل PowerShell؟ ربما لا. الأمر الذي يمكنك استدعاؤه لاسترداد توقيع ملف هو Get-AuthenticodeSignature.

للحصول على توقيع النص البرمجي الرقمي، قم بتشغيل الأمر أدناه. يحصل هذا الأمر على توقيع الملف C:\ATA\myscript.ps1. يعرض الأمر Select-Object -Property * تفاصيل التوقيع.

Get-AuthenticodeSignature -FilePath C:\\ATA\\myscript.ps1 | Select-Object -Property *

بعد تشغيل الأمر، يجب أن ترى نتيجة مماثلة كما في الصورة أدناه. كما ترى، تعرض خاصية SignerCertificate تفاصيل شهادة التوقيع. بينما تعرض خاصية TimerStamperCertificate شهادة خادم البصمات الزمنية.

Viewing the digital signature in PowerShell

تشغيل نص برمجي PowerShell موقعاً

في هذه النقطة، لقد قمت بتوقيع نص برمجي PowerShell وتأكدت من وجود التوقيع الرقمي. ولكن، الاختبار النهائي لمعرفة ما إذا كنت قمت بجميع الخطوات بشكل صحيح هو تنفيذ النص البرمجي والتأكد من تشغيله.

تحتوي PowerShell على ميزة أمان تحمي المستخدمين من تشغيل النصوص عن غير قصد. تسمى هذه الميزة الأمان سياسات التنفيذ. باختلاف سياسة التنفيذ، قد يمنع PowerShell تشغيل النصوص أو يسمح بها.

لمعرفة المزيد حول السياسات المختلفة للتنفيذ وكيفية تأثيرها على تنفيذ النصوص، راجع سياسات تنفيذ PowerShell: الفهم والإدارة.

لتشغيل نص PowerShell موقع، اتبع هذه الخطوات.

أولاً، قم بتغيير سياسة التنفيذ إلى AllSigned لضمان أنه يمكن تشغيل النصوص الموقعة فقط. دون القيام بهذه الخطوة، لا يمكنك اختبار ما إذا كان النص الموقع يعمل بشكل دقيق. للقيام بذلك، استدعي الأمر Set-ExecutionPolicy بتشغيل الأمر أدناه في PowerShell كمسؤول.

Set-ExecutionPolicy AllSigned

ثم، قم بتنفيذ نص PowerShell الموقع.

C:\ATA\myscript.ps1

يجب أن يعمل النص بدون أخطاء أو تحذيرات، كما يمكنك رؤية النتيجة أدناه.

Running the signed script without errors

ولكن إذا كان النص موقعًا بشكل غير صحيح أو غير موقع على الإطلاق بطريقة ما، فسوف تحصل على خطأ مشابه للصورة أدناه. في هذه الحالة، قم بمراجعة الخطوات الخاصة بك وحاول توقيع النص مرة أخرى.

Running a script with errors regarding the digital signature

ماذا لو قمت في نهاية المطاف بتحديث النص الخاص بك؟ هل ستظل التوقيع الرقمي ساري المفعول؟ الإجابة هي لا. أي تعديل على النص الموقع سيبطل توقيعه الرقمي. ستفشل تشغيل النص المعدل وستنتج عنه خطأ.

اتبع هذه الخطوات لاختبار نص موقع معدل.

1. افتح النص الموقع myscript.ps1 في محرر نص أو كود.

2. قم بتعديل الشيفرة لإضافة حرف، مثل شرطة سفلية في هذا المثال. لا تقم بتغيير أي شيء آخر.

Editing the signed script

3. احفظ النص بعد تعديل الشيفرة.

4. في النهاية، قم بتنفيذ النص المعدل في PowerShell عن طريق تشغيل الأمر أدناه.

C:\ATA\myscript.ps1

نظرًا لأنك قمت بتعديل النص الموقع، فإن تنفيذ النص سيؤدي إلى الخطأ المعروض أدناه. ستحتاج إلى توقيع النص مرة أخرى لتحديث وإصلاح توقيعه الرقمي.

Running a signed script with a broken digital signature

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.

الاستنتاج

في هذا المقال، تعلمت لماذا قد يكون توقيع نصوص PowerShell ضروريًا اعتمادًا على سياسات التنفيذ. كما تعلمت كيفية التمييز بين نص موقع وغير موقع. وأخيرًا، تعلمت كيفية توقيع نصوص PowerShell بشكل رقمي وكيفية اختبارها وتشغيلها.

الآن بعد أن تعرف كيفية توقيع النصوص في PowerShell، هل ستبدأ في توقيع النصوص قبل توزيعها أو نشرها؟

Source:
https://adamtheautomator.com/how-to-sign-powershell-script/