ฉันต้องการกฎเพื่อยกเลิกการเชื่อมต่อ 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.