แม้ SELinux ช่วยให้ลีนุกซ์มีความปลอดภัยมากขึ้น แต่ก็สร้างความปวดหัวให้กับผู้ดูแลระบบพอสมควรในการแก้ไขปัญหา ทำให้หลายคนปิดคุณสมบัตินี้ไป
ปัญหาหนึ่งที่จะพบบ่อยคือ Security Context หรือ Label ของไฟล์ผิดไป ทำให้บางโปรเซสอ่านไฟล์ไม่ได้ เพราะว่า SELinux จะมีการกำหนด (policy) ว่าแต่ละโปรเซสจะสามารถอ่านไฟล์อะไรได้บ้าง
ตัวอย่างเช่นโปรเซส httpd หรือ Apache จะสามารถอ่านไฟล์ที่มีการกำหนด label เป็นชนิด (type) httpd_sys_content_t ถ้าไฟล์ถูก label เป็นชนิดอื่น อาจจะทำให้เปิดหน้าเว็บไฟล์นั้นไม่ได้
ลองมาดูตัวอย่างปัญหากัน สมมติว่า user1 เป็นคนสร้างไฟล์ test.html แล้ว root ทำการย้ายไฟล์นี้ไปไว้ในไดเร็คทอรีเว็บ /var/www/html/
ใช้คำสั่ง sestatus ตรวจสอบสถานะการเปิด SELinux
[root@cent6-dev ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
สถานะตอนนี้ (Current mode) ยังเปิดบังคับใช้ SELinux อยู่ (enforcing)
ล็อกอินด้วย user1 สร้างไฟล์ test.html
ใช้คำสั่ง ls ระบุออปชั่น -Z เพื่อดู Security Context ของไฟล์
[user1@cent6-dev ~]$ pwd /home/user1
[user1@cent6-dev ~]$ ls -Z test.html
-rw-r--r--. user1 users unconfined_u:object_r:user_home_t:s0 test.html
โดยดีฟอลต์ ไฟล์ที่ถูกสร้างขึ้นใน home ของ user จะถูกแปะ label เป็นชื่อ user_home_t
ล็อกอินด้วย root แล้วใช้คำสั่ง mv เพื่อย้ายไฟล์นี้ไปไว้ใน /var/www/html/
หมายเหตุ ในที่นี้ใช้คำสั่ง mv เพื่อจำลองปัญหา การ copy ไฟล์แบบอื่นๆ เช่น cp, tar อาจไม่เกิดปัญหาแบบนี้
[root@cent6-dev ~]# cd /var/www/html/
[root@cent6-dev html]# mv ~user1/test.html .
[root@cent6-dev html]# ls -Z test.html
-rw-r--r--. user1 users unconfined_u:object_r:user_home_t:s0 test.html
สังเกตว่า label จะยังคงเหมือนเดิม
ถ้าลองเปิดหน้าเว็บด้วย browser ดู จะไม่สามารถเปิดไฟล์นี้ได้ แม้ permission ของไฟล์เป็น 644 ทุกคนอ่านได้ก็ตาม
หากพบปัญหาแบบนี้ก็สงสัยได้เลยว่าเป็นเพราะ SELinux เพื่อความแน่ใจลองตรวจสอบไฟล์ /var/log/audit/audit.log
คำแนะนำ บน RedHat หรือ CentOS แนะนำให้รันเซอร์วิส auditd ไว้ จะมีการเก็บข้อความเกี่ยวกับ SELinux แยกไว้ในไฟล์ /var/log/audit/audit.log หากไม่ได้รันเซอร์วิส auditd นี้ ข้อความ SELinux จะถูกเก็บไว้ใน /var/log/messages
[root@cent6-dev ~]# tail -f /var/log/audit/audit.log type=AVC msg=audit(1388943762.550:118): avc: denied { read } for pid=1869 comm="httpd" name="test.html" dev=sda2 ino=1450012 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
คำอธิบาย
- comm=”httpd” : โปรเซส (process command) ชื่อ httpd
- name=”test.html” : ชื่อไฟล์เป้าหมาย target
- scontext : Security Context ของโปรเซส
- tcontext : Security Context ของไฟล์เป้าหมาย
สรุปคือโปรเซส httpd ไม่สามารถอ่านไฟล์ test.html
แล้วจะแก้ไขอย่างไร บอกตามตรงก็ต้อง search จากเน็ตเอาแล้วทำความเข้าใจ แต่เท่าที่ผู้เขียนเจอ ถ้าเป็นปัญหาเรื่องอ่านไฟล์ไม่ได้แบบนี้ หรือดูแล้ว Security Context ไม่ตรง ส่วนใหญ่จะสามารถแก้ไขได้ด้วยคำสั่ง restorecon
วิธีการง่ายมาก รันคำสั่ง restorecon ตามด้วยชื่อไฟล์ที่ต้องการแก้ไข ระบุออปชั่น -v เพื่อดูการเปลี่ยนแปลง
[root@cent6-dev html]# restorecon -v test.html restorecon reset /var/www/html/test.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
คำสั่ง restorecon จะทำการ restore หรือ reset Security Context ของไฟล์ ให้เป็นไปตามการกำหนด (policy) ดีฟอลต์ที่ตั้งไว้
ลองดู label ที่ถูกเปลี่ยนไป
[root@cent6-dev html]# ls -Z test.html
-rw-r--r--. user1 users unconfined_u:object_r:httpd_sys_content_t:s0 test.html
ตอนนี้น่าจะเปิดจาก browser ได้แล้ว