บทความก่อนหน้า: การดำเนินการหลังติดตั้ง CentOS 7

หลังจากที่ก่อนหน้านี้ ได้มีการแนะนำขั้นตอนที่ควรดำเนินการเพื่อความปลอดภัยในการใช้งาน หลังจากติดตั้ง RHEL 7/CentOS 7 แล้ว ในหัวข้อนี้จะขอกล่าวถึงขั้นตอนในการติดตั้ง LAMP (Linux, Apache, MariaDB, PHP) และ mod_security

ติดตั้ง Apache

เริ่มด้วยการติดตั้ง Apache จากคำสั่ง yum โดยจะมีการ ติดตั้ง package ที่เกี่ยวข้องหรือส่วนที่ apache ต้องการใช้งาน เพิ่มเติมมาให้ด้วย

หลังจากติดตั้งเรียบร้อยแล้ว กำหนดให้ apache เริ่มทำงานตั้งแต่มีการเปิดเครื่องทุกครั้ง

คำสั่งในการ start / stop / restart service

คำสั่งในการตรวจสอบว่า httpd service ทำงานอยู่หรือไม่

ตรวจสอบ Firewall เพื่อให้เครื่อง client อื่นๆ สามารถ เรียกใช้งาน port 80 จาก server ได้

 

ขั้นตอนการการตรวจสอบหา IP ตนเอง

 

ทดสอบเรียกหน้า web http://[IP ADDRESS]/ หรือ Domain name ที่ตั้งค่าไว้แล้ว เพื่อนำมาทดสอบใช้งาน เช่น http://site2.example.com

ค่าเริ่มต้นต่างๆ สำหรับ httpd

ติดตั้ง MariaDB

สำหรับ mariadb นั้น คือ Database ที่ทาง RedHat และ CentOS ได้เลือกเป็น Default แทน MySQL สำหรับใช้งานในส่วนของ database ซึ่ง MariaDB มีต้นสายมาจาก MySQL ดังนั้นการเปลี่ยนมาใช้งาน MariaDB แทนที่ MySQL จึงแทบจะไม่ต้องแก้ไข code ของ PHP เพิ่มเติม ก็ยังคงสามารถใช้งาน function ต่างๆ ได้

การติดตั้ง MariaDB

สั่ง start service

กำหนดให้ MariaDB เริ่มทำงานตั้งแต่มีการเปิดเครื่อง

คำสั่งในการ start / stop / restart service

คำสั่งในการตรวจสอบว่า MariaDB service ทำงานอยู่หรือไม่

 

กำหนดความปลอดภัยเพิ่มขึ้นให้กับ MariaDB server

 

หากแสดงข้อความดังกล่าว แสดงว่าดำเนินการเรียบร้อยแล้ว
สามารถทดสอบ login ได้ด้วยคำสั่ง

 

กำหนดให้สามารถใช้งานผ่าน firewall

 

ติดตั้ง PHP

เริ่มต้นจาก ติดตั้ง php และ extension ต่างๆ ที่ต้องการใช้งาน

 

Restart apache เพื่อเริ่มต้นใช้งาน php

 

สร้างไฟล์ php เพื่อทดสอบ

 

ทดสอบเรียกหน้า web : http://site2.example.com/testphp.php

ติดตั้ง mod_security

ModSecurity คือ web application firewall (WAF) ที่ใช้เพื่อตรวจสอบและป้องกันการบุกรุก รวมทั้งเพิ่มความปลอดภัยในการเรียกใช้งานที่ผิดประเภท สำหรับ Web server

เริ่มการติดตั้ง

 

ตรวจสอบว่า apache มีการโหลดโมดูล mod_security มาใช้งานแล้ว

 

โดยส่วนที่เกี่ยวข้องกับการ config คือ

/etc/httpd/conf.d/mod_security.conf
/etc/httpd/modsecurity.d

เริ่มต้นการใช้งาน

 

การ config mod_security

การแก้ไข config เราจะเริ่มต้นที่ ไฟล์ mod_security.conf จากค่า default ของ config จะถูกกำหนดไว้เป็น DetectionOnly ซึ่งหมายถึงจะมีการตรวจสอบข้อมูลจาก rule ที่กำหนด แต่จะไม่มีการ block ค่าใดๆ ดังนั้นหากเราต้องการเปิดใช้งานสามารถแก้ไขค่าดังกล่าว หรือสามารถเปิดใช้งาน หลังจากที่มีการทดสอบส่วนต่างๆ เรียบร้อยแล้ว ก็ได้เช่นกัน

หากต้องการเปิดใช้งาน

แก้ไขจาก

 

สำหรับ directive ที่จะมีการเปลี่ยนค่าตัวต่อไป คือ SecResponseBodyAccess เนื่องจาก เมื่อมีการเปิดการใช้งานในส่วนนี้ จะทำให้มีการเรียกใช้งานบัฟเฟอร์เพิ่มขึ้น และยังเพิ่มขนาดของไฟล์ log ให้มีขนาดใหญ่ขึ้น ดังนั้นเบื้องต้นเราจะปิดค่านี้ไปก่อน

ทั้งนี้เมื่อปิดการใช้งานในส่วน global ไปแล้ว สามารถเลือกเปิดใช้งาน ในบางช่วงสถานการณ์ที่เฉพาะเจาะจงสำหรับบางประเภทผ่าน directive : SecResponseBodyMimeType ได้

แก้ไขจาก

 

สำหรับ directive : SecRequestBodyLimit คือ การกำหนดค่าสูงสูดของขนาดข้อมูล POST ซึ่งหากข้อมูลมีขนาดใหญ่กว่าค่าที่กำหนดไว้ จะได้รับ Error : 413 “Request Entity Too Large” โดยค่านี้เหมาะสำหรับการปรับลดในกรณีที่ web site ไม่มีส่วนของการ upload ไฟล์ข้อมูลขนาดใหญ่ ดังนั้นเราจะแก้ไขเป็นค่าด้านล่าง ซึ่งประมาณ 12.5MB

 

อีก directive ที่มีลักษณะการทำงานคล้ายกันได้แก่ SecRequestBodyNoFilesLimit ซึ่งคือ การกำหนดค่าน้อยที่สุดของขนาดข้อมูล POST ซึ่งเราจะแก้ไขเป็นค่าด้านล่าง ประมาณ 128KB

 

การกำหนด path สำหรับการเก็บ debug log

 

การกำหนดค่าของระดับการเก็บ log สามารถกำหนดค่าได้ตั้งแต่ 0-9 ซึ่งค่า default อยู่ที่ 0 สำหรับการใส่ค่า 1-3 log ดังกล่าวจะมีการเขียนลงที่ log ของ apache อยู่แล้ว หากต้องการตรวจสอบการใช้งาน สามารถปรับเพิ่มได้ ตามความเหมาะสม กรณีที่เครื่องที่มีการเปิดใช้งานแล้ว ไม่แนะนำให้มีการตั้งค่าสูงกว่า 3 เนื่องจาก อาจส่งผลกระทบกับประสิทธิภาพของระบบได้

รายละเอียดสำหรับการเก็บ debug log
0: no logging
1: errors (intercepted requests) only
2: warnings
3: notices
4: details of how transactions are handled
5: as above, but including information about each piece of information handled
9: log everything, including very detailed debugging information

ส่วนนี้เราจะกำหนดค่าคงไว้ที่ค่าเริ่มต้น

 

ติดตั้ง package เพิ่มเติม ซึ่งเป็นส่วน base rules จาก mod_security crs (Core Rule Set)

 

เมื่อติดตั้งเรียบร้อย จะพบว่ามีไฟล์ rule ต่างๆ อยู่ตาม path ด้านล่าง

 

และมีการทำ symlinks มายัง path ตั้งต้น ของ modsecurity

 

หลังจากได้ rule ต่างๆ แล้วต่อไปเราจะเริ่มทดสอบใช้งาน

ทดสอบ sql injection rule

ซึ่งเบื้องต้นเราจะเลือกทดสอบใช้งานเฉพาะบางตัวก่อน ในที่นี่เราจะทดสอบ sql injection เท่านั้น โดยเริ่มแก้ไขดังนี้

 

save ไฟล์และสั่ง load config

 

login เข้าสู่ mysql

 

เมื่อสามารถ login ผ่านจะพบ prompt MariaDB [(none)]> ให้ run คำสั่งตามด้านล่าง

 

ทดสอบสร้างไฟล์ php เพื่อทดสอบเรียกใช้งาน

 

ทดสอบใช้งานการ Sign in โดยทดสอบใส่ค่าที่ถูกต้อง และไม่ถูกต้องเพื่อตรวจสอบการทำงานและการติดต่อ database
http://site2.example.com/login.php
Username: somsri
Password: March

หลังจากนั้นให้ลองทดสอบใส่ค่า password ดังตัวอย่างด้านล่าง

‘ คือ Single quotes
true – – คือ SPACE true SPACE DASH SPACE DASH SPACE
select * from mysql; คือ select SPACE STAR from SPACE mysql SEMICOLON

และตรวจสอบการทำงานของ ModSecurity จากไฟล์ log
/var/log/httpd/modsec_audit.log
/var/log/httpd/error_log

ตัวอย่าง เช่น

 

ทดสอบสร้าง Rule เพื่อใช้งาน

เริ่มต้นจาก Rule แรก จะเป็นการปิดกั้นการใช้งานสำหรับ IP 192.168.0.12

 

save ไฟล์และสั่ง load config

 

ทดสอบเรียกใช้งาน web จาก IP 192.168.0.12 หากไม่สามารถใช้งานได้ ให้ตรวจสอบเพิ่มเติมที่ไฟล์ log
[Thu Feb 12 14:44:18.166166 2015] [:error] [pid 26980] [client 192.168.0.12] ModSecurity: Access denied with code 403 (phase 2). Pattern match “^192.168.0.12$” at REMOTE_ADDR. [file “/etc/httpd/conf.d/mod_security.conf”] [line “56”] [id “5001”] [msg “Test Rule”] [hostname “site2.example.com”] [uri “/login.php”] [unique_id “VOWU5Km6ppso-fMuh0vBRQAAAAM”]

และสำหรับ Rule ที่จะแนะนำเพิ่มเติม จะเป็นการปิดกั้นการเรียกใช้งาน URL เมื่อมีการเรียก ค่า httpd.conf หรือ passwd

 

save ไฟล์และสั่ง load config

 

ทดสอบเรียกใช้งาน web จาก http://site2.example.com/login.php?passwd หากไม่สามารถใช้งานได้ ให้ตรวจสอบเพิ่มเติมที่ไฟล์ log

[Thu Feb 12 15:34:32.568072 2015] [:error] [pid 27134] [client 192.168.0.12] ModSecurity: Access denied with code 403 (phase 2). Pattern match “(?:\\\\b(?:passwd|httpd\\\\.conf)\\\\b)” at REQUEST_URI. [file “/etc/httpd/conf.d/mod_security.conf”] [line “58”] [id “5002”] [msg “Remote File Access Attempt”] [hostname “site2.example.com”] [uri “/login.php”] [unique_id “VOWgGIPP4q@AnEElri7AUgAAAAA”]

และหากต้องการ disable การใช้งานเฉพาะ บาง VirtualHost สามารถ เพิ่มค่าตามด้านล่าง เข้าไปยัง <VirtualHost> นั้นๆ

ข้อมูลเพิ่มเติมสำหรับ ModSecurity : https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual

บริการ Virtual machine ต่างๆ ของ HostPacific เช่น CloudNode (เริ่มต้นเพียงชม.ละ 0.75 บาท), CloudNode-M (เริ่มต้นเพียงเดือนละ 450 บาท) หรือ Enterprise Cloud Server (เริ่มต้นเดือนละ 900 บาท) สามารถใช้งาน LAMP stack เช่นในบทความนี้ได้ทุกแพลน

 

Share this:Share on FacebookTweet about this on TwitterShare on Google+Pin on Pinterest