SSH known_hosts com um IP dinâmico

1

Eu tenho uma máquina atrás de um firewall. Eu me conecto a ele remotamente usando um encapsulamento VPN com uma porta encaminhada através do ssh. Para se conectar à máquina, eu uso o IP externo da VPN e minha porta pessoal e temporária. O comando que eu uso é:

ssh USER@VPN_IP -p PORT

Como VPN_IP e PORT são alterados com frequência, não consigo obter vantagens de salvar a chave do host em known_host para me livrar dos ataques man man-in-the-middle, mas ao mesmo tempo a chave do host está bem conhecido para mim e eu poderia fornecê-lo para o ssh, a fim de usá-lo para a combinação atual VPN_IP e PORT . Isso é possível? Como?

    
por Ilmanowar 16.06.2017 / 14:22

2 respostas

4

O arquivo known_hosts é para fornecer essas chaves e não há nenhuma alternativa de linha de comando direta (e de qualquer forma não seria tão útil). No entanto, seu objetivo é completamente possível com o arquivo known_hosts !

Leia o % formato de arquivo man sshd do ssh_known_hosts .

When performing host authentication, authentication is accepted if any matching line has the proper key; either one that matches exactly or, if the server has presented a certificate for authentication, the key of the certification authority that signed the certificate.

É possível usar curingas em ~/.ssh/known_hosts (e /etc/ssh/ssh_known_hosts ):

Each line in these files contains the following fields: markers (optional), hostnames, keytype, base64-encoded key, comment. The fields are separated by spaces.

Hostnames is a comma-separated list of patterns (* and ? act as wildcards); each pattern in turn is matched against the canonical host name (when authenticating a client) or against the user-supplied name (when authenticating a server). A pattern may also be preceded by ! to indicate negation: if the host name matches a negated pattern, it is not accepted (by that line) even if it matched another pattern on the line. A hostname or address may optionally be enclosed within [ and ] brackets then followed by ‘:’ and a non-standard port number.

É possível tornar uma chave confiável para

  • um intervalo de rede, se conhecido, por ex. para TEST-NET-2 :

    198.51.100.* ssh-rsa AAAAB3Nza...2iQ==
    
  • vários intervalos (por exemplo, todos os TEST-NET s) usando a lista separada por vírgulas:

    192.0.2.*,198.51.100.*,203.0.113.* ssh-rsa AAAAB3Nza...2iQ==
    
  • ou até mesmo quando se conecta em qualquer lugar:

    * ssh-rsa AAAAB3Nza...2iQ==
    

Se essa chave não estiver presente, ela ainda avisará sobre a autenticidade das outras chaves, mostrará a impressão digital e a adicionará automaticamente, se você responder yes . A comparação é feita linha a linha.

    
por 16.06.2017 / 14:53
1

Usando a resposta útil de Esa Jokinen e automatizando o processo aqui minha solução:

#!/bin/sh
previous_IP_OR_known_host_key_line=$1
current_IP=$2
user=$3
port=$4

#random extension to avoid collision by multiple script execution
temp_file="/tmp/temp_host_file.$(hexdump -n 2 -e '/2 "%u"' /dev/urandom)"

if [ "$(echo "$previous_IP_OR_known_host_key_line"|wc -w)" -gt 1 ]; then 
 echo "$previous_IP_OR_known_host_key_line"|sed "s/^[^ ]*/$current_IP/">"$temp_file"
else
 ssh-keygen -F "$previous_IP_OR_known_host_key_line"|grep -v "^#"|sed "s/^[^ ]*/$current_IP/">"$temp_file"
fi

ssh "$user"@"$current_IP" -p "$port" -o UserKnownHostsFile="$temp_file"

rm "$temp_file"

O script gera um arquivo temporário known_host para fornecer ao ssh. O script precisa do seguinte parâmetro (seguindo a ordem):

-o IP de destino que a máquina tinha em conexões aceitas anteriormente OU a linha RAW correspondente com a chave do arquivo known_host.

- o IP atual (atrás da VPN / firewall).

-o usuário.

-a porta.

    
por 20.06.2017 / 14:57