Bazı kötü amaçlı Apache bağlantılarını bırakmak için kurallara ihtiyacım var


10

Web sunucum için 80 dışındaki bağlantı noktalarındaki tüm trafiği bırakıyorum.

Ben iptables böyle bazı kurallar var:

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

Daha fazlasına sahip olan biri paylaşabilir mi? Ben her zaman hala kötü hackerlar güncelleme biliyorum, ama bazıları her zaman aynı kod ile başlar. Bazı kriterlere göre bağlantıyı kesmem gerekiyor. İşte bazı Apache günlüğü (ips kaldırmak ama her atack aynı geliyor):

Saldırı 1: Bu ne yapmaya çalıştığımı bilmiyorum, ama aynı ipden 50 kez yap

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

Saldırı 2: Bu sadece sunucu hakkında bilgi almaya çalışır.

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

Saldırı 3: Bir giriş sayfası güvenlik açığına erişmeye çalışıyorlar

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

Saldırı 4: Bu, ilk istekte bir cgi'ye erişmeyi deneyin, (bunu bırakmak için ilk iptables kuralıma bakın)

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

Sunucuda çok yeniyim, bu 4 saldırı sadece son 12 saatten ... Haftada binlerce var.


Bu HTTP isteklerinde belirli bir model görmüyorum. Kötü niyetli olduklarını nereden biliyorsun? Burada neyi başarmaya çalıştığınızı anlamıyorum. Açıklığa kavuşturmak için lütfen sorunuzu düzenler misiniz ? Teşekkürler.
David Foerster

Merhaba David, Bir süre önce ftp gibi portları açtığımda, kaba kuvvetten günlük aldım, 24 saat içinde fail2ban'ı iptables'da 100'den fazla ips düşüşü gördüğümde. 80 dışında tüm portları kapatıyorum. Şimdi fail2ban gibi kurallar yapmaya çalışıyorum, ama apache için.
Javier Palmero

2
Apache için mod_security ve mod_evasive hakkında ne düşünüyorsunuz ?
pa4080

evet, paylaşacak kuralların var mı? veya nerede bulunur? Ben blocklist.de gelen blok ips
Javier Palmero

Apache2 güvenliği hakkında bildiğim hemen hemen her şeyi yazdım.
pa4080

Yanıtlar:


18

Güncelleme: Geçerli cevap tamamen güncellenmiştir.

Bu tartışmaya göre WWW Güvenlik Asistanı adlı bir GitHub deposu oluşturdum . ask_ubuntuBu cevaba adanmış denilen bir şube var . Daha önce burada bulunan tüm referanslar karakter sınırlaması nedeniyle kaldırılmıştır - GitHub'da kullanılabilir.

İşte Ubuntu 16.04'te Apache2 güvenliğinin nasıl artırılacağı , tam bir mekanizmaya dahil olan birkaç yol .

İçerik tablosu:

  • WWW Güvenlik Yardımcısı Komut Dosyası (WSAS) ► Iptables
  • Iptables - Temel Yapılandırma - Kaydet ve Geri Yükle
  • Apache2 için ModEvasive
  • ModEvasive ► WSAS ► Iptables
  • Apache2 için ModSecurity 2.9
  • ModSecurity OWASP Çekirdek Kural Seti 3.x
  • ModSecurity Kuralları Beyaz Liste
  • ModSecurity Kuralları ► WSAS ► Iptables
  • ModSecurity ve Apache Günlük Dosyaları
  • ModSecurity Günlük Dosyaları ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
  • ModSecurity GuardianLog ► HTTPD Özel Analiz ► WSAS ► Iptables

Ayrıca HTTPS kullanmanın her zaman iyi olduğunu varsayalım:


WWW Güvenlik Yardımcısı Komut Dosyası ► Iptables

İşte senaryo sunulmaktadır www-security-assistant.bash. Kötü amaçlı IP adreslerinin ele alınmasında size yardımcı olabilir. Komut dosyasının iki modu vardır.

Otomatik mod

Harici bir program, Apache's gibi mod_securitykötü amaçlı bir $IPadres sağlar. Bu durumda, komut dosyasını çağıran sözdizimi şöyle olmalıdır:

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

Bu modda komut dosyası iki işlem aşaması sağlar ve her işlem için yöneticilere bir e-posta gönderir .

  • İlk aşama: İlk birkaç için 'ihlallerde' kaynak $IPolacak bir süre boyunca yasaklı değerine eşit $BAN_TIME. Bu mod komutu kullanır at.

  • İkinci aşama: Belli olan geçişlerin sayısı $IPdeğerine eşit olduğunda $LIMIT, bu $IPadres Iptables aracılığıyla kalıcı olarak yasaklanacak ve $BAN_LIST.

Manuel mod

Bu mod aşağıdaki seçenekleri kabul eder:

  • www-security-assistant.bash <ip-address> --DROP "log notes"

    Dosyaya bir girdi oluşturur /var/www-security-assistant/iptables-DROP.listve şu şekilde bir kural oluşturur:

    iptables -A GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --DROP-CLEAR "log notes"

    Dosyaya bir girdi oluşturur /var/www-security-assistant/iptables-DROP-CLEAR.list, belirli Iptables kuralını kaldırır $IP, geçmişten ve aşağıdakilerden kaldırır $BAN_LIST:

    iptables -D GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --ACCEPT "log notes"

    Dosyaya yalnızca bir girdi oluşturur /var/www-security-assistant/iptables-ACCEPT.list.

  • www-security-assistant.bash <ip-address> --ACCEPT-CHAIN "log notes"

    Dosyaya bir girdi oluşturur /var/www-security-assistant/iptables-ACCEPT.listve şu şekilde bir kural oluşturur:

    iptables -A GUARDIAN -s $IP -j ACCEPT
    

Bağımlılıklar

Senaryo kullanır iptables-save.shve sonraki bölümde açıklanan iptableszincir GUARDIAN. İçinde birkaç dosya oluşturur ve saklar $WORK_DIR:

  • www-security-assistant.history - önceki IP işlemlerinin verilerini içerir.
  • www-security-assistant.mail - komut dosyası tarafından gönderilen son e-postanın içeriği.
  • iptables-ACCEPT.list; iptables-DROP.listve iptables-DROP-CLEAR.list.

Komut dosyası, e-posta göndermek için minimum bir yapılandırmaya ihtiyaç duyar:

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

Herhangi bir yapılandırılmış HTTPS hizmeti varsa TLS sertifikası Postfix hizmetinde kullanılabilir.

Buna ek olarak komut kullanır at: sudo apt install at.

Kurulum

  • Çalışma dizini oluşturun, diyelim /var/www-security-assistant. İndirin www-security-assistant.bashve yürütülebilir yapın:

    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Özel komut olarak kullanılabilir yap :

    sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
  • Üzerinden şifre olmadan www-dataçalıştırma izni verin . Ek ' ' kuralıyla yeni bir dosya oluşturmak ve düzenlemek için aşağıdaki komutu kullanın :www-security-assistant.bashsudosudoers

    sudo visudo -f /etc/sudoers.d/www-security-assistant

    Dosyanın içine aşağıdaki satırı ekleyin - dosyayı kaydedin ve çıkın:

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
  • Tweak www-security-assistant.bash. En azından değişkenin değerini değiştirin $EMAIL_TO.

Kontrol etmek

  • Kendinizi temsil $AGENTedin ve Otomatik MOD'un düzgün çalışıp çalışmadığını kontrol edin:

    www-security-assistant.bash 192.168.1.177 Guardian

    Sonra e-postanızı kontrol edin, yazın iptables -L GUARDIAN -n, dosyaları gözden geçirin www-security-assistant.historyve www-security-assistant.mail. Yukarıdaki komutu 5 kez çalıştırın ve dosyaları gözden iptables-DROP.listve iptables-CURRENT.conf.

  • Manuel MOD'un düzgün çalışıp çalışmadığını kontrol edin - localhost'unuzu Beyaz Listeye ekleyin:

    www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"

    Sonra dosyayı kontrol edin iptables-ACCEPT.list.


Bu öğreticinin geri kalanı www-security-assistant, sisteminizle nasıl tümleştireceğinizdir .


Iptables - Temel Yapılandırma - Kaydet ve Geri Yükle

Temel yapılandırma

Aşağıdaki kuralları eklemeden önce lütfen bu kılavuzu okuyun .

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

Sonraki eylemleri yapmadan önce yeni bir SSH bağlantısı açın ve her şeyin yolunda olup olmadığını kontrol etmek için sisteminize giriş yapmayı deneyin!

Kaydet ve Geri Yükle

Bu, iptablessistemin durdur-başlat (veya yeniden başlat) işlemi sırasında koniyi kaydedecek ve geri yükleyecek özel komut dosyaları aracılığıyla gerçekleştirilebilir . (Iptables kurallarını ayarlamak için UFW kullanırsak, bu adıma gerek yoktur.)

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

Yeni zincir oluştur

Yeni zincir oluşturun, çağırın GUARDIANve INPUTzincire 3 numara olarak ekleyin :

sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN

Kontrol etmek

Sistemi yeniden başlatın ve yapılandırmayı kontrol edin. Lütfen kullanın sudo systemctl reboot(zorlama seçeneğini kullanmayın reboot -f). Sistem tekrar çevrimiçi olduğunda, yeni oluşturulan zincirin var olup olmadığını kontrol edebiliriz:

sudo iptables -L GUARDIAN -n


Apache2 için ModEvasive

ModEvasive, Apache'nin HTTP DoS veya DDoS saldırısı veya kaba kuvvet saldırısı durumunda kaçırma eylemi sağlaması için kaçırma manevraları modülüdür. Daha fazla oku...

Kurulum

  • Modülü kurun ve etkinleştirin:

    sudo apt install libapache2-mod-evasive
    sudo a2enmod evasive
  • Günlük Dizini oluşturun ve aşağıdakiler için erişilebilir olmasını sağlayın www-data:

    sudo mkdir -p /var/log/apache2_mod_evasive
    sudo chown www-data /var/log/apache2_mod_evasive
  • Temel yapılandırmayı ayarlayın - yapılandırma dosyasındaki açıklamayı kaldırın ve belirli yönergeleri düzenleyin:

    /etc/apache2/mods-enabled/evasive.conf
  • Yeniden Apache: sudo systemctl restart apache2.service.

Kontrol etmek

  • Sunucunuzdan bir web sayfası açın ve tarayıcı penceresini birkaç kez yoğun bir şekilde yenileyin (basın F5) - 403 Yasak hata mesajı almalısınız . Günlük dizinine yeni bir kilit dosyası oluşturulur. Bu IP adresinden daha fazla geçiş tespiti için bu dosya silinmelidir.


ModEvasive ► WSAS ► Iptables

Burada , yukarıdaki bölümde oluşturulan, üzerinden mod_evasivekonuşacağız .iptableswww-security-assistant.bash

  • Düzenleme /etc/apache2/mods-available/evasive.confbu şekilde:

    <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>
  • Günlük dosyası oluşturun ve Apache'yi yeniden başlatın:

    sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog

Biz ile DDOS saldırısı simüle Bu konfigürasyon test etmek için F5bir yöntem, yukarıda belirtildiği gibi, ya da bir komutları kullanarak ab, hping3vs.

Uyarı:iptables WSAS'ta kullanılan kural SSH bağlantılarınız da dahil olmak üzere tüm yeni bağlantıları kaynaktan DROP yapacağından dikkatli olun $IP. Sınamalar sırasında sunucuya bağlanmak için yedek bir yol olması iyidir. Bu kuralı yalnızca HTTP / HTTPS bağlantı noktalarıyla çalışacak şekilde değiştirebilirsiniz.


Apache2 için ModSecurity 2.9

ModSecurity , kendi başına çok az koruma sağlayan bir web uygulaması güvenlik duvarı motorudur. Yararlı olması için ModSecurity'nin kurallarla yapılandırılması gerekir. Kullanıcıların ModSecurity'den tam olarak yararlanabilmesi için Trustwave's Spider Labs, sertifikalı ücretsiz bir kural seti sunuyor ... Devamını oku ...

Kurulum

  • Modülü kurun ve etkinleştirin:

    sudo apt install libapache2-mod-security2
    sudo a2enmod security2
  • Yapılandırma dosyası oluştur:

    sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

    /etc/modsecurity/modsecurity.confDikkatlice okuyun ve düzenleyin ! En azından aşağıdaki yönergeleri ekleyin veya değiştirin:

    # -- 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
  • Dosya /etc/apache2/mods-enabled/security2.confiçerir /etc/modsecurity/modsecurity.confApache yapılandırma içine. Bu aşamada security2.confşöyle görünecektir:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
  • Günlük Dizini Oluştur:

    sudo mkdir -p /var/log/apache2_mod_security
  • Günlük döndürmeyi ayarlayın. İlk olarak config dosyası oluşturun:

    sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec

    Ardından yeni dosyayı şu şekilde düzenleyin:

    /var/log/apache2_mod_security/*.log {  }
  • Apache'yi yeniden başlatın.

Kontrol etmek

  • /etc/modsecurityİçinde ek bir yapılandırma dosyası oluşturun , örneğin arayın z-customrules.confve içeriği olarak aşağıdaki kuralı ekleyin:

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"

    Sunucuyu yeniden başlatın: sudo systemctl restart apache2.service. Tarayıcınızı açın ve yazın https://example.com/?abc=../. Sonuç: 403 Yasak . /var/log/apache2_mod_securityDaha fazla ayrıntı için günlük dosyalarına bakın.

  • İşleri daha eğlenceli hale getirmek için , komut dosyasını issues.phpiçinde uygun bir yere yerleştirin DocumentRoot(burada bu yer olduğunu varsayıyorum /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

    Ardından yukarıdaki kuralı aşağıdaki şekilde değiştirin:

    # 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'yi yeniden başlatın, ardından tarayıcınızı açın ve https://example.com/?abc=../;-) Fikir SE'nin senaryosundan ödünç alınmıştır BotLovin.cs.

  • Düzenleme /etc/modsecurity/z-customrules.confbir kez daha ve yorum (devre dışı) kural - bu sadece bir test örneği olduğunu ve sonraki bölümde açıklanan, OWASP CRS kaplıdır.

  • Aşağıda, tüm wp-adminsayfa isteklerini yeniden yönlendireceğimiz , ancak bunlar dışında belirli IP adreslerinden yönlendireceğimiz başka bir örnek verilmiştir (not 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"

    Burada iki yıkıcı eylemimiz var: (1) deny, status:403ve (2) redirect:'/issues.php'. Aslında denyeyleme ihtiyacımız yok çünkü eylem geçersiz kılınacak redirect.


ModSecurity OWASP Çekirdek Kural Seti 3.x

Ubuntu 16.04'te CSR 2.x: yükleyebilirsiniz apt install modsecurity-crs. Burada CSR 3.x'i kuracağız , ayrıntılı talimatlar Kurulum kılavuzunda verilmiştir ( gitgereklidir).

Kurulum

  • Klasördeki CSR'yi klonlayın /usr/share/modsecurity-crs.3:

    sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
  • GeoIP veritabanını yükseltin ve otomatik olarak yenileyin. (GeoIP DB artık CRS'ye dahil değildir. Bunun yerine düzenli olarak indirmeniz önerilir.) Komut dosyası util/upgrade.pybu işlevi getirir. Bunu cron'da aşağıdaki gibi kullanabilirsiniz 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
  • Yapılandırma dosyaları oluşturun:

    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,}

    Bu dosyaları dikkatlice okuyun ve düzenleyin! En azından SecGeoLookupDByönerge:

    SecGeoLookupDB util/geo-location/GeoIP.dat
  • Apache'nin yapılandırmasını uygulayın. Düzenleme /etc/apache2/mods-available/security2.confbu şekilde:

    <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>

    Dosyayı kaydedin ve Apache'yi yeniden başlatın.


ModSecurity Kuralları Beyaz Liste

ModSecurity Kurallarının beyaz listesi, belirli dizinler veya konum eşleşmeleri için sistem genelinde veya sanal ana bilgisayarın yapılandırması dahilinde kullanılabilen aşağıdaki ModSec yönergeleri yoluyla yapılabilir:

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

mod_security2PhpMyAdmin için devre dışı bırak . /etc/phpmyadmin/apache.confBu şekilde değiştirin :

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

Belirli bir dizin için belirli kuralları devre dışı bırakın:

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

Kuralları global olarak devre dışı bırakın. Bu amaçla yönergelerimizi Apache'nin yapılandırma dosyalarına bir yere eklemeliyiz: /etc/modsecurity/z-customrules.confiyi bir yer.

  • Tüm Apache yapılandırmasındaki kuralları devre dışı bırakın:

    SecRuleRemoveById 973301 950907
  • ModSecurity'den geçebilmesi için bir IP adresini beyaz listeye ekleyin:

    SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
  • Dizin eşleşmesi içindeki kuralları devre dışı bırak:

    <Directory /var/www/mediawiki/core>
        SecRuleRemoveById 973301 950907
    </Directory>
  • Kural eşleşmesinin Konum eşleşmesi içindeki kimliğiyle güncellenmesi :

    <LocationMatch "/index.php.*">
        SecRuleUpdateActionById 973301 "pass"
        SecRuleUpdateActionById 950907 "pass"
    </LocationMatch>

Yukarıdaki örneklerde biz varsayalım 973301ve 950907bizim web uygulamaları normal çalışmasını engelleyecek bir kural kimlikleri bulunmaktadır. Kuralları analiz ederek bulabiliriz modsec_audit.log.


ModSecurity Kuralları ► WSAS ► Iptables

Aşağıda, özel SecRules oluşturmanın yanı sıra WWW Security Assistant Script'i (WSAS) nasıl arayabileceğimize dair birkaç örnek daha verilmiştir.

İlk kurulum

Ek bir başlangıç ​​komut dosyasına ihtiyacımız var modsecurity-assistant.sh. Bunun nedeni, ModSecurity'nin execeyleminin çok basit ve sınırlı bir sözdizimine sahip olmasıdır.

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

Komut dosyasının içine bakarsanız, ModSecurity tarafından dışa aktarılan birkaç değişken görürsünüz. Bunlar şunlardır: $REQUEST_URI, $ARGS, $SERVER_NAME, $REMOTE_ADDR, $REMOTE_HOSTve $UNIQUE_ID. Diğer değişkenler kod içinde açıklanmıştır.

Özel kural oluştur ve komut dosyalarımızı onunla çağır

İlk olarak , istek URI'sı kara listemize dahil edilen bir kelime içerdiğinde yürütülecek modsecurity-assistant.sh(ve çağrılacak) bir kural oluşturalım www-security-assistant.bash. /etc/modsecurity/z-customrules.confAşağıdaki satırları açın ve alta ekleyin:

# 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- bu değişken, geçerli istekten tam URI'yi içerir. Kural daha geniş olabilir:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFilemodsecurity-uri-black.listher bir kelime grubunun veya kelimenin yeni bir satıra yerleştirildiği kelime öbeklerinin bulunduğu dosyayı okuyacaktır . Günlük dosyalarından ilginç kelimeler ve ifadeler toplayabilirsiniz. Eğer modellerimizle ve modeller listemiz arasında belirli bir eşleşme varsa REQUEST_URIkural uygulanır. Dosya boş olabilir, ancak ( touch) oluşturmanız gerekir .

  • logEylem ile bu kural için günlük dosyalarında kütüğü girişlerini oluşturur id:150.

  • drop, deny(İle status) ve redirecteylemler aittir yıkıcı eylemlerin grubundan, bunlar kural başında olmalıdır chain(bir zincir varsa). İkinci eylem birincisini geçersiz kılar ve üçüncüsü ikinciyi geçersiz kılar, bu yüzden gerçekleştirilmesini istediğinizi seçmelisiniz ve diğerlerini silebilirsiniz.

  • chaineylem, zincirin bir sonraki kuralını çağırır, ikinci kuralın sahip olmadığını unutmayın id.

  • REMOTE_ADDR isteğin IP adresini içerir.

  • @ipMatchFromFilemodsecurity-ip-white.listIP adreslerinin beyaz listesini içeren dosya , yeni satırlarla ayrılır. CIDR girişleri de kabul edilebilir. Çünkü yıkıcı eylem her zaman uygulanacak zincirin lider kural bulunur, ancak belirli IP bu beyaz listede olduğu zaman execeylem uygulanmayacaktır. Dosya boş olabilir, ancak ( touch) oluşturmanız gerekir .

  • execeylem harici betiğimizi çağırır. Bu eylem kesintiye uğramaz ve geçerli kural doğru olduğunda yürütülür. Bu eylem uygulandığında, uzak IP komut dosyalarımızdan işlenecektir.

  • setenvbu eylem, bazı dahili değişkenleri =%{...} envvar olarak dışa aktaracak, dışa aktarılan adlar içten farklı olabilir. Bazı değişkenler manuel olarak dışa aktarılmalı, bazıları otomatik olarak dışa aktarılmalıdır - muhtemelen küçük bir hatadır (bazı durumlarda aynı adlara sahip manuel dışa aktarma, örneğin setenv:REQUEST_URI=%{REQUEST_URI}dışa aktarılan değişkenin boş bir değerine neden olur).

Kontrol etmek

Sunucunuzda Joomla'nın olmadığını varsayalım, dosyayı düzenleyin modsecurity-uri-black.listve içeriğe sahip bir satır ekleyin /joomla. Ardından tarayıcınızı yazın https://exemple.com/joomla. Iptables aracılığıyla yönlendirilmeli ve engellenmelisiniz. Kayıtları silin sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note', IP'nizi ekleyin modsecurity-ip-white.listve alıştırmayı tekrar yapın. Şimdi yönlendirilmelisiniz, ancak engellenmemelisiniz.

Betiklerimizi OWASP Çekirdek Kural Seti 3.x ile bağlayın

Bunu yapmak için Anomali Modu Kurallarının (949110 ve 959100) varsayılan eylemini güncelleyeceğiz . Bu amaçla dosyayı düzenleyin /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.confve sonraki satırları en alta ekleyin:

# -- 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"

Kontrol etmek

Yapılandırma değişikliklerini uygulamak için Apache'yi yeniden başlatmayı (veya yeniden yüklemeyi) unutmayın. Testler sırasında kayıtları düzenli olarak temizlemeyi unutmayın, aksi takdirde kalıcı olarak engellenebilirsiniz :-)

Dizin geçiş saldırısını simüle et:

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 Enjeksiyon saldırısını simüle edin:

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 ve Apache Günlük Dosyaları

Apache web sunucusu, sunucu yöneticisine nasıl çalıştığı hakkında önemli bilgiler verecek şekilde yapılandırılabilir ... Yöneticiye geri bildirim sağlamanın ana yolu günlük dosyalarının kullanılmasıdır. Daha fazla oku...

ModSecurity'nin güçlü kayıt mekanizması vardır. Yönerge SecGuardianLoggereği, harici komut dosyalarıyla çalışmak üzere özel olarak tasarlanmış bir günlük akışı sağlar.

Şu çalışmak için bilinen tek araçtır vasi günlük olduğu httpd-guardianbir parçası olan, Apache httpd araçları projesinin . httpd-guardianAracı hizmet reddi saldırıları karşı savunmak için tasarlanmıştır. blacklist toolSorunlu IP adreslerini dinamik olarak kara listeye alan iptables tabanlı ... güvenlik duvarıyla etkileşim kurmak için kullanır . Daha fazla oku...


ModSecurity Günlük Dosyaları ► Fail2Ban ► Iptables

Apache'nin günlük dosyalarının veri ayrıştırılması için Fail2Ban'ı kurmak mümkündür. modsec_audit.logmuhtemelen en iyi seçimdir, ancak bahsettiğimiz bölümlere de bakın SecGuardianLog.

Kendine iyi bak o SecAuditLogRelevantStatusiçinde /etc/modsecurity/modsecurity.confyorumlanır. Aksi takdirde 404 hata sayfası alan herkes fail2ban tarafından engellenir.

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

Şu anda Fail2Ban bu projede hiçbir şekilde uygulanmamıştır.


ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables

httpd-guardian- istekleri izleyerek DoS saldırılarını tespit eder Apache Security, Telif Hakkı (C) 2005 Ivan Ristic - borulu günlükleme mekanizması aracılığıyla tüm web sunucusu isteklerini izlemek için tasarlanmıştır. Her IP adresinden gönderilen istek sayısını takip eder ... httpd-guardian bir uyarı gönderebilir veya IP adresini engellemek için bir komut dosyası çalıştırabilir ...

Bu komut dosyası Apache2 günlük mekanizmasıyla veya ModSecurity (daha iyi) ile kullanılabilir.

Mevcut Durumlarda Kurulum ve Kurulum

İndirin httpd-guardianve yürütülebilir yapın:

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-119Komut dosyasının WSAS komut dosyasına nasıl bağlandığını görmek için satırları okuyun .

Apache'nin yapılandırmasında ( /etc/modsecurity/modsecurity.conf) aşağıdaki değişikliği uygulayın , ardından yeniden başlatın:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

Kontrol etmek

Komut dosyasını test etmek için ModEvasive'ı devre dışı bırakın ( sudo a2dismod evasivedaha sonra etkinleştirmeyi unutmayın) ve Apache'yi yeniden başlatın. Sonra tailexec günlüğü:

tail -F /var/www-security-assistant/www-security-assistant.execlog

Ve başka bir örnekten DoS saldırısı gerçekleştirin, örneğin abbu şekilde kullanın :

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done


ModSecGuardianLog ► Özel Analiz ► WSAS ► Iptables

Burada, httpd-custom-analyze.bashözel bir şey değil, güzel bir örnek olabilecek basit bir komut dosyası sunulmaktadır . Özellikleri komut dosyasının gövdesinde açıklanmıştır.

Kurulum ve Kurulum

İndirin httpd-custom-analyze.bashve yürütülebilir yapın:

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'nin yapılandırmasında ( /etc/modsecurity/modsecurity.conf) aşağıdaki değişikliği uygulayın ve yeniden başlatın:

#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"
  • Eşik değere ulaşıldığında komut dosyası WSAS'yi çağırır - okuma satırı 86ve 35.

  • Her iki httpd-komut dosyasının aynı anda çalışmasını sağlamak için her ikisini de düzenleyin modsecurity.confve ekleyin SecGuardianLog.

  • Test yapmak için yukarıdaki bölümdeki ipuçlarını izleyin.


Lütfen yayınınızı sık sık düzenlemeyin. Gönderinizi günde birçok kez sürekli olarak düzenlemek, bunu ön sayfaya çarpmaya devam eder ve ayrıca moderatörler için gürültü üretir. Bunun yerine, içeriğinizi başka bir sayfada veya bir metin düzenleyicisinde hazırlamayı , ardından ayrıntıları tek tek düzenlemek yerine toplu olarak düzenlemeyi düşünün . (Bu yazı, burada yapılan düzenlemeyi geçici olarak sınırlamak için bir saat kilitlendi)
Thomas Ward

1
Yorum için teşekkürler, @ThomasWard. Bunu aklımda tutacağım! Kullanıcılar sayfasında Profil ve Ayarları Düzenle'nin yanında korumalı alan olarak kullanmak iyi bir fikir değil mi?
pa4080

1
Önerildi ve reddedildiğine inanıyorum. Ne öneriyorsun Değişiklikleri yaptıktan olmasıdır olmadan o tasarruf ve sonra bunu düzenleyebilir, sisteminizde bir metin dosyasına olduğu gibi sorunuzun bir kopyasını saklamak, Düzenlemeye yayını istediğiniz zaman geri kopyalamak ve markdown ve benzeri için düzeltme. Üstelik tüm üstü çizili şeyler ... şeyleri okumayı zorlaştırıyor. Bunun yerine yalnızca bu bölümleri kaldırmayı düşünün . (Düzeltme geçmişi verileri tutacak)
Thomas Ward

Stack Exchange'in ön sayfada düzenlemeleri engellememesine izin vermemesi saçma
Franck Dernoncourt

1

Pa4080'in tüm bunları kendi başınıza halletmeniz için ayrıntılı ve muhtemelen çok yararlı bir yanıt verdiğini anlıyorum. Sorunları kendi başınıza halletmek iyi gelse de, bu da çok zaman alabilir .

  1. Alışın Cloudflare serbest DDoS koruma sağlamak olarak.
  2. Şu anda yalnızca Apache kullanıyorsanız, NGINX'in yükünüzü dengelemek için nasıl çalıştığını öğrenin. NGINX, burada ve burada gösterildiği gibi yük dengeleme Apache için mükemmeldir .
  3. İnceleme onların dokümanlar üzerinde güvenlik için Apache'nin ipuçları .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.