ডিজিটাল সিগনেচারযুক্ত একটি স্ক্রিপ্ট বা এক্সিকিউটেবল ফাইল ব্যবহারকারীকে নিশ্চিত করে যে ফাইলটি আসল এবং এর কোড কোনো তৃতীয় পক্ষ দ্বারা পরিবর্তন করা হয়নি। পাওয়ারশেলের বর্তমান ভার্সনগুলিতে *.ps1 স্ক্রিপ্ট ফাইল কোড সাইনিং-এর জন্য বিল্ট-ইন টুল রয়েছে ডিজিটাল সার্টিফিকেট ব্যবহার করে।
আপনি একটি বিশেষ ধরনের সার্টিফিকেট ব্যবহার করে পাওয়ারশেল স্ক্রিপ্ট সাইন করতে পারেন – Code Signing। এই সার্টিফিকেট একটি বাহ্যিক কমার্শিয়াল সার্টিফিকেশন অথরিটি (CA), অভ্যন্তরীণ এন্টারপ্রাইজ CA থেকে প্রাপ্ত করা যায় অথবা সেলফ-सাইনড সার্টিফিকেটও ব্যবহার করা যায়।
মান लीজिए, আপনার ডোমেইনে PKI সার্ভিস (Active Directory Certificate Services) ডিপ্লয় করা আছে। https://CA-server-name/certsrv-এ যান এবং Code Signing টেমপ্লেট দিয়ে একটি নতুন সার্টিফিকেট রিকোয়েস্ট করুন (এই টেমপ্লেটটি প্রথমে সার্টিফিকেশন অথরিটি কনসোলে সক্ষম করা দরকার)।
ব্যবহারকারী MMC স্ন্যাপ-ইন Certificates → My Account → Personal → All Tasks → Request a new certificate থেকে পাওয়ারশেল স্ক্রিপ্ট সাইন করার জন্য সার্টিফিকেট রিকোয়েস্ট করতে পারেন।
আপনি যদি ম্যানুয়ালি সার্টিফিকেট রিকোয়েস্ট করেন, তবে আপনার কাছে .cer এক্সটেনশনযুক্ত একটি x509 সার্টিফিকেট ফাইল থাকবে। এই সার্টিফিকেট আপনার কম্পিউটারের লোকাল সার্টিফিকেট স্টোরে ইনস্টল করা দরকার।
নিচের পাওয়ারশেল কমান্ডগুলো ব্যবহার করে সার্টিফিকেটকে কম্পিউটারের ট্রাস্টেড রুট সার্টিফিকেটগুলিতে যোগ করতে পারেন:
$certFile = Export-Certificate -Cert $cert -FilePath C:\ps\certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
যদি আপনি সেলফ-सাইনড সার্টিফিকেট ব্যবহার করতে চান, তবে CodeSigning সার্টিফিকেট তৈরি করতে New-SelfSignedCertificate কামডলেট ব্যবহার করুন DNS নাম testPC1-র সাথে:
New-SelfSignedCertificate -DnsName testPC1 -Type CodeSigning
$cert = New-SelfSignedCertificate -Subject "Cert for Code Signing” -Type CodeSigningCert -DnsName test1 -CertStoreLocation cert:\LocalMachine\My
সার্টিফিকেট জেনারেট হওয়ার পর, সেটিকে Intermediate কন্টেইনার থেকে Trusted Root-এ সরান Certificate Manager কনসোল (certmgr.msc) ব্যবহার করে।
সার্টিফিকেট পাওয়ার পর, পাওয়ারশেল স্ক্রিপ্ট এক্সিকিউশন পলিসি কনফিগার করুন যাতে শুধু সাইন করা স্ক্রিপ্ট চালানো যায়। ডিফল্টলি উইন্ডোজ ১০/উইন্ডোজ সার্ভার ২০১৬-এ পাওয়ারশেল এক্সিকিউশন পলিসি Restricted সেট থাকে (যেকোনো পাওয়ারশেল স্ক্রিপ্ট এক্সিকিউশন ব্লক করে)।
File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system.
শুধু সাইন করা PS1 স্ক্রিপ্ট চালানোর অনুমতি দিতে পাওয়ারশেল এক্সিকিউশন পলিসি AllSigned বা RemoteSigned-এ পরিবর্তন করুন (এখানে একমাত্র পার্থক্য হলো RemoteSigned ইন্টারনেট থেকে ডাউনলোড করা স্ক্রিপ্টের জন্য সিগনেচার বাধ্যতামূলক করে):
Set-ExecutionPolicy AllSigned –Force
এই মোডে, আনসাইনড পাওয়ারশেল স্ক্রিপ্ট চালানোর চেষ্টা করলে ত্রুটি আসে:
File C:\script.ps1 cannot be loaded. The file script.ps1 is not digitally signed. You cannot run this script on the current system.
গ্রুপ পলিসি ব্যবহার করেও সাইন করা পাওয়ারশেল স্ক্রিপ্ট চালানোর অনুমতি দেওয়া যায়: Computer Configuration → Policies → Administrative Templates → Windows Components → Windows PowerShell এর অধীনে Turn on Script Execution প্যারামিটার। এর ভ্যালু Allow only signed scripts সেট করুন।
এখন পাওয়ারশেল স্ক্রিপ্ট ফাইল সাইন করার 차례। প্রথমে কারেন্ট ইউজারের লোকাল সার্টিফিকেট স্টোর থেকে CodeSign সার্টিফিকেট নিন। সবচেয়ে প্রথমে কোড সাইন করার জন্য উপযোগী সব সার্টিফিকেট লিস্ট করুন:
Get-ChildItem cert:\CurrentUser\my –CodeSigningCert
আমাদের কেসে, পারসোনাল ইউজার সার্ট স্টোর থেকে প্রথম সার্টিফিকেট নিয়ে $cert ভেরিয়েবলে সংরক্ষণ করি:
$cert = (Get-ChildItem cert:\CurrentUser\my –CodeSigningCert)[0]
যদি আপনি আপনার সার্টিফিকেটকে ট্রাস্টেড রুট সার্টিফিকেট স্টোরে সরিয়ে ফেলেন, তবে নিচের কমান্ডটি ব্যবহার করুন:
$cert = (Get-ChildItem Cert:\LocalMachine\AuthRoot –CodeSigningCert)[0]
এই সার্টিফিকেটটি ব্যবহার করে আপনার পাওয়ারশেল স্ক্রিপ্টের PS1 ফাইল সাইন করুন:
Set-AuthenticodeSignature -Certificate $cert -FilePath C:\PS\testscript.ps1
আপনি নিচের কমান্ডটিও ব্যবহার করতে পারেন (এখানে আমরা DNS নাম দ্বারা তৈরি সেলফ-सাইনড সার্টিফিকেট সিলেক্ট করছি):
Set-AuthenticodeSignature C:\PS\test_script.ps1 @(gci Cert:\LocalMachine\AuthRoot -DnsName testPC1 -codesigning)[0]
-TimestampServer "https://timestamp.verisign.com/scripts/timstamp.dll"
যদি আপনি সাধারণ SSL/TLS সার্টিফিকেট ব্যবহার করে স্ক্রিপ্ট সাইন করার চেষ্টা করেন, তবে ত্রুটি আসে:
Set-AuthenticodeSignature: Cannot sign code. The specified certificate is not suitable for code signing.
একই ফোল্ডারের সব পাওয়ারশেল স্ক্রিপ্ট ফাইল একসাথে সাইন করতে পারেন:
Get-ChildItem c:\ps\*.ps1| Set-AuthenticodeSignature -Certificate $Cert
এখন চেক করুন পাওয়ারশেল স্ক্রিপ্ট ফাইলটি সঠিকভাবে সাইন হয়েছে কিনা। Get-AuthenticodeSignature কামডলেট ব্যবহার করুন বা PS1 ফাইলের প্রপার্টিজ খুলে Digital Signatures ট্যাবে যান।
Get-AuthenticodeSignature c:\ps\test_script.ps1 | ft -AutoSize
যদি Set-AuthenticodeSignature কমান্ড চালানোর সময় UnknownError ওয়ার্নিং আসে, তবে এই সার্টিফিকেট ট্রাস্টেড নয়, কারণ এটি ইউজারের পারসোনাল সার্টিফিকেট স্টোরে অবস্থিত।
এটিকে Trusted Root Certificates-এ সরান (নियमিতভাবে উইন্ডোজ সার্টিফিকেট স্টোরে সন্দেহজনক সার্টিফিকেট চেক করুন এবং ট্রাস্টেড রুট সার্টিফিকেট লিস্ট আপডেট করুন):
Move-Item -Path $cert.PSPath -Destination "Cert:\LocalMachine\Root"
এখন PS1 ফাইলের সিগনেচার ভেরিফাই করলে Valid স্ট্যাটাস ফেরত দেওয়া উচিত।
পাওয়ারশেল স্ক্রিপ্ট ফাইল সাইন করার সময়, Set-AuthenticodeSignature কামডলেট PS1 টেক্সট ফাইলের শেষে একটি ডিজিটাল সিগনেচার ব্লক যোগ করে:
# SIG # Begin signature block ........... ........... # SIG # End signature block
সিগনেচার ব্লকে স্ক্রিপ্টের হ্যাশ থাকে যা প্রাইভেট কী দিয়ে এনক্রিপ্ট করা থাকে।
প্রথমবার স্ক্রিপ্ট চালানোর চেষ্টা করলে একটি ওয়ার্নিং আসবে:
Do you want to run software from this untrusted publisher? File C:\PS\script.ps1 is published by CN=testPC1 and is not trusted on your system. Only run scripts from trusted publishers.
যদি আপনি স্ক্রিপ্টের প্রথম রান টাইমে [A] Always run সিলেক্ট করেন, তবে একই সার্টিফিকেট দিয়ে সাইন করা স্ক্রিপ্ট পরবর্তীবার চালালে ওয়ার্নিং আর আসবে না।
এই ওয়ার্নিং প্রতিবন্ধ করতে হলে সার্টিফিকেটকে Trusted Publishers সার্টিফিকেশন অথরিটিতে কপি করতে হবে। সার্টিফিকেট কনসোলে Copy-Paste অপারেশন ব্যবহার করে সার্টিফিকেটকে Trusted Publishers → Certificates-এ কপি করুন।
সাইন করা পাওয়ারশেল স্ক্রিপ্ট এখন আনট্রাস্টেড পাবলিশার নোটিফিকেশন ছাড়া চালাবে।
টিপ। CA রুট সার্টিফিকেট এবং স্ক্রিপ্ট সাইন করার জন্য ব্যবহৃত সার্টিফিকেট অবশ্যই ট্রাস্টেড হতে হবে (অন্যথায় স্ক্রিপ্ট চলবে না)। GPO ব্যবহার করে ডোমেইন কম্পিউটারগুলিতে সার্টিফিকেট সেন্ট্রালি ডিপ্লয় করা যায়। সার্টিফিকেটগুলো GPO-এর নিচের পাবলিক কি সেকশনে রাখতে হবে: Computer Configuration → Policies → Windows Settings → Security Settings → Public Key Policies → Trusted Root Certification Authorities এবং Trusted Publishers।যদি রুট সার্টিফিকেট আনট্রাস্টেড থাকে, তবে পাওয়ারশেল স্ক্রিপ্ট চালালে ত্রুটি আসবে:
A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
সাইন করা পাওয়ারশেল স্ক্রিপ্ট ফাইলের কোড পরিবর্তন করলে কী হবে? এটি চালানোর চেষ্টা ব্লক হবে এই নোটিফিকেশন দিয়ে যে স্ক্রিপ্টের কন্টেন্ট পরিবর্তন করা হয়েছে।
File xx.ps1 cannot be loaded. The contents of file xx.ps1 might have been changed by an unauthorized user or process, because the hash of the file does not match the hash stored in the digital signature. The script cannot run on the specified system.
Get-AuthenticodeSignature কামডলেট ব্যবহার করে স্ক্রিপ্টের সিগনেচার ভেরিফাই করুন। যদি ক্যালকুলেটেড হ্যাশ সিগনেচারের হ্যাশের সাথে মেলে না, তবে HashMismatch মেসেজ আসবে।
অতএব, সাইন করা PS1 স্ক্রিপ্টের কোড যেকোনো পরিবর্তন সেটিকে পুনঃসাইন করার প্রয়োজন হবে।