อัปเดต: คำตอบปัจจุบันได้รับการอัพเดตอย่างสมบูรณ์
ตามที่การสนทนานี้ผมสร้างพื้นที่เก็บข้อมูล 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.listiptables-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
นอกจากสคริปต์ที่ใช้:atsudo 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.listiptables-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 ใหม่และลองลงชื่อเข้าใช้ระบบของคุณเพื่อตรวจสอบว่าทุกอย่างใช้งานได้ดีหรือไม่!
บันทึกและกู้คืน
สิ่งนี้สามารถทำได้ผ่านสคริปต์ที่กำหนดเองซึ่งจะบันทึกและกู้คืนiptablesconing ระหว่างกระบวนการหยุด (หรือรีบูต) ของระบบ (ถ้าเราใช้ 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.serviceApache:
ตรวจเช็ค
- เปิดหน้าเว็บจากเซิร์ฟเวอร์ของคุณและรีเฟรชหน้าต่างเบราว์เซอร์สองสามครั้งอย่างหนาแน่น (กด
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-crsCSR: ที่นี่เราจะติดตั้ง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) ไฟล์
การดำเนินการจะสร้างรายการบันทึกในแฟ้มบันทึกสำหรับกฎนี้กับlogid:150
drop, deny(พร้อมstatus) และredirectการกระทำเป็นของกลุ่มการกระทำที่ก่อกวนพวกเขาจะต้องอยู่ในจุดเริ่มต้นของกฎchain(หากมีห่วงโซ่) การกระทำที่สองจะแทนที่รายการแรกและรายการที่สามจะแทนที่รายการที่สองดังนั้นคุณต้องเลือกว่าคุณต้องการดำเนินการใดและสามารถลบรายการอื่นได้
chainidการดำเนินการจะเรียกกฎต่อไปของของห่วงโซ่ที่ทราบว่ากฎข้อที่สองไม่ได้มี
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 เมื่อเกณฑ์ถึง - สายการอ่านและ8635
เพื่อให้ทั้งhttpd-สคริปต์ทำงานพร้อมกันแก้ไขmodsecurity.confและไพพ์SecGuardianLogไปที่ทั้งคู่
หากต้องการทำการทดสอบให้ทำตามคำแนะนำจากส่วนด้านบน