PowerShell Code Sign และ Self-Signed Certificate

สวัสดีครับ ผม Chaba_OK! เราจะมาเรียนรู้การสร้าง PowerShell script file ให้มีความน่าเชื่อถือว่า ไม่โดนแก้ไขโดยใช้ Code signing certificate ซึ่งเหมาะกับการนำไปใช้งานใน Production System

เริ่มต้นต้องตรวจสอบก่อนว่า PowerShell ต้องเป็น version 4.0 ขึ้นไป

01

การ Sign ต้องใช้ Certificate ถ้าเป็นงาน Production เราควรใช้ Certificate ที่ออกจาก Certificate Authority แต่สำหรับการทดสอบเราจะใช้ Self-signed certificate สร้างด้วยคำสั่งนี้

02

จากคำสั่ง เป็นการสร้าง Certificate เพื่อทำ Digital Signature มีอายุ 5 ปี สำหรับ domain ชื่อ api.vm360degree.com ซึ่งหากตั้งเป็นชื่ออื่นที่เหมาะกับงานก็ได้  เมื่อสร้างสำเร็จ Certificate จะถูกเก็บไว้ที่ Local Machine วิธีเปิดดูให้กด [Windows]+[R] | mmc.exe | File | Add/Remove Snap-in … เลือก Certificates | Click ที่ปุ่ม Add > | เลือก Computer account | เลือก Local Computer | กด Finish ผลตามภาพด้านล่าง

03

ลำดับต่อไป เราจะต้องย้าย Certificate ไปเก็บไว้ที่ Trusted Root Certificate ด้วยคำสั่ง move-item การอ้างอิงถึง Certificate จะใช้ค่า Thumbprint ของ Cettificate ที่สร้างไปไว้แล้ว

04

จะได้ผลลัพธ์ตามภาพด้านล่าง

05

หรือ กลับไปเรียกด้วย PowerShell คือ

06.PNG

ตอนนี้เรามี Certificate – Code Signing พร้อมจะ Signed ซึ่งในตัวอย่าง ได้เตรียม file  hello.ps1 มีหน้าตาแบบนี้

07

ใช้คำสั่งเพื่อสร้าง Sign ในภาพ

08

ในตัวอย่างผมใช้เครื่องหมาย ` เพื่อขึ้นบบรทัดใหม่โดยที่ยังไม่จบคำสั่ง ซึ่งในคีย์บอร์ดภาษาไทยเป็นตัวเปลี่ยนภาษา ก็ให้ copy ไปแปะแทนก็ได้ และหลังสัญลักษณ์นี้ห้ามเว้นวรรคให้ขึ้นบรรทัดใหม่ทันที ผลที่ได้คือในไฟล์ hello.ps1 จะมี Signature แปะไว้

09

วิธีการตรวจสอบว่าไฟล์ที่ Signed ไว้มีการแก้ไขหรือเปล่าให้คำสั่ง Get-AuthenticodeSignature ผลก็ได้ตามภาพด้านล่าง ปกติ Status ต้องเป็น valid แต่ถ้าถูกแก้จะได้เป็น  HashMismatch10.PNG

Script ที่ใช้ทั้งหมดอยู่ด้านล่าง

สรุป เราเรียนรู้ 2 เรื่องคือ

  1. การสร้าง Self-signed certificate ด้วย PowerShell ทำความเข้าใจให้ดี เพราะจะใช้งานต่อไปอีกในครั้งต่อไป เช่น Azure KeyVault, WinRM แบบ HTTPS
  2. การ Signed PowerShell Script เพื่อป้องกันการแก้ไข

สุดท้ายขอฝาก Facebook group – Azure Thailand User Group ไว้ด้วยครับ

Reference

Create Code Signing Certificate on Windows for signing PowerShell scripts

https://blogs.technet.microsoft.com/heyscriptingguy/2010/06/17/hey-scripting-guy-how-can-i-sign-windows-powershell-scripts-with-an-enterprise-windows-pki-part-2-of-2/

https://www.ddls.com.au/blog/creating-a-self-signed-certificate-for-powershell/

Advertisements

PowerShell สำหรับผู้ดูแล Windows Server ตอนที่ 1

PowerShell คือ ภาษา Shell Script ที่ Microsoft สร้างขึ้นมาให้ผู้ดูแลระบบงานบน Windows  ใช้สั่งให้เครื่องทำงาน  มันใช้ได้กับ Windows และอีกหลายโปรแกรม ซึ่งดีกว่าการใช้คำสั่งใน DOS โดยที่ PowerShell นี้มากับ Windows ทำงานอยู่บน.Net Framework และต่อมาเมื่อมี .Net Core สำหรับ Linux ก็มี PowerShell บน Linux ด้วย จากจุดเริ่มต้นมันช่วยให้สั่งงานผ่าน Command Line และ Batch File (PowerShell Script File) ต่อมาการทำงานของ Microsoft เกือบทุกเรื่องก็รองรับ PowerShell แล้ว  การไม่ต้องยึดติดกับ GUI ตลอดเวลา มันช่วยให้ทำงานเป็น  Automate ได้มากขึ้น สรุปง่ายๆ ว่าอะไรที่ต้องซ้ำๆ ให้เขียนเป็น PowerShell Script เก็บไว้ใช้ได้ มันช่วยให้ทำงานได้เร็วขึ้น เป็นมาตรฐาน ลดความผิดพลาด

เมื่อไรถึงจะใช้ PowerShell

การใช้คำสั่งบน Windows ยุคก่อนมี PowerShell บางคำสั่งเป็น GUI บางครั้งก็เป็น Command Line แนวทางยังไม่ชัดเจน ต่อมาตั้งแต่มี PowerShell คนใน Microsoft เห็นประโยชน์จึงนำไป Integrate กับ Product อืนๆ เช่น Config Windows Server, Active Directory, Exchange, SharePoint เป็นต้น โดยการสั่งงานอะไรที่ทำผ่าน GUI ได้ ก็จะมีคำสั่งใน PowerShell ได้เช่นกัน มันจึงช่วยให้การทำงานเป็นระบบมากขึ้น เช่น ทำเป็น script แก้ไขระบบ ไปทดลองก่อนในระบบทดสอบ เมื่อเสร็จก็นำไปใช้จริงที่ระบบ Production หรือ การสั่งงานบางอย่างที่มีความซับซ้อนหรือระดับ low level มากๆ เหล่านี้ก็ใช้ PowerShell ได้ และหากใช้บ่อยก็หาเครื่องมือทำ Version เช่น GIT มาช่วยด้วย

วิธีเปิด PowerShell Console

Console ของ PowerShell มีให้ใช้ทั้งแบบ Command Line และแบบที่มี Editor คือ PowerShell Integrated Scripting Environment (ISE)  เรามักใช้ Command Line เมื่อ Run script ส่วน ISE เหมาะกับการใช้เขียน Script การเปิดทำได้หลายวิธีคือ

วิธีที่ 1 – Click ที่ icon บน Taskbar  image สำหรับ Command Line หรือ ise_icon สำหรับ PowerShell ISE

วิธีที่ 2 – กดปุ่ม Windows + R พิมพ์ powershell_ise  หรือ powershell

วิธีที่ 3 – เปิด Command Windows แล้วพิมพ์คำสั่ง powershell_ise  หรือ powershell

ด้านล่างเป็นตัวอย่างหน้าจอ PowerShell ISE  ที่ใช้เขียน Script ในหน้าจอแบ่งเป็น 3 ช่อง ที่ใช้บ่อยคือ Script pane เพื่อเขียน Script และช่อง Console เพื่อดู Output

ise

Hello, World

PowerShell ใช้รูปแบบคำสั่ง verb-noun ให้จำไปใช้กันง่ายๆ ตัวอย่างของ Verb เช่น Get, Set, Write, Remove เป็นต้น คำสั่งแสดงผลหน้าจอก็เป็น  write-host “hello,world” มี 4 คำสั่ง เป็นคำสั่งสามัญประจำบ้าน จดจำไว้เลย

  • get-help  ใช้แสดงวิธีใช้คำสั่ง
  • get-member ใช้เพื่อขอดูว่า คำสั่งที่เรียกใช้ มีคุณสมบัติอะไรให้ใช้งานบ้าง
  • select-object ใช้เพื่อขอดูว่า คำสั่งที่เรียกใช้ มีคุณสมบัติอะไรให้ใช้งานบ้าง

เราจะทดลองคำสั่ง 4 อันนี้ โดยใช้คำสั่ง get-date เป็นตัวอย่าง

get-help ใช้เพื่อขอดูวิธีใช้คำสั่งที่เราต้อง เช่น  get-help get-date ในภาพด้านล่าง

 

image

จากภาพด้านบนมีคำอธิบายดังนี้

1. เป็นการใช้คำสั่ง Get-Help เพื่อขอดูวิธีใช้คำสั่ง Get-Date

2. Syntax เป็นการบอกวิธีใช้

3. Description บอกว่า gets a DateTime object

4. Remark 4 วิธีเพิ่มเติม

get-help get date –example
get-help get-date –detailed
get-help get-date –full
get-help get-date –online

คำสั่งที่ใช้ใน PowerShell แบ่งออกเป็น 4 พวกคือ Cmdlet, PowerShell Functions, PowerShell Scripts และ Native Windows Command แต่ละพวกมีรายละเอียดต่อไปนี้

1. Cmdlet (อ่านว่า คอม-เหล็ด Command-Let) เป็นรูปแบบการเรียกคำสั่งแบบ “Verb-noun” ที่สื่อความหมายของคำสั่งได้ง่าย ได้แก่ คำสั่ง Get-Command

image

2. PowerShell Function – ความหมายของ Function คือ ฺBlock of Code เราสามารถเขียนคำสั่งเป็น Function แล้ว save เก็บในไฟล์เพื่อทำใช้ซ้ำบ่อยได้ แต่หากเราใช้คำสั่ง Get-Command จะเห็นว่าคำสั่งที่มากับ PowerShell บางอันก็เป็น Function และบางอันก็เป็น Cmdlet ในึครั้งต่อไปเราจะฝึกเขียน Function กัน

 

Reference

  1. PowerShell cmd vs. function  (https://powershell.org/forums/topic/cmdlets-vs-functions/)
  2. PowerShell Function http://windowsitpro.com/windows/create-your-own-powershell-functions