CWAF – Web application firewall for the masses

Olá a todos,

Com a explosão do self-hosting em PME’s seja via datacenter providers, como em ambientes de public cloud, tem me perguntado se eu conheço algum método ou software para se protegerem de ataques maliciosos, ou de simples interações com vírus ou worms com os seus sites ou webapps.

Este post vem ao encontro desses pedidos, de forma a auxiliar a colmatar essa necessidade.

Sim existe e o software que pretendem encaixa-se na categoria de WAF.

Existem várias soluções, desde hardware dedicado, WAFs / Ironports, passando por produtos da comunidade como por exemplo o Comodo WAF que iremos visitar hoje.

Escolhi esta versão, pois de todos é o dos mais pacíficos de instalar, com uma base de deteção bastante grande, e que corre apoiado no mod_security do apache que existe em praticamente todas as distribuições.

O que é o mod_security?

Conforme o site refere, o mod_security é uma firewall de aplicativos web: “ModSecurity is a toolkit for real-time web application monitoring, logging, and access control”
Funciona validando contra uma lista pre-determinada de regras se condições especificas se verificam (por exemplo um típico sql injection) e caso se verifiquem, efetuem o drop ao pedido de forma a nunca chegar a nossa web-based-app.

Mas para tudo isto funcionar, é necessário que algo alimente o mod_security com regras sobre o que procurar e é aqui que entra o Comodo WAF.

A instalação é relativamente simples, bastando ir ao site do aplicativo e criar uma conta (valida para que seja possível descarregar atualizações).

Os pré requisitos são relativamente modestos:

  • Apache web server v.2.2 ou superior (nginx e lightspeed são igualmente suportados).
  • Linux server platform 🙂
  • 10 MB free space (para descarregar as assinaturas e rulesets).

Para proceder á instalação, temos de validar se existe o modulo mod_security em execução no nosso apache:

httpd -M | grep security

Caso não exista instalar através do comando e dependências para instalação

yum install mod_security which

Em seguida será questão de visitar o site e proceder ao download do produto:

# wget "https://waf.comodo.com/cpanel/cwaf_client_install.sh"

Nota: Caso não tenha sido ainda iniciado, iniciar o apache.

E em seguida efetuar a instalação executando o cwaf_client_install.sh.
Nota que poderá existe necessidade de instalação de mais módulos, que serão automaticamente instalados pelo installer do produto.

No fim da instalação será pedido o login e password registados no site, de forma ao installer conseguir ir buscar regras automaticamente ao site da Comodo:

Depois, para garantir a configuração correta, será necessário ou invocar o gui interno, ou instalar o modulo de webmin (caso seja essa a vossa realidade).
No meu caso, e tendo em conta que não sou particularmente fã do webmin (e como tal não o tenho sequer instalado), executei o gui local com user não root:

cd /usr/local/cwaf/scripts
./standalone-gui.pl

Em seguida com porta exportada via ssh desde o servidor onde se encontra o CWAF  ( ssh -N -p <ssh_port> [email protected] -L <local_port>:localhost:5580) a funcionar invocar o seguinte url:

http://127.0.0.1:5580

No fim, para testar se está tudo OK com a nossa instalação executar em consola, como root:

# httpd -M
AH00526: Syntax error on line 1546 of /usr/local/cwaf/rules/29_Apps_WPPlugin.conf:
Error creating rule: Failed to resolve operator: detectSQLi

Isto é causado pela versão do mod_security. Caso seja esse o caso, efetuem upgrade ao vosso mod_security através do repositório atomic:

# wget -q -O – http://www.atomicorp.com/installers/atomic | sh
# yum install mod_security

Poderá ocorrer ainda erro nos ficheiros de configuração que são de fácil resolução:

# httpd -M

[Wed Oct 12 15:47:59.816458 2016] [so:warn] [pid 860] AH01574: module unique_id_module is already loaded, skipping

httpd: Syntax error on line 353 of /etc/httpd/conf/httpd.conf: Syntax error on line 14
of /etc/httpd/conf.d/00_mod_security.conf: No matches for the wildcard ‘*asl*.conf’ in
‘/etc/httpd/modsecurity.d’, failing (use IncludeOptional if required)

Para resolução, basta ir ao ficheiro /etc/httpd/conf.d/00_mod_security.conf  e comentar as linhas referentes a “Rule management is handled by ASL” ficando com um ficheiro semelhante ao abaixo:

 #
 # ASL Free trial ruleset is available at: https://atomicorp.com/amember/signup/cart/
 #
 #
 LoadModule security2_module modules/mod_security2.so
 #
 <IfModule mod_security2.c>
 # Basic configuration goes in here
   Include modsecurity.d/tortix_waf.conf
# Rule management is handled by ASL
  #Include modsecurity.d/00*exclude.conf
  #Include modsecurity.d/*asl*.conf
  #Include modsecurity.d/99*exclude.conf
 </IfModule>

Finalmente fazer teste á configuração do apache, e se tudo estiver OK reload ao apache e validar o resultado.

Lembrem-se ainda de colocar um cron a atualizar as regras do WAF de forma a estarem protegidos contra as ultimas ameaças identificadas.
O update pode ser invocado através do seguinte script

/usr/local/cwaf/scripts/updater.pl
Nota: Os logs dos acessos bloqueados estão em  /var/log/httpd/modsec_audit.log, com o indicativo do erro conforme é visível pela mensagem abaixo:

--af84c952-H--
Message: [file "/usr/local/cwaf/rules/02_Global_Generic.conf"] [line "58"] [id "211200"] [rev "3"] [msg "COMODO WAF: System Command Access||88.88.88.88|F|2"] [data "Matched Data: cmd.exe found within XML: cmd.exe/c start/min powershell.exe -nop -noni -ep bypass -w hidden -e jabpafmapqaoaecavwbtagkaiabxagkabgazadiaxwbpahaazqbyageadabpag4azwbtahkacwb0aguabqapac4aqwbhahaadabpag8abga7acqavwbdad0atgblahcalqbpagiaagblagmadaagae4azqb0ac4avwblagiaqwbsagkazqbuahqaowakafcaqwauaegazqbhagqazqbyahmawwanafuacwblahialqbbagcazqbuahqajwbdad0aigbqag8adwblahiauwboaguababsac8avwbmacaajabpafmaiga7aekarqbyacaajabxaemalgbeag8adwbuagwabwbhagqauwb0ahiaaqbuagcakaanaggadab0ahaaogavac8amqayad..."] [severity "CRITICAL"] [tag "CWAF"] [tag "Generic"] Access denied with code 403 (phase 2). Pattern match "\\b(?:cmd(?:\\b[^a-zA-Z0-9_]{0,}?\\/c|(?:32){0,1}\\.exe\\b)|(?:ftp|n(?:c|et|map)|rcmd|telnet|w(?:guest|sh))\\.exe\\b)" at MATCHED_VAR.
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client 88.88.88.88] ModSecurity: [file "/usr/local/cwaf/rules/02_Global_Generic.conf"] [line "58"] [id "211200"] [rev "3"] [msg "COMODO WAF: System Command Access||88.88.88.88:80|F|2"] [data "Matched Data: cmd.exe found within XML: cmd.exe/c start/min powershell.exe -nop -noni -ep bypass -w hidden -e jabpafmapqaoaecavwbtagkaiabxagkabgazadiaxwbpahaazqbyageadabpag4azwbtahkacwb0aguabqapac4aqwbhahaadabpag8abga7acqavwbdad0atgblahcalqbpagiaagblagmadaagae4azqb0ac4avwblagiaqwbsagkazqbuahqaowakafcaqwauaegazqbhagqazqbyahmawwanafuacwblahialqbbagcazqbuahqajwbdad0aigbqag8adwblahiauwboaguababsac8avwbmacaajabpafmaiga7aekarqbyacaajabxaemalgbeag8adwbuagwabwbhagqauwb0ahiaaqbuagcakaanaggadab0ahaaogavac8amqayad..."] [severity "CRITICAL"] [tag "CWAF"] [tag "Generic"] Access denied with code 403 (phase 2). Pattern match "\\\\\\\\b(?:cmd(?:\\\\\\\\b[^a-zA-Z0-9_]{0,}?\\\\\\\\/c|(?:32){0,1}\\\\\\\\.exe\\\\\\\\b)|(?:ftp|n(?:c|et|map)|rcmd|telnet|w(?:guest|sh))\\\\\\\\.exe\\\\\\\\b)" at MATCHED_VAR. [hostname "88.88.88.88"] [uri "/wls-wsat/CoordinatorPortType"] [unique_id "WveG3Rkh3XfLePuP1AUB2AAAAAw"]
Action: Intercepted (phase 2)
Stopwatch: 1526171357305146 275857 (- - -)
Stopwatch2: 1526171357305146 275857; combined=1692, p1=726, p2=533, p3=0, p4=0, p5=330, sr=93, sw=103, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.2 (http://www.modsecurity.org/); CWAF_Apache.
Server: Apache
Engine-Mode: "ENABLED"

--af84c952-Z--

Com base neste erro é possível construir exclusões, caso o ataque reportado e bloqueado seja efetivamente um falso positivo.

Como conclusão a este post, informo que tenho usado e abusado do CWAF nos últimos tempos, apesar de utilizar IDS/IPS no meu balanceador interno que faz o desencapsulamento de pedidos https para http.
Mesmo com o IDS/IPS á frente, ainda estão a passar algumas tentativas de ataque que estão a ser prontamente bloqueadas no CWAF.

É um software interessante com extremo potencial para uma PME ou para quem quiser ter o seu homelab.

Claro que caso tenham duvidas, ou reparos sabem onde me encontrar.

Até ao próximo post, um abraço!
Nuno