Aqui está minha situação: estou configurando um equipamento de teste que, a partir de um cliente central, inicia várias instâncias de máquina virtual e executa comandos nelas via ssh
. As máquinas virtuais terão nomes de host e endereços IP anteriormente não utilizados, portanto não estarão no ~/.ssh/known_hosts
arquivo no cliente central.
O problema que estou tendo é que o primeiro ssh
comando executado em uma nova instância virtual sempre aparece com um prompt interativo:
The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?
Existe uma maneira de contornar isso e fazer com que o novo host já seja conhecido pela máquina cliente, talvez usando uma chave pública que já esteja inserida na imagem da máquina virtual? Eu realmente gostaria de evitar ter que usar o Expect ou o que quer que seja para responder ao prompt interativo, se puder.
fonte
Respostas:
Defina a
StrictHostKeyChecking
opção comono
, no arquivo de configuração ou via-o
:ssh -o StrictHostKeyChecking=no [email protected]
fonte
Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.
Para evitar o aviso, e para evitar a entrada a ser adicionado a qualquer arquivo known_hosts, eu faço:ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null [email protected]
Na IMO, a melhor maneira de fazer isso é o seguinte:
Isso garantirá que não haja entradas duplicadas, que você esteja coberto tanto pelo nome do host quanto pelo endereço IP, e também fará o hash da saída, uma medida extra de segurança.
fonte
ssh-keyscan
estavam falhando para mim porque meu host de destino não suporta o tipo de chave padrão da versão 1. A adição-t rsa,dsa
ao comando corrigiu isso.ssh-keygen -F [address]
. medium.com/@wblankenship/…Para os preguiçosos:
-H faz hash no nome do host / endereço IP
fonte
Como mencionado, o uso da digitalização de teclas seria a maneira correta e discreta de fazer isso.
O acima será o truque para adicionar um host, SOMENTE se ele ainda não tiver sido adicionado. Também não é seguro para simultaneidade; você não deve executar o snippet na mesma máquina de origem mais de uma vez ao mesmo tempo, pois o arquivo tmp_hosts pode ser derrotado, resultando no inchaço do arquivo known_hosts ...
fonte
ssh-keyscan
? O motivo é que isso requer algum tempo e conexão de rede adicional.cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts
, mas uma edição subsequente foi alterada para>>
. Usar>>
é um erro. Ele anula o objetivo da exclusividade na primeira linha e faz com que ele despeje novas entradasknown_hosts
toda vez que é executado. (Just postou uma edição para mudá-lo de volta.)Você pode usar o
ssh-keyscan
comando para pegar a chave pública e anexá-la ao seuknown_hosts
arquivo.fonte
É assim que você pode incorporar o ssh-keyscan no seu jogo:
fonte
essa seria uma solução completa, aceitando a chave do host pela primeira vez apenas
fonte
Eu tive um problema semelhante e descobri que algumas das respostas fornecidas me levaram apenas a uma solução automatizada. A seguir, o que acabei usando, espero que ajude:
Ele adiciona a chave
known_hosts
e não solicita a senha.fonte
Então, eu estava procurando uma maneira mundana de ignorar a interação manual host desconhecida de clonar um repositório git, como mostrado abaixo:
Observe a impressão digital da chave RSA ...
Então, isso é uma coisa do SSH, isso funcionará para git sobre SSH e apenas coisas relacionadas ao SSH em geral ...
Primeiro, instale o nmap no seu driver diário. O nmap é altamente útil para certas coisas, como detectar portas abertas e isso - verificar manualmente as impressões digitais SSH. Mas, voltando ao que estamos fazendo.
Boa. Ou estou comprometida nos vários lugares e máquinas em que verifiquei - ou a explicação mais plausível de tudo o que está acontecendo é o que está acontecendo.
Essa 'impressão digital' é apenas uma string reduzida com um algoritmo unidirecional para nossa conveniência humana, com o risco de mais de uma string ser resolvida na mesma impressão digital. Acontece, eles são chamados de colisões.
Independentemente disso, de volta à string original que podemos ver no contexto abaixo.
Portanto, com antecedência, temos uma maneira de solicitar uma forma de identificação ao host original.
Nesse ponto, estamos manualmente tão vulneráveis quanto automaticamente - as cadeias correspondem, temos os dados de base que criam a impressão digital e poderíamos solicitar esses dados de base (evitando colisões) no futuro.
Agora, para usar essa string de uma maneira que evite perguntar sobre a autenticidade dos hosts ...
O arquivo known_hosts nesse caso não usa entradas de texto sem formatação. Você saberá entradas de hash quando as vir; elas se parecem com hashes com caracteres aleatórios em vez de xyz.com ou 123.45.67.89.
A primeira linha de comentário aparece irritantemente - mas você pode se livrar dela com um redirecionamento simples através da convenção ">" ou ">>".
Como eu fiz o meu melhor para obter dados não contaminados para serem usados para identificar um "host" e confiança, adicionarei essa identificação ao meu arquivo known_hosts no meu diretório ~ / .ssh. Como agora será identificado como um host conhecido, não receberei o prompt mencionado acima quando você era jovem.
Obrigado por ficar comigo, aqui está. Estou adicionando a chave RSA do bitbucket para que eu possa interagir com meus repositórios git de uma maneira não interativa como parte de um fluxo de trabalho de IC, mas faça o que quiser.
Então é assim que você permanece virgem por hoje. Você pode fazer o mesmo com o github seguindo instruções semelhantes no seu próprio tempo.
Vi tantas mensagens de estouro de pilha dizendo para adicionar programaticamente a chave às cegas sem nenhum tipo de verificação. Quanto mais você checa a chave de máquinas diferentes em redes diferentes, mais confiança você tem que o host é o que diz ser - e isso é o melhor que você pode esperar dessa camada de segurança.
ERRADO
ssh -oStrictHostKeyChecking = nenhum nome de host [comando]ERRADO
ssh-keyscan -t rsa -H nome do host >> ~ / .ssh / known_hostsNão faça nenhuma das coisas acima, por favor. Você tem a oportunidade de aumentar suas chances de evitar alguém espionando suas transferências de dados através de um homem no meio do ataque - aproveite essa oportunidade. A diferença é literalmente verificar se a chave RSA que você possui é a do servidor de boa-fé e agora você sabe como obter essas informações para compará-las, para que possa confiar na conexão. Lembre-se de que mais comparações de diferentes computadores e redes geralmente aumentam sua capacidade de confiar na conexão.
fonte
Eu faço um script de uma linha, um pouco longo, mas útil para executar esta tarefa em hosts com vários IPs, usando
dig
ebash
fonte
A seguir, evite entradas duplicadas em ~ / .ssh / known_hosts:
fonte
mkdir -p ~/.ssh/known_hosts;
Como você está construindo essas máquinas? você pode executar um script de atualização de DNS? você pode participar de um domínio IPA?
O FreeIPA faz isso automaticamente, mas basicamente tudo o que você precisa é de registros de DNS SSHFP e DNSSEC na sua zona (o freeipa fornece como opções configuráveis (dnssec desativado por padrão)).
Você pode obter os registros SSHFP existentes do seu host executando.
ssh-keygen -r jersey.jacobdevans.com
depois de publicado, você adicionaria
VerifyHostKeyDNS yes
ao seu ssh_config ou ~ / .ssh / configSe / quando o google decidir ativar o DNSSEC, você poderá fazer o ssh sem um prompt de chave de host.
ssh jersey.jacobdevans.com
MAS meu domínio ainda não está assinado, então por enquanto você veria ....
fonte
Para fazer isso corretamente, o que você realmente deseja fazer é coletar as chaves públicas do host das VMs enquanto você as cria e soltá-las em um arquivo no
known_hosts
formato. Em seguida, você pode usar o-o GlobalKnownHostsFile=...
, apontando para esse arquivo, para garantir que você esteja se conectando ao host em que acredita estar conectado. Entretanto, como você faz isso depende de como você está configurando as máquinas virtuais, mas lê-lo no sistema de arquivos virtual, se possível, ou até mesmo fazer com que o host imprima o conteúdo/etc/ssh/ssh_host_rsa_key.pub
durante a configuração pode ajudar.Dito isto, isso pode não valer a pena, dependendo do tipo de ambiente em que você está trabalhando e de quem são seus adversários esperados. Fazer um simples "armazenamento na primeira conexão" (por meio de uma varredura ou simplesmente durante a primeira conexão "real"), conforme descrito em várias outras respostas acima, pode ser consideravelmente mais fácil e ainda fornecer um pouco de segurança. No entanto, se você fizer isso, sugiro fortemente que você altere o arquivo hosts conhecidos do usuário (
-o UserKnownHostsFile=...
) para um arquivo específico para esta instalação de teste específica; isso evitará poluir seu arquivo de hosts conhecidos pessoais com informações de teste e facilitará a limpeza das chaves públicas agora inúteis quando você excluir suas VMs.fonte
Esse todo
os negócios continuaram me irritando, então optei por
Um script para governar todos eles
Esta é uma variante do script em https://askubuntu.com/a/949731/129227 com a resposta de Amadu Bah https://serverfault.com/a/858957/162693 em um loop.
chamada de exemplo
./schcheck somedomain site1 site2 site3
O script fará um loop nos sites de nomes e modificará o arquivo .ssh / config e .ssh / known_hosts e executará ssh-copy-id mediante solicitação - para o último recurso, deixe as chamadas de teste do ssh falharem, por exemplo, pressionando Enter 3 vezes em a solicitação de senha.
script sshcheck
fonte
Aqui está como fazer uma coleção de hosts
definir uma coleção de hosts
Em seguida, defina duas tarefas para adicionar as chaves aos hosts conhecidos:
fonte
O melhor seria verificar a impressão digital de cada novo servidor / host. Essa é a única maneira de autenticar o servidor. Sem ele, sua conexão SSH pode estar sujeita a um ataque man-in-the-middle .
Se você realmente tem certeza de que deseja ignorar a verificação da impressão digital, a segunda opção melhor e menos segura é usar
StrictHostKeyChecking=accept-new
, que foi introduzida no OpenSSH versão 7.6 (2017-10-03) :Não use o valor antigo,
StrictHostKeyChecking=no
que nunca verifica a autenticidade do servidor. (Embora o significado dessa=no
configuração seja alterado algumas versões mais tarde .)fonte