Denyhosts bloqueia apenas logins falhados (após uma contagem predefinida). Não, que eu saiba, bloquear preventivamente as pessoas.
Eu tenho o denyhosts configurado e trabalhando no Ubuntu 12.04. Aparentemente funciona bem, exceto que é muito rigoroso.
Eu posso fazer login de qualquer endereço IP que eu adicionei ao hosts.allow antecipadamente. Meu sshd_config não permite login de senha, somente login com chaves.
No entanto, fazendo login a partir de um novo endereço IP com minha chave RSA válida (que funciona com meus endereços IP conhecidos), o servidor mostra essa mensagem em /var/log/auth.log:
Jun 23 19:16:31 MyServerName sshd[5949]: refused connect from hostname.comcast.net (XXX.XXX.XXX.XXX)
Para se conectar, tudo o que tenho que fazer é adicionar o novo endereço IP ao /etc/hosts.allow. É isso aí. Então eu posso logar:
Jun 23 19:45:03 MyServerName sshd[6024]: Accepted publickey for username from XXX.XXX.XXX.XXX port 61236 ssh2
Jun 23 19:45:03 MyServerName sshd[6026]: pam_unix(sshd:session): session opened for user username by (uid=0)
Eu não alterei nenhum dos valores de configuração padrão do denyhosts e ele funciona muito bem - exceto que é muito rigoroso.
(Ou alguma outra coisa lê o /etc/hosts.allow?)
Eu preciso permitir que qualquer usuário do linux (cuja conta já exista no servidor) faça o login de qualquer endereço IP sem fazer alterações no servidor antecipadamente (como adicionar o IP ao hosts.allow).
O EightBitTony sugere que o denyhosts deve permitir esse comportamento. Em resposta ao EightBitTony, eu mudei essa questão e o título.
Denyhosts bloqueia apenas logins falhados (após uma contagem predefinida). Não, que eu saiba, bloquear preventivamente as pessoas.
Você não pode bloquear simultaneamente o acesso no nível inferior (IP) e exigir do protocolo de nível superior (SSH) para substituir o bloco - simplesmente porque o nível mais alto nunca é alcançado (no caso de um bloco).
Você pode restringir os hosts de login para os usuários em geral e permitir que apenas um usuário faça o login de qualquer lugar. Mas isso não seria uma solução dinâmica.
Você também pode executar duas sshd
instâncias, uma usando denyhosts, a outra sendo utilizável por este único usuário. Infelizmente, parece não ser possível desabilitar o libwrap na configuração, então você provavelmente teria que compilar sshd
com (out) as respectivas opções ou executar a segunda instância em uma VM ou container.
Acho que encontrei o problema. Meu /etc/hosts.deny contém estas duas linhas:
ALL: PARANOID
sshd: ALL
Isso parece o problema?
Aqui está uma parte do meu /etc/hosts.deny:
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#
# Example: ALL: some.host.name, .some.domain
# ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# The PARANOID wildcard matches any host whose name does not match its
# address.
# You may wish to enable this to ensure any programs that don't
# validate looked up hostnames still leave understandable logs. In past
# versions of Debian this has been the default.
ALL: PARANOID
sshd: ALL
ALL: 200.125.165.10
ALL: 203.144.65.53
ALL: 85.31.203.35
...