Arquivo

Textos com Etiquetas ‘Segurança’

Protegendo serviços com o Fail2ban

Opa,

Recentemente notei uma grande quantidade de tentativas de acesso (sem sucesso) ao servidor de e-mail’s onde trabalho, mais precisamente no serviço de autenticação para envio de e-mail’s (SASL), após verificar que as tentativas vinham de vários endereços diferentes e obviamente perceber que manualmente isso ia dar um trabalho enorme para bloquear, resolvi procurar uma solução para esse problema na Internet, foi quando encontrei o fail2ban, na verdade já tinha lido algumas coisas sobre ele, mas nunca cheguei a testá-lo. O fail2ban para quem não conheçe serve para verificar os logs do sistema e identificar as tentativas de acesso aos serviços (SSH, SASL, POP3, IMAP, DNS, Apache, etc…) utilizando o método de brute force, após essa identificação é possível realizar o bloqueio do IP utilizando o iptables ou o TCP wrappers (hosts.deny).

O servidor em questão está executando um OpenSuSE 10.3, ou seja, o repositório oficial já foi descontinuado pela Novell e foi necessário adicionar um repositório para poder instalar as dependências:

# zypper ar http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/10.3/repo/oss/ Repositorio

Instale as dependências:

# zypper install python python-devel

Faça o download dos fontes no site do projeto (nesse post utilizei a versão 0.8.4):

# wget -c http://downloads.sourceforge.net/project/fail2ban/fail2ban-stable/fail2ban-0.8.4/?use_mirror=ufpr

Descompacte e instale a aplicação:

# tar -xvjf fail2ban-0.8.4.tar.bz2 && cd fail2ban-0.8.4
# python setup.py install

Abra o arquivo jail.conf e configure o serviço de acordo com as suas necessidades:

# vim /etc/fail2ban/jail.conf
[DEFAULT]

# IPs que devem ser ignorados
ignoreip = 127.0.0.1 192.168.1.200

# Tempo em segundos que o IP sera banido
bantime = 600

# O host sera banido caso atinja o numero de maxretry durante o tempo configurado em findtime
findtime = 600

# Apos quantas tentativas o host devera ser bloqueado
maxretry = 3

# Backend utilizado, podendo ser gamin, polling ou auto
backend = auto

# Agora criamos as jail's:

# Este jail bloqueia o host apos 5 tentativas no Courier POP3
[courierpop3]

enabled = true
port = pop3
filter = courierlogin
action = iptables[name=%(__name__)s, port=%(port)s]
logpath = /var/log/mail
maxretry = 5

# Este jail bloqueia o host apos 5 tentativas no Courier Imap
[courierimap]

enabled = true
port = imap2
filter = courierlogin
action = iptables[name=%(__name__)s, port=%(port)s]
logpath = /var/log/mail
maxretry = 5

# Este jail bloqueia o host apos 3 tentivas no Sasl e envia um e-mail para o destinatario
[sasl-iptables]

enabled = true
filter = sasl
action = iptables[name=sasl, port=smtp, protocol=tcp]
sendmail-whois[name=sasl, dest=fulano@dominio.com.br]
logpath = /var/log/mail

OBS.: Foi necessário alterar o filtro do sasl.conf para poder detectar as tentativas corretamente:

# vim /etc/fail2ban/filter.d/sasl.conf
failregex = (?i): warning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed: authentication failure$

Dica: Para testar um filtro basta executar o comando fail2ban-regex seguido do log desejado e o arquivo de filtro referente, também pode ser usado uma string no lugar do log e a expressão regular no lugar do arquivo de filtro:

# fail2ban-regex /var/log/mail /etc/fail2ban/filter.d/sasl.conf
Running tests
=============

Use regex file : /etc/fail2ban/filter.d/sasl.conf
Use log file : /var/log/mail

Results
=======

Failregex
|- Regular expressions:
| [1] (?i): warning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed: authentication failure$
|
`- Number of matches:
[1] 5915 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
xxx.xxx.xxx.xxx (Thu May 13 10:30:30 2010)
xxx.xxx.xxx.xxx (Thu May 13 10:30:32 2010)
...

Date template hits:
52774 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s):

Success, the total number of match is 5915

However, look at the above section 'Running tests' which could contain important information.

Ative na inicialização do sistema e inicie o serviço:

# cp fail2ban-0.8.4/files/suse-initd /etc/init.d/fail2ban
# chkconfig --add fail2ban
# /etc/init.d/fail2ban start

Podemos verificar os bloqueios atráves do log do fail2ban ou pelo iptables:

# tail -f /var/log/fail2ban.log
2010-05-13 10:31:16,824 fail2ban.actions: WARNING [sasl-iptables] Ban xxx.xxx.xxx.xxx
2010-05-13 10:31:20,913 fail2ban.actions: WARNING [sasl-iptables] Ban xxx.xxx.xxx.xxx

# iptables -L -n
DROP all -- xxx.xxx.xxx.xxx 0.0.0.0/0
DROP all -- xxx.xxx.xxx.xxx 0.0.0.0/0

O fail2ban possui diversos serviços já configurados bastando ativá-los no seu arquivo de configuração e novos serviços podem ser adicionados e ajustados conforme desejar. Abraço!

Fonte: http://www.howtoforge.com/fail2ban_opensuse10.3

Categories: Linux Tags: , , ,

CentOS: Instalando mod_security

15, dezembro, 2009 2 comentários

Opa,

Nesse post iremos instalar e ativar o suporte a mod_security no CentOS 5.4, o mod_security é útil para proteger o Apache contra diversos tipos de ataques a aplicações web, agindo como uma camada de proteçã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). Como já possuo o repositório EPEL (e por preguiça também lógico) escolhi instalar o pacote binário, segue abaixo os procedimentos utilizados.

Caso não possua o repositório EPEL ativado 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−3.noarch.rpm

Versão 64 bits
# rpm −Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel−release−5−3.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 (dica que encontrei no comentário do Zigzacom na fonte), 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 diretó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á configurada para 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"]

Abraço!

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