Fail2ban – testar configurações

To test your configs, check your apache-badbots.conf and find the failregex.

Code:

failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"(?:%(badbots)s|%(badbotscustom)s)"$

 

Chose one entry from “badbots” and run fail2ban-regex with a test-string against your apache-badbots.conf:

Code:

fail2ban-regex '1.2.3.4 - - [12/Feb/2013:10:53:59 +0100] "GET / HTTP/1.1 200" 39460 "-" "autoemailspider"' /etc/fail2ban/filter.d/apache-badbots.conf

 

You should get something like “Success, the total number of match is 1”

Bloquear bots no Apache

Code:

#Joomla com_jce exploit
SecRule HTTP_User-Agent "BOT for JCE" "deny,status:500,id:5000218,msg:'Joomla com_jce code exec'"

#Joomla com_jce exploit
SecRule REQUEST_URI "/images/stories/.+\.php" "deny,status:500,id:5000219,msg:'Joomla com_jce code exec'"

The first blocks the user agent. That exploit puts PHP files into site.com/images/stories/something.php if it is successful, so the 2nd rule blocks access to those in case they change user agent.

Even with the .htaccess or this first rule, you should still use the 2nd rule. Changing user agents is very simple.

 

Outra sugestão:

https://github.com/bluedragonz/bad-bot-blocker

Prevenir ataques DDoS com Apache mod_evasive

# yum install httpd-devel
# yum install mod_evasive

* É necessário ativar o repositório EPEL

Reinicia-se o Apache para ativar o módulo

# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

Verificar que o módulo está ativo

# php -r 'phpinfo();' | grep -i evasive
^ Loaded Modules | core prefork http_core mod_so mod_auth_basic mod_auth_digest mod_authn_file mod_authn_alias mod_authn_anon mod_authn_dbm mod_authn_default mod_authz_host mod_authz_user mod_authz_owner mod_authz_groupfile mod_authz_dbm mod_authz_default util_ldap mod_authnz_ldap mod_include mod_log_config mod_logio mod_env mod_ext_filter mod_mime_magic mod_expires mod_deflate
mod_headers mod_usertrack mod_setenvif mod_mime mod_dav mod_status mod_autoindex mod_info mod_dav_fs mod_vhost_alias mod_negotiation mod_dir mod_actions mod_speling mod_userdir mod_alias mod_rewrite mod_proxy mod_proxy_balancer mod_proxy_ftp mod_proxy_http mod_proxy_connect mod_cache mod_suexec mod_disk_cache mod_file_cache mod_mem_cache mod_cgi mod_version mod_evasive20 mod_perl mod_php5 mod_proxy_ajp mod_python mod_ssl |

Agora vamos configurar o módulo. Esta é a configuração que estou a testar de momento, parece funcionar bem mesmo num servidor partilhado com muitos acessos.

Editar o ficheiro /etc/httpd/conf.d/mod_evasive.conf:

<IfModule mod_evasive20.c>
   DOSHashTableSize 3097
   DOSPageCount 6
   DOSSiteCount 100
   DOSPageInterval 2
   DOSSiteInterval 2
   DOSBlockingPeriod 600
</IfModule>

Reinicia-se novamente o Apache para recarregar as configurações:

# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

Desactivar mod_security para um virtualhost

Não é possível desactivar o mod_security2 através de um ficheiro .htaccess. É necessário desactivá-lo no virtual host no ficheiro de configuração httpd.conf adicionando as seguintes directivas:

<IfModule mod_security2.c>
 SecRuleEngine Off
</IfModule>

WordPress + ModSecurity2 = slow load

Pelos vistos o wordpress não funciona com o modsecurity2. A solução passa por desactivar o modsecurity2 para o site através do .htaccess

<IfModule mod_env.c> SetEnv MODSEC_ENABLE Off PassEnv MODSEC_ENABLE </IfModule>

httpd não inicia

-bash-3.2# service httpd start
A iniciar o httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

-bash-3.2# lsof -i :80
COMMAND   PID   USER   FD   TYPE   DEVICE SIZE NODE NAME
perl    24082 apache    4u  IPv6 77043797       TCP *:http (LISTEN)
[init]  24093 apache    4u  IPv6 77043797       TCP *:http (LISTEN)
-bash-3.2# kill -9 24082
-bash-3.2# kill -9 24093
-bash-3.2# service httpd start
A iniciar o httpd:                                         [  OK  ]

Quando este tipo de situação ocorre normalmente significa que o servidor foi comprometido. Neste exemplo é possível verificar que existe um processo a correr na porta 80 iniciado como utilizador apache pelo perl. Estava a correr uma aplicação (trojan) para realizar scans a outros servidores.

Instalar mod_security no CentOS 5.4

UPDATE:

Actualizações das regras aqui: http://sourceforge.net/projects/mod-security/files/modsecurity-crs/0-CURRENT/

O mod_security é útil para proteger o Apache contra diversos tipos de ataques a aplicações web, agindo como uma camada de protecção.

Para realizar a instalação do mod_security no CentOS existem duas formas, compilar o código-fonte ou instalar o pacote binário do repositório EPEL (Extra Packages for Enterprise Linux). Neste guia vamos instalar o pacote binário.

Caso não possua o repositório EPEL activado no seu sistema, instale-o com o comando abaixo:

Versão 32 bits

# rpm −Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel−release−5−4.noarch.rpm

Versão 64 bits

# rpm −Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel−release−5−4.noarch.rpm

Antes de instalar o pacote do mod_security no meu ambiente (CentOS 5.4 64 bits) foi necessário instalar o pacote lua, portanto, caso encontre erros de dependência da biblioteca liblua-5.1.so durante a instalação execute o comando abaixo:

# rpm −ivh http://mirrors.kernel.org/fedora−epel/5Server/x86_64/lua−5.1.2−1.el5.x86_64.rpm

Instale o pacote do mod_security com o comando abaixo:

# yum install mod_security

O arquivo de configuração principal do mod_security encontra-se em /etc/httpd/conf.d/mod_security.conf, no directório /etc/httpd/modsecurity.d/ encontram-se todos os outros arquivos de configuração do mod_security incluindo o arquivo /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf que deve ser ajustado de acordo com as suas necessidades.

Os arquivos de log encontram-se em /var/log/httpd/modsec_debug.log e em /var/log/httpd/modsec_audit.log.

Após a instalação verifique no arquivo /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf se a opção SecRuleEngine está On:

# vim /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf SecRuleEngine On

Agora basta reiniciar o serviço com o comando abaixo:

# service httpd restart

Nos logs do Apache pode ser verificado se o módulo foi devidamente carregado:

# tail -f /var/log/httpd/error_log [Tue Dec 15 20:34:35 2009] [notice] caught SIGTERM, shutting down [Tue Dec 15 20:34:44 2009] [notice] SELinux policy enabled; httpd running as context root:system_r:httpd_t [Tue Dec 15 20:34:45 2009] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Tue Dec 15 20:34:46 2009] [notice] ModSecurity for Apache/2.5.9 (http://www.modsecurity.org/) configured. [Tue Dec 15 20:34:46 2009] [notice] Original server signature: Apache/2.2.3 (CentOS) [Tue Dec 15 20:34:46 2009] [notice] Digest: generating secret for digest authentication ... [Tue Dec 15 20:34:46 2009] [notice] Digest: done [Tue Dec 15 20:34:47 2009] [notice] Apache/2.2.0 (Fedora) configured -- resuming normal operations

E após algumas tentativas segue um exemplo do mod_security em ação:

# tail -f /var/log/httpd/error_log [Tue Dec 15 18:29:21 2009] [error] [client XX.XX.XX.XX] ModSecurity: Warning. Match of "rx ModSecurity" against "WEBSERVER_ERROR_LOG" required. [ile "/etc/httpd/modsecurity.d/modsecurity_crs_21_protocol_anomalies.conf"] [line "65"] [id "960913"] [msg "Invalid request"] [severity "CRITICAL"] [hostname "meu.site.com"] 

Depois foi necessário definir o SecDataDir na configuração. Isto não estava definido inicialmente e surgiam erros nos logs.

ModSecurity: Unable to retrieve collection (name "", key ""). Use SecDataDir to define data directory first.

Este erro foi corrigido adicionando a directiva SecDataDir e criando um directório para este propósito, dando permissões ao apache para escrita.

# vim /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf
( Added SecDataDir /usr/local/apache/modsec_data )
mkdir /usr/local/apache
mkdir /usr/local/apache/modsec_data
chown apache:apache /usr/local/apache/modsec_data
chown apache:apache /usr/local/apache

Depois de reiniciar o serviço o modsecurity começou a aplicar as regras, mas em vez de bloquear os pedidos, simplesmente registava os avisos. Alterei a SecDefaultAction em

# vim /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf
SecDefaultAction "phase:2,pass"

para

SecDefaultAction "phase:2,deny,log,status:403"

Fonte: http://www.cyberciti.biz/faq/rhel-fedora-centos-httpd-mod_security-configuration/

Fonte: http://devinvenable.blogspot.com/2010/04/modsecurity-setup-on-centos-54.html

Testar configuração Apache

Depois de se fazerem alterações às configurações do Apache (httpd.conf) é boa prática testar a configuração antes de a implementar.

Para testar erros no ficheiro de configuração do Apache:

apachectl configtest

Se o ficheiro de configuração estiver correcto este comando irá responder com Syntax Ok. Caso contrário, responderá com informação detalhada sobre o erro encontrado.