SELinux และ AppArmor แก้ปัญหา Permission Denied ที่ตั้งค่าถูกแล้วก็ยังโดน
เคยติดตั้งแอปพลิเคชันบน Linux แล้วเจอ permission denied ทั้งที่ตั้ง file permission ถูกต้องแล้วไหม มีโอกาสสูงมากว่าตัวการคือ SELinux หรือ AppArmor ระบบ security ที่ทำงานเบื้องหลังและมักถูกมองข้ามจนกว่าจะเจอปัญหา บทความนี้จะช่วยให้คุณเข้าใจและทำงานร่วมกับระบบเหล่านี้ได้อย่างถูกวิธี
Mandatory Access Control (MAC) คืออะไร
SELinux และ AppArmor เป็นระบบ Mandatory Access Control (MAC) ซึ่งทำงานคนละระดับกับ file permission แบบ rwx ที่คุ้นเคย file permission ดูแค่ว่า user หรือ group มีสิทธิ์เข้าถึงไฟล์หรือไม่ แต่ MAC ไปไกลกว่านั้น กำหนดว่า process ไหนเข้าถึง resource ไหนได้บ้าง แม้ว่า process นั้นจะรันด้วย root ก็ตาม
พูดง่าย ๆ MAC เป็นชั้นความปลอดภัยเพิ่มเติมที่ป้องกันไม่ให้ process ที่ถูก compromise ทำอะไรนอกเหนือจากที่อนุญาตไว้ สำหรับเซิร์ฟเวอร์ที่ต้องการความปลอดภัยสูง นี่คือสิ่งที่ขาดไม่ได้
SELinux พัฒนาโดย NSA
ใช้เป็น default บน RHEL, CentOS, Fedora และ distro ตระกูล Red Hat ทำงานแบบ label-based คือทุก file, process และ port จะมี security context กำกับ มีความยืดหยุ่นสูงแต่ซับซ้อนกว่าในการตั้งค่า
AppArmor พัฒนาโดย Canonical
ใช้เป็น default บน Ubuntu, Debian และ SUSE ทำงานแบบ path-based ซึ่งตั้งค่าง่ายกว่า SELinux เหมาะสำหรับผู้ที่เริ่มต้นทำงานกับ MAC
ปัญหาที่พบบ่อยและวิธีวินิจฉัย
เช็คว่า SELinux เป็นสาเหตุหรือไม่
ดูสถานะ SELinux ด้วยคำสั่ง getenforce ถ้าได้ Enforcing แปลว่า SELinux กำลังบังคับใช้ policy อยู่:
getenforce
# ผลลัพธ์: Enforcing | Permissive | Disabled
ดูรายละเอียดเพิ่มเติมด้วย sestatus:
sestatus
จากนั้นเช็ค audit log เพื่อดู AVC denial ล่าสุดที่จะบอกว่า process ไหนถูกบล็อก:
sudo ausearch -m avc -ts recent
เช็คว่า AppArmor เป็นสาเหตุหรือไม่
สำหรับ Ubuntu หรือ Debian ใช้คำสั่ง aa-status เพื่อดูว่ามี profile ไหนกำลัง enforce อยู่:
sudo aa-status
ดู log ที่ AppArmor บล็อกได้จาก kernel log:
sudo dmesg | grep -i apparmor
วิธีแก้ไข SELinux Issues
แก้ Security Context ที่ไม่ถูกต้อง
ปัญหาที่พบบ่อยที่สุดคือไฟล์มี security context ไม่ถูกต้อง เช่น ย้ายไฟล์เว็บจาก /home ไป /var/www แล้ว context ยังเป็นของ home directory ดู context ปัจจุบันก่อน:
ls -Z /var/www/html/
แล้วใช้ restorecon เพื่อ reset context ให้ตรงกับ policy:
sudo restorecon -Rv /var/www/html
ใช้ setsebool เปิด Boolean ที่จำเป็น
SELinux มี boolean switches เปิดปิดได้ ดูรายการ boolean ที่เกี่ยวข้องกับ httpd:
getsebool -a | grep httpd
เช่น ถ้า Apache ต้องเชื่อมต่อ network:
sudo setsebool -P httpd_can_network_connect on
flag -P ทำให้เปลี่ยนแปลงคงอยู่แม้ reboot
สร้าง Custom Policy ด้วย audit2allow
หากไม่มี boolean ที่ตรงกับความต้องการ ดู policy ที่จะถูกสร้างก่อน:
sudo ausearch -m avc -ts recent | audit2allow
จากนั้นสร้างและติดตั้ง custom policy module:
sudo ausearch -m avc -ts recent | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp
วิธีแก้ไข AppArmor Issues
สลับ Profile เป็น Complain Mode
หากสงสัยว่า AppArmor บล็อกแอปพลิเคชัน ให้สลับ profile เป็น complain mode ซึ่งจะ log แต่ไม่บล็อก:
sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld
ถ้าแอปทำงานได้ปกติก็ยืนยันว่าปัญหาอยู่ที่ AppArmor profile แก้ profile ให้ถูกต้องแล้วสลับกลับเป็น enforce:
sudo aa-enforce /etc/apparmor.d/usr.sbin.mysqld
เพิ่ม Rule ใน Profile
ต้องการให้แอปเข้าถึง path ใหม่ ก็แก้ไข profile ใน /etc/apparmor.d/ โดยตรง แล้วโหลดใหม่:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
ควรปิด SELinux หรือ AppArmor ไหม
คำตอบสั้น ๆ คือไม่ควร หลายคนเจอปัญหาแล้วแก้ด้วยการปิด SELinux เลย มันแก้ปัญหาได้จริง แต่เท่ากับเปิดช่องโหว่ด้านความปลอดภัยไปด้วย โดยเฉพาะบน production server การปิด MAC เป็นสิ่งที่ไม่ควรทำ
วิธีที่ถูกต้องคือเรียนรู้ที่จะทำงานร่วมกับมัน ถ้าจำเป็นต้อง debug อาจสลับเป็น permissive mode ชั่วคราว:
# สลับเป็น permissive ชั่วคราว (ไม่ต้องรีบูต)
sudo setenforce 0
# สลับกลับเป็น enforcing เมื่อ debug เสร็จ
sudo setenforce 1
Security Best Practices สำหรับ MAC
อย่าปิด SELinux/AppArmor บน production server ใช้ permissive mode เฉพาะตอน debug ตรวจสอบ audit log เป็นประจำ ทำความเข้าใจ policy ก่อนแก้ไข และใช้เครื่องมือช่วยอย่าง audit2allow สร้าง custom policy
สำหรับผู้ที่ต้องการความช่วยเหลือด้าน security ในระดับลึก บริการ Security ของ DriteStudio ให้บริการ security hardening รวมถึงตั้งค่า SELinux และ AppArmor ให้เหมาะกับแอปพลิเคชันของคุณ ร่วมกับ Dedicated Server และ VPS ที่ตั้งค่ามาอย่างปลอดภัย
คำถามที่พบบ่อย (FAQ)
SELinux กับ AppArmor ต่างกันอย่างไร
SELinux ใช้ label-based ซับซ้อนแต่ยืดหยุ่นสูง เหมาะกับ RHEL/CentOS ส่วน AppArmor ใช้ path-based ตั้งค่าง่ายกว่า เหมาะกับ Ubuntu/Debian ทั้งสองให้ระดับความปลอดภัยที่ใกล้เคียงกัน เลือกตาม distro ที่ใช้
ย้ายไฟล์แล้ว SELinux บล็อก ทำไง
เมื่อ cp หรือ mv ไฟล์ security context อาจไม่เปลี่ยนตาม ใช้ restorecon reset context ให้ตรงกับ path ปลายทาง หรือใช้ cp --preserve=context เมื่อ copy
Container (Docker) ต้องสนใจ SELinux ไหม
ต้อง SELinux ยังทำงานอยู่แม้ใช้ container Docker มี option --security-opt label:disable สำหรับปิด SELinux ใน container แต่ไม่แนะนำสำหรับ production ควรตั้ง policy ที่เหมาะสมแทน
Permissive กับ Disabled ต่างกันอย่างไร
Permissive ยัง log ทุก violation แค่ไม่บล็อก ทำให้ดู audit log ได้ ส่วน Disabled ปิดทั้งหมดรวมถึง logging ดังนั้นใช้ permissive สำหรับ debug ได้ แต่อย่าใช้ disabled บน production
SELinux และ AppArmor ไม่ใช่ศัตรู แต่เป็นเกราะป้องกันเซิร์ฟเวอร์ของคุณ หากต้องการเซิร์ฟเวอร์ที่ตั้งค่า security มาอย่างดี DriteStudio พร้อมช่วยเหลือ ติดต่อเราได้เลย