เคยพบเหตุการณ์แบบนี้หรือไม่
- พี่ครับ chmod 777 คืออะไร ทำไมผมอัพไฟล์ไม่ได้
- ทำไมไอ้ directory นั้นมันถูกสร้างโดย apache ผมอยากให้เป็นชื่อผมได้มั้ย
mod_ruid เป็นการกระจาย PAM เข้าไปถึงระดับ httpd โดย httpd จะรันใน User นั้นๆ ไม่ใช่ User apache อีกแล้ว ข้อดีอีกอย่าง คือ เวลา top จะเห็นได้ว่า user ไหนโหลดหนักด้วย แต่หลักๆ แล้วมันถูก design มาเพื่อแก้ปัญหาสองข้อด้านบนมากกว่า
คำเตือน นี่เป็นการยุ่งกับระบบ กรุณาแบคอัพทุกอย่างก่อนลงมือทำทุกครั้ง และเจ้าของบทความ ไม่ขอรับผิดชอบใดๆในกรณีที่คุณเอาไปทำตามแล้วผิดชั้นตอนหรือมีปัญหาทำให้ระบบพังนะครับ
เริ่มกันเลยดีกว่า ป้อนคำสั่ง ทีละบรรทัดนะครับ ใจเย็นๆ
yum -y install libcap-devel
cd /root
wget -O mod_ruid2-0.9.7.tar.bz2 "http://downloads.sourceforge.net/project/mod-ruid/mod_ruid2/mod_ruid2-0.9.7.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmod-ruid%2Ffiles%2Fmod_ruid2%2Fmod_ruid2-0.9.7.tar.bz2%2Fdownload%3Fuse_mirror%3Djaist&ts=1352883561&use_mirror=jaist"
tar xjf mod_ruid2-0.9.7.tar.bz2
cd mod_ruid2-0.9.7
apxs -a -i -l cap -c mod_ruid2.c
ทีนี้ เราลองเช็คดูครับว่า httpd โหลดโมดูลเข้าไปแล้วหรือยัง ด้วยคำสั่ง
grep 'mod_ruid2' /etc/httpd/conf/httpd.conf
ถ้าใช้ได้ จะเจอประมาณนี้เป็น output ครับ
LoadModule ruid2_module /usr/lib/apache/mod_ruid2.so
ทีนี้เราต้องมาแก้ DA Config กันหน่อย เพื่อเป็นการเปิด ruid ให้กับ user ทุกคนในระบบ
ป้อนคำสั้งทีละบรรทัดนะครับ ใจเย็นๆ
cd /usr/local/directadmin/data/templates/
cp virtual_host2* custom/
chown -R diradmin:diradmin custom/
cd /usr/local/directadmin/data/templates/custom/
แล้วทีนี้ ด้านในคุณจะเจอไฟล์ประมาณนี้ครับ
virtual_host2.conf
virtual_host2_secure.conf
virtual_host2_secure_sub.conf
virtual_host2_sub.conf
ให้เปิดทีละไฟล์ แล้วแก้แถวตรง <ifmodule mod_ruid2.c=””> ให้เป็นคล้ายๆ ด้านล่างครับ
<ifmodule mod_ruid2.c="">
SuexecUserGroup |USER| |GROUP|
</ifmodule>
<ifmodule mod_ruid2.c="">
RMode config
RUidGid |USER| |GROUP|
RGroups apache
</ifmodule>
เสร็จแล้วรัน
echo "action=rewrite&value=httpd" >> /usr/local/directadmin/data/task.queue
แล้วรัน
/usr/local/directadmin/dataskq d800
แล้วรัน
chown -R webapps:webapps /var/www/html
เพื่อให้ เมลกระรอก, roundcube และ phpmyadmin ใช้งานได้
และแก้ไข httpd config นิดหน่อยครับ
เปิดไฟล์ /etc/httpd/httpd.conf แล้วเพิ่มตัวหนาลงไปในคอนฟิคส่วนนี้ครับ
(ถ้าไม่เจอ จะอยู่ใน /etc/httpd/conf/extra/httpd-directories.conf)
<directory "="" var="" www="" html"="">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
<ifmodule mod_suphp.c="">
suPHP_Engine On
suPHP_UserGroup webapps webapps
</ifmodule>
RUidGid webapps webapps
แล้ว Restart httpd หนึ่งที เป็นอันเสร็จพิธี ทีนี้ลองสร้าง user ขึ้นมาเทสครับ ลงพวก CMS อะไรก็ได้ที่ require 777 chmod มันจะไม่ require อีกต่อไปแล้ว
ในระบบเก่าคุณอาจจะมี user ที่มีไฟล์เป็น owner apache อยู่ มันอาจจะมีปัญหา ให้แก้ด้วยสคริปต์ตามบรรทัดด้านล่างได้เลยครับ
สคริปต์จะเข้าไปเช็ค permission และแก้ไขทั้งหมดให้เป็น permission ของ user ไม่ world-readable อีกต่อไป
**** ก่อนรันคุณต้องมั่นใจว่าทำตัวหนาด้านบนผ่านแล้วนะครับ ไม่งั้นละก็ คุณรับโทรศัพท์สนุกแน่ครับ ****
cd /usr/local/directadmin/scripts && ./set_permissions.sh user_homes
find /home/*/domains/*/public_html -type d -print0 | xargs -0 chmod 711
find /home/*/domains/*/public_html -type f -print0 | xargs -0 chmod 644
find /home/*/domains/*/public_html -type f -name '*.cgi*' -exec chmod 755 {} \;
find /home/*/domains/*/public_html -type f -name '*.pl*' -exec chmod 755 {} \;
find /home/*/domains/*/public_html -type f -name '*.pm*' -exec chmod 755 {} \;
cd /usr/local/directadmin/data/users && for i in `ls`; do { chown -R $i:$i /home/$i/domains/*/public_html;}; done;
หากพบปัญหาการใช้ php mail fucntion ส่งเมลแล้ว Sender กลายเป็น user@xxx.domain.com (ชื่อ host name) ซึ่งปกติจะต้องเป็น user@domain.com สามารถแก้ไขได้ดังนี้
เพิ่ม
local_from_check = false
local_sender_retain = true
untrusted_set_sender = *
หลัง
# TRUSTED USERS
trusted_users = mail:majordomo:apache:diradmin
ขอขอบคุณเทคนิคดีๆ โดยคุณ zephythor จาก THT