อัปเดต: คำตอบปัจจุบันได้รับการอัพเดตอย่างสมบูรณ์
ตามที่การสนทนานี้ผมสร้างพื้นที่เก็บข้อมูล GitHub ชื่อWWW การรักษาความปลอดภัยผู้ช่วย มีสาขาเรียกว่าask_ubuntu
อุทิศให้กับคำตอบนี้ การอ้างอิงทั้งหมดที่มีอยู่ก่อนหน้านี้ที่นี่จะถูกลบออกเนื่องจากขีด จำกัด อักขระ - มีอยู่ใน GitHub
ต่อไปนี้เป็นวิธีการดูที่เกี่ยวข้องกับกลไกที่สมบูรณ์วิธีเพิ่มความปลอดภัย Apache2ภายใน Ubuntu 16.04
สารบัญ:
- สคริปต์ผู้ช่วยความปลอดภัย WWW (WSAS) ► Iptables
- Iptables - การกำหนดค่าพื้นฐาน - บันทึกและกู้คืน
- ModEvasive สำหรับ Apache2
- ModEvasive ► WSAS ► Iptables
- ModSecurity 2.9 สำหรับ Apache2
- ชุดกฎหลัก ModSecurity OWASP 3.x
- รายการที่อนุญาตพิเศษกฎของ ModSecurity
- กฎ ModSecurity ► WSAS ► Iptables
- ModSecurity และ Apache Log Files
- ModSecurity Log files ► Fail2Ban ► Iptables
- ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
- ModSecurity GuardianLog ► HTTPD กำหนดเองวิเคราะห์► WSAS ► Iptables
นอกจากนี้สมมติว่ามันดีเสมอที่จะใช้ HTTPS:
สคริปต์ผู้ช่วยความปลอดภัย WWW ► Iptables
www-security-assistant.bash
ที่นี่จะนำเสนอสคริปต์ มันสามารถช่วยคุณจัดการกับที่อยู่ IP ที่เป็นอันตราย สคริปต์มีสองโหมด
โหมดอัตโนมัติ
เมื่อโปรแกรมภายนอกเช่นเดียวกับ Apache mod_security
ให้ที่$IP
อยู่ที่เป็นอันตราย ในกรณีนี้ไวยากรณ์ที่เรียกใช้สคริปต์ควรเป็น:
www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst
ในโหมดนี้สคริปต์มีสองขั้นตอนการกระทำและสำหรับทุกการกระทำสคริปต์จะส่งอีเมลไปยังผู้ดูแลระบบ
ขั้นตอนแรกสำหรับไม่กี่ครั้งแรก'การละเมิด'แหล่งที่มา$IP
จะถูกต้องห้ามสำหรับระยะเวลาหนึ่ง$BAN_TIME
เท่ากับค่าของ at
โหมดนี้ใช้คำสั่ง
ขั้นตอนที่สอง: เมื่อจำนวนของการละเมิดจากบางที่$IP
จะเท่ากับค่าของ$LIMIT
นี้$IP
อยู่จะถูกห้ามอย่างถาวรผ่าน iptables $BAN_LIST
คำและจะถูกเพิ่มเข้าไป
โหมดแมนนวล
โหมดนี้ยอมรับตัวเลือกต่อไปนี้:
www-security-assistant.bash <ip-address>
--DROP "log notes"
สร้างรายการลงในไฟล์/var/www-security-assistant/iptables-DROP.list
และสร้างกฎเป็น:
iptables -A GUARDIAN -s $IP -j DROP
www-security-assistant.bash <ip-address>
--DROP-CLEAR "log notes"
สร้างรายการในไฟล์/var/www-security-assistant/iptables-DROP-CLEAR.list
ลบกฎ Iptables ที่แน่นอนลบออก$IP
จากประวัติและจาก$BAN_LIST
:
iptables -D GUARDIAN -s $IP -j DROP
www-security-assistant.bash <ip-address>
--ACCEPT "log notes"
/var/www-security-assistant/iptables-ACCEPT.list
สร้างเพียงเข้าสู่ไฟล์
www-security-assistant.bash <ip-address>
--ACCEPT-CHAIN "log notes"
สร้างรายการลงในไฟล์/var/www-security-assistant/iptables-ACCEPT.list
และสร้างกฎเป็น:
iptables -A GUARDIAN -s $IP -j ACCEPT
การอ้างอิง
สคริปต์ใช้iptables-save.sh
และiptables
เชนGUARDIAN
อธิบายในส่วนถัดไป มันจะสร้างและบำรุงรักษาไฟล์บางไฟล์ภายใน$WORK_DIR
:
www-security-assistant.history
- มีข้อมูลสำหรับการละเมิด IP ก่อนหน้า
www-security-assistant.mail
- เนื้อหาของอีเมลล่าสุดที่ส่งโดยสคริปต์
iptables-ACCEPT.list
; และiptables-DROP.list
iptables-DROP-CLEAR.list
สคริปต์ต้องการการกำหนดค่าขั้นต่ำเพื่อส่งอีเมล:
sudo apt install s-nail mutt mailutils postfix
sudo dpkg-reconfigure postfix # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email email@example.com
หากมีบริการ HTTPS ที่กำหนดค่าไว้ใด ๆ ใบรับรอง TLS สามารถใช้ภายในบริการ Postfix
นอกจากสคริปต์ที่ใช้:at
sudo apt install at
การติดตั้ง
/var/www-security-assistant
สร้างไดเรกทอรีทำงานขอเรียกว่า ดาวน์โหลดwww-security-assistant.bash
และทำให้ปฏิบัติการ:
sudo mkdir /var/www-security-assistant
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
ทำให้www-security-assistant.bash
พร้อมใช้งานเป็นคำสั่งที่กำหนดเอง:
sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
ให้สิทธิ์ในการwww-data
ที่จะทำงานได้โดยไม่ต้องผ่านรหัสผ่านwww-security-assistant.bash
sudo
ใช้คำสั่งต่อไปนี้เพื่อสร้างและแก้ไขไฟล์ใหม่ด้วยsudoers
กฎ ' ' เพิ่มเติมอย่างปลอดภัย :
sudo visudo -f /etc/sudoers.d/www-security-assistant
เพิ่มบรรทัดต่อไปนี้ภายในไฟล์ - บันทึกไฟล์และออก:
www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
www-security-assistant.bash
ปรับแต่ง $EMAIL_TO
เปลี่ยนอย่างน้อยค่าของตัวแปร
ตรวจเช็ค
เป็นตัวแทนของคุณ$AGENT
และตรวจสอบว่าโหมดอัตโนมัติทำงานอย่างถูกต้องหรือไม่:
www-security-assistant.bash 192.168.1.177 Guardian
จากนั้นตรวจสอบ e-mail ของคุณพิมพ์iptables -L GUARDIAN -n
ให้ตรวจสอบไฟล์และwww-security-assistant.history
www-security-assistant.mail
เรียกใช้คำสั่งดังกล่าว 5 ครั้งและตรวจทานแฟ้มและiptables-DROP.list
iptables-CURRENT.conf
ตรวจสอบว่า Manual MODE ทำงานอย่างถูกต้องหรือไม่เพิ่ม localhost ของคุณใน White List:
www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"
iptables-ACCEPT.list
จากนั้นตรวจสอบไฟล์
ส่วนที่เหลือของบทช่วยสอนนี้เป็นวิธีการรวมเข้าwww-security-assistant
กับระบบของคุณ
Iptables - การกำหนดค่าพื้นฐาน - บันทึกและกู้คืน
การกำหนดค่าพื้นฐาน
โปรดอ่านคู่มือนี้ก่อนที่จะเพิ่มกฎต่อไปนี้
sudo iptables -F
sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
ก่อนที่คุณจะดำเนินการต่อไปให้เปิดการเชื่อมต่อ SSH ใหม่และลองลงชื่อเข้าใช้ระบบของคุณเพื่อตรวจสอบว่าทุกอย่างใช้งานได้ดีหรือไม่!
บันทึกและกู้คืน
สิ่งนี้สามารถทำได้ผ่านสคริปต์ที่กำหนดเองซึ่งจะบันทึกและกู้คืนiptables
coning ระหว่างกระบวนการหยุด (หรือรีบูต) ของระบบ (ถ้าเราใช้ UFW เพื่อตั้งค่ากฎ Iptables ขั้นตอนนี้ไม่จำเป็น)
printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore
สร้างห่วงโซ่ใหม่
สร้างสายโซ่ใหม่ที่เรียกว่าGUARDIAN
และใส่เป็นหมายเลข 3 ลงในINPUT
ห่วงโซ่:
sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN
ตรวจเช็ค
รีบูทระบบและตรวจสอบการกำหนดค่า โปรดใช้sudo systemctl reboot
(อย่าใช้ตัวเลือกบังคับreboot -f
) เมื่อระบบกลับมาออนไลน์เราสามารถตรวจสอบว่ามีการสร้างเครือข่ายใหม่โดย:
sudo iptables -L GUARDIAN -n
ModEvasive สำหรับ Apache2
ModEvasive เป็นโมดูลการหลบหลีกที่ใช้งานได้สำหรับ Apache เพื่อให้เกิดการกระทำที่ชัดเจนในกรณีที่มีการโจมตี HTTP DoS หรือ DDoS หรือการโจมตีแบบบังคับเดรัจฉาน อ่านเพิ่มเติม...
การติดตั้ง
ติดตั้งและเปิดใช้งานโมดูล:
sudo apt install libapache2-mod-evasive
sudo a2enmod evasive
สร้าง Log Directory และทำให้สามารถเข้าถึงได้สำหรับwww-data
:
sudo mkdir -p /var/log/apache2_mod_evasive
sudo chown www-data /var/log/apache2_mod_evasive
ปรับการกำหนดค่าพื้นฐาน - uncomment และแก้ไขคำสั่งบางอย่างในไฟล์กำหนดค่า:
/etc/apache2/mods-enabled/evasive.conf
เริ่มต้นใหม่ sudo systemctl restart apache2.service
Apache:
ตรวจเช็ค
- เปิดหน้าเว็บจากเซิร์ฟเวอร์ของคุณและรีเฟรชหน้าต่างเบราว์เซอร์สองสามครั้งอย่างหนาแน่น (กด
F5
) - คุณต้องได้รับข้อความแสดงข้อผิดพลาดต้องห้าม 403ข้อ ในไดเรกทอรีบันทึกจะถูกสร้างขึ้นใหม่ล็อคไฟล์ ไฟล์นี้ควรถูกลบเพื่อการตรวจจับการละเมิดเพิ่มเติมจากที่อยู่ IP นี้
ModEvasive ► WSAS ► Iptables
ที่นี่เราจะกำหนดค่าmod_evasive
ให้พูดคุยiptables
ผ่านwww-security-assistant.bash
สร้างในส่วนด้านบน
แก้ไข/etc/apache2/mods-available/evasive.conf
ด้วยวิธีนี้:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 9
DOSSiteCount 70
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
#DOSEmailNotify your@email.foo
DOSLogDir "/var/log/apache2_mod_evasive"
DOSSystemCommand "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
</IfModule>
สร้างไฟล์บันทึกและรีสตาร์ท Apache:
sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog
ในการทดสอบการกำหนดค่านี้เราสามารถจำลอง DDoS โจมตีผ่านทางF5
วิธีการดังกล่าวข้างต้นหรือเราสามารถใช้คำสั่งเป็นab
, hping3
ฯลฯ
ข้อควรระวัง: ใช้ความระมัดระวังเนื่องจากiptables
กฎที่ใช้ใน WSAS จะทำการเชื่อมต่อใหม่ทั้งหมดจากแหล่ง$IP
รวมถึงการเชื่อมต่อ SSH ของคุณ เป็นการดีที่มีวิธีสำรองเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ในระหว่างการทดสอบ คุณสามารถเปลี่ยนกฎนี้เพื่อทำงานกับพอร์ต HTTP / HTTPS เท่านั้น
ModSecurity 2.9 สำหรับ Apache2
ModSecurityเป็นเอ็นจิ้นเว็บไฟร์วอลล์แอปพลิเคชั่นที่ให้การปกป้องเพียงเล็กน้อยเท่านั้น เพื่อให้มีประโยชน์ ModSecurity ต้องถูกกำหนดค่าด้วยกฎ เพื่อให้ผู้ใช้สามารถใช้ประโยชน์จาก ModSecurity ได้อย่างเต็มประสิทธิภาพ Spider Labs ของ Trustwave ได้มอบชุดกฎที่ได้รับการรับรองฟรี ... อ่านเพิ่มเติม ...
การติดตั้ง
ติดตั้งและเปิดใช้งานโมดูล:
sudo apt install libapache2-mod-security2
sudo a2enmod security2
สร้างไฟล์กำหนดค่า:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
อ่านและแก้ไข/etc/modsecurity/modsecurity.conf
อย่างระมัดระวัง! เพิ่มหรือเปลี่ยนแปลงคำสั่งต่อไปนี้อย่างน้อย:
# -- Rule engine initialization ----------------------------------------------
SecRuleEngine On
# -- Debug log configuration -------------------------------------------------
SecDebugLogLevel 2
SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
# -- Audit log configuration -------------------------------------------------
SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
# -- Guardian log configuration -------------------------------------------------
SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
ไฟล์/etc/apache2/mods-enabled/security2.conf
เกี่ยวข้องกับ/etc/modsecurity/modsecurity.conf
การกำหนดค่าของ Apache ในขั้นตอนนี้security2.conf
จะมีลักษณะเช่นนี้:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
</IfModule>
สร้างไดเรกทอรีเข้าสู่ระบบ:
sudo mkdir -p /var/log/apache2_mod_security
ตั้งค่าการหมุนเวียนการหมุน สร้างไฟล์กำหนดค่าครั้งแรก:
sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec
จากนั้นแก้ไขไฟล์ใหม่ด้วยวิธีนี้:
/var/log/apache2_mod_security/*.log { … }
รีสตาร์ท Apache
ตรวจเช็ค
สร้างไฟล์การกำหนดค่าเพิ่มเติมใน/etc/modsecurity
เรียกมันตัวอย่างz-customrules.conf
และเพิ่มกฎต่อไปนี้เป็นเนื้อหา:
# Directory traversal attacks
SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
รีสตาร์ทเซิร์ฟเวอร์: sudo systemctl restart apache2.service
. https://example.com/?abc=../
เปิดเบราว์เซอร์ของคุณและพิมพ์ ผลที่จะได้รับ: 403 พระราชวังต้องห้าม ตรวจสอบล็อกไฟล์/var/log/apache2_mod_security
เพื่อดูรายละเอียดเพิ่มเติม
เพื่อให้สิ่งที่สนุกมากขึ้นวางสคริปต์issues.php
ในตำแหน่งที่เหมาะสมภายในของคุณDocumentRoot
(ที่นี่ฉันสมมติว่าสถานที่นี้คือ/var/www/html
):
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php
จากนั้นแก้ไขกฎข้างต้นด้วยวิธีต่อไปนี้:
# Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"
เริ่มต้นใหม่ Apache แล้วเปิดเบราว์เซอร์ของคุณและพิมพ์https://example.com/?abc=../
;-) BotLovin.cs
ความคิดที่ยืมมาจากสคริปต์
แก้ไข/etc/modsecurity/z-customrules.conf
อีกครั้งและแสดงความคิดเห็น (ปิดการใช้งาน) กฎ - นี่เป็นเพียงตัวอย่างการทดสอบและถูกครอบคลุมโดย OWASP CRS ซึ่งอธิบายไว้ในส่วนถัดไป
นี่คืออีกตัวอย่างหนึ่งที่เราจะเปลี่ยนเส้นทางwp-admin
คำขอหน้าทั้งหมดแต่ยกเว้นสิ่งเหล่านี้จากที่อยู่ IP ที่แน่นอน (หมายเหตุchain
):
# Block wp-admin access
SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"
ที่นี่เรามีสองการกระทำก่อกวน: (1) deny, status:403
และ redirect:'/issues.php'
(2) ที่จริงแล้วเราไม่ต้องการการdeny
กระทำเพราะมันจะถูกแทนที่โดยการredirect
กระทำ
ชุดกฎหลัก ModSecurity OWASP 3.x
ใน Ubuntu 16.04 คุณสามารถติดตั้ง 2.x apt install modsecurity-crs
CSR: ที่นี่เราจะติดตั้งCSR 3.xคำแนะนำโดยละเอียดมีให้ในคู่มือการติดตั้ง ( git
จำเป็น)
การติดตั้ง
โคลน CSR ในโฟลเดอร์/usr/share/modsecurity-crs.3
:
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
อัปเกรดและต่ออายุฐานข้อมูล GeoIP โดยอัตโนมัติ (GeoIP DB ไม่รวมอยู่ใน CRS อีกต่อไปคุณควรดาวน์โหลดเป็นประจำ) สคริปต์util/upgrade.py
จะนำฟังก์ชันนี้มาใช้ คุณสามารถใช้มันใน cron - sudo crontab -e
:
0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
สร้างไฟล์กำหนดค่า:
sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}
อ่านและแก้ไขไฟล์เหล่านี้อย่างระมัดระวัง! SecGeoLookupDB
คำแนะนำอย่างน้อย uncomment :
SecGeoLookupDB util/geo-location/GeoIP.dat
ใช้การกำหนดค่าของ Apache แก้ไข/etc/apache2/mods-available/security2.conf
ด้วยวิธีนี้:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
</IfModule>
บันทึกไฟล์แล้วเริ่ม Apache ใหม่
รายการที่อนุญาตพิเศษกฎของ ModSecurity
การขึ้นบัญชีขาวของกฎ ModSecurity สามารถทำได้ผ่านคำสั่ง ModSec ต่อไปนี้ซึ่งสามารถใช้ได้ทั้งระบบหรือภายในการกำหนดค่าโฮสต์เสมือนรวมทั้งทั่วโลกสำหรับไดเรกทอรีหรือตำแหน่งที่ตรงกัน:
SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById
ปิดการใช้งานmod_security2
สำหรับ PhpMyAdmin เปลี่ยน/etc/phpmyadmin/apache.conf
วิธีนี้:
<Directory /usr/share/phpmyadmin>
<IfModule security2_module>
SecRuleEngine Off
</IfModule>
</Directory>
ปิดการใช้งานกฎเฉพาะสำหรับไดเรกทอรีบางอย่าง:
<Directory /var/www/html>
<IfModule security2_module>
SecRuleRemoveById 973301
</IfModule>
</Directory>
ปิดการใช้งานกฎทั่วโลก เพื่อจุดประสงค์นี้เราจะต้องเพิ่มคำสั่งของเราที่ไหนสักแห่งในไฟล์กำหนดค่าของ Apache: /etc/modsecurity/z-customrules.conf
เป็นสถานที่ที่ดี
ปิดใช้งานกฎภายในการกำหนดค่าทั้งหมดของ Apache:
SecRuleRemoveById 973301 950907
รายการที่อยู่ IP ที่อนุญาตพิเศษเพื่อให้สามารถผ่าน ModSecurity:
SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
ปิดใช้งานกฎภายในการจับคู่ไดเรกทอรี:
<Directory /var/www/mediawiki/core>
SecRuleRemoveById 973301 950907
</Directory>
อัปเดตการทำงานของกฎด้วย IDภายในการจับคู่สถานที่:
<LocationMatch "/index.php.*">
SecRuleUpdateActionById 973301 "pass"
SecRuleUpdateActionById 950907 "pass"
</LocationMatch>
ในตัวอย่างข้างต้นเราถือว่า973301
และ950907
เป็นรหัสกฎที่ขัดขวางการทำงานปกติของเว็บแอปของเรา modsec_audit.log
เราสามารถหากฎเหล่านี้โดยวิเคราะห์ของ
กฎ ModSecurity ► WSAS ► Iptables
ต่อไปนี้เป็นตัวอย่างเพิ่มเติมเกี่ยวกับวิธีสร้าง SecRules ที่กำหนดเองรวมถึงวิธีที่เราสามารถเรียก WWW Security Assistant Script (WSAS) ผ่านทางพวกเขา
ตั้งค่าเริ่มต้น
เราจำเป็นต้องของใบเริ่มต้นเพิ่มเติม modsecurity-assistant.sh
- เหตุผลก็คือexec
การกระทำของ ModSecurity นั้นง่ายเกินไปและมีข้อ จำกัด ด้านไวยากรณ์
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh
ถ้าคุณดูข้างในสคริปต์คุณจะเห็นตัวแปรบางตัวที่เป็น exportd โดย ModSecurity เหล่านี้คือ: $REQUEST_URI
, $ARGS
, $SERVER_NAME
, $REMOTE_ADDR
, และ$REMOTE_HOST
$UNIQUE_ID
ตัวแปรอื่น ๆ มีการอธิบายไว้ในสคริปต์
สร้างกฎที่กำหนดเองและเรียกใช้สคริปต์ของเราผ่านมัน
ขั้นแรกให้สร้างกฎที่จะดำเนินการmodsecurity-assistant.sh
(และโทรwww-security-assistant.bash
) เมื่อคำขอ URI มีคำที่รวมอยู่ในบัญชีดำของเรา เปิด/etc/modsecurity/z-customrules.conf
และเพิ่มบรรทัดต่อไปนี้ที่ด้านล่าง:
# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
"id:150, log, t:lowercase, chain, \
drop, deny, status:403, redirect:'/issues.php'"
SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
"setenv:REMOTE_HOST=%{REMOTE_HOST}, \
setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
REQUEST_URI
- ตัวแปรนี้มี URI แบบเต็มจากคำขอปัจจุบัน กฎ culd กว้างกว่า:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...
@pmFromFile
จะอ่านไฟล์modsecurity-uri-black.list
ที่มีรายการวลีโดยที่แต่ละวลีหรือคำเฉพาะถูกวางไว้ในบรรทัดใหม่ คุณสามารถรวบรวมคำและวลีที่น่าสนใจได้จากล็อกไฟล์ หากมีโดยเฉพาะอย่างยิ่งการแข่งขันระหว่างREQUEST_URI
และรายการของรูปแบบของเรากฎจะถูกนำมาใช้ ไฟล์อาจว่างเปล่า แต่คุณต้องสร้าง ( touch
) ไฟล์
การดำเนินการจะสร้างรายการบันทึกในแฟ้มบันทึกสำหรับกฎนี้กับlog
id:150
drop
, deny
(พร้อมstatus
) และredirect
การกระทำเป็นของกลุ่มการกระทำที่ก่อกวนพวกเขาจะต้องอยู่ในจุดเริ่มต้นของกฎchain
(หากมีห่วงโซ่) การกระทำที่สองจะแทนที่รายการแรกและรายการที่สามจะแทนที่รายการที่สองดังนั้นคุณต้องเลือกว่าคุณต้องการดำเนินการใดและสามารถลบรายการอื่นได้
chain
id
การดำเนินการจะเรียกกฎต่อไปของของห่วงโซ่ที่ทราบว่ากฎข้อที่สองไม่ได้มี
REMOTE_ADDR
มีที่อยู่ IP ของคำขอ
@ipMatchFromFile
ไฟล์modsecurity-ip-white.list
ที่มีรายการสีขาวของที่อยู่ IP จะถูกคั่นด้วยบรรทัดใหม่หรือไม่ รายการ CIDR นั้นเป็นที่ยอมรับเช่นกัน เนื่องจากการกระทำที่ก่อกวนนั้นมักจะอยู่ในกฎนำหน้าของโซ่มันจะถูกนำไปใช้ แต่เมื่อ IP บางอย่างอยู่ในรายการสีขาวการexec
กระทำนี้จะไม่ถูกนำไปใช้ ไฟล์อาจว่างเปล่า แต่คุณต้องสร้าง ( touch
) ไฟล์
exec
การดำเนินการจะเรียกสคริปต์ภายนอกของเรา การกระทำนี้จะไม่ก่อกวนและจะถูกดำเนินการเมื่อกฎปัจจุบันกลับมาจริง เมื่อการกระทำนี้ใช้ IP ระยะไกลจะถูกประมวลผลผ่านสคริปต์ของเรา
setenv
การกระทำนี้จะส่งออกตัวแปรภายใน บางตัว=%{...}
เป็น envvars ชื่อที่ส่งออกอาจแตกต่างจากภายใน ตัวแปรบางตัวจะต้องส่งออกด้วยตนเองส่วนอื่น ๆ จะถูกส่งออกโดยอัตโนมัติ - อาจเป็นข้อบกพร่องเล็ก ๆ (ในบางกรณีการส่งออกด้วยตนเองด้วยชื่อเดียวกันตัวอย่างเช่นsetenv:REQUEST_URI=%{REQUEST_URI}
จะทำให้เกิดค่าว่างของตัวแปรที่ส่งออก)
ตรวจเช็ค
สมมติว่าคุณไม่ได้มี Joomla บนเซิร์ฟเวอร์ของคุณแก้ไขไฟล์และเพิ่มบรรทัดที่มีเนื้อหาmodsecurity-uri-black.list
จากนั้นพิมพ์ในเบราว์เซอร์ของคุณ/joomla
https://exemple.com/joomla
คุณควรเปลี่ยนเส้นทางและปิดกั้นผ่าน Iptables ล้างระเบียนsudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note'
เพิ่ม IP ของคุณmodsecurity-ip-white.list
และทำแบบฝึกหัดอีกครั้ง ตอนนี้คุณควรจะเปลี่ยนเส้นทาง แต่ไม่ถูกบล็อก
เชื่อมต่อสคริปต์ของเรากับ OWASP Core Rule Set 3.x
ในการทำเช่นนั้นเราจะอัปเดตการกระทำเริ่มต้นของกฎโหมดความผิดปกติ (949110 และ 959100) เพื่อจุดประสงค์นี้แก้ไขไฟล์ /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
และเพิ่มบรรทัดถัดไปที่ด้านล่าง:
# -- Anomaly Mode - Update actions by ID -----
#
SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#
SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
"id:'999010', t:none, phase:1, pass, \
ctl:ruleRemoveById=949110, \
ctl:ruleRemoveById=959100"
SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
"id:'999020', t:none, phase:1, pass, \
ctl:ruleRemoveById=949110, \
ctl:ruleRemoveById=959100"
ตรวจเช็ค
อย่าลืมรีสตาร์ท (หรือโหลดซ้ำ) Apache เพื่อใช้การเปลี่ยนแปลงการกำหนดค่า อย่าลืมลบบันทึกเป็นระยะในระหว่างการทดสอบมิฉะนั้นคุณสามารถบล็อกอย่างถาวร :-)
จำลองการโจมตีผ่านเส้นทางของไดเรกทอรี:
https://example.com/?abc=../../../ # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../ # This should pass because of the whitelist rule
จำลองการโจมตี SQL Injection:
https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo
ModSecurity และ Apache Log Files
เว็บเซิร์ฟเวอร์ Apache สามารถกำหนดค่าเพื่อให้ข้อมูลที่สำคัญแก่ผู้ดูแลระบบเซิร์ฟเวอร์เกี่ยวกับวิธีการทำงาน ... ถนนหลักสำหรับการแสดงความคิดเห็นต่อผู้ดูแลระบบคือการใช้ไฟล์บันทึก อ่านเพิ่มเติม...
ModSecurityมีกลไกการบันทึกที่มีประสิทธิภาพ โดยคำสั่งSecGuardianLog
จะให้ฟีดบันทึกการออกแบบมาเพื่อทำงานกับสคริปต์ภายนอก
ปัจจุบันเครื่องมือเดียวที่เป็นที่รู้จักกันในการทำงานกับการเข้าสู่ระบบผู้ปกครองเป็น
httpd-guardian
ซึ่งเป็นส่วนหนึ่งของApache โครงการเครื่องมือ httpd-guardian
เครื่องมือที่ถูกออกแบบมาเพื่อป้องกันการปฏิเสธการโจมตีบริการ มันใช้ในblacklist tool
การโต้ตอบกับไฟร์วอลล์ ... ที่ใช้ iptables, บัญชีดำที่อยู่ IP ที่ละเมิด อ่านเพิ่มเติม...
ModSecurity Log files ► Fail2Ban ► Iptables
เป็นไปได้ที่จะตั้งค่า Fail2Ban สำหรับการวิเคราะห์ข้อมูลของล็อกไฟล์ของ Apache modsec_audit.log
อาจเป็นตัวเลือกที่ดีที่สุด แต่โปรดดูหัวข้อที่เราพูดถึงSecGuardianLog
ด้วย
ดูแลที่SecAuditLogRelevantStatus
อยู่ใน/etc/modsecurity/modsecurity.conf
ความเห็น มิฉะนั้นทุกคนที่ได้รับหน้าข้อผิดพลาด 404 จะถูกบล็อกโดย fail2ban
SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"
ปัจจุบัน Fail2Ban ไม่ได้ถูกนำไปใช้ในทางใดทางหนึ่งในโครงการนี้
ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables
httpd-guardian
- ตรวจจับการโจมตี DoS โดยการตรวจสอบการร้องขอ Apache Security, ลิขสิทธิ์ (C) 2005 Ivan Ristic - ถูกออกแบบมาเพื่อตรวจสอบคำขอเว็บเซิร์ฟเวอร์ทั้งหมดผ่านกลไกการบันทึก piped มันจะติดตามจำนวนคำขอที่ส่งจากที่อยู่ IP แต่ละรายการ ... httpd-guardian สามารถส่งคำเตือนหรือเรียกใช้สคริปต์เพื่อบล็อกที่อยู่ IP ...
สคริปต์นี้สามารถใช้กับกลไกการบันทึก Apache2หรือกับ
ModSecurity (ดีกว่า)
การติดตั้งและตั้งค่าภายในสถานการณ์ปัจจุบัน
ดาวน์โหลดhttpd-guardian
และทำให้ปฏิบัติการ:
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl
อ่านบรรทัด98-119
เพื่อดูว่าสคริปต์เชื่อมต่อกับสคริปต์ WSAS ของเราอย่างไร
ใช้การเปลี่ยนแปลงต่อไปนี้ภายในการกำหนดค่าของ Apache ( /etc/modsecurity/modsecurity.conf
) จากนั้นรีสตาร์ท:
#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
ตรวจเช็ค
เพื่อทดสอบสคริปต์ปิดการใช้งาน ModEvasive ( sudo a2dismod evasive
อย่าลืมเปิดใช้งานในภายหลัง) และเริ่ม Apache ใหม่ จากนั้นtail
บันทึก exec:
tail -F /var/www-security-assistant/www-security-assistant.execlog
และจากอินสแตนซ์อื่นทำการโจมตี DoS ตัวอย่างเช่นใช้ab
ในวิธีนี้:
for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done
ModSecGuardianLog ►การวิเคราะห์ที่กำหนดเอง► WSAS ► Iptables
ที่นี่มีการนำเสนอสคริปต์แบบง่าย ๆ ที่เรียกhttpd-custom-analyze.bash
ว่าไม่ใช่สิ่งที่พิเศษ แต่อาจเป็นตัวอย่างที่ดี คุณสมบัติของมันอธิบายไว้ในเนื้อความของสคริปต์
การติดตั้งและตั้งค่า
ดาวน์โหลดhttpd-custom-analyze.bash
และทำให้ปฏิบัติการ:
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash
ใช้การเปลี่ยนแปลงต่อไปนี้ภายในการกำหนดค่าของ Apache ( /etc/modsecurity/modsecurity.conf
) และรีสตาร์ท:
#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
สคริปต์จะเรียก WSAS เมื่อเกณฑ์ถึง - สายการอ่านและ86
35
เพื่อให้ทั้งhttpd-
สคริปต์ทำงานพร้อมกันแก้ไขmodsecurity.conf
และไพพ์SecGuardianLog
ไปที่ทั้งคู่
หากต้องการทำการทดสอบให้ทำตามคำแนะนำจากส่วนด้านบน