คำตอบสั้น ๆ: อัปเดตแพ็กเกจ Ubuntu ด้วย apt อย่างถูกวิธี ตรวจว่าต้องรีบูตหรือไม่ และเปิด unattended-upgrades ให้ติดตั้ง Security Update ให้อัตโนมัติทุกวัน
คู่มือนี้อธิบาย Ubuntu ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ช่องโหว่ด้านความปลอดภัยของซอฟต์แวร์ถูกค้นพบและแก้ไขอยู่เสมอ เซิร์ฟเวอร์ที่ไม่ได้อัปเดตนาน ๆ จึงเป็นเป้าหมายที่ง่ายที่สุดของการโจมตีอัตโนมัติ Ubuntu มีเครื่องมือ unattended-upgrades ที่ติดตั้ง Security Update ให้เองทุกวัน โดยค่าเริ่มต้นจะติดตั้งเฉพาะแพ็กเกจจากช่องทาง Security ซึ่งเสี่ยงต่อการทำให้ระบบเปลี่ยนพฤติกรรมน้อยที่สุด
คู่มือนี้แบ่งเป็นสองส่วน คือการอัปเดตแพ็กเกจด้วยตนเองอย่างถูกวิธี และการเปิด Security Update อัตโนมัติ ใช้ได้กับ Ubuntu 22.04 และ 24.04
สิ่งที่ต้องเตรียม
- Ubuntu 22.04/24.04 และผู้ใช้ที่ใช้
sudoได้ - Backup หรือ Snapshot ล่าสุดของเซิร์ฟเวอร์ก่อนอัปเดตครั้งใหญ่ ดู การ Backup Server บน Cloud ของ TDC
- ช่วงเวลาที่รีบูตได้ เพราะการอัปเดต Kernel และไลบรารีหลักต้องรีบูตจึงจะมีผล
ส่วนที่ 1: อัปเดตแพ็กเกจด้วยตนเอง
ขั้นตอนที่ 1: ดึงรายการแพ็กเกจล่าสุด
sudo apt update
ท้ายผลลัพธ์จะบอกจำนวนแพ็กเกจที่อัปเดตได้ เช่น 23 packages can be upgraded. Run 'apt list --upgradable' to see them.
ขั้นตอนที่ 2: ดูรายการก่อนติดตั้ง
apt list --upgradable
ตรวจว่ามีแพ็กเกจสำคัญ เช่น ฐานข้อมูล, Web Server หรือ PHP อยู่ในรายการหรือไม่ ถ้ามี ควรเลือกทำในช่วงที่มีผู้ใช้น้อย
ขั้นตอนที่ 3: ติดตั้งอัปเดต
sudo apt upgrade
apt จะแสดงรายการและถาม Do you want to continue? [Y/n] ตอบ Y บน Ubuntu 22.04 ขึ้นไป เมื่อเสร็จ needrestart อาจแสดงหน้าจอถามว่าจะรีสตาร์ตบริการใดบ้าง โดยทั่วไปกด Enter เพื่อยอมรับรายการที่เลือกไว้ได้
apt upgrade จะไม่ลบแพ็กเกจและไม่ติดตั้งแพ็กเกจใหม่ แพ็กเกจที่ต้องทำเช่นนั้นจะขึ้นว่า kept back ถ้าต้องการติดตั้งส่วนนี้ด้วย ให้ใช้ sudo apt full-upgrade และอ่านรายการแพ็กเกจที่จะถูกลบให้ละเอียดก่อนยืนยัน บางแพ็กเกจที่ขึ้น kept back เป็นเพราะ Phased Update ของ Ubuntu ที่ทยอยปล่อยให้เครื่องทีละส่วน กรณีนี้รอสักระยะแล้วจะติดตั้งได้เอง
ขั้นตอนที่ 4: ตรวจว่าต้องรีบูตหรือไม่
cat /var/run/reboot-required 2>/dev/null
cat /var/run/reboot-required.pkgs 2>/dev/null
ถ้าคำสั่งแรกแสดง *** System restart required *** ให้วางแผนรีบูต คำสั่งที่สองบอกว่าแพ็กเกจใดต้องการการรีบูต ถ้าไม่แสดงอะไรเลย แปลว่ายังไม่ต้องรีบูต
ขั้นตอนที่ 5: ลบแพ็กเกจที่ไม่ใช้แล้ว
sudo apt autoremove --purge
ช่วยลบ Kernel รุ่นเก่าที่ไม่ได้ใช้ ทำให้ /boot และดิสก์ไม่เต็ม
ส่วนที่ 2: เปิด Security Update อัตโนมัติ
ขั้นตอนที่ 1: ติดตั้งและเปิดใช้งาน
Ubuntu Server ส่วนใหญ่ติดตั้ง unattended-upgrades มาแล้ว คำสั่งนี้จะยืนยันหรือติดตั้งให้
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
หน้าจอจะถาม Automatically download and install stable updates? เลือก Yes ขั้นตอนนี้สร้างไฟล์ /etc/apt/apt.conf.d/20auto-upgrades ตรวจเนื้อหาได้ด้วย
cat /etc/apt/apt.conf.d/20auto-upgrades
ต้องมีสองบรรทัดนี้ ค่า "1" หมายถึงทำทุกวัน
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
ขั้นตอนที่ 2: ปรับการตั้งค่า
การตั้งค่าหลักอยู่ที่ /etc/apt/apt.conf.d/50unattended-upgrades ไฟล์นี้เป็นของแพ็กเกจ ถ้าแก้แล้วอาจถูกถามเรื่องไฟล์ชนกันตอนอัปเกรดแพ็กเกจ ทางที่สะอาดกว่าคือสร้างไฟล์ใหม่ที่ถูกอ่านทีหลังเพื่อเขียนทับเฉพาะค่าที่ต้องการ
sudo nano /etc/apt/apt.conf.d/52unattended-upgrades-local
// ลบ Kernel และแพ็กเกจที่ไม่ใช้แล้วหลังอัปเดต
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// ไม่รีบูตเอง (เปลี่ยนเป็น "true" ถ้ายอมให้รีบูตอัตโนมัติ)
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
ค่า Automatic-Reboot ต้องเลือกให้เหมาะกับงาน ถ้าตั้งเป็น "true" เครื่องจะรีบูตตามเวลาที่กำหนดเมื่อมีอัปเดตที่ต้องรีบูต ซึ่งทำให้ระบบปลอดภัยต่อเนื่องแต่บริการจะหยุดไปชั่วครู่ ถ้าตั้งเป็น "false" ต้องคอยตรวจ /var/run/reboot-required และรีบูตเอง
ส่วนที่กำหนดว่าจะอัปเดตจากช่องทางใดอยู่ในบล็อก Unattended-Upgrade::Allowed-Origins ของไฟล์ 50unattended-upgrades ค่าเริ่มต้นอนุญาตช่องทาง Release หลักของเวอร์ชัน (ซึ่งไม่มีการเปลี่ยนแพ็กเกจหลังออกรุ่น) และช่องทางที่ลงท้ายด้วย -security (รวมถึง ESM ถ้าเครื่องเปิดใช้ Ubuntu Pro) ส่วนบรรทัด "${distro_id}:${distro_codename}-updates"; ถูกปิดไว้ด้วย // แนะนำให้คงค่าเริ่มต้นไว้สำหรับเซิร์ฟเวอร์ Production
ถ้ามีแพ็กเกจที่ไม่ต้องการให้อัปเดตเอง เช่น ฐานข้อมูลที่ต้องการควบคุมเวลาอัปเกรดเอง ให้เพิ่มลงในไฟล์ 52unattended-upgrades-local
Unattended-Upgrade::Package-Blacklist {
"mariadb-server";
};
ตรวจไวยากรณ์ของไฟล์ทั้งหมดด้วย apt-config dump | grep -i unattended ถ้าไฟล์มีข้อผิดพลาด คำสั่งนี้จะแสดง Error พร้อมชื่อไฟล์และบรรทัด