login
Thu 23 of Nov, 2017 (13:02 UTC)

[root@madeira.eng.br ~]#

Linux - It is now safe to turn on your computer

atualizar cache imprimir

DenyHosts

Criada por: Frederico Madeira, última modificação em: Fri 25 of Jan, 2008 (19:16 UTC)

Introdução


Todos nós administradores de redes Linux, precisamos de alguma forma ter acesso remoto aos nosso servidores, para que possamos realizar tarefas administrativas ou de suporte. Uma forma muito comum de se obter tal funcionalidade é através de sessões seguras utilizando o serviço SSH (Secure Shell). Isso requer que nosso servidor fique exposto a internet para que possamos acessá-lo. A forma mais comum de acesso ao servidor ssh é através de usuário e senha.

Estando nosso servidor exposto a internet ou ainda na rede da corporação, com um serviço que solicite usuário e senha para acesso, ele está exposto a ataques de dicionário (força bruta) onde, exaustivamente, o atacante tentará inúmeras combinações de usuário e senha até que encontre o par correto e ganhe acesso a shell de nosso servidor.

Uma forma de proteção do serviços SSH contra ataques desse tipo é a utilização de ferramentas como a DenyHosts.

DenyHosts é um script que pode ser rodado pelos Linux Sys Admin com o objetivo de ajudá-los a combater ataques de dicionário contra servidores SSH.

Durante sua execução, ele monitora o arquivo de log /var/log/secure (para RedHat/Fedora) ou ainda o /var/log/auth.log (Mandriva) com o objetivo de identificar as mensagens de tentativa de acesso negadas.

Ele integra-se ao Tcpwrappers, adicionando entradas em /etc/hosts.deny toda vez que detecta que um determinado host teve uma certa quantidade de logons negados, durante um certo período de tempo.

Instalando


Primeiramente precisamos baixar o programa, seguimos os passos abaixo:

Para sistemas baseados em RPM

[root@vpn01 denyhosts]# wget http://ufpr.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6-python2.4.noarch.rpm


Arquivo Compactado

[root@vpn01 denyhosts]# wget http://ufpr.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz


Após o download, vamos iniciar a instalação:

Via RPM


[root@vpn01 denyhosts]# rpm -ivh DenyHosts-2.6-python2.4.noarch.rpm 
A preparar...               ########################################### [100%]
   1:DenyHosts              ########################################### [100%]


Via Arquivo Compactado


[root@localhost ~]# cd /usr/local/src
[root@localhost src]# tar xvfz DenyHosts-2.6.tar.gz 
# Cria-se um link para o diretório padrão de instalação
[root@localhost src]# ln -s /usr/local/src/DenyHosts-2.6 /usr/share/denyhosts
# Coloca-se uma cópia do script na pasta padrão dos binários do sistema
[root@localhost src]# ln -s /usr/local/src/DenyHosts-2.6/denyhosts.py /usr/bin



Configuração


Os arquivos do DenyHosts estão instalados no diretório /usr/share/denyhosts/

É necessário entrar nessa pasta e editar o arquivo de configuração

[root@vpn01 denyhosts]# cd /usr/share/denyhosts/
[root@vpn01 denyhosts]# cp denyhosts.cfg-dist denyhosts.cfg      


Agora, é necessário editar o arquivo de configuração para de acordo com as configurações do seu sistema.

As minhas ficaram dessa forma:

############ THESE SETTINGS ARE REQUIRED ############
# Arquivo de LOG a ser verificado
SECURE_LOG = /var/log/secure
# Arquivo o qual os HOSTS serão bloqueados
HOSTS_DENY = /etc/hosts.deny
PURGE_DENY = 2d 
PURGE_THRESHOLD = 0
#Indica qual serviço deve ser bloqueado para o host. Evite usar ALL para evitar ataques de negação de serviço.
BLOCK_SERVICE  = sshd
# Quantidade de logins inválidos o qual será considerado como ataque. Para usuários não inválidos.
DENY_THRESHOLD_INVALID = 5
# Quantidade de logins inválidos o qual será considerado como ataque. Para usuários válidos
DENY_THRESHOLD_VALID = 10
DENY_THRESHOLD_ROOT = 1
DENY_THRESHOLD_RESTRICTED = 1
WORK_DIR = /usr/share/denyhosts/data
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
HOSTNAME_LOOKUP=YES
LOCK_FILE = /var/lock/subsys/denyhosts
############ THESE SETTINGS ARE OPTIONAL ############
# Configurações de email para envio de alertas
# Email de quem receberá os alertas.
ADMIN_EMAIL = admin@dominio.com.br
# Servidor de email
SMTP_HOST = mail.dominio.com.br
SMTP_PORT = 25
# Quem enviará o email
SMTP_FROM = DenyHosts <root@vpn01>
SMTP_SUBJECT = DenyHosts Report for VPN01
SMTP_DATE_FORMAT = %a, %d %b %Y %H:%M:%S %z
SYSLOG_REPORT=YES
AGE_RESET_VALID=5d
AGE_RESET_ROOT=25d
AGE_RESET_RESTRICTED=25d
AGE_RESET_INVALID=10d
######### THESE SETTINGS ARE SPECIFIC TO DAEMON MODE  ##########
# Arquivo de log para o modo daemon
DAEMON_LOG = /var/log/denyhosts
DAEMON_LOG_TIME_FORMAT = %b %d %H:%M:%S
DAEMON_LOG_MESSAGE_FORMAT = %(asctime)s - %(name)-12s: %(levelname)-8s %(message)s
# Intervalo de tempo no qual ele verificará o arquivo de log.
DAEMON_SLEEP = 30s
# Intervalo de tempo no qual ele verificará os hosts que podem ser removidos do /etc/hosts.deny
DAEMON_PURGE = 1h
#########   THESE SETTINGS ARE SPECIFIC TO     ##########
#########       DAEMON SYNCHRONIZATION         ##########
SYNC_SERVER = http://xmlrpc.denyhosts.net:9911
SYNC_INTERVAL = 1h
SYNC_UPLOAD = yes
SYNC_DOWNLOAD = yes
SYNC_DOWNLOAD_RESILIENCY = 2d


Os campos que recebem unidades de tempo recebem número precedido de um período este útlimo, sendo especificado da seguinte forma:
Valor a ser utilizadoDescrição
ssegundos
mminutos
hhoras
ddias
wsemanas
yanos


Se o período for deixado em branco, o valor assumido será o de segundos.

Executando


Para rodar o DenyHosts podemos fazê-lo de duas formas:

- StandAlone: Rodado por demanda. Apenas quando solicitado pelo administrador.
- Daemon: Fica rodando constantemente em background no sistema verificando o arquivo de log.

No Modo Standalone


Para executá-lo nesse método, basta executar o comando abaixo:

[root@vpn01 denyhosts]# python /usr/bin/denyhosts.py -c /usr/share/denyhosts/denyhosts.cfg

Ele irá analisar o arquivo de log configurado na variável SECURE_LOG, exibirá alguma saída na tela, criará a pasta /usr/share/denyhosts/data e dentro dela criará os seus arquivos de controle.
Após a análise do arquivo, ela adicionará os hosts bloqueados ao arquivo /etc/hosts.deny

No meu caso, ele adicionou as seguintes entradas:

[root@vpn01 data]# cat /etc/hosts.deny | egrep -v "(^#)"
sshd: 62.245.231.71
sshd: 67.180.38.96
sshd: 200.56.249.70
sshd: 201.220.75.76
sshd: 83.170.115.53


É indicado que o DenyHosts fique seja executado de tempos em tempos de forma que ele possa atualizar as entradas em /etc/deny.hosts com os IP's dos novos atacantes. Para tal, vamos usar o crontab o qual ficará responsável por rodar o comando anterior em intervalos de tempo definidos.

Como root, digite o comando e insira a linha indicada abaixo dentro do arquivo que será exibido. Ela indica que o comando deve ser executado a cada 10 minutos.

[root@vpn01 data]# crontab -e
*/10 * * * * python /usr/bin/denyhosts.py -c /usr/share/denyhosts/denyhosts.cfg

OBS:
- Os caminhos acima podem ser diferentes de acordo com sua instalação.
- Não é necessário reiniciar o serviço cron

Para conferir se ele está sendo executado no tempo configurado, monitore o arquivo de log do cron através do comando abaixo e aguarda uma saída conforme exibido:

[root@vpn01 data]# tail -f /var/log/cron
Jan 18 13:26:01 vpn01 crond[13039]: (root) CMD (python /usr/bin/denyhosts.py -c /usr/share/denyhosts/denyhosts.cfg)

OBS: O arquivo de log do cron pode ser diferente de acordo com a configuração do syslog.

No Modo Daemon


Neste modo, devem ser observadas as seguintes configurações:

# Arquivo de log para o modo daemon
DAEMON_LOG = /var/log/denyhosts
# Intervalo de tempo no qual ele verificará o arquivo de log.
DAEMON_SLEEP = 30s
# Intervalo de tempo no qual ele verificará os hosts que podem ser removidos do /etc/hosts.deny
DAEMON_PURGE = 1h


Primeiramente vamos criar um link para o script de inicialização para que ele seja visto dentro da pasta de scripts de inicialização de serviços do sistema:

[root@vpn01 denyhosts]# ln -s /usr/share/denyhosts/daemon-control-dist /etc/init.d/DenyHosts


Vamos configurá-lo para ser carregado nos runlevels 2345:

[root@vpn01 denyhosts]# /sbin/chkconfig --level 2345 DenyHosts on


O próximo passp é configurar o script. Para tanto basta editar o script de inicialização e configurar as variáveis abaixo com os caminhos referentes ao seu sistema.

[root@vpn01 denyhosts]# vi  /etc/init.d/DenyHosts


Observe as variáveis abaixo:


DENYHOSTS_BIN   = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK  = "/var/lock/subsys/denyhosts"
DENYHOSTS_CFG   = "/usr/share/denyhosts/denyhosts.cfg"


Feito isso, o DenyHosts já está pronto para ser inicializado.

[root@vpn01 denyhosts]# /etc/init.d/DenyHosts start
starting DenyHosts:    /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg


Para checar se ele está rodando, usemos o comando abaixo:

[root@vpn01 denyhosts]# /etc/init.d/DenyHosts status
DenyHosts is running with pid = 13259



Testando

Para execução deste teste, é necessário duas estações que tenham permissão para se conectar ao servidor testado. A primeira terá o acesso bloqueado, enquanto que a segunda poderá desbloquear a segunda estação.

De acordo com as configurações do host protegido, se um usuário válido errar a senha 10 vezes ele será bloqueado.
Dessa forma, vamos tentar realizar o logon no host com a senha errada por 10 vezes. Repita o comando, até que você seja solicitado 10 vezes pela senha. Lembrando que sempre digite uma senha inválida.

[fred@localhost ~]$ ssh 192.168.0.1
fred@192.168.0.1's password: 


Logo em seguida verifique o arquivo de log /var/log/denyhosts

[root@vpn01 denyhosts]# tail -f /var/log/denyhosts
Jan 18 14:24:29 - denyhosts   : INFO     new denied hosts: ['192.168.0.100']

Vemos que o daemon bloqueou o host que estava tentando fazer acesso indevido.

Sincronização


O DenyHosts possui a capacidade de enviar periodicamente a base de hosts bloqueados por ele a um servidor central, pode também baixar periodicamente uma lista de hosts que foram bloqueados por outros daemons espalhados pelo mudo.
Para ativar esse recurso, basta descomentar a linha abaixo do arquivo de configuração.

SYNC_SERVER = http://xmlrpc.denyhosts.net:9911


Considerações Finais


Em ambos os casos, no modo Standalone e no modo daemon, recebi um email notificando da inserção do host no arquivo /etc/hosts.deny. Vide abaixo um exemplo.

Subject: DenyHosts Report for VPN01
Added the following hosts to /etc/hosts.deny:
192.168.0.100 (unknown)


O daemon não utiliza muitos recursos da máquina e nem afeta outros sistemas que estejam rodando na mesma além de apresentar boa performance.
O DenyHosts apresenta-se como uma ferramenta rápida e versátil para compor as ferramentas de segurança de nossos servidores.

Referências



[1] - Site oficial: [http://denyhosts.sourceforge.net/|http://denyhosts.sourceforge.net/]
[2] - DenyHosts FAQ: [http://denyhosts.sourceforge.net/faq.html|http://denyhosts.sourceforge.net/faq.html]


Comentários