ฉันต้องการกฎเพื่อยกเลิกการเชื่อมต่อ Apache ที่เป็นอันตราย


10

ฉันลดทราฟฟิกทั้งหมดบนพอร์ตยกเว้น 80 สำหรับเว็บเซิร์ฟเวอร์ของฉัน

ฉันมีกฎบางอย่างเช่นนี้ใน iptables:

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

คนที่มีมากกว่าสามารถแชร์ได้ ฉันรู้ว่าแฮ็กเกอร์ที่ไม่ดียังคงอัปเดตอยู่เสมอ แต่บางคนเริ่มต้นด้วยรหัสเดียวกันเสมอ ฉันจำเป็นต้องวางการเชื่อมต่อตามเกณฑ์บางอย่าง นี่คือบันทึก Apache (ฉันลบ ips แต่แต่ละ atack มาจากที่เดียวกัน):

Attack 1: อันนี้ฉันไม่รู้ว่ากำลังพยายามทำอะไร แต่ทำได้ 50 เท่าจาก ip เดียวกัน

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

Attack 2: นี่พยายามหาข้อมูลเกี่ยวกับเซิร์ฟเวอร์เท่านั้น

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1

Attack 3: พวกเขาพยายามเข้าถึงช่องโหว่ของหน้าล็อกอิน

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

Attack 4: นี่พยายามเข้าถึง cgi เมื่อมีการร้องขอครั้งแรก (ดูกฎ iptables แรกของฉันเพื่อดรอปนี้)

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

ฉันใหม่มากกับเซิร์ฟเวอร์การโจมตี 4 ครั้งนี้มาจาก 12 ชั่วโมงล่าสุดเท่านั้น ... มีหลายพันต่อสัปดาห์


ฉันไม่เห็นรูปแบบเฉพาะในคำขอ HTTP เหล่านี้ คุณรู้ได้อย่างไรว่าพวกเขาเป็นอันตราย ฉันไม่เข้าใจว่าคุณกำลังพยายามทำอะไรที่นี่ คุณช่วยแก้ไขคำถามของคุณให้กระจ่างได้มั้ย ขอบคุณ
— David Foerster

สวัสดีเดวิดเมื่อไม่นานมานี้เมื่อฉันเปิดพอร์ตเช่น ftp ฉันได้รับบันทึกจากแรงเดรัจฉานเมื่อฉันเห็น fail2ban ใน 24 ชั่วโมงมีการปล่อย iptables มากกว่า 100 ips ฉันปิดพอร์ตทั้งหมดยกเว้น 80 ตอนนี้ฉันพยายามสร้างกฎอย่าง fail2ban แต่สำหรับ apache
— Javier Palmero

2
คุณรู้เกี่ยวกับmod_securityและmod_evasiveสำหรับ Apache หรือไม่?
— pa4080

ใช่คุณมีกฎที่จะแบ่งปันหรือไม่? หรือจะหาที่ไหน ฉันบล็อก ips จาก blocklist.de
— Javier Palmero

ฉันได้เขียนเกือบทุกอย่างที่ฉันรู้เกี่ยวกับความปลอดภัย Apache2
— pa4080

คำตอบ:


18

อัปเดต: คำตอบปัจจุบันได้รับการอัพเดตอย่างสมบูรณ์

ตามที่การสนทนานี้ผมสร้างพื้นที่เก็บข้อมูล 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ไปที่ทั้งคู่

  • หากต้องการทำการทดสอบให้ทำตามคำแนะนำจากส่วนด้านบน


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

1
ขอบคุณสำหรับข้อสังเกต @ThomasWard ฉันจะเก็บไว้ในใจ! มันไม่ได้เป็นความคิดที่ดีที่จะมีสิ่งที่เป็น Sandbox ภายในหน้าผู้ใช้ต่อไปเพื่อแก้ไขข้อมูลส่วนตัวและการตั้งค่า ?
— pa4080

1
ได้รับการเสนอและฉันเชื่อว่าถูกปฏิเสธ สิ่งที่ฉันอยากจะแนะนำคือคุณทำการเปลี่ยนแปลงโดยไม่บันทึกและเก็บสำเนาคำถามของคุณตามที่เป็นในไฟล์ข้อความในระบบของคุณจากนั้นคุณสามารถแก้ไขคัดลอกกลับมาเมื่อคุณต้องการแก้ไขโพสต์แล้ว แก้ไขสำหรับ markdown และเช่น เช่นกันขีดฆ่าทั้งหมดคือ ... ทำให้สิ่งที่อ่านยาก ลองนำหัวข้อเหล่านั้นออกแทน (ประวัติการแก้ไขจะเก็บข้อมูลไว้)
— โธมัสวอร์ด

มันไร้สาระที่การแลกเปลี่ยนแบบสแต็กต์ไม่อนุญาตให้ไม่ทำการแก้ไขการชนกับหน้าแรก
— Franck Dernoncourt

1

ฉันรู้ว่า pa4080 ให้คำตอบที่ละเอียดและมีประโยชน์มากสำหรับการดูแลทั้งหมดนี้ด้วยตัวคุณเอง ในขณะที่การดูแลปัญหาด้วยตัวคุณเองอาจจะรู้สึกดีนี้ยังสามารถใช้เป็นจำนวนมากเวลา

  1. ทำความคุ้นเคยกับCloudflareเนื่องจากพวกเขาให้การป้องกัน DDoS ฟรี
  2. หากคุณใช้ Apache ในปัจจุบันเท่านั้นให้พิจารณาการเรียนรู้ว่า NGINX ทำงานอย่างไรเพื่อรักษาสมดุลในการโหลด NGINX เป็นที่ดีสำหรับ load balancing Apache เป็นจัดแสดงที่นี่และที่นี่
  3. รีวิวเคล็ดลับของ Apache สำหรับการรักษาความปลอดภัยบนเอกสารของพวกเขา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.