ตั้ง AppArmor ความปลอดภัย Application บน VPS

ตั้ง AppArmor ความปลอดภัย Application บน VPS

มิถุนายน 2026 · อ่าน 7 นาที

AppArmor (Application Armor) คือ Linux Security Module ที่ Ubuntu เปิดใช้งานโดย default ทำหน้าที่จำกัดว่า program แต่ละตัวสามารถเข้าถึง file, network, และ system capability ใดได้บ้าง ถ้า Nginx หรือ PHP-FPM ถูก exploit AppArmor จะกั้นไม่ให้ attacker ออกไปนอกขอบเขตที่กำหนด ลดความเสียหายที่อาจเกิดขึ้นได้มาก

ตรวจสอบ AppArmor ปัจจุบัน

# ตรวจว่า AppArmor เปิดอยู่
sudo systemctl status apparmor

# ดู profile ทั้งหมดที่ active อยู่
sudo apparmor_status

# ดู profile mode (enforce/complain)
sudo aa-status | grep -E "(enforce|complain)"

ติดตั้ง AppArmor Tools

sudo apt update
sudo apt install apparmor apparmor-utils apparmor-profiles apparmor-profiles-extra -y

# เปิดใช้งาน AppArmor
sudo systemctl enable --now apparmor

ตรวจ Profile ที่มีอยู่แล้ว

# ดู profile ทั้งหมดในระบบ
ls /etc/apparmor.d/

# Profile สำคัญที่ Ubuntu ตั้งให้:
# usr.sbin.nginx - Nginx web server
# usr.bin.man - man page viewer
# usr.lib.snapd.snap-confine - Snap packages

# ดูรายละเอียด profile
cat /etc/apparmor.d/usr.sbin.nginx

เปิดใช้งาน Profile ที่มีอยู่แล้ว

# เปิด profile เป็น enforce mode
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

# เปิดทีละหลาย profile
sudo aa-enforce /etc/apparmor.d/usr.sbin.*

# เปิด complain mode (log แต่ไม่บล็อก) เพื่อทดสอบก่อน
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

สร้าง Profile ใหม่สำหรับ Application

# ใช้ aa-genprof สร้าง profile อัตโนมัติ
sudo aa-genprof /usr/bin/myapp
# รัน application ระหว่างนี้ แล้วกด S เพื่อ scan events

# หรือสร้างด้วยมือ
sudo nano /etc/apparmor.d/usr.bin.myapp
#include <tunables/global>

/usr/bin/myapp {
    #include <abstractions/base>
    #include <abstractions/nameservice>

    # อ่านอย่างเดียว
    /etc/myapp/config.conf r,
    /var/log/myapp/ r,

    # อ่าน-เขียน
    /var/log/myapp/*.log rw,
    /tmp/myapp/ rw,

    # Network
    network inet tcp,
    network inet udp,

    # ห้ามเข้า /etc/shadow, /root/
    deny /etc/shadow r,
    deny /root/** rw,
}
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.myapp
sudo aa-enforce /etc/apparmor.d/usr.bin.myapp
Tip: เริ่มด้วย complain mode เสมอ รัน application จริงสัก 1-2 วัน แล้วดู /var/log/syslog ว่ามี AppArmor denial ที่ legitimate ไหม ก่อนเปลี่ยนเป็น enforce mode

ตรวจสอบว่า AppArmor ทำงานถูกต้อง

# ดู status ทุก profile
sudo apparmor_status

# ดู AppArmor denial ใน syslog
sudo grep "apparmor" /var/log/syslog | tail -20

# ดู audit log
sudo ausearch -m avc | tail -20

# ตรวจ profile ที่ enforce อยู่
sudo aa-status | grep "profiles are in enforce mode"
Tip: ถ้าเห็น apparmor="DENIED" ใน syslog แสดงว่า AppArmor บล็อก operation นั้น ถ้า app ทำงานผิดปกติหลังเปิด enforce ให้ดู log นี้ก่อนเสมอ

แก้ปัญหาที่พบบ่อย

Application หยุดทำงานหลังเปิด AppArmor enforce

AppArmor บล็อก operation ที่ app ต้องใช้ ให้เปลี่ยนเป็น complain mode ก่อน แล้วดู log:

sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
sudo systemctl restart nginx
sudo grep "apparmor.*ALLOWED" /var/log/syslog | grep nginx
# เพิ่ม rules ที่ขาดไปใน profile แล้วค่อยกลับ enforce

Profile load ไม่ได้ (syntax error)

ตรวจ syntax ด้วย apparmor_parser:

sudo apparmor_parser -p /etc/apparmor.d/usr.bin.myapp
# จะแสดง error และ line number
# แก้ไขแล้ว reload
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.myapp

AppArmor ไม่ block ทั้งที่ profile เป็น enforce

ตรวจว่า profile ถูก load จริง:

sudo aa-status | grep myapp
# ต้องเห็น myapp ใน "profiles are in enforce mode"
# ถ้าไม่เห็น ให้ reload:
sudo systemctl reload apparmor

Docker container ไม่ทำงานกับ AppArmor

Docker ใช้ default profile ชื่อ docker-default ถ้า custom container ต้องการ capability พิเศษ:

# รัน container ด้วย custom profile
docker run --security-opt apparmor=docker-default myapp
# หรือปิด AppArmor สำหรับ container นั้น (ไม่แนะนำ)
docker run --security-opt apparmor=unconfined myapp

คำถามที่พบบ่อย

AppArmor กับ SELinux ต่างกันอย่างไร?

AppArmor ใช้ path-based policy เขียนง่ายกว่า SELinux ที่ใช้ label-based policy AppArmor เป็น default บน Ubuntu/Debian SELinux เป็น default บน RHEL/CentOS ทั้งคู่ทำหน้าที่ Mandatory Access Control (MAC) เหมือนกัน AppArmor เหมาะกับผู้ดูแล VPS ที่ต้องการ security โดยไม่ต้องเรียนรู้ label system ที่ซับซ้อน

AppArmor กระทบ performance ไหม?

กระทบน้อยมาก ส่วนใหญ่ overhead ไม่เกิน 2-3% เพราะ kernel ตรวจ policy ที่ cache ไว้ใน memory ไม่ต้องอ่าน file ทุกครั้ง application ที่ I/O เยอะเช่น database อาจเห็น overhead สูงขึ้นเล็กน้อยแต่ยังอยู่ในระดับที่ยอมรับได้

Ubuntu ติดตั้ง AppArmor profile ให้อัตโนมัติไหม?

Ubuntu ติดตั้ง profile สำหรับ software บางตัวอัตโนมัติเมื่อ install เช่น Nginx, cups, man และ snap packages ที่เหลือต้องตั้งเองหรือติดตั้งจาก apparmor-profiles-extra package