<rss
      xmlns:atom="http://www.w3.org/2005/Atom"
      xmlns:media="http://search.yahoo.com/mrss/"
      xmlns:content="http://purl.org/rss/1.0/modules/content/"
      xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      version="2.0"
    >
      <channel>
        <title><![CDATA[Block of Vaz]]></title>
        <description><![CDATA[Random thought of a System Engineer]]></description>
        <link>https://blog.siamstr.com/tag/cybersecurity/</link>
        <atom:link href="https://blog.siamstr.com/tag/cybersecurity/rss/" rel="self" type="application/rss+xml"/>
        <itunes:new-feed-url>https://blog.siamstr.com/tag/cybersecurity/rss/</itunes:new-feed-url>
        <itunes:author><![CDATA[VΔz]]></itunes:author>
        <itunes:subtitle><![CDATA[Random thought of a System Engineer]]></itunes:subtitle>
        <itunes:type>episodic</itunes:type>
        <itunes:owner>
          <itunes:name><![CDATA[VΔz]]></itunes:name>
          <itunes:email><![CDATA[VΔz]]></itunes:email>
        </itunes:owner>
            
      <pubDate>Sun, 23 Jun 2024 10:15:02 GMT</pubDate>
      <lastBuildDate>Sun, 23 Jun 2024 10:15:02 GMT</lastBuildDate>
      
      <itunes:image href="https://image.nostr.build/ba269bb842d8e1c6ada4ea3f9203aa570f1610cceeaca6a35c281f28274a914a.jpg" />
      <image>
        <title><![CDATA[Block of Vaz]]></title>
        <link>https://blog.siamstr.com/tag/cybersecurity/</link>
        <url>https://image.nostr.build/ba269bb842d8e1c6ada4ea3f9203aa570f1610cceeaca6a35c281f28274a914a.jpg</url>
      </image>
      <item>
      <title><![CDATA[มาทำ Secure Boot บน Linux กันเถอะ]]></title>
      <description><![CDATA[ไหนมีใครใช้ Linux บ้าง???]]></description>
             <itunes:subtitle><![CDATA[ไหนมีใครใช้ Linux บ้าง???]]></itunes:subtitle>
      <pubDate>Sun, 23 Jun 2024 10:15:02 GMT</pubDate>
      <link>https://blog.siamstr.com/post/1klj6-rzdcev_jaakoli3/</link>
      <comments>https://blog.siamstr.com/post/1klj6-rzdcev_jaakoli3/</comments>
      <guid isPermaLink="false">naddr1qq2nz66vdgmz65j6g33k2ajlffqkz660f35nxq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wvzj7x2</guid>
      <category>siamstr</category>
      
        <media:content url="https://image.nostr.build/55e82d0b3a6bd7157e9a6baa0558cbb230c03c78f1d64ef4608c020ea20c9cc7.jpg" medium="image"/>
        <enclosure 
          url="https://image.nostr.build/55e82d0b3a6bd7157e9a6baa0558cbb230c03c78f1d64ef4608c020ea20c9cc7.jpg" length="0" 
          type="image/jpeg" 
        />
      <noteId>naddr1qq2nz66vdgmz65j6g33k2ajlffqkz660f35nxq3qvaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qxpqqqp65wvzj7x2</noteId>
      <npub>npub1vaz88a5zhsqsrj220vh5vdnpjsu53msm34hzvcrh27x5d7zeav7qm45t60</npub>
      <dc:creator><![CDATA[VΔz]]></dc:creator>
      <content:encoded><![CDATA[<h2>Secure Boot คืออะไร?</h2>
<p>Secure Boot เป็นฟังก์ชั่นของระบบไบออส UEFI ที่ป้องกันการติดตั้งไฟล์ระบบที่ไม่ได้รับการอนุมัติจากผู้ผลิดเมนบอร์ด<br>โดยเมื่อระบบบูต, ไบออส UEFI จะตรวจหาลายเซ็นดิจิตอลในไฟล์บูตของระบบปฏิบัติการ<br>หากตรวจพบและเช็คความถูกต้องผ่านหมด ก็จะทำการบูตระบบปฏิบัติการนั้นขึ้นมา<br>แต่ถ้าไม่พบ, ไม่ถูกต้อง หรือลายเซ็นมาจากเจ้าที่ไม่รู้จัก ก็จะปฏิเสธการบูตระบบนั้น</p>
<p>ฟีเจอร์นี้มีไว้ในกรณีที่ระบบปฏิบัติการที่มีรูโหว่แล้วถูกไวรัสเขียนทับไฟล์ระบบที่ใช้บูต หรือถูกผู้อื่นเข้าถึงคอมของเราแล้ววางไฟล์บูตที่มีช่องโหว่ให้โจมตีได้<br>เมื่อผู้ใช้รีสตาร์ต ระบบจะหยุดทำงานที่จอดำเพื่อไม่ให้ไวรัสก่อความเสียหายเพิ่มเติม หรือถูกโจมตีระบบ</p>
<h2>จำเป็นแค่ไหน?</h2>
<p>หากว่าระบของเราไม่ได้เข้ารหัสแบบ Full-disk encryption แล้วนั้น ตัว secure boot ไม่ได้จำเป็น หรือไม่มีประโยชน์ใด ๆ เลย นอกจากให้ Microsoft บังคับห้ามเราลง ระบบประติบัติการที่เราต้องการเท่านั้น (ปิด secure boot ใน bios ก็สามารถเข้าระบบได้เลย)</p>
<p>แต่สำหรับระบบที่เข้ารหัสไว้นั้น จะช่วยเพิ่มความปลอดภัยไปอีกระดับ เช่นหากโดยขโมยคอมไป แม้เขาจะพยายามแก้ไขไฟล์ boot ก็ไม่สามารถเข้าถึงระบบเราได้อยู่ดี มีเดียวทางเดียวคือล้างข้อมูลทั้งหมดทิ้งไปเท่านั้น ถึงจะใช้งานคอมเครื่องนั้น ๆ ได้ แม้จะปิด secure boot ใน bios แล้วก็ตาม</p>
<p>ทำให้ระบบ Linux ที่เข้ารหัสไว้ ปลอดภัยขึ้นอีกชั้นนึง</p>
<h2>Boot Loader</h2>
<pre><code>BIOS &gt; BOOT LOADER &gt; KERNEL &gt; INIT SYSTEM
</code></pre>
<p>ในระบบประติบัติการ Linux นั้น มีตัวเลือกสำหรับ Boot Loader ที่หลากหลาย อย่างระบบใหม่ ๆ จะใช้ systemd-boot ที่สะดวกใช้งานง่าย ปรับอะไรได้ไม่มากนัก<br>โดยตัวที่ใช้เยอะที่สุดคงจะเป็น GRUB ซึ่งสามารถปรับแต่งได้แทบทุก logic ของการบูตเข้าระบบของเรา และในบทความนี้ เราจะใช้ GRUB ในการทำ Secure Boot</p>
<p>โดยก่อนหน้านั้นเราต้องแบ่ง partition ส่วนนึงไปให้ <code>/boot/efi</code> ซึ่งเป็น filesystem แบบ fat ทั่ว ๆ ไป สำหรับ ให้ bios อ่านไฟล์ boot ของเราได้</p>
<pre><code class="language-sh">❯ sudo fdisk -l
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: WD PC SN735 SDBPNHH-512G-1002
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9A5798B5-DC04-4770-A26B-3A489642CF32

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    2099199   2097152     1G EFI System
/dev/nvme0n1p2 2099200 1000214527 998115328 475.9G Linux filesystem
</code></pre>
<p>และอีกส่วน จะใช้ LVM (Logical Volume Management) ในการสร้าง Volume Group (VG) บน SSD ของผม สำหรับติดตั้งระบบที่เข้ารหัสไว้ โดยจะแบ่งพื้นที่ส่วนนึงไปเป็น <code>swap</code> partition ใช้สำหรับการเก็บข้อมูลตอนที่เราพับจอ หรือเข้าโหมด sleep<br>ที่เหลือทั้งหมด ก็จะเป็นพื้นที่ติดตั้ง Linux ของผม (disk นี้ผมไม่ได้แยก <code>/home</code>(user's home) กับ <code>/</code>(root) ไว้คนละ Partition เพราะว่าผมชอบทำ root เต็มบ่อย ๆ ฮาาา)</p>
<pre><code class="language-sh">❯ sudo vgscan
  Found volume group "vg0" using metadata type lvm2

❯ sudo lvscan
  ACTIVE            '/dev/vg0/swap' [17.00 GiB] inherit
  ACTIVE            '/dev/vg0/void' [458.93 GiB] inherit
</code></pre>
<p>สำหรับวิธีการติดตั้ง Linux แบบเข้ารหัสนั้น มีอยู่ตามคู่มือตอนติดตั้ง Linux เกือบทุกตัวอยู่แล้ว ไม่ต้อง งง ยิ่งพวกที่เป็น GUI install อย่าง Fedora, Ubuntu บลา ๆ นั้นแค่คลิก ๆ ก็ทำได้แล้ว (แถมทำ Secure Boot ได้เลยอีกต่างหาก)</p>
<p>โดยที่ระบบที่ผมใช้ในบทความนี้ คือ <a href="https://voidlinux.org/">VoidLinux</a> ซี่งเป็นระบบง่าย ๆ ไม่มี systemd ให้กวนใจ</p>
<p>ส่วนของ software ที่ใช้จะมี</p>
<ol>
<li>grub</li>
<li>sbctl<br>และ bash script เล็กน้อย ในการทำ kernel hook สำหรับการ Sign ไฟล์ boot ของเราอัตโนมัติหลังจาก Update</li>
</ol>
<h1>เริ่มกันเลย!</h1>
<p>อย่างแรก ตั้งค่า SecureBoot ใน Bios เป็น Setup-Mode ให้เรียบร้อยก่อน<br> จากนั้นต้องตั้งค่า Grub กันใหม่ โดยเพิ่ม module <code>tpm</code> และ <code>--disable-shim-lock</code> (สำหรับ Microsoft's CA) เผื่อกรณีที่อยากทำ Dual Boot เข้า Windows ด้วย</p>
<pre><code class="language-sh">sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void --modules="tpm" --disable-shim-lock
</code></pre>
<p>จากนั้นก็มา Gen ไฟล์ตั้งค่าที่เพิ่งทำไปด้วยคำสั่ง</p>
<pre><code class="language-sh">sudo grub-mkconfig -o /boot/grub/grub.cfg
</code></pre>
<p>แล้วก็ติดตั้ง sbctl ให้เรียบร้อย </p>
<pre><code class="language-sh">sudo xbps-install sbctl
</code></pre>
<p>จากนั้นลองเช็คด้วยคำสั่ง <code>sbctl status</code> ก็จะแสดงผลประมาณนี้</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
.....
</code></pre>
<p>จากนั้นเราก็จะสร้าง Key สำหรับการ Sign ไฟล์ Boot ของเรา</p>
<pre><code class="language-sh">sudo sbctl create-keys
</code></pre>
<p>พอได้คีย์แล้ว <code>enroll-keys</code> ต่อ คำสั่งนี้จะสร้างรหัสสำหรับ Verify ใน Bios ให้เราหลังจากการตั้ง Setup-Mode ใน Secure Boot (<code>-m</code> คือการเพิ่ม Cert ของ Microsoft ไปด้วย เผื่อ Dual Boot)</p>
<pre><code class="language-sh">sudo sbctl enroll-keys -m
</code></pre>
<p>หลังจากขั้นตอนนี้ก็ใช้คำสั่งดู status อีกรอบ<br>และใช้คำสั่ง <code>sudo sbctl verify</code> เพื่อดูว่าเราต้อง Sign ไฟล์ไหนบ้าง</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
Owner GUID:     61bb7cf9-38bb-4ef5-94f6-960b095c9322
Setup Mode:     ✓ Disabled
Secure Boot:    ✓ Enabled
Vendor Keys:    microsoft
❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi..
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>อย่างตัวอย่างข้างบนคือไฟล์เหล่านี้ได้ถูก sign เรียบร้อยแล้ว ก็สามารถ Boot ด้วย Secure Boot ได้เลย<br>หากไฟล์ไหนยังไม่ได้ Sign ก็จัดการด้วยคำสั่ง <code>sudo sbctl sign -s /ไฟล์พาท</code> เช่น</p>
<pre><code class="language-sh">sudo sbctl sign -s /boot/efi/EFI/void/grubx64.efi
</code></pre>
<p>แล้วก็ลอง <code>sudo sbctl verify</code> ดูว่า sign เรียบร้อยดีไหม<br>ถ้าเรียบร้อยแล้วก็สามารถ reboot ไปเปิด SecureBoot ดูได้เลย ว่า Boot เข้าระบบได้หรือไม่</p>
<p>และบางระบบก็ต้อง sign ไฟล์ kernel ด้วยเหมือนกัน อย่างระบบผม ต้อง sign <code>/boot/vmlinuz-{version}</code>  ด้วย ไม่งั้น Boot ไม่ได้</p>
<pre><code class="language-sh">❯ sudo sbctl sign -s /boot/vmlinuz-6.9.6_1

❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi...
✓ /boot/vmlinuz-6.9.6_1 is signed
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>หลังจาก reboot ด้วย SecureBoot ได้เรียบร้อย เป็นอันเสร็จ<br>แต่อย่าลืมว่าถ้าระบบ Update เราต้องกลับมา Sign เองใหม่หรือเปล่า??</p>
<h2>Kernel Hook</h2>
<p>โดยทั่วไป ระบบ Linux จะมี Directory <code>/etc/kernel.d/post-install/</code> ซึ่งจะรวบรวมเอา Script สำหรับใช้หลังจาก Update ระบบเช่น ตัว Grub เอง ก็สร้างไฟล์ config ใหม่ทุกครั้งหลังจาก update kernel</p>
<pre><code class="language-sh">cat /etc/kernel.d/post-install/50-grub
#!/bin/sh
#
# Kernel hook for GRUB 2.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#
PKGNAME="$1"
VERSION="$2"

export ZPOOL_VDEV_NAME_PATH=YES

if command -v grub-mkconfig &gt;/dev/null 2&gt;&amp;1; then
        if [ -d $ROOTDIR/boot/grub ]; then
                grub-mkconfig -o $ROOTDIR/boot/grub/grub.cfg
                exit $?
        fi
fi

exit 0
</code></pre>
<p>และสังเกตุว่า ไฟล์ทั้งหมดใน Directory นี้นั้น จะนำหน้าด้วยตัวเลข ซึ่งเป็นลำดับของการทำงานนั่นเอง โดยที่เลขน้อยกว่า จะถูกรันก่อน จนครบ</p>
<pre><code class="language-sh">❯ sudo ls /etc/kernel.d/post-install/ -l
10-dkms
 20-initramfs -&gt; ../../../usr/libexec/dracut/kernel-hook-postinst
 50-bootsize
50-efibootmgr
50-grub
</code></pre>
<p>เราก็จะทำการ Copy ไฟล์ <code>50-grub</code> มาเป็น templates ในการทำ kernel hook และตั้งชื่อว่า <code>60-sign</code> เพื่อให้แน่ใจว่า ทุกอย่างถูกติดตั้งไปก่อน แล้ว sign เป็นลำดับสุดท้าย</p>
<pre><code class="language-sh">sudo cp /etc/kernel.d/post-install/50-grub  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็เข้าไปแก้ไขไฟล์</p>
<pre><code class="language-sh">sudo vi  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็ปรับคำสั่งเป็น sbctl ให้เรียบร้อย<br>จะสังเกตุว่าผมได้ใช้ sign สองครั้ง คือ <code>grub config</code> และไฟล์ kernel <code>vmlinuz-</code> ที่มีเวอร์ชั่นตามท้าย</p>
<pre><code class="language-bash">#!/bin/sh
#
# Kernel post-install hook for surcue boot.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#

PKGNAME="$1"
VERSION="$2"

if command -v sbctl &gt;/dev/null 2&gt;&amp;1; then
    if [ -d $ROOTDIR/boot/efi ]; then
        echo "Signing new packages v.$VERSION"
        sbctl sign -s /boot/efi/EFI/void/grubx64.efi
        sbctl sign -s /boot/vmlinuz-${VERSION}
        exit $?
    fi
fi

exit 0
</code></pre>
<p>เซฟไฟล์ และสุดท้าย ทำ permission ให้มัน excuteable หรือว่าให้โปรแกรมเรียยกทำงานได้</p>
<pre><code class="language-sh">sudo chmod +x  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>เนื่องจากว่าบางระบบจะไม่ให้ไฟล์ script ใดๆ มาทำงานได้ตามใจชอบ<br>เราต้องควบคุมเองว่าไฟล์ไหนมี <code>สิทธ์</code> ที่จะทำงานได้ นั่นเอง</p>
<p>เพียงเท่านี้ เราก็จะมีระบบเข้ารหัสที่ปลอดภัยสุด ๆ ใครจะมาแอบเสียบแฟรชไดร์มาแก้ไขไฟล์ Boot วางยาเราไม่ได้ แน่นอน</p>
]]></content:encoded>
      <itunes:author><![CDATA[VΔz]]></itunes:author>
      <itunes:summary><![CDATA[<h2>Secure Boot คืออะไร?</h2>
<p>Secure Boot เป็นฟังก์ชั่นของระบบไบออส UEFI ที่ป้องกันการติดตั้งไฟล์ระบบที่ไม่ได้รับการอนุมัติจากผู้ผลิดเมนบอร์ด<br>โดยเมื่อระบบบูต, ไบออส UEFI จะตรวจหาลายเซ็นดิจิตอลในไฟล์บูตของระบบปฏิบัติการ<br>หากตรวจพบและเช็คความถูกต้องผ่านหมด ก็จะทำการบูตระบบปฏิบัติการนั้นขึ้นมา<br>แต่ถ้าไม่พบ, ไม่ถูกต้อง หรือลายเซ็นมาจากเจ้าที่ไม่รู้จัก ก็จะปฏิเสธการบูตระบบนั้น</p>
<p>ฟีเจอร์นี้มีไว้ในกรณีที่ระบบปฏิบัติการที่มีรูโหว่แล้วถูกไวรัสเขียนทับไฟล์ระบบที่ใช้บูต หรือถูกผู้อื่นเข้าถึงคอมของเราแล้ววางไฟล์บูตที่มีช่องโหว่ให้โจมตีได้<br>เมื่อผู้ใช้รีสตาร์ต ระบบจะหยุดทำงานที่จอดำเพื่อไม่ให้ไวรัสก่อความเสียหายเพิ่มเติม หรือถูกโจมตีระบบ</p>
<h2>จำเป็นแค่ไหน?</h2>
<p>หากว่าระบของเราไม่ได้เข้ารหัสแบบ Full-disk encryption แล้วนั้น ตัว secure boot ไม่ได้จำเป็น หรือไม่มีประโยชน์ใด ๆ เลย นอกจากให้ Microsoft บังคับห้ามเราลง ระบบประติบัติการที่เราต้องการเท่านั้น (ปิด secure boot ใน bios ก็สามารถเข้าระบบได้เลย)</p>
<p>แต่สำหรับระบบที่เข้ารหัสไว้นั้น จะช่วยเพิ่มความปลอดภัยไปอีกระดับ เช่นหากโดยขโมยคอมไป แม้เขาจะพยายามแก้ไขไฟล์ boot ก็ไม่สามารถเข้าถึงระบบเราได้อยู่ดี มีเดียวทางเดียวคือล้างข้อมูลทั้งหมดทิ้งไปเท่านั้น ถึงจะใช้งานคอมเครื่องนั้น ๆ ได้ แม้จะปิด secure boot ใน bios แล้วก็ตาม</p>
<p>ทำให้ระบบ Linux ที่เข้ารหัสไว้ ปลอดภัยขึ้นอีกชั้นนึง</p>
<h2>Boot Loader</h2>
<pre><code>BIOS &gt; BOOT LOADER &gt; KERNEL &gt; INIT SYSTEM
</code></pre>
<p>ในระบบประติบัติการ Linux นั้น มีตัวเลือกสำหรับ Boot Loader ที่หลากหลาย อย่างระบบใหม่ ๆ จะใช้ systemd-boot ที่สะดวกใช้งานง่าย ปรับอะไรได้ไม่มากนัก<br>โดยตัวที่ใช้เยอะที่สุดคงจะเป็น GRUB ซึ่งสามารถปรับแต่งได้แทบทุก logic ของการบูตเข้าระบบของเรา และในบทความนี้ เราจะใช้ GRUB ในการทำ Secure Boot</p>
<p>โดยก่อนหน้านั้นเราต้องแบ่ง partition ส่วนนึงไปให้ <code>/boot/efi</code> ซึ่งเป็น filesystem แบบ fat ทั่ว ๆ ไป สำหรับ ให้ bios อ่านไฟล์ boot ของเราได้</p>
<pre><code class="language-sh">❯ sudo fdisk -l
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: WD PC SN735 SDBPNHH-512G-1002
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9A5798B5-DC04-4770-A26B-3A489642CF32

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    2099199   2097152     1G EFI System
/dev/nvme0n1p2 2099200 1000214527 998115328 475.9G Linux filesystem
</code></pre>
<p>และอีกส่วน จะใช้ LVM (Logical Volume Management) ในการสร้าง Volume Group (VG) บน SSD ของผม สำหรับติดตั้งระบบที่เข้ารหัสไว้ โดยจะแบ่งพื้นที่ส่วนนึงไปเป็น <code>swap</code> partition ใช้สำหรับการเก็บข้อมูลตอนที่เราพับจอ หรือเข้าโหมด sleep<br>ที่เหลือทั้งหมด ก็จะเป็นพื้นที่ติดตั้ง Linux ของผม (disk นี้ผมไม่ได้แยก <code>/home</code>(user's home) กับ <code>/</code>(root) ไว้คนละ Partition เพราะว่าผมชอบทำ root เต็มบ่อย ๆ ฮาาา)</p>
<pre><code class="language-sh">❯ sudo vgscan
  Found volume group "vg0" using metadata type lvm2

❯ sudo lvscan
  ACTIVE            '/dev/vg0/swap' [17.00 GiB] inherit
  ACTIVE            '/dev/vg0/void' [458.93 GiB] inherit
</code></pre>
<p>สำหรับวิธีการติดตั้ง Linux แบบเข้ารหัสนั้น มีอยู่ตามคู่มือตอนติดตั้ง Linux เกือบทุกตัวอยู่แล้ว ไม่ต้อง งง ยิ่งพวกที่เป็น GUI install อย่าง Fedora, Ubuntu บลา ๆ นั้นแค่คลิก ๆ ก็ทำได้แล้ว (แถมทำ Secure Boot ได้เลยอีกต่างหาก)</p>
<p>โดยที่ระบบที่ผมใช้ในบทความนี้ คือ <a href="https://voidlinux.org/">VoidLinux</a> ซี่งเป็นระบบง่าย ๆ ไม่มี systemd ให้กวนใจ</p>
<p>ส่วนของ software ที่ใช้จะมี</p>
<ol>
<li>grub</li>
<li>sbctl<br>และ bash script เล็กน้อย ในการทำ kernel hook สำหรับการ Sign ไฟล์ boot ของเราอัตโนมัติหลังจาก Update</li>
</ol>
<h1>เริ่มกันเลย!</h1>
<p>อย่างแรก ตั้งค่า SecureBoot ใน Bios เป็น Setup-Mode ให้เรียบร้อยก่อน<br> จากนั้นต้องตั้งค่า Grub กันใหม่ โดยเพิ่ม module <code>tpm</code> และ <code>--disable-shim-lock</code> (สำหรับ Microsoft's CA) เผื่อกรณีที่อยากทำ Dual Boot เข้า Windows ด้วย</p>
<pre><code class="language-sh">sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void --modules="tpm" --disable-shim-lock
</code></pre>
<p>จากนั้นก็มา Gen ไฟล์ตั้งค่าที่เพิ่งทำไปด้วยคำสั่ง</p>
<pre><code class="language-sh">sudo grub-mkconfig -o /boot/grub/grub.cfg
</code></pre>
<p>แล้วก็ติดตั้ง sbctl ให้เรียบร้อย </p>
<pre><code class="language-sh">sudo xbps-install sbctl
</code></pre>
<p>จากนั้นลองเช็คด้วยคำสั่ง <code>sbctl status</code> ก็จะแสดงผลประมาณนี้</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
.....
</code></pre>
<p>จากนั้นเราก็จะสร้าง Key สำหรับการ Sign ไฟล์ Boot ของเรา</p>
<pre><code class="language-sh">sudo sbctl create-keys
</code></pre>
<p>พอได้คีย์แล้ว <code>enroll-keys</code> ต่อ คำสั่งนี้จะสร้างรหัสสำหรับ Verify ใน Bios ให้เราหลังจากการตั้ง Setup-Mode ใน Secure Boot (<code>-m</code> คือการเพิ่ม Cert ของ Microsoft ไปด้วย เผื่อ Dual Boot)</p>
<pre><code class="language-sh">sudo sbctl enroll-keys -m
</code></pre>
<p>หลังจากขั้นตอนนี้ก็ใช้คำสั่งดู status อีกรอบ<br>และใช้คำสั่ง <code>sudo sbctl verify</code> เพื่อดูว่าเราต้อง Sign ไฟล์ไหนบ้าง</p>
<pre><code class="language-sh">❯ sbctl status
Installed:      ✓ sbctl is installed
Owner GUID:     61bb7cf9-38bb-4ef5-94f6-960b095c9322
Setup Mode:     ✓ Disabled
Secure Boot:    ✓ Enabled
Vendor Keys:    microsoft
❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi..
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>อย่างตัวอย่างข้างบนคือไฟล์เหล่านี้ได้ถูก sign เรียบร้อยแล้ว ก็สามารถ Boot ด้วย Secure Boot ได้เลย<br>หากไฟล์ไหนยังไม่ได้ Sign ก็จัดการด้วยคำสั่ง <code>sudo sbctl sign -s /ไฟล์พาท</code> เช่น</p>
<pre><code class="language-sh">sudo sbctl sign -s /boot/efi/EFI/void/grubx64.efi
</code></pre>
<p>แล้วก็ลอง <code>sudo sbctl verify</code> ดูว่า sign เรียบร้อยดีไหม<br>ถ้าเรียบร้อยแล้วก็สามารถ reboot ไปเปิด SecureBoot ดูได้เลย ว่า Boot เข้าระบบได้หรือไม่</p>
<p>และบางระบบก็ต้อง sign ไฟล์ kernel ด้วยเหมือนกัน อย่างระบบผม ต้อง sign <code>/boot/vmlinuz-{version}</code>  ด้วย ไม่งั้น Boot ไม่ได้</p>
<pre><code class="language-sh">❯ sudo sbctl sign -s /boot/vmlinuz-6.9.6_1

❯ sudo sbctl verify
Verifying file database and EFI images in /boot/efi...
✓ /boot/vmlinuz-6.9.6_1 is signed
✓ /boot/efi/EFI/void/grubx64.efi is signed
</code></pre>
<p>หลังจาก reboot ด้วย SecureBoot ได้เรียบร้อย เป็นอันเสร็จ<br>แต่อย่าลืมว่าถ้าระบบ Update เราต้องกลับมา Sign เองใหม่หรือเปล่า??</p>
<h2>Kernel Hook</h2>
<p>โดยทั่วไป ระบบ Linux จะมี Directory <code>/etc/kernel.d/post-install/</code> ซึ่งจะรวบรวมเอา Script สำหรับใช้หลังจาก Update ระบบเช่น ตัว Grub เอง ก็สร้างไฟล์ config ใหม่ทุกครั้งหลังจาก update kernel</p>
<pre><code class="language-sh">cat /etc/kernel.d/post-install/50-grub
#!/bin/sh
#
# Kernel hook for GRUB 2.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#
PKGNAME="$1"
VERSION="$2"

export ZPOOL_VDEV_NAME_PATH=YES

if command -v grub-mkconfig &gt;/dev/null 2&gt;&amp;1; then
        if [ -d $ROOTDIR/boot/grub ]; then
                grub-mkconfig -o $ROOTDIR/boot/grub/grub.cfg
                exit $?
        fi
fi

exit 0
</code></pre>
<p>และสังเกตุว่า ไฟล์ทั้งหมดใน Directory นี้นั้น จะนำหน้าด้วยตัวเลข ซึ่งเป็นลำดับของการทำงานนั่นเอง โดยที่เลขน้อยกว่า จะถูกรันก่อน จนครบ</p>
<pre><code class="language-sh">❯ sudo ls /etc/kernel.d/post-install/ -l
10-dkms
 20-initramfs -&gt; ../../../usr/libexec/dracut/kernel-hook-postinst
 50-bootsize
50-efibootmgr
50-grub
</code></pre>
<p>เราก็จะทำการ Copy ไฟล์ <code>50-grub</code> มาเป็น templates ในการทำ kernel hook และตั้งชื่อว่า <code>60-sign</code> เพื่อให้แน่ใจว่า ทุกอย่างถูกติดตั้งไปก่อน แล้ว sign เป็นลำดับสุดท้าย</p>
<pre><code class="language-sh">sudo cp /etc/kernel.d/post-install/50-grub  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็เข้าไปแก้ไขไฟล์</p>
<pre><code class="language-sh">sudo vi  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>แล้วก็ปรับคำสั่งเป็น sbctl ให้เรียบร้อย<br>จะสังเกตุว่าผมได้ใช้ sign สองครั้ง คือ <code>grub config</code> และไฟล์ kernel <code>vmlinuz-</code> ที่มีเวอร์ชั่นตามท้าย</p>
<pre><code class="language-bash">#!/bin/sh
#
# Kernel post-install hook for surcue boot.
#
# Arguments passed to this script: $1 pkgname, $2 version.
#

PKGNAME="$1"
VERSION="$2"

if command -v sbctl &gt;/dev/null 2&gt;&amp;1; then
    if [ -d $ROOTDIR/boot/efi ]; then
        echo "Signing new packages v.$VERSION"
        sbctl sign -s /boot/efi/EFI/void/grubx64.efi
        sbctl sign -s /boot/vmlinuz-${VERSION}
        exit $?
    fi
fi

exit 0
</code></pre>
<p>เซฟไฟล์ และสุดท้าย ทำ permission ให้มัน excuteable หรือว่าให้โปรแกรมเรียยกทำงานได้</p>
<pre><code class="language-sh">sudo chmod +x  /etc/kernel.d/post-install/60-sign
</code></pre>
<p>เนื่องจากว่าบางระบบจะไม่ให้ไฟล์ script ใดๆ มาทำงานได้ตามใจชอบ<br>เราต้องควบคุมเองว่าไฟล์ไหนมี <code>สิทธ์</code> ที่จะทำงานได้ นั่นเอง</p>
<p>เพียงเท่านี้ เราก็จะมีระบบเข้ารหัสที่ปลอดภัยสุด ๆ ใครจะมาแอบเสียบแฟรชไดร์มาแก้ไขไฟล์ Boot วางยาเราไม่ได้ แน่นอน</p>
]]></itunes:summary>
      <itunes:image href="https://image.nostr.build/55e82d0b3a6bd7157e9a6baa0558cbb230c03c78f1d64ef4608c020ea20c9cc7.jpg"/>
      </item>
      
      </channel>
      </rss>
    