Status code 403: Jak funguje ModSecurity

Modsecurity je firewall pro webové aplikace. Je to open-source pro zabezpečení apache nebo nginx serveru. Monitoruje požadavky na web server, loguje útoky a umí je i zablokovat.

Sada pravidel CRS 3

Do Modsecurity existuje několik různých sad pravidel. Já používám OWASP. Owasp je nejpřísnější a vyžaduje úpravy, protože jinak blokuje např. některé pluginy WordPress. Další alternativy sady pravidel je Atomic Standard (základní ochrana), Atomic Advanced (placená verze) nebo Comodo.

V souboru /etc/httpd/conf/modsecurity.d/rules/owasp_modsecurity_crs_3-plesk/10-crs-setup.conf a /etc/nginx/modsecurity.d/rules/owasp_modsecurity_crs_3-plesk/10-crs-setup.conf

Režim činnosti: výchozí Anomaly Scoring vs. samostatný režim

CRS může běžet ve dvou režimech. Ve starší verzi CRS 2 byl výchozí režim Self-Contained Mode, ale ve verzi 3 je výchozím a doporučenným „anomální režim“ nazývaný také „režim detekce ve spolupráci“. V Anomaly Scoring každé odpovídající pravidlo zvyšuje skóre. Na konci pravidel se zkontroluje skóre anomálie a vyhodnotí se blokování.

V samostatném režimu se provede akce okamžitě při odpovídajícím pravidlu.

Pro konfiguraci režimu se musí tedy nastavit logovací nastavení (Alert Logging Control).

Ve výchozím nastavení je nastaven Anomaly Scoring mode v Alert Logging Control.

SecDefaultAction „phase:1,log,auditlog,pass“
SecDefaultAction „phase:2,log,auditlog,pass“

Zaloguje útoky a nechá projít. Pro aktivaci samostatného režimu by stačilo zakomentovat příklad pro anomální režim a odkomentovat příklad pro Self-contained mode:

SecDefaultAction „phase:1,log,auditlog,deny,status:403“
SecDefaultAction „phase:2,log,auditlog,deny,status:403“

Akce zakáže zpracování a vrací status kod 403. Je dobré také zkontrolovat podobu error page pro 403, aby to vypadalo uživatelsky přívětivě.

Inicializace úrovně paranoie PL

Nastavení PL umožňuje nastavit zvolit požadovanou úroveň kontroly pravidel. Výchozí úroveň je 1. Doporučuje se pro zkušené uživatele zvýšit na 2 odkomentování příslušného řádku.

Paranoia Level 2

Od úrovně 2 se zapisuje do modsec_audit.log a také platí mnohem více pravidel, pěkně je to zdokumentováno zde https://www.netnea.com/cms/core-rule-set-inventory/

Jak bude probíhat zablokování útoku v http requestu pro různé úrovně PL je nastaveno v konfiguračním souboru REQUEST-949-BLOCKING-EVALUATION.conf.

Např. pro PL 2:

SecRule TX:PARANOIA_LEVEL "@lt 3" "phase:1,id:949015,nolog,pass,skipAfter:END-REQUEST-949-BLOCKING-EVALUATION"
SecRule TX:PARANOIA_LEVEL "@lt 3" "phase:2,id:949016,nolog,pass,skipAfter:END-REQUEST-949-BLOCKING-EVALUATION"

Zvýšením PL se dá zvýšit zabezpečení.

Příklad SQL injection útoku

Např. pokud Modsecurity modul pro Apache detekuje SQL dotaz SLEEP(5) v query parametru url, tak to vyhodnotí jako pokus o SQL injekci a dá vědět Apachi, že to má zablokovat.

Analýza probíhá v 5 fázích.

  1. fáze: kontrola záhlaví (request headers) požadavku – detekuje chyby v hlavičkách např. nesprávné content-type pro http metodu, blokuje některé roboty nebo chybná volání api
  2. fáze: kontrola těla (request body) požadavku – pokud požadavek obsahuje tělo ve formátu application/x-www-form-urlencoded, multipart/form-data nebo text/xml, může v něm být škodlivý kód
  3. fáze: kontrola záhlaví odpověďi – po zpracování požadavku serverem může zablokovat proces před zpracováním těla požadavku, tady nevím konkrétní příklad, co by mohlo vadit
  4. fáze: kontrola těla odpověďi – po zpracování požadavku serverem zablokuje, pokud najde např. chybové hlášky obsahující sql dotazy, které by návštěvník (útočník) určitě vidět neměl nebo chyby autentizace
  5. zalogování

Konfigurace Modsecurity

Umístění konfigurace závisí na používaném software, např. Plesk se liší od použití instalace ze zdrojových kodů.

SecRuleEngine

Modsecurity umí běžet pouze v detekčním režimu (SecRuleEngine DetectionOnly), ve kterém pouze loguje, ale nic neblokuje. Pokud používám CRS rule set OWASP, který je velice příšný a nedovoluje např. vkládat do komentářů v diskuzi, poptávkových formulářích apod. i celkem bezpečné věci obsahující zmínku o sql dotazech apod. Zapíná se hodnotou: On, vypíná hodnotou Off

SecAuditLog

Cesta k log souboru, důležité kontrolovat, zda Modsecurity neblokuje něco, co by blokovat neměl.

SecRuleRemoveById

Dá se jednoduše vyjmout ze sady pravidel konkrétní pravidlo podle jeho identifikátoru.

Jak číst logovací soubor modsec_audit.log

Došlo k útoku ? Jak to zjistím ? Je třeba mít zapnutý SecAuditEngine na On nebo lépe na RelevantOnly. Modsecurity loguje do error logu Apache a zároveň do modsec_audit.log.

Dokumentace k audit logu Modsecurity. Do souboru /var/log/modsec_audit.log jsou zapisovány útoky nebo potenciální útoky. Zápis je rozdělen do sekcí A B C D E F G H I J K Z, aby šlo v něm dobře hledat. Zapisují se celé hlavičky a těla požadavků a odpověďí.

Jak číst modsec_debug.log

Debug log je ve výchozím nastavení vypnutý. Zapnout se dá v různých úrovních. 9 je max, to je brutál, to ani nezkoušejte. 2 jsou chyby + upozornění.

SecDebugLog /var/log/modsec_debug.log
SecDebugLogLevel 2