แก้ปัญหา SELinux Context ผิด ด้วย restorecon

แม้ 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 ทุกคนอ่านได้ก็ตาม

01-selinux-context

หากพบปัญหาแบบนี้ก็สงสัยได้เลยว่าเป็นเพราะ 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 ได้แล้ว

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.