คู่มือครบครันสำหรับ sudo - ระบบให้สิทธิ์ Root แบบเจาะจง (Granular) แทนการ Login Root โดยตรง
sudo คืออะไร?
- ให้ User ทั่วไป รันคำสั่งเป็น Root (หรือ User อื่น)
- ควบคุมได้ละเอียด: User, Host, Command, NOPASSWD
- Log ทุกการใช้งาน (Audit trail)
- Ubuntu Default: Lock root account, ใช้ sudo แทน
แก้ไข sudoers: visudo
# visudo
- ใช้ Editor ที่ปลอดภ (ตรวจสอบ Syntax ก่อน Save)
- ไฟล์จริง:
/etc/sudoers+/etc/sudoers.d/ - ห้ามแก้ /etc/sudoers โดยตรง - ผิด Syntax = Locked out
Syntax พื้นฐาน
user host=(runas) commands
ตัวอย่าง
# Full root access
calvin ALL=(ALL) ALL
# เฉพาะ restart apache
calvin ALL=(ALL) /etc/init.d/httpd restart
# หลายคำสั่ง (คั่นด้วย comma)
calvin ALL=(ALL) /etc/init.d/httpd restart, /etc/init.d/httpd stop
# ไม่ต้องรหัสผ่าน (NOPASSWD)
calvin ALL=(ALL) NOPASSWD: /etc/init.d/httpd restart
# Group (นำหน้าด้วย %)
%admin ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
Default /etc/sudoers (Ubuntu)
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
# User เพิ่มใน group sudo จะได้สิทธิ์เต็ม
เพิ่ม User ให้มีสิทธิ์ sudo (Ubuntu/Debian)
usermod -aG sudo username
Defaults ที่น่าสนใจ
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults timestamp_timeout=15 # จดจำรหัสผ่าน 15 นาที (default)
Defaults lecture=always # แสดงข้อความเตือนทุกครั้ง
Defaults logfile="/var/log/sudo.log"
Debug และ Troubleshooting
# ตรวจสอบสิทธิ์ของ user ปัจจุบัน
sudo -l
# ตรวจสอบ user อื่น (ต้องเป็น root)
sudo -l -U username
# รันคำสั่งเป็น user อื่น
sudo -u postgres psql
# Preserve Environment variables
sudo -E command
Best Practices
- ใช้ Group (%sudo, %wheel) แทน User โดยตรง
- จำกัดคำสั่งให้เฉพาะที่จำเป็น (Principle of Least Privilege)
- หลีกเลี่ยง NOPASSWD ยกเว้น Service Account/Automation
- ใช้
/etc/sudoers.d/สำหรับ Custom rules (Include จาก sudoers หลัก) - Audit:
grep sudo /var/log/auth.log
sudo เป็นมาตรฐานการจัดการสิทธิ์ใน Linux การตั้งค่าที่ถูกต้อง = Security + Convenience