การย้าย Mailman และปรับแต่งให้รองรับภาษาไทย

Mailman เป็น mailing list ที่มีระบบบริหารจัดการสมาชิกผ่านทางเว็บเพจ  ระบบตรวจสอบอีเมลเข้ามาใน list  ระบบ archive และอื่นๆ อีกมากมาย  (อ่านเพิ่มเติมที่นี่)  

วิธีการติดตั้งเองมีความยุ่งยากในระดับหนึ่ง เพราะต้องวุ่นวายกับสิทธิ์การเข้าถึงไฟล์ต่างๆ  แต่ผู้พัฒนาได้เขียนวิธีการติดตั้งไว้ค่อนข้างละเอียด  เพียงทำตามไปทีละขั้นตอนก็สามารถติดตั้งใช้งานได้

สำหรับเรื่องภาษาไทยนั้น  ก่อนหน้านี้ในเวอร์ชัน 2.1.x จะไม่สามารถส่งภาษาไทยได้  เพราะเมื่อส่งอีเมลที่มีภาษาไทยปนอยู่ด้วยแล้ว  อีเมลนั้นจะหายเงียบไปเลย  แต่ในเวอร์ชัน 2.1.9 ขณะที่เขียนเรื่องนี้สามารถส่งอีเมลเป็นภาษาไทยได้แล้ว

สำหรับโจทย์ที่ผมเจอก็คือ ผมจำเป็นต้องย้าย mailig list ไปไว้ที่เซิร์ฟเวอร์เครื่องใหม่  ซึ่งวิธีการที่ผมดำเนินการมีดังนี้

  1. ติดตั้ง Mailman ในเซิร์ฟเวอร์ใหม่ตามปกติ  พร้อมทดสอบว่าใช้งานได้จริง
    ผมใช้คำสั่ง configuration ดังนี้

    ./configure --prefix=/home/mailman 
    --with-mail-gid=mailman 
    --with-cgi-gid=apache 
    --with-mailhost=hostname.com 
    --with-urlhost=hostname.com
  2. ทำการคัดลอกไฟล์และไดเรอทอรีทั้งหมด ที่อยู่ในไดเรกทอรี archives, data และ list จากเซิร์ฟเวอร์เก่า มายังเซิร์ฟเวอร์เครื่องใหม่
  3. คัดลอก custom configuration ภายในไฟล์ mm_cfg.py มาไว้ที่เครื่องใหม่
  4. ทดสอบเรียกใช้งาน mailman 

สำหรับวิธีการเพิ่มภาษาไทยนั้น จำเป็นจะต้องแก้ไขไฟล์ Defaults.py  โดยให้เพิ่มบรรทัดต่อไปนี้ ที่กลุ่มคำสั่งเพิ่มภาษาต่างๆ  ซึ่งจะอยู่ที่บริเวณท้ายสุดของไฟล์

add_language('th',    _('Thai'),    'tis-620')

หรือจะใช้ utf-8 แทน tis-620 ก็น่าจะได้เช่นกัน  และในไฟล์ mm_cfg.py ให้เพิ่มบรรทัดต่อไปนี้ด้วย

DEFAULT_CHARSET = 'tis-620'
VERBATIM_ENCODING = ['tis-620']
DEFAULT_SERVER_LANGUAGE = 'th'

เท่านี้ก็จะมี option ภาษาไทยให้เลือกใช้ในส่วนของ Language option ครับ

vsftpd and mirror server

วันนี้ผมได้ทำ mirror server โดยใช้ vsftpd (http://vsftpd.beasts.org/)  และ Emirror (http://sourceforge.net/projects/emirror/)  

วิธีการติดตั้ง vsftpd สามารถดูได้ที่นี่ http://rd.cc.psu.ac.th/content/view/20/46/

ไฟล์ /etc/vsftpd.conf มีสิ่งที่อาจต้องเพิ่มเติมคือ

# เพื่อเปลี่ยนโฮมของ ftp จาก /var/ftp ไปที่ /home/ftp  และควรแก้ home ของ ftp user ให้เป็นที่ /home/ftp ด้วย

anon_root=/home/ftp

# กำหนดจำนวน clients สูงสุดที่เข้าใช้งานได้

max_clients=50

# กำหนดจำนวน concurrent session ต่อ IP address

max_per_ip=4

# สร้าง banner ที่เมื่อ user login จะเห็นข้อความในไฟล์นี้

banner_file=/etc/vsftpd/banner_file 

หรือต้องการให้มีข้อความส่งถึงผู้ใช้ในแต่ละไดเรกทอรี  สามารถทำโดยสร้างไฟล์ .message  แต่ต้องเปิด option นี้ด้วย

dirmessage_enable=YES
 Continue reading vsftpd and mirror server

WordPress 2.3 มาแล้ว

ผม upgrade เป็น WordPress 2.3 (Dexter) แล้ว  เวอร์ชันใหม่นี้มีอะไรบ้าง  ก็คงมีคนพูดถึงมากมายแล้ว   แต่ขอพูดถึงการเปลี่ยนแปลงที่น่าสนใจไว้หน่อยครับ

  • Native tagging support  มีระบบ tag  เพิ่มเติมจาก category ของเดิม
  • Plug-in update notification เมื่อผู้พัฒนา plug-in ออกเวอร์ชันใหม่ๆ ก็จะมีข้อความแจ้งบอก  (แต่ต้องเข้าไปดูในส่วน plug-in เองนะ)
  • Canonical URLs ทำให้รองรับรูปแบบของ URL ที่ยืดหยุ่นมากขึ้น (อ่านรายละเอียดเพิ่มเติม)
  • advanced WYSIWYG  ที่เลิกซ่อนฟังก์ชันที่แอบไว้ของ TinyMCE (ต้องกด CTRL+Shift+V)
  • รองรับ Atom 1.0 อย่างสมบูรณ์แบบ
  • เร็วขึ้นจากเดิม 800% จากผลของ jQuery  (ว้าว!)

Upgrade ยังไง? 

ขั้นตอนการ upgrade ก็ง่ายดายเหมือนเดิม  แต่ควรจะทำการ Backup Database และไฟล์เดิมเสียก่อน แล้วก็ upload ไฟล์ต่างๆ  ของเวอร์ชัน 2.3 เข้าไป   และเรียกใช้งาน upgrade.php ก็เป็นอันเสร็จ   อย่างไรก็ตามควรจะตรวจสอบด้วยว่า plug-in ที่ใช้อยู่นั้นทำงานได้กับเวอร์ชัน 2.3 หรือไม่

สำหรับผมนั้นโชคดีที่  plug-in ไม่มีปัญหาอะไร  แต่ก็พบว่า plug-in ที่ใช้อยู่จำนวนหนึ่งได้ update เวอร์ชันไปแล้ว  (คลิกเข้าไปทีดูที่ส่วนของ plug-in จะเห็นข้อความเตือนเลย)

ทำอะไรบ้างหลังจาก upgrade

หากเคยใช้ tag plug-in ต่างๆ มาก่อนหน้านี้ เช่น Ultimate Tag Warrior, Jerome’s Keyworkds, Simple Tags และ Bunny’s Tecghorati Tag  ก็ควรจะทำการ import เอาข้อมูลเดิมมาใส่ในฐานข้อมูล tag ของ WordPress   ซึ่งก็ทำไม่ยากเพราะทีมงานของ WordPress ได้เตรียมการไว้ให้แล้ว

ขั้นตอนง่ายๆ แค่คลิกที่ Manage -> Import แล้วก็เลือกว่าจะ Import tag จาก plug-in ไหน  ทุกอันจะมีคำเตือนว่า “Don’t be stupid – backup your database before proceeding!” ยังไงก็ควรจะทำตามนะครับ

แก้ไขธีมให้รองรับ tag

ถ้าธีมที่ใช้อยู่ยังไม่รองรับ tag เราก็สามารถเพิ่มเข้าไปได้เลย  โดยการเพิ่มฟังก์ชัน the_tags() เข้าไปเพื่อให้แสดง tag ที่เราใส่ออกมา  รูปแบบเป็นดังนี้ครับ

<?php the_tags(‘before’, ’separator’, ‘after’); ?>

before เป็น คำ หรือ ข้อความ หรือ คำสั่งของ HTML ที่อยากให้ปรากฎก่อนรายชื่อ tag ต่างๆ
separator เป็น ตัวอักษรที่ใช้แยก tag ต่างๆ ออกจากกัน
after เป็น คำ หรือ ข้อความ หรือ คำสั่งของ HTML ที่อยากให้ปรากฎหลังรายชื่อ tag ต่างๆ

เช่น ถ้าอยากให้แสดงผลแบบนี้  แท็กของฉัน: กินข้าว, ดูหนัง, ฟังเพลง  ก็ใช้คำสั่งแบบนี้

<?php the_tags(‘แท็กของฉัน: ’, ’, ’, ‘’); ?>

อ่านรายละเอียดเพิ่มเติมได้ที่ How to add WordPress 2.3 tags to your current theme ครับ

ส่วน tag clouds เหมือนทางฝั่งขวามือใน sidebar ก็ใช้ฟังก์ชัน wp_tag_cloud()  เช่น

<?php wp_tag_cloud(‘smallest=8&largest=18&number=50’); ?>

smallest เป็นขนาดของตัวอักษรตัวเล็กที่สุด
largest เป็นขนาดของตัวอักษรตัวใหญ่ที่สุด
number เป็นจำนวน tag ที่จะแสดงออกมา

มี option อื่นๆ อีกอ่านรายละเอียดเพิ่มเติมได้ที่นี่ครับ: wp_tag_cloud

แก้วันที่ให้แสดงเป็นภาษาไทย

ชื่อเดือนและวันนั้น ผมก็ทำการ localize เฉพาะในส่วนของการแสดงผลชื่อเดือนและวันให้เป็นภาษาไทย  จากนั้นก็สร้างไดเรกทอรีชื่อ languages ภายใต้ wp-includes  แล้วก็เอาไฟล์ th_TH.mo ใส่ไว้ข้างใน  ขั้นตอนต่อไปก็แก้ไขไฟล์ wp-config.php ให้มาอ่านไฟล์นี้

define (‘WPLANG’, ‘th_TH’);  // อ่านเพิ่มเติมที่นี่

แล้วผมก็เขียน plug-in ง่ายๆ ขึ้นมาเพื่อให้แปลงปี ค.ศ. เป็นปี พ.ศ.  เสีย  plug-in ใช้งานได้ดีในส่วนของข้อความที่โพสในแต่ละวัน   แต่ก็ยังมีบางส่วนที่ต้องเข้าไปแก้ไขใน script โดยตรง  ซึ่งก็ไม่ได้ยุ่งยากอะไร

วิธีการติดตั้ง Chrooted DNS Server (BIND9)

วิธีการติดตั้ง chrooted dns server สำหรับ CentOS

yum install bind-chroot 

chmod 755 /var/named/
chmod 775 /var/named/chroot/
chmod 775 /var/named/chroot/var/
chmod 775 /var/named/chroot/var/named/
chmod 775 /var/named/chroot/var/run/
chmod 777 /var/named/chroot/var/run/named/
cd /var/named/chroot/var/named/
ln -s ../../ chroot
chkconfig –levels 235 named on
/etc/init.d/named start

ที่มา: http://www.howtoforge.com/perfect_setup_centos_4.4_p4

SSH brute force attack

ถ้าใครติดตั้ง SSH ไว้ในเครื่องก็คงหลีกไม่พ้นพวก SSH brute force attack แบบนี้

Failed password for invalid user james from ::ffff:203.81.58.202 port 44512 ssh2
Failed password for invalid user snort from ::ffff:203.81.58.202 port 45086 ssh2
Failed password for invalid user radiomail from ::ffff:203.81.58.202 port 45520 ssh2
Failed password for invalid user divine from ::ffff:203.81.58.202 port 46804 ssh2
Failed password for invalid user popa3d from ::ffff:203.81.58.202 port 47604 ssh2
Failed password for invalid user aptproxy from ::ffff:203.81.58.202 port 48192 ssh2
Failed password for invalid user desktop from ::ffff:203.81.58.202 port 48667 ssh2

พวกนี้ช่างมีความพยายามเสียเหลือเกินครับ จะดูฉลาดกว่านี้ถ้าไปหาชื่อคนไทย เช่น somchai somsak อะไรใส่ลงไปหน่อย 🙂

วิธีแก้ง่ายๆ อย่างหนึ่งก็คือ เปลี่ยน port ของ SSH ไปใช้ port อื่นที่ไม่ใช่หมายเลข 22 ซะ (แก้ในไฟล์ /etc/ssh/sshd_config

อีกวิธีหนึ่งก็คือ ใช้คำสั่ง iptables ที่จะ block IP เจ้าปัญหา 60 วินาที ถ้าพยายาม connect เข้ามามากกว่า 3 ครั้งภายใน 60 วินาที Continue reading SSH brute force attack

How to Compile suPHP+Apache2+PHP

คัดลอกจาก http://planetmy.com/blog/?p=67

Finally I’m manage to make my PHP 5.1.2 compiled with suPHP successful today suPHP is a tool for executing PHP scripts with the permissions of their owners. It consists of an Apache module (mod_suphp) and a setuid root binary (suphp) that is called by the Apache module to change the uid of the process executing the PHP interpreter.

I just would like to share about “How’s To Compile PHP + suPHP + Apache” as below:

Continue reading How to Compile suPHP+Apache2+PHP

Monitor A System With Sysstat (CentOS)

Sysstat เป็นโปรแกรมที่ช่วยเก็บข้อมูลเกี่ยวกับ performance ของเครื่อง และบันทึกลงข้อมูลเก็บไว้เรียกดูได้

วิธีการติดตั้ง sysstat

yum intstall sysstat

หลังจากติดตั้งแล้วจะต้องปล่อยให้ชุดโปรแกรมของ sysstat ทำการเก็บข้อมูลไประยะหนึ่งก่อนจึงจะเรียกดูข้อมูลได้ โดยในชุด rpm ของ sysstat จะมีการติดตั้ง cron เพื่อให้สั่งทำงานทุก 10 นาที อยู่ที่ /etc/cron.d/sysstat ภายในไฟล์นี้มีข้อมูลคือ

# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A

Continue reading Monitor A System With Sysstat (CentOS)

Squild proxy with Digest HTTP Authentication

เมื่อเร็วๆ นี้ผมพบว่าเน็ตเวิร์คที่ตัวเองดูแลอยู่มี traffic ขาออกมากกว่าขาเข้าอย่างมากมาย มีช่วงหนึ่งที่มี traffic ขาออกประมาณ 7 MBits/s เป็นช่วงระยะเวลาประมาณ 3 ชั่วโมง ซึ่งผมนึกไม่ออกว่าที่นี่จะมีข้อมูลส่งออกอะไรที่มากมายขนาดนี้ คาดว่าคงมีผู้ใช้ละเมิดระเบียบการใช้งานเครือข่าย ซึ่งในที่สุดข้อสงสัยของผมเป็นจริงเมื่อผมตรวจพบว่ามีการใช้โปรแกรมประเภท peer-to-peer

ด้วยความสะดวกสบายในการใช้งานเครือข่าย เพราะมีห้องปฏิบัติการหลายห้องที่เปิดให้นักศึกษาเข้าใช้งานได้ตลอด 24 ชั่วโมง กอรปกับการเพิ่มความเร็วในการเชื่อมต่อกับอินเทอร์เน็ตที่เพิ่มขึ้น และความละเลยของภาควิชาในการควบคุมดูแลนักศึกษา ระเบียบการใช้งานเครือข่ายจึงเป็นแค่กระดาษที่ถูกแจกจ่ายไปแล้วก็ถูกเก็บเข้าแฟ้ม

เมื่อถูกละเลยผมจึงต้องเล่นบทโหด ด้วยการตามปิด switch port ของผู้ใช้งานที่สร้างปัญหา ซึ่งผู้ใช้งานตัวแสบก็ทำการย้ายที่ไปเรื่อยๆ ในที่สุดก็โดนทั้งห้องปฏิบัติการ นอกจากนี้ความอยากใช้งานเครือข่ายมาก (อยากรู้จริงๆ ว่าใช้อะไรกันนักหนา ถ้าไม่เล่นเกมส์กับดาวน์โหลดไฟล์) ก็เลยทำการละเมิดระเบียบอีกข้อด้วยการต่อเชื่อมเน็ตเวิร์คระหว่างห้องปฏิบัติการโดยพละการ และด้วยสายเน็ตเวิร์คไม่ยาวพอ ก็เลยทำการต่อสายให้ยาวขึ้นด้วยตัวเอง ซึ่งผมเห็นแล้วถึงกับพูดไม่ออกในความมักง่าย เพราะสายทองแดงทุกเส้นมีโอกาสช็อตกันหมด

ด้วยเหตุที่เกิดขึ้นนี้จึงต้องคุมเข้มผู้ใช้งานที่ขาดสติ ด้วยการตัดไม่ให้เชื่อมต่อออกไปข้างนอกได้โดยตรง โดยผู้ใช้งานจะต้องใช้ผ่าน proxy ที่มีระบบ authentication เท่านั้น เพื่อที่จะตรวจสอบ ควบคุม และติดตามการใช้งานได้สะดวกขึ้น

ทีนี้เรื่องของ browser authentication มันก็มี 2 แบบคือ Basic access authentication กับ Digest access authenication ตามที่ระบุไว้ใน RFC2617

เมื่อลองเปรียบเทียบกันแล้ว basic access authentication จะมีความปลอดภัยน้อยกว่าเนื่องจากมีการส่งข้อมูลแบบ plain text ส่วน digest access authentitication นั้นจะมีการทำ digest ของ username password URL และ nounce ด้วย ซึ่งจะช่วยทำให้การส่งข้อมูลระหว่างการ authenticate นั้นไม่ได้อยู่ในรูปแบบของ plain text เท่านั้น

ลองดูตัวอย่างการทำ HTTP authentication กับ PHP ได้ที่นี่ครับ

ทีนี้เจ้า Squid สามารถที่จะทำการ authentication ด้วยวิธี digest access authenticatio ได้เช่นกัน โดยในการ compile จะต้องระบุไปด้วยว่าจะใช้ authentication แบบ digest ด้วย ดังตัวอย่างต่อไปนี้ ถ้าไม่ระบุไปก็จะมีแต่ basic authentication เท่านั้น

CFLAGS="-O2 -march=i686 -funroll-loops" 
./configure 
--exec_prefix=/usr 
--bindir=/usr/sbin 
--libexecdir=/usr/lib/squid 
--localstatedir=/var 
--sysconfdir=/etc/squid 
--enable-dlmalloc 
--enable-gnuregex 
--enable-xmalloc-statistics 
--with-pthreads 
--enable-removal-policies="heap" 
--enable-storeio=diskd,ufs 
--enable-delay-pools 
--enable-cache-digests 
--enable-err-language=English 
--enable-poll 
--enable-linux-netfilter 
--enable-truncate 
--enable-auth="basic digest"

อ่านวิธีการติดตั้ง squid แบบ quickstart ได้ที่นี่ครับ มีคนเขียนวิธีการติดตั้งเอาไว้เยอะแล้ว ดังนั้นผมจะข้ามรายละเอียดส่วนนี้ไป

ทีนี้เนื่องจากเราต้องใช้โปรแกรมที่เป็น helper ในการอ่าน digest password ก็ต้องเข้าไปในไดเรกทอรี helpers/digest_auth/password ที่อยู่ภายใต้ไดเรกทอรีของ squid-2.5.STABLEXX ที่โหลดมา จากนั้นให้สั่ง combile และ copy digest_pw_auth ไปไว้ยังไดเรกทอรี libexecdir ที่กำหนดไว้ตอนสั่ง configuration ข้างบน (/usr/lib/squid) ดังตัวอย่างต่อไปนี้

# make
# cp digest_pw_auth /usr/lib/squid

ขั้นตอนต่อไปก็คือเพิ่มคำสั่งต่อไปนี้ใน squid.conf (จะมีส่วนของ auth_param อยู่)

auth_param digest program /usr/lib/squid/digest_pw_auth /etc/squid/digpass
auth_param digest children 5
auth_param digest realm Your Company Name
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50
auth_param digest nonce_strictness off
auth_param digest check_nonce_count on
auth_param digest post_workaround off
acl authentication proxy_auth REQUIRED

และใส่ acl ของ authentication ไว้ในส่วของ acl ด้วย
http_access allow authentication
http_access allow localnet
http_access deny all

จากนั้นก็สร้างไฟล์ชื่อ digpass ในไดเรกทอรี /etc/squid (ระบุไว้ในคำสั่ง auth_param ข้างต้น) ซึ่งเป็นที่เก็บ username และ password ในรูปแบบของ username:password เช่น somchai:ilovemywife โดบให้แยก username และ password ของผู้ใช้ให้อยู่คนละบรรทัด

จากนั้นก็ restart sqiud แล้วเปลี่ยนบราวเซอร์ให้มาใช้ proxy ลองเปิดเว็บ ถ้าทุกอย่างถูกต้องก็จะมี popup ขึ้นมาให้ใส่ username และ password ครับ

Apache web server VS SELINUX

วันนี้ได้มีโอกาสย้ายข้อมูลของเว็บเซิร์ฟเวอร์ ในเครื่องใหม่มีการติดตั้ง SELINUX ไว้ด้วย ทีนี้ผมต้องการย้าย home ของเว็บเพจจาก /var/www ให้เป็น /home/httpd เพื่อให้เหมือนกับโครงสร้างเดิม ผมก็เลยดำเนินการแก้ไขไฟล์ httpd.conf จาก /var/www ให้เป็น /home/httpd ทั้งหมด แล้วก็ restart apache ใหม่ ผลปรากฏว่า start apache ไม่ได้ และมีข้อความเตือนดังนี้

Starting httpd: Syntax error on line 265 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
[FAILED]

ผมมั่นใจว่าแก้ไขไฟล์ httpd.conf ถูกแน่ๆ เลยลองเข้าไปดูใน /var/log/message ก็พบข้อความ error ต่อไปนี้

Sep 10 19:07:11 hostname httpd: DocumentRoot must be a directory
Sep 10 19:07:11 hostname kernel: audit(1126354031.054:0): avc: denied { getattr } for pid=4120 comm=httpd path=/home/httpd/html dev=hda10 ino=3194909 scontext=root:system_r:httpd_t tcontext=root:object_r:user_home_t tclass=dir
Sep 10 19:07:11 hostname httpd: httpd startup failed

คาดว่าคงเป็นเพราะว่ายังไม่ได้แก้ไข config ของ SELINUX ผมเลยลองค้นดูใน Google ก็เจอเอกสารที่คนไทยเขียนไว้เหมือนกัน แต่ไหงบอกว่าถ้าเจอปัญหาทำนองนี้ ให้แก้ไขโดยการยกเลิกการใช้งานของ SELINUX ซะ (อ้าว…)

วิธีปิด SELINUX ก็ให้แก้ไขแฟ้มชื่อ /etc/selinux/config แก้ไขจากเดิมบรรทัดว่า SELINUX=enforcing ให้เป็น SELINUX=disabled แล้วรีบูทเครื่องใหม่

แต่ผมไม่อยากปิด SELINUX ก็เลยลองตรวจสอบดูหน่อยว่าที่ /var/www มีการตั้งค่าไว้ยังไงบ้าง โดยใช้คำสั่ง ls -Z

[root@hostname www]# ls -Z
drwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t cgi-bin
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t error
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t html
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t icons
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t manual

ทีนี้ลงหาวิธีการ config ให้ apache สามารถใช้ /home/httpd ได้ ก็พบเว็บนี้ครับ
http://www.linuxhomenetworking.com/linux-hn/apachebasic.htm

ลองตรวจสอบก่อนว่า /home/httpd ของเดิมเป็นยังไง โดยใช้คำสั่ง ls -Z

[root@hostname httpd]# ls -Z
drwxr-xr-x root root root:object_r:user_home_t cgi-bin
drwxr-xr-x root root root:object_r:user_home_t error
drwxr-xr-x root root root:object_r:user_home_t html
drwxr-xr-x root root root:object_r:user_home_t icons
drwxr-xr-x root root root:object_r:user_home_t manual

ทีนี้ใช้คำสั่งนี้เพื่อแก้ไข context label
chcon -R -h -t httpd_sys_content_t /home/httpd

หลังจากนั้นลอง ls -Z ดูผลลัพธ์สักที

[root@hostname httpd]# ls -Z
drwxr-xr-x root root root:object_r:httpd_sys_content_t cgi-bin
drwxr-xr-x root root root:object_r:httpd_sys_content_t error
drwxr-xr-x root root root:object_r:httpd_sys_content_t html
drwxr-xr-x root root root:object_r:httpd_sys_content_t icons
drwxr-xr-x root root root:object_r:httpd_sys_content_t manual

แล้วก็ลอง start apache อีกสักครั้ง
[root@hostname httpd]# service httpd start
Starting httpd: [ OK ]

สำเร็จ!