De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Privacidade no SSH
Colaboração: Fabiano Caixeta Duarte
Data de Publicação: 19 de Junho de 2006
O ssh é um protocolo seguro para comunicações entre diferentes estações
utilizado amplamente para obtenção de console textual remota e para tunelar
(túneis criptografados) vários tipos de conexão.
Em 'Como melhorar a segurança no ssh' podemos ver algumas maneiras de melhorar a segurança no uso deste protocolo.
Por outro lado, há que se falar em um outro aspecto pertinente à segurança:
a privacidade.
Ao utilizar aplicativos clientes do ssh (ssh, sftp, scp, etc), é armazenado
em um arquivo do usuário um par de informações nome/ip e chave pública do
servidor ssh acessado. Este arquivo é chamado ~/.ssh/known_hosts, ou seja,
reside no diretório HOME do usuário.
Por default, o nome do host (ou seu endereço IP) é armazenado em texto plano,
o que caracteriza a possibilidade de quebra de privacidade. Para melhor
compreensão, imagine o seguinte contexto:
Um atacante está fazendo um target harvesting, ou seja, uma busca por
alvos válidos para ataque de força bruta. Ao invés de atacar aleatóriamente
um conjunto de hosts que podem não existir ou não possuir servidor ssh,
faz muito mais sentido colher hosts que tenham servidores ssh.
Suponhamos que este atacante conseguiu invadir uma determinada máquina e obteve
acesso root. A partir de uma varredura em todos os arquivos known_hosts dos
usuários, o atacante conhecerá hosts válidos, tanto na mesma rede como em
qualquer outra. Assim, ele poderá direcionar o ataque para estes hosts.
A solução
A partir da versão 4.1 do OpenSSH é possível armazenar um hash do nome de
host ao invés de texto plano para garantir privacidade. Para tal, basta
setar no arquivo de configuração do cliente ssh, geralmente localizado em
/etc/ssh/ssh_config a opção HashKnownHosts da seguinte maneira:
HashKnownHosts yes
Naturalmente este procedimento deve ser feito pelo administrador do
sistema. Não é necessário reiniciar o serviço, uma vez que esta alteração
afeta apenas o funcionamento dos programas clientes de ssh.
A partir de então, todas as entradas que forem inseridas pelo ssh no arquivo
known_hosts conterão o hash do nome/IP do host. As entradas pre-existentes
permanecerão em texto plano. Para sanar este 'problema' pode-se converter
as entradas a partir do seguinte comando:
$ ssh-keygen -H
Cada usuário deve realizar este procedimento. Naturalmente, por meio de
algum script específico, o usuário root pode automatizar a rotina para todos
os usuários.
Efeito colateral
Existem alguns raros casos em que você pode precisar excluir uma entrada
específica no arquivo known_hosts. Exemplo: o servidor em que você costuma se
autenticar foi formatado. Na primeira execução do serviço ssh, é definida uma
nova chave. Por default, o cliente ssh vai reclamar da diferença entre a chave
pré-existente e a atual. Isto ocorre para alertar você que talvez você esteja
se conectando a algum outro host como parte de um ataque de IP/DNS spoofing.
Como não é o caso, você vai precisar excluir a entrada antiga. Mas como
fazer se você não tem o hostname em texto plano? Isto pode ser feito de forma
muito fácil utilizando novamente o utilitário ssh-keygen da seguinte maneira:
$ ssh-keygen -R <hostname>
Onde hostname é o nome do servidor ssh cuja entrada você quer remover.
Conclusão
A preocupação com segurança é algo quase paranóico. Infelizmente não pode ser
diferente, uma vez que os crackers não descansam. Assim, mesmo se tratando
de um protocolo/programas voltados à criação de um ambiente seguro, o ssh -
servidor e cliente -, precisa estar bem configurado para evitar outros
problemas de segurança.