ค้นหาเว็บไซต์

ปกป้อง Apache จากการโจมตีแบบ Brute Force หรือ DDoS โดยใช้โมดูล Mod_Security และ Mod_evasive


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

mod_security (กลไกการตรวจจับและป้องกันการบุกรุกแบบโอเพนซอร์สสำหรับเว็บแอปพลิเคชันที่ทำงานร่วมกับเว็บเซิร์ฟเวอร์ได้อย่างราบรื่น) และ mod_evasive เป็นเครื่องมือที่สำคัญมากสองอย่างที่สามารถนำไปใช้ในการปกป้องเว็บเซิร์ฟเวอร์ได้ ต่อต้านการโจมตีด้วยกำลังดุร้ายหรือ (D) DoS

mod_evasive ตามชื่อของมัน มอบความสามารถในการหลบเลี่ยงในขณะที่ถูกโจมตี โดยทำหน้าที่เป็นเสมือนร่มที่ปกป้องเว็บเซิร์ฟเวอร์จากภัยคุกคามดังกล่าว

ในบทความนี้ เราจะพูดถึงวิธีการติดตั้ง กำหนดค่า และนำไปใช้ร่วมกับ Apache บน RHEL/CentOS 8 และ 7 เป็น เช่นเดียวกับ Fedora นอกจากนี้ เราจะจำลองการโจมตีเพื่อตรวจสอบว่าเซิร์ฟเวอร์ตอบสนองตามนั้น

ซึ่งจะถือว่าคุณมีเซิร์ฟเวอร์ LAMP ติดตั้งอยู่ในระบบของคุณ ถ้าไม่ โปรดตรวจสอบบทความนี้ก่อนที่จะดำเนินการต่อไป

  • วิธีการติดตั้งเซิร์ฟเวอร์ LAMP บน CentOS 8
  • วิธีติดตั้ง LAMP stack ใน RHEL/CentOS 7

คุณจะต้องตั้งค่า iptables เป็นฟรอนต์เอนด์เริ่มต้นของไฟร์วอลล์แทนไฟร์วอลล์ หากคุณใช้ RHEL/CentOS 8/7 หรือ Fedora แข็งแกร่ง>. เราทำเช่นนี้เพื่อที่จะใช้เครื่องมือเดียวกันทั้งใน RHEL/CentOS 8/7 และ Fedora

ขั้นตอนที่ 1: การติดตั้งไฟร์วอลล์ Iptables บน RHEL/CentOS 8/7 และ Fedora

ในการเริ่มต้น ให้หยุดและปิดการใช้งาน firewalld:

systemctl stop firewalld
systemctl disable firewalld

จากนั้นติดตั้งแพ็คเกจ iptables-services ก่อนที่จะเปิดใช้งาน iptables:

yum update && yum install iptables-services
systemctl enable iptables
systemctl start iptables
systemctl status iptables

ขั้นตอนที่ 2: การติดตั้ง Mod_Security และ Mod_evasive

นอกเหนือจากการตั้งค่า LAMP แล้ว คุณจะต้องเปิดใช้งานพื้นที่เก็บข้อมูล EPEL ใน RHEL/CentOS 8/7 ตามลำดับ เพื่อติดตั้งแพ็คเกจทั้งสอง ผู้ใช้ Fedora ไม่จำเป็นต้องเปิดใช้งาน repo ใดๆ เนื่องจาก epel เป็นส่วนหนึ่งของ Fedora Project แล้ว

yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
dnf --enablerepo=raven-extras install mod_evasive

เมื่อการติดตั้งเสร็จสมบูรณ์ คุณจะพบไฟล์การกำหนดค่าสำหรับเครื่องมือทั้งสองใน /etc/httpd/conf.d

ls -l /etc/httpd/conf.d

ตอนนี้ เพื่อที่จะรวมโมดูลทั้งสองนี้เข้ากับ Apache และให้โหลดโมดูลเหล่านั้นเมื่อเริ่มต้น ตรวจสอบให้แน่ใจว่าบรรทัดต่อไปนี้ปรากฏในส่วนระดับบนสุดของ mod_evasive.conf และ mod_security.conf ตามลำดับ:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

โปรดทราบว่า modules/mod_security2.so และ modules/mod_evasive24.so เป็นเส้นทางสัมพัทธ์จากไดเร็กทอรี /etc/httpd ไปยังไฟล์ต้นฉบับ ของโมดูล คุณสามารถตรวจสอบสิ่งนี้ (และเปลี่ยนแปลงได้ หากจำเป็น) โดยแสดงรายการเนื้อหาของไดเร็กทอรี /etc/httpd/modules:

cd /etc/httpd/modules
pwd
ls -l | grep -Ei '(evasive|security)'

จากนั้นรีสตาร์ท Apache และตรวจสอบว่าโหลด mod_evasive และ mod_security หรือไม่:

systemctl restart httpd 	

ดัมพ์รายการโมดูลแบบคงที่และโมดูลที่ใช้ร่วมกันที่โหลด

httpd -M | grep -Ei '(evasive|security)'				

ขั้นตอนที่ 3: การติดตั้งชุดกฎหลักและการกำหนดค่า Mod_Security

กล่าวอีกนัยหนึ่ง ชุดกฎหลัก (หรือที่เรียกว่า CRS) จะให้คำแนะนำแก่เว็บเซิร์ฟเวอร์เกี่ยวกับวิธีการทำงานภายใต้เงื่อนไขบางประการ บริษัทผู้พัฒนา mod_security มอบ CRS ฟรีที่เรียกว่า OWASP (Open Web Application Security Project) ModSecurity CRS ซึ่งสามารถดาวน์โหลดและติดตั้งได้ดังต่อไปนี้

1. ดาวน์โหลด OWASP CRS ไปยังไดเร็กทอรีที่สร้างขึ้นเพื่อวัตถุประสงค์ดังกล่าว

mkdir /etc/httpd/crs-tecmint
cd /etc/httpd/crs-tecmint
wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. เลิกตาร์ไฟล์ CRS และเปลี่ยนชื่อไดเร็กทอรีเพื่อความสะดวกของเรา

tar xzf master
mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. ตอนนี้ก็ถึงเวลากำหนดค่า mod_security คัดลอกไฟล์ตัวอย่างที่มีกฎ (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) ไปยังไฟล์อื่นที่ไม่มีนามสกุล .example:

cd owasp-modsecurity-crs/
cp crs-setup.conf.example crs-setup.conf

และบอก Apache ให้ใช้ไฟล์นี้พร้อมกับโมดูลโดยการแทรกบรรทัดต่อไปนี้ในไฟล์การกำหนดค่าหลักของเว็บเซิร์ฟเวอร์ /etc/httpd/conf/httpd.conf หากคุณเลือกที่จะแตกไฟล์ tarball ในไดเรกทอรีอื่น คุณจะต้องแก้ไขเส้นทางตามคำสั่งรวม:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

สุดท้ายนี้ ขอแนะนำให้เราสร้างไฟล์การกำหนดค่าของเราเองภายในไดเร็กทอรี /etc/httpd/modsecurity.d ซึ่งเราจะวางคำสั่งที่กำหนดเองของเรา (เราจะตั้งชื่อว่า tecmint.conf b> ในตัวอย่างต่อไปนี้) แทนที่จะแก้ไขไฟล์ CRS โดยตรง การทำเช่นนี้จะช่วยให้อัปเกรด CRS ได้ง่ายขึ้นเมื่อมีการเปิดตัวเวอร์ชันใหม่

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

คุณสามารถดูพื้นที่เก็บข้อมูล ModSecurity GitHub ของ SpiderLabs เพื่อดูคำแนะนำโดยละเอียดเกี่ยวกับคำสั่งการกำหนดค่า mod_security

ขั้นตอนที่ 4: การกำหนดค่า Mod_Evasive

mod_evasive ได้รับการกำหนดค่าโดยใช้คำสั่งใน /etc/httpd/conf.d/mod_evasive.conf เนื่องจากไม่มีกฎที่ต้องอัปเดตระหว่างการอัปเกรดแพ็คเกจ เราจึงไม่จำเป็นต้องมีไฟล์แยกต่างหากเพื่อเพิ่มคำสั่งที่กำหนดเอง ซึ่งต่างจาก mod_security

ไฟล์ mod_evasive.conf เริ่มต้นเปิดใช้งานคำสั่งต่อไปนี้ (โปรดทราบว่าไฟล์นี้มีความคิดเห็นจำนวนมาก ดังนั้นเราจึงตัดความคิดเห็นออกเพื่อเน้นคำสั่งการกำหนดค่าด้านล่าง):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

คำอธิบายของคำสั่ง:

  • DOSHashTableSize: คำสั่งนี้ระบุขนาดของตารางแฮชที่ใช้ในการติดตามกิจกรรมตามที่อยู่ IP ต่อ การเพิ่มจำนวนนี้จะช่วยให้ค้นหาเว็บไซต์ที่ลูกค้าเคยเยี่ยมชมในอดีตได้เร็วขึ้น แต่อาจส่งผลกระทบต่อประสิทธิภาพโดยรวมหากตั้งค่าไว้สูงเกินไป
  • DOSPageCount: จำนวนคำขอที่เหมือนกันที่ถูกต้องตามกฎหมายไปยัง URI เฉพาะ (เช่น ไฟล์ใดๆ ที่ให้บริการโดย Apache) ที่ผู้เข้าชมสามารถสร้างได้ในช่วงเวลา DOSPageInterval
  • DOSSiteCount: คล้ายกับ DOSPageCount แต่หมายถึงจำนวนคำขอโดยรวมที่สามารถทำได้ไปยังทั้งไซต์ในช่วงเวลา DOSSiteInterval
  • DOSBlockingPeriod: หากผู้เข้าชมเกินขีดจำกัดที่กำหนดโดย DOSSPageCount หรือ DOSSiteCount ที่อยู่ IP ต้นทางของเขาจะถูกขึ้นบัญชีดำในช่วงเวลา DOSBlockingPeriod ในระหว่าง DOSBlockingPeriod คำขอใดๆ ที่มาจากที่อยู่ IP นั้นจะพบข้อผิดพลาด 403 Forbidden

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

คำเตือนเล็กๆ น้อยๆ เท่านั้น: หากตั้งค่าเหล่านี้ไม่ถูกต้อง คุณจะเสี่ยงต่อการบล็อกผู้เข้าชมที่ถูกต้องตามกฎหมาย

คุณอาจต้องการพิจารณาคำสั่งที่เป็นประโยชน์อื่นๆ:

DOSEmailแจ้งเตือน

หากคุณมีเมลเซิร์ฟเวอร์และทำงานอยู่ คุณสามารถส่งข้อความเตือนผ่าน Apache ได้ โปรดทราบว่าคุณจะต้องให้สิทธิ์แก่ผู้ใช้ apache SELinux ในการส่งอีเมลหาก SELinux ถูกตั้งค่าให้บังคับใช้ คุณสามารถทำได้โดยการวิ่ง

setsebool -P httpd_can_sendmail 1

จากนั้น เพิ่มคำสั่งนี้ในไฟล์ mod_evasive.conf พร้อมด้วยคำสั่งอื่นๆ ที่เหลือ:

DOSEmailNotify [email 

หากตั้งค่านี้ไว้และเมลเซิร์ฟเวอร์ของคุณทำงานอย่างถูกต้อง อีเมลจะถูกส่งไปยังที่อยู่ที่ระบุเมื่อใดก็ตามที่ที่อยู่ IP กลายเป็นบัญชีดำ

คำสั่งระบบ DOS

สิ่งนี้ต้องการคำสั่งระบบที่ถูกต้องเป็นอาร์กิวเมนต์

DOSSystemCommand </command>

คำสั่งนี้ระบุคำสั่งที่จะดำเนินการเมื่อใดก็ตามที่ที่อยู่ IP กลายเป็นบัญชีดำ มักจะใช้ร่วมกับเชลล์สคริปต์ที่เพิ่มกฎไฟร์วอลล์เพื่อบล็อกการเชื่อมต่อเพิ่มเติมจากที่อยู่ IP นั้น

เขียนเชลล์สคริปต์ที่จัดการบัญชีดำ IP ในระดับไฟร์วอลล์

เมื่อที่อยู่ IP กลายเป็นบัญชีดำ เราจำเป็นต้องบล็อกการเชื่อมต่อที่มาจากที่อยู่ IP ในอนาคต เราจะใช้เชลล์สคริปต์ต่อไปนี้เพื่อทำงานนี้ สร้างไดเร็กทอรีชื่อ scripts-tecmint (หรือชื่อใดก็ได้ตามที่คุณต้องการ) ใน /usr/local/bin และไฟล์ชื่อ ban_ip.sh ในไดเร็กทอรีนั้น

#!/bin/sh
IP that will be blocked, as detected by mod_evasive
IP=$1
Full path to iptables
IPTABLES="/sbin/iptables"
mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

คำสั่ง DOSSystemCommand ของเราควรมีลักษณะดังนี้:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

ในบรรทัดด้านบน %s แสดงถึง IP ที่ละเมิดซึ่งตรวจพบโดย mod_evasive

เพิ่มผู้ใช้ apache ลงในไฟล์ sudoers

โปรดทราบว่าทั้งหมดนี้จะไม่ทำงานเว้นแต่คุณจะให้สิทธิ์แก่ผู้ใช้ apache เพื่อเรียกใช้สคริปต์ของเรา (และสคริปต์นั้นเท่านั้น!) โดยไม่ต้องใช้เทอร์มินัลและรหัสผ่าน ตามปกติ คุณสามารถพิมพ์ visudo เป็น root เพื่อเข้าถึงไฟล์ /etc/sudoers จากนั้นเพิ่ม 2 บรรทัดต่อไปนี้ดังที่แสดงในภาพด้านล่าง:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

สิ่งสำคัญ: ตามนโยบายความปลอดภัยเริ่มต้น คุณสามารถเรียกใช้ sudo ในเทอร์มินัลเท่านั้น เนื่องจากในกรณีนี้ เราจำเป็นต้องใช้ sudo โดยไม่มี tty เราจึงต้องใส่ความคิดเห็นในบรรทัดที่ถูกไฮไลต์ในภาพต่อไปนี้:

#Defaults requiretty

สุดท้ายให้รีสตาร์ทเว็บเซิร์ฟเวอร์:

systemctl restart httpd

ขั้นตอนที่ 4: จำลองการโจมตี DDoS บน Apache

มีเครื่องมือหลายอย่างที่คุณสามารถใช้เพื่อจำลองการโจมตีภายนอกบนเซิร์ฟเวอร์ของคุณ คุณเพียงแค่ใช้ Google เพื่อหา “เครื่องมือสำหรับจำลองการโจมตี ddos ” เพื่อค้นหาหลายรายการ

โปรดทราบว่าคุณและคุณเพียงคนเดียวเท่านั้นที่จะเป็นผู้รับผิดชอบต่อผลลัพธ์ของการจำลองของคุณ อย่าคิดที่จะเริ่มการโจมตีจำลองบนเซิร์ฟเวอร์ที่คุณไม่ได้โฮสต์อยู่ในเครือข่ายของคุณเอง

หากคุณต้องการทำเช่นเดียวกันกับ VPS ที่โฮสต์โดยบุคคลอื่น คุณจะต้องเตือนผู้ให้บริการโฮสติ้งของคุณอย่างเหมาะสม หรือขออนุญาตให้การจราจรหนาแน่นดังกล่าวผ่านเครือข่ายของพวกเขา linux-console.net จะไม่รับผิดชอบต่อการกระทำของคุณไม่ว่าด้วยวิธีใดก็ตาม!

นอกจากนี้ การโจมตี DoS จำลองจากโฮสต์เดียวไม่ได้แสดงถึงการโจมตีในชีวิตจริง ในการจำลองดังกล่าว คุณจะต้องกำหนดเป้าหมายเซิร์ฟเวอร์ของคุณจากไคลเอนต์หลายเครื่องพร้อมกัน

สภาพแวดล้อมการทดสอบของเราประกอบด้วยเซิร์ฟเวอร์ CentOS 7 [IP 192.168.0.17] และโฮสต์ Windows ซึ่งเราจะเริ่มการโจมตี [IP 192.168.0.103< /ข>]:

โปรดเล่นวิดีโอด้านล่างและทำตามขั้นตอนที่ระบุไว้ตามลำดับที่ระบุเพื่อจำลองการโจมตี DoS แบบง่ายๆ:

จากนั้น IP ที่ละเมิดจะถูกบล็อกโดย iptables:

บทสรุป

เมื่อเปิดใช้งาน mod_security และ mod_evasive การโจมตีจำลองจะทำให้ CPU และ RAM ทดลองกับการใช้งานสูงสุดชั่วคราวสำหรับ เพียงไม่กี่วินาทีก่อนที่ IP ต้นทางจะถูกขึ้นบัญชีดำและถูกบล็อกโดยไฟร์วอลล์ หากไม่มีเครื่องมือเหล่านี้ การจำลองจะทำให้เซิร์ฟเวอร์ล่มอย่างรวดเร็วอย่างแน่นอน และทำให้ไม่สามารถใช้งานได้ในระหว่างช่วงระยะเวลาของการโจมตี

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

ลิงค์อ้างอิง

https://www.modsecurity.org/