يجب عليك التأكد من عدم قيام أي شخص بتعديل النصوص الخاصة بك وتمريرها على أنها أصلية؟ إذا كان الأمر كذلك، فعليك أن تتعلم كيفية توقيع نصوص 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.
الحصول على شهادة توقيع الكود
قبل أن تتعلم كيفية توقيع نص 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
للاستخدام في الخطوة التالية.
3. بعد ذلك، لجعل الكمبيوتر يثق في الشهادة الجديدة التي قمت بإنشائها، أضف الشهادة ذاتية التوقيع إلى مصدر الجذر المعتمد للشهادات و الناشرين المعتمدين في الكمبيوتر. للقيام بذلك، انسخ الكود أدناه وقم بتشغيله في PowerShell.
هناك ثلاثة أسباب رئيسية لتثبيت الشهادات ذاتية التوقيع في ثلاثة متاجر شهادات مختلفة.
- الشهادة التي أنشأتها في متجر الشهادات الشخصية هي ما ستستخدمه كشهادة توقيع الكود.
- نسخ نفس الشهادة إلى متجر الناشرين الموثوق بهم يضمن أن يثق جهاز الكمبيوتر المحلي في الناشر الذي وقع النص البرمجي. يتحقق PowerShell من الشهادة في هذا المتجر للتحقق من توقيع النص البرمجي.
- أخيرًا ، إضافة الشهادة ذاتية التوقيع إلى سلطات شهادات الجذور الموثوق بها يضمن أن يثق جهاز الكمبيوتر المحلي بالشهادات في متاجر الشخصية و الناشرين الموثوق بهم.
4. للتأكد من أن الشهادة ذات الموضوع ATA Authenticode موجودة في متاجر الشهادات الشخصية و الجذر و الناشرين الموثوق بهم في جهاز الكمبيوتر ، قم بتشغيل الأوامر أدناه في PowerShell.

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

كيفية توقيع نصوص PowerShell
الآن بعد أن قمت بإنشاء شهادة توقيع الشيفرة الخاصة بك وقمت بتثبيتها في ثلاثة مخازن للشهادات، أنت الآن جاهز لاستخدامها لتوقيع نص PowerShell الخاص بك. عندما تحتاج إلى توقيع النصوص، يعتبر الأمر Set-AuthenticodeSignature
هو النجم الرئيسي.
لتوقيع نص PowerShell، قم بتشغيل الكود أدناه في PowerShell. يقوم الأمر الأول بالحصول على شهادة توقيع الشيفرة من مخزن الشهادات الشخصية على الجهاز المحلي. الأمر الثاني يضيف توقيعًا رقميًا إلى ملف النص PowerShell.
معظم موفري الشهادات الموثوق بهم يمتلكون خادم الطابع الزمني ويمكنك العثور عليها من مواقع موفري الشهادات. على سبيل المثال، يكون خادم الطابع الزمني لـ DigiCert هو http://timestamp.digicert.com و Comodo لديها http://timestamp.comodoca.com.
بعد توقيع النص البرمجي، يجب أن ترى نتيجة مماثلة للتقاط الشاشة أدناه.

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

حذف كتلة التوقيع الرقمي من كود النص البرمجي سيجعل النص البرمجي غير موقع.
فتح خصائص ملف النص البرمجي
طريقة أخرى للتحقق من التوقيع الرقمي للنص البرمجي هي فتح خصائص ملف النص البرمجي في مستكشف Windows. للقيام بذلك:
- في مستكشف Windows، انتقل إلى موقع النص البرمجي PowerShell. في هذا المثال، يكون النص البرمجي في C:\ATA\myscript.ps1.
- انقر بزر الماوس الأيمن فوق النص البرمجي ثم انقر فوق الخصائص.
- في نافذة خصائص الملف، انقر على علامة التبويب التوقيعات الرقمية، ويجب أن ترى توقيعًا رقميًا تحت قائمة التوقيعات.

باستخدام Get-AuthenticodeSignature
هل ستفاجأ إذا علمت أنه يمكنك أيضًا التحقق من توقيع النص البرمجي داخل PowerShell؟ ربما لا. الأمر الذي يمكنك استدعاؤه لاسترداد توقيع ملف هو Get-AuthenticodeSignature
.
للحصول على توقيع النص البرمجي الرقمي، قم بتشغيل الأمر أدناه. يحصل هذا الأمر على توقيع الملف C:\ATA\myscript.ps1. يعرض الأمر Select-Object -Property *
تفاصيل التوقيع.
بعد تشغيل الأمر، يجب أن ترى نتيجة مماثلة كما في الصورة أدناه. كما ترى، تعرض خاصية SignerCertificate
تفاصيل شهادة التوقيع. بينما تعرض خاصية TimerStamperCertificate
شهادة خادم البصمات الزمنية.

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

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

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

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

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/