Sudo Configuration และ Sudoers File บน Linux

ในระบบ Linux การรัน Command ด้วยสิทธิ์ root โดยตรงเป็นแนวปฏิบัติที่อันตราย เพราะความผิดพลาดเพียงครั้งเดียวอาจทำลายระบบได้ทั้งหมด sudo (Superuser Do) คือเครื่องมือที่ช่วยให้ User ทั่วไปสามารถรัน Command เฉพาะที่ได้รับอนุญาต ด้วยสิทธิ์สูงกว่าปกติ โดยไม่ต้อง Login เป็น root โดยตรง

บทความนี้อธิบายหลักการทำงานของ sudo, วิธีกำหนดสิทธิ์ผ่าน Sudoers File, และ Best Practices ที่ใช้ในสภาพแวดล้อม Production จริง

sudo ทำงานอย่างไร

เมื่อ User รันคำสั่งพร้อม sudo ระบบจะตรวจสอบว่า User นั้นมีสิทธิ์รัน Command นั้นหรือไม่ โดยอ้างอิงจากไฟล์ /etc/sudoers หาก User มีสิทธิ์ ระบบจะขอ Password ของ User คนนั้น (ไม่ใช่ Password ของ root) แล้วจึงรัน Command ด้วยสิทธิ์ที่กำหนด โดยค่าเริ่มต้น sudo จะจำ Authentication ไว้ 5 นาที (configurable) ก่อนจะขอ Password ซ้ำ

# รัน command ด้วยสิทธิ์ root
sudo apt update

# รัน command ในฐานะ user อื่น
sudo -u www-data php artisan queue:work

# เปิด shell ด้วยสิทธิ์ root (ระวัง)
sudo -i
sudo -s

# ดู sudo privilege ของตัวเอง
sudo -l

Sudoers File — /etc/sudoers

ไฟล์ /etc/sudoers คือไฟล์กำหนดสิทธิ์หลักของ sudo ห้ามแก้ไขโดยตรงด้วย Editor ทั่วไป เพราะถ้า Syntax ผิดพลาด sudo จะใช้งานไม่ได้ทั้งระบบ ให้ใช้คำสั่ง visudo ซึ่งจะตรวจสอบ Syntax ก่อน Save เสมอ

# แก้ไข sudoers อย่างถูกต้อง — ต้องใช้ visudo เสมอ
sudo visudo

# ระบุ editor ที่ต้องการ
sudo EDITOR=nano visudo

โครงสร้าง Sudoers Rule

รูปแบบของแต่ละ Rule ใน sudoers คือ

WHO WHERE=(AS_WHO) WHAT

# ตัวอย่าง
john    ALL=(ALL:ALL) ALL
%sudo   ALL=(ALL:ALL) ALL
deploy  ALL=(www-data) /usr/bin/php

โดยแต่ละส่วนมีความหมายดังนี้ ส่วน WHO ระบุว่าใครได้รับสิทธิ์ (ชื่อ User หรือชื่อ Group นำหน้าด้วย %) ส่วน WHERE ระบุว่า Rule นี้ใช้บน Hostname ใด (ALL หมายถึงทุก Host) ส่วน AS_WHO ระบุว่าสามารถรันในฐานะ User/Group ใด และส่วน WHAT ระบุว่า Command ใดที่ได้รับอนุญาต

ตัวอย่าง Rule ที่ใช้บ่อย

# ให้ user "alice" มีสิทธิ์ทุกอย่าง (เทียบเท่า root)
alice   ALL=(ALL:ALL) ALL

# ให้ทุก user ใน group sudo มีสิทธิ์ทุกอย่าง (Ubuntu default)
%sudo   ALL=(ALL:ALL) ALL

# ให้ทุก user ใน group wheel มีสิทธิ์ทุกอย่าง (RHEL/CentOS default)
%wheel  ALL=(ALL:ALL) ALL

# ให้ user "deploy" รัน systemctl restart nginx ได้โดยไม่ต้องใส่ password
deploy  ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx

# ให้ user "monitor" ดู log ได้อย่างเดียว
monitor ALL=(ALL) NOPASSWD: /usr/bin/tail, /bin/cat /var/log/*

NOPASSWD — รัน sudo โดยไม่ต้องใส่ Password

ในสภาพแวดล้อม Automation เช่น CI/CD Pipeline หรือ Script อัตโนมัติ การที่ sudo ขอ Password ทุกครั้งเป็นปัญหา จึงใช้ NOPASSWD เพื่อยกเว้น แต่ต้องระบุ Command ให้ชัดเจนที่สุดเสมอ ไม่ควรใช้ NOPASSWD กับ ALL

# ไม่ดี — เปิด NOPASSWD กว้างเกินไป
deploy  ALL=(ALL) NOPASSWD: ALL

# ดี — ระบุ command เฉพาะที่จำเป็น
deploy  ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl reload nginx
deploy  ALL=(ALL) NOPASSWD: /usr/bin/certbot renew

sudoers.d — กำหนดสิทธิ์แยกไฟล์

แทนที่จะแก้ไข /etc/sudoers โดยตรง แนวปฏิบัติที่ดีกว่าคือสร้างไฟล์แยกใน Directory /etc/sudoers.d/ ซึ่ง sudoers จะ Include ไฟล์ทั้งหมดใน Directory นี้โดยอัตโนมัติ ช่วยให้จัดการสิทธิ์แยกตาม User หรือ Service ได้ง่าย และลดความเสี่ยงจากการแก้ไขไฟล์หลัก

# สร้างไฟล์สิทธิ์สำหรับ user deploy
sudo visudo -f /etc/sudoers.d/deploy

# ตัวอย่างเนื้อหาในไฟล์ /etc/sudoers.d/deploy
deploy  ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx
deploy  ALL=(ALL) NOPASSWD: /bin/systemctl restart php8.1-fpm

# กำหนด permission ให้ถูกต้อง (สำคัญมาก)
sudo chmod 0440 /etc/sudoers.d/deploy

ไฟล์ใน /etc/sudoers.d/ ต้องมี Permission 0440 เสมอ ถ้า Permission ไม่ถูกต้อง sudo จะปฏิเสธไฟล์นั้นและแจ้งเตือน

เพิ่ม User เข้า sudo Group

วิธีที่ง่ายที่สุดในการให้ User มีสิทธิ์ sudo คือการเพิ่มเข้า Group ที่กำหนดไว้ใน sudoers โดย Ubuntu ใช้ Group sudo ส่วน RHEL/CentOS/Rocky ใช้ Group wheel

# Ubuntu/Debian — เพิ่มเข้า group sudo
sudo usermod -aG sudo username

# RHEL/CentOS/Rocky/AlmaLinux — เพิ่มเข้า group wheel
sudo usermod -aG wheel username

# ตรวจสอบว่าเพิ่มสำเร็จ (ต้อง logout/login ก่อนถึงจะมีผล)
groups username
id username

sudo Log และ Audit

ทุกการใช้งาน sudo จะถูกบันทึก Log ไว้ ทำให้สามารถตรวจสอบย้อนหลังได้ว่าใครรัน Command อะไร เมื่อไหร่ บน System ส่วนใหญ่ Log จะอยู่ที่ /var/log/auth.log (Debian/Ubuntu) หรือ /var/log/secure (RHEL-based)

# ดู sudo log บน Ubuntu/Debian
sudo grep "sudo" /var/log/auth.log | tail -20

# ดู sudo log บน RHEL/CentOS
sudo grep "sudo" /var/log/secure | tail -20

# ตัวอย่าง log entry
# Apr 16 10:30:00 server sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/bin/systemctl restart nginx

Best Practices สำหรับ sudo

  • ใช้ visudo เสมอ — ห้ามแก้ไข /etc/sudoers โดยตรงด้วย Editor อื่น เพราะ Syntax Error จะทำให้ sudo พัง
  • Principle of Least Privilege — ระบุ Command เฉพาะที่จำเป็น อย่าให้สิทธิ์ ALL เกินความจำเป็น
  • ใช้ sudoers.d — แยกไฟล์สิทธิ์ตาม User หรือ Service เพื่อจัดการง่ายและลด Risk
  • จำกัด NOPASSWD — ใช้ได้แต่ต้องระบุ Command ที่ชัดเจน ไม่ควรเปิด NOPASSWD ALL
  • Disable root SSH Login — บังคับให้ทุกคนต้อง Login ด้วย User ปกติแล้วใช้ sudo แทน ตั้งค่าผ่าน PermitRootLogin no ใน sshd_config
  • Review สม่ำเสมอ — ตรวจสอบ sudoers.d และ Group Membership เป็นระยะ ลบสิทธิ์ที่ไม่ใช้แล้ว

สรุป

sudo เป็นเครื่องมือสำคัญที่ช่วยให้ Admin จัดการสิทธิ์ได้อย่างละเอียดโดยไม่ต้อง Share root Password หัวใจของการใช้งานอยู่ที่ /etc/sudoers ซึ่งต้องแก้ไขผ่าน visudo เสมอ การใช้ /etc/sudoers.d/ ช่วยให้จัดการสิทธิ์แยกรายการได้สะดวก และ NOPASSWD ควรใช้เฉพาะกับ Command ที่ระบุชัดเจนเท่านั้น การบันทึก Log ของ sudo ยังช่วยด้าน Audit Trail สำหรับการตรวจสอบความปลอดภัยด้วย

แนะนำบริการ DE

การฝึกกำหนดสิทธิ์ sudo และทดสอบ Sudoers File จำเป็นต้องมีสิทธิ์ root บน Server จริง Cloud VPS ของ DE ให้คุณเข้าถึง Root Shell ได้เต็มที่ เหมาะสำหรับทดลองตั้งค่า sudo, กำหนด sudoers.d, และฝึก Security Configuration โดยไม่กระทบ Production

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ User Permission ระดับ System Cloud Hosting ของ DE มีระบบจัดการสิทธิ์ผ่าน Control Panel ที่ปลอดภัยและใช้งานง่าย