Como aceitar chaves de host SSH programaticamente se a impressão digital for conhecida?

3

Eu não quero usar a opção -o StrictHostKeyChecking=no , mas quero salvar a chave pública do servidor em um arquivo e usar essa chave pública em todas as conexões, até mesmo o endereço IP ou a porta são alterados.

Quando a opção -o UserKnownHostsFile=myfile é usada, o ssh ainda pede verificação se nós conectarmos a mesma máquina sobre um IP diferente.

Como informar ssh para salvar uma chave pública em um local diferente e usar essa chave pública na conexão atual? Exemplo de uso:

# there is no 'foo-public.key' file at this moment
ssh -o TheMagicalOption=foo-public.key [email protected] -p 1234

The authenticity of host 'xxxxxxxx' can't be established.
ECDSA key fingerprint is SHA256:LR5wDKrEmHD0QhRcAmxTxBnzWIRmNUfJyeawhKw+W38.
Are you sure you want to continue connecting (yes/no)? [YES]

# 'foo-public.key' is created at this point 
on-target $ exit 

# another port forward is made, so the same server is on port 5678
ssh -o TheMagicalOption=foo-public.key [email protected] -p 5678
# not asking the same verification question
on-target $     
    
por ceremcem 16.07.2017 / 03:19

4 respostas

2

Você pode usar

ssh -o StrictHostKeyChecking=ask \
    -o HashKnownHosts=no \
    -o CheckHostIP=no \
    -o UserKnownHostsFile=example_fp \
    -p 1234 [email protected]

para obter a chave.

  • HashKnownHosts=no garante que o nome do host será salvo em texto não criptografado
  • CheckHostIP=no é usado para identificar o host apenas pelo nome

o resultado em example_fp será uma linha começando como

[example.com]:1234 ecdsa-sha2-nistp521 AAAA...

Ao usar a porta padrão 22 na primeira conexão, você verá

example.com ecdsa-sha2-nistp521 AAAA...

Portanto, use a porta 22 na primeira conexão ou edite o arquivo posteriormente para remover o número da porta. Quando ligar da próxima vez, esta linha irá corresponder a qualquer número de porta.

    
por 20.10.2017 / 15:38
1

Não existe essa opção mágica que faria isso. Você pode armazenar a chave pública manualmente com antecedência (se ela for conhecida) ou usar algum script de espera, que gravará "sim" para você caso a impressão digital esteja "correta".

    
por 16.07.2017 / 10:05
1

Se você tiver (uma cópia) do arquivo pubkey do servidor como o seu nome sugere, você pode usá-lo para criar um arquivo temporário known_hosts como:

sshfoo() {
  # assumes first arg is always user@host, otherwise adjust
  echo ${1#*@} $(cat foo-pubkey) >temp_myhosts
  ssh -oUserKnownHostsFile=temp_myhosts "$@"
  # or if you don't have anything you need in .ssh/known_hosts,
  # just overwrite that and omit the -o 
  rm temp_myhosts # or just leave it and replace it next time
}
# can use ssh for the function name if you always want this change,
# or if in the cases you don't want it you remember to override 
# with command ssh or $(which ssh) or /bin/ssh or whatever 

Se você realmente tiver uma linha known_hosts existente (que é um campo de host seguido pelo conteúdo do arquivo pubkey), você pode modificá-la da seguinte forma:

awk -vh="${1#*@}" "{$1=h;print}" <hosts_line >temp_myhosts 

ou se você tiver um arquivo com essa linha, entre outros, talvez o usual known_hosts:

awk -vh="${1#*@}" "$1~/oldname/{$1=h} 1" <.ssh/known_hosts >temp_myhosts 

et cetera et cetera a Yul Brynner.

    
por 16.07.2017 / 10:38
1

Uma solução alternativa seria usar ssh-keyscan , como uma etapa adicional, para obter a (s) impressão digital (s) ssh e, em seguida, substituir o campo host por um curinga * antes de salvá-lo em um arquivo. Por exemplo:

$ ssh-keyscan -p 1234 example.com | perl -pe 's/.*? /* /' > example_fp

Você referencia example_fp sempre que precisar se conectar a este servidor (independentemente da porta / dns / ip):

$ ssh -o UserKnownHostsFile=example_fp -p 4321 [email protected]
    
por 16.07.2017 / 10:53

Tags