แก้ไข Joomla Directory Permissions Unwritable บนลีนุกซ์ที่เปิด SELinux

เมื่อลูกค้าขอให้ดูเรื่องความปลอดภัยของเว็บไซต์เป็นพิเศษ เลยต้องจัดเต็มซะหน่อย

จากที่เคยปิดคุณสมบัติ SELinux เพื่อแก้ปัญหา Directory Permissions Unwritable มาแล้วในบทความ แก้ไข permission ไฟล์หลังการติดตั้ง Joomla 2.5

ครั้งนี้ขอปรับปรุงใหม่ ด้วยการเปิดคุณสมบัติ SELinux ไว้ แล้วแก้ไข security context ของไดเร็คทอรีที่มีปัญหา เพื่อให้สามารถเขียนไฟล์ได้

ในที่นี้ยังคงทดลองบน ​Fedora 16 เหมือนเดิม แต่เท่าที่ลองกับ Linux Distributions อื่นๆ วิธีการแก้ไขก็คล้ายกัน

[root@fc16-64a ~]# cat /etc/redhat-release 
Fedora release 16 (Verne)

ใช้คำสั่ง sestatus เพื่อตรวจสอบสถานะการเปิดคุณสมบัติ SELinux

[root@fc16-64a ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 26
Policy from config file: targeted

เมื่อเปิด SELinux แล้ว แม้เราจะเปลี่ยน owner หรือ permission ของไฟล์ เพื่อให้ apache สามารถ เขียนไฟล์ (write) ได้ แล้ว ในหน้าตรวจสอบ Directory Permissions ก็ยังขึ้น Unwritable เหมือนเดิม

ตัวอย่างการเปลี่ยน owner ของไดเร็คทอรีย่อยภายใต้ administrator แล้ว

[root@fc16-64a ~]# cd /var/www/html/joomla25/
[root@fc16-64a joomla25]# ls -l administrator/
total 36
drwxr-xr-x. 3  apache root 4096 Mar 4 00:42 cache
drwxr-xr-x. 28 apache root 4096 Mar 4 00:37 components
drwxr-xr-x. 3  root   root 4096 Mar 3 22:54 help
drwxr-xr-x. 2  root   root 4096 Mar 3 22:54 includes
-rw-r--r--. 1  root   root 1495 Feb 1 12:45 index.php
drwxr-xr-x. 15 apache root 4096 Mar 4 00:37 language
drwxr-xr-x. 5  root   root 4096 Mar 3 22:54 manifests
drwxr-xr-x. 16 apache root 4096 Mar 3 22:54 modules
drwxr-xr-x. 5  apache root 4096 Feb 1 12:45 templates

ที่เป็นเช่นนี้เพราะว่า หลังจากตรวจสอบสิทธิในการอ่านเขียนไฟล์ (owner, group, permission) พื้นฐาน Discretionary Access Control (DAC) ของลีนุกซ์แล้ว คุณสมบัติ SELinux จะทำการตรวจสอบสิทธิเพิ่มเติม Mandatory Access Control (MAC) ว่าเป็นไปตามนโยบาย (Policy) หลักของเครื่องหรือไม่

ปัญหาอย่างแรกผู้ใช้ (apache) ต้องการเขียนไฟล์ลงบนไดเร็คทอรีต่างๆ ยกตัวอย่างเช่น “administrator/components/”

เริ่มต้น จะมีการตรวจสอบสิทธิพื้นฐานของลีนุกซ์ ผู้ใช้ apache สามารถเขียนไฟล์ลงในไดเร็คทอรีนี้ได้ เพราะเป็น owner และ permission เป็น rwx (read, write, executue ได้)

[root@fc16-64a joomla25]# ls -ld administrator/components/
drwxr-xr-x. 28 apache root 4096 Mar 4 00:37 administrator/components/

ขั้นต่อไปจะมีการตรวจสอบ SELinux Contexts ของไฟล์ ใช้คำสั่ง ls ตามด้วยออปชั่น ‘-Z’

[root@fc16-64a joomla25]# ls -Zd administrator/components/
drwxr-xr-x. apache root system_u:object_r:httpd_sys_content_t:s0 administrator/components/

ในที่นี้ให้สนใจเฉพาะ httpd_sys_content_t เป็น SELinux Context “type” ของไฟล์

อ้างอิงจาก
http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-The_Apache_HTTP_Server-Types.html

httpd_sys_content_t
Use this type for static web content, such as .html files used by a static website. Files labeled with this type are accessible (read only) to httpd and scripts executed by httpd. By default, files and directories labeled with this type can not be written to or modified by httpd or other processes. Note: by default, files created in or copied into /var/www/html/ are labeled with the httpd_sys_content_t type.

ไฟล์ที่มีค่า “type” แบบนี้ สามารถอ่านได้อย่างเดียว (readonly) เท่านั้น

การแก้ไขปัญหา

ต้องเปลี่ยน “type” ของไฟล์เป็นแบบอื่น เท่าที่ทดสอบดู ลองเปลี่ยนเป็น httpd_sys_content_rw_t ก็น่าจะสามารถเขียนได้แล้ว

หมายเหตุ มีหลายวิธีการที่แก้ไขปัญหานี้ได้ ขอออกตัวว่านี่เป็นวิธีการหนึ่งเท่านั้นที่น่าง่ายสุด และตรงไปตรงมา

httpd_sys_content_rw_t
Files labeled with this type can be written to by scripts labeled with the httpd_sys_script_exec_t type, but can not be modified by scripts labeled with any other type. You must use the httpd_sys_content_rw_t type to label files that will be read from and written to by scripts labeled with the httpd_sys_script_exec_t type.
ใช้คำสั่ง chcon เพื่อเปลี่ยน SELinux security context ของไฟล์

ตัวอย่างการทดลองเปลี่ยนสองไดเร็คทอรี

[root@fc16-64a joomla25]# chcon -t httpd_sys_content_rw_t administrator/components/
[root@fc16-64a joomla25]# chcon -t httpd_sys_content_rw_t administrator/language/
[root@fc16-64a joomla25]# ls -Zd administrator/components/
drwxr-xr-x. apache root system_u:object_r:httpd_sys_rw_content_t:s0 administrator/components/
[root@fc16-64a joomla25]# ls -Zd administrator/language/
drwxr-xr-x. apache root system_u:object_r:httpd_sys_rw_content_t:s0 administrator/language/

ทดลองรีเฟรชในหน้าจอ Joomla Administration ก็จะเปลี่ยนเป็น Writable แล้ว

 

ส่วนที่เหลือก็ไล่เปลี่ยนไดเร็คทอรีทั้งหมดที่แสดงขึ้นมาว่า Unwritable

ขออธิบายแค่นี้ก่อน บอกตามตรงเป็นเรื่องยากพอสมควร ในการทำความเข้าใจ และแก้ปัญหา SELinux แต่ด้วยข้อดีเพื่อช่วยเพิ่มความปลอดภัยให้กับระบบ ทางผู้เขียน จะพยายามศึกษา ทดลอง แล้วนำมาแชร์เล่าสู่กันฟัง

 

 

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

1 thought on “แก้ไข Joomla Directory Permissions Unwritable บนลีนุกซ์ที่เปิด SELinux”

  1. มาวิธีแก้ตั้งนาน สงสัยว่าทำไมติด unwritable ตอนนี้แก้ไขได้แล้ว ขอบคุณครับ

Leave a Reply