DenyHosts Adicionando segurança para SSH

E ai galera, aqui eu vou abordar a instalação do denyhosts que é uma ferramenta que monitora os logins mal sucedidos no /var/log/auth.log e adiciona o ip do atacante no /etc/hosts.deny então o nosso controle é por tcpwrappers.

Vamos também

Vamos instalar o denyhosts para efetuar bloqueios de tentativas de acesso ao ssh mal sucedidas

aptitude install denyhosts -y

Agora vamos acertar a configuração dele

vim /etc/denyhosts.conf
[...]
#Aqui abaixo estamos definindo qual arquivo de log que ele vai analisar para efetuar os bloqueios
SECURE_LOG = /var/log/auth.log
[...]
#O bloqueio vai ser efetuado por tcpwrappers
HOSTS_DENY = /etc/hosts.deny
[...]
#Quando vamos liberar o ip do bloqueio, como não definimos nada ele nunca vai sair do bloqueio
PURGE_DENY =
#Agora vamos definir qual serviço que vamos monitorar em nosso caso sshd
BLOCK_SERVICE  = sshd
#Quantas tentativas vamos esperar para bloquear uma tentativa de acesso com usuário invalido
DENY_THRESHOLD_INVALID = 1
#Quantas tentativas vamos esperar para bloquear o acesso mal sucedidas com um usuário existente no /etc/passwd, fora o root
DENY_THRESHOLD_VALID = 3
#Quantas tentativas vamos esperar para bloquear o acesso mal sucedido com o usuário root
DENY_THRESHOLD_ROOT = 1
[...]
#Aqui vamos definir o endereço email do usuário que vai receber a notificação de bloqueio
ADMIN_EMAIL = douglas@douglasqsantos.com.br
#Aqui vamos definir o servidor smtp
SMTP_HOST = mail.douglasqsantos.com.br
#Caso deseje utilizar autenticação podemos utilizar para usuário
SMTP_USERNAME=douglas@douglasqsantos.com.br
#Caso deseje utilizar autenticação podemos utilizar para senha
SMTP_PASSWORD=SENHA
#Agora podemos especificar quem esta enviando a mensagem
SMTP_FROM = DenyHosts <denyhosts@douglasqsantos.com.br>
#Agora podemos definir o assunto da mensagem
SMTP_SUBJECT = DenyHosts Report
[...]
#Agora podemos definir se o sistema vai gerar alertas no Syslog
SYSLOG_REPORT=YES

Agora vamos mandar reiniciar o daemon do denyhosts

/etc/init.d/denyhosts restart

Podemos visualizar os logs do denyhosts da seguinte forma

tail -f /var/log/denyhosts 
2013-01-15 11:24:10,219 - prefs       : INFO        WORK_DIR: [/var/lib/denyhosts]
2013-01-15 11:24:10,220 - denyhosts   : INFO     restricted: set([])
2013-01-15 11:24:10,221 - denyhosts   : INFO     launching DenyHosts daemon (version 2.6)...
2013-01-15 11:24:10,227 - denyhosts   : INFO     DenyHosts daemon is now running, pid: 13601
2013-01-15 11:24:10,227 - denyhosts   : INFO     send daemon process a TERM signal to terminate cleanly
2013-01-15 11:24:10,227 - denyhosts   : INFO       eg.  kill -TERM 13601
2013-01-15 11:24:10,229 - denyhosts   : INFO     monitoring log: /var/log/auth.log
2013-01-15 11:24:10,229 - denyhosts   : INFO     sync_time: 3600
2013-01-15 11:24:10,229 - denyhosts   : INFO     purging of /etc/hosts.deny is disabled
2013-01-15 11:24:10,229 - denyhosts   : INFO     denyhosts synchronization disabled

Agora vamos ajustar algumas coisas no sshd

vim /etc/ssh/sshd_config
[...]
#Vamos mudar a porta padrão de 22 para por exemplo 34276
Port 34276
[...]
#O protocolo deve sempre ser o 2
Protocol 2
[...]
#Aqui vamos definir que a conexão vai ser cortada se o cliente ficar inativo por 2 minutos
LoginGraceTime 2m
[...]
#Vamos desativar o login como root, utilize um usuário comun para efetuar login no servidor depois utilize "su -" para passar para root
PermitRootLogin no
[...]
#Nunca permita login via ssh sem senha então deixe como abaixo
PermitEmptyPasswords no
#depois de 3 tentativas não autenticadas, 50% das conexões do IP são recusadas e quando o número de de tentativas
#chegar a 6 todas as tentativas de conexões do IP serão recusadas.
MaxStartups 3:50:6
[...]
#As linhas abaixo podem ser inseridas no final do arquivo
#Vamos definir quais grupos podem efetuar login via ssh, aqui podemos separar os grupos por espaço
AllowGroups sudo
#Podemo tambem definir quais usuários podem efetuar login via ssh, aqui o padrão é user@host para utilizar por usuário descomente a linha abaixo.
#AllowUsers douglas@*
#Vamos tirar o Banner default do Debian
DebianBanner no
#Podemo definir quais grupos não podem efetuar login via ssh, aqui podemos separar os grupos por espaço, para utilizar descomente a linha abaixo
#DenyGroups desenvolvimento
#Podemo tambem definir quais usuários não podem efetuar login via ssh, aqui o padrão é user@host para utilizar por usuário descomente a linha abaixo.
#DenyUsers nerso
#Vamos limitar a quantidade máxima de conexões ssh no servidor para 2
MaxSessions 2

Agora vamos reiniciar o servidor ssh

/etc/init.d/ssh restart

Agora vamos tentar efetuar uma conexão com um usuário que não esteja no grupo sudo

ssh jose@10.101.0.25
jose@10.101.0.25's password: 
Permission denied, please try again.

Agora vamos analisar os logs de erros

tail -f /var/log/auth.log
Jan 15 11:56:19 debian25 sshd[19705]: User jose from 10.101.0.1 not allowed because none of user's groups are listed in AllowGroups
Jan 15 11:56:19 debian25 sshd[19705]: Failed none for invalid user jose from 10.101.0.1 port 46786 ssh2
Jan 15 11:56:20 debian25 sshd[19705]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.101.0.1  user=jose
Jan 15 11:56:22 debian25 sshd[19705]: Failed password for invalid user jose from 10.101.0.1 port 46786 ssh2

A primeira linha do log já nos informa que o usuário não consegue acesso pois ele não pertence aos grupos listados em AllowGroups.

Agora vamos ver os logs do denyhosts

tail -f /var/log/denyhosts
[...]
2013-01-15 11:56:01,931 - denyhosts   : INFO     new denied hosts: ['10.101.0.254', '10.101.0.1']
2013-01-15 11:56:31,995 - denyhosts   : INFO     new denied hosts: ['10.101.0.254', '10.101.0.1']

Porém se eu precisar deixar algum endereço habilitado a conectar no servidor não importando se vai dar erro ou não ex minha lan podemos liberar ela em /var/lib/denyhosts/allowed-hosts

vim /var/lib/denyhosts/allowed-hosts
10.101.0.0/24

Neste caso estou liberando a minha rede inteira para o acesso ao servidor.

Referências