
Muitos serviços (como GitHub) usam uma ampla variedade de IPs e, obviamente, a mesma chave pública.
Como posso adicionar um intervalo de IP (de preferência em um único) ao arquivoknown_hosts?
Para o exemplo do GitHub, ele usa os seguintes intervalos:
- 207.97.227.224/27
- 173.203.140.192/27
- 204.232.175.64/27
- 72.4.117.96/27
- 192.30.252.0/22
E a chave é:
AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQ qZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE 3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
Responder1
Conforme observado em outras respostas,hosts_conhecidosnão tem suporte para intervalos de endereços IP. No entanto, ele oferece suporte a curingas. É claro que curingas não são exatamente a mesma coisa, então você precisa ter muito cuidado ao usá-los em endereços IP, mas no caso específico do GitHub isso pode ser feito com segurança.
A situação parece ter ficado mais simples desde que a pergunta foi feita. De acordo comDocumentação oficial do GitHubhá apenas um intervalo de endereços IP em uso (pelo menos no que diz respeito ao IPv4). Este é o intervalo 192.30.252.0/22. Isso resulta em 1.020 endereços IP possíveis que abrangem convenientemente todo o intervalo possível para o último octeto em apenas quatro blocos C diferentes.
De man 8 sshd
, é com isso que temos que trabalhar emhosts_conhecidos:
Hostnames
é uma lista de padrões separados por vírgula (*
e?
atua como curingas); cada padrão, por sua vez, é comparado ao nome do host canônico (ao autenticar um cliente) ou ao nome fornecido pelo usuário (ao autenticar um servidor). Um padrão também pode ser precedido por!
para indicar negação: se o nome do host corresponder a um padrão negado, ele não será aceito (por aquela linha), mesmo que corresponda a outro padrão na linha. Um nome de host ou endereço pode opcionalmente ser colocado entre colchetes[
e]
seguido por:
um número de porta não padrão.
Usando essas informações, podemos construir uma entrada usando o *
curinga para o último octeto que corresponda a todos os endpoints possíveis do GitHub (eapenasesses endpoints) assim:
github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
Se o intervalo IP que você precisava construir não preenchesse um bloco C completo (e, portanto, todos os valores possíveis para um octeto), seria impossível usar curingas para uma correspondência tão precisa.
Responder2
Não acho que você possa adicionar os intervalos facilmente, mas acho (não posso testar isso agora) que o mesmo efeito pode ser alcançado adicionando o seguinte a .ssh/ssh_config:
Host *.github.com
HostKeyAlias github-server-pool.github.com
Em seguida, você adicionaria a chave ao arquivoknown_hosts com o nome github-server-pool.github.com.
Suposição: o host github-server-pool.github.com não existe ou nunca está conectado por meio de SSH.
A ideia por trás disso é que o ssh usará a chave github-server-pool.github.com como a chave para pesquisar a chave pública do host para todos os hosts do domínio github.com.
Responder3
Não há suporte para conjuntos de endereços IP no known_hosts
arquivo. Você terá que ter uma linha por endereço.
Embora a parte do nome do host das entradas seja hash por padrão, isso é apenas para privacidade, para que alguém que tenha acesso ao seu .known_hosts
não consiga descobrir facilmente a quais hosts você está se conectando. (Eles ainda podem verificar suposições.) Você pode usar um nome de host ou endereço IP simples.
for net in 207.97.227.224/27 173.203.140.192/27 204.232.175.64/27 72.4.117.96/27 192.30.252.0/24 192.30.252.1/24 192.30.252.2/24 192.30.252.3/24; do
base=${net%/*}; d=${base##*.}; abc=${base%.*}
bits=$((32 - ${net#*/}))
e=0
while [ $e -lt $((2 ** bits) ]; do
echo "$abc.$((d + e)) ssh-rsa AAAAB3NzaC1yc…" >>~/.ssh/known_hosts
e=$((e + 1))
done
done
Observe que isso pode adicionar duplicatas.
Responder4
Eu escrevi um pequeno script Ruby, github_known_hosts
que pode expandir os intervalos de endereços IP que o GitHub publica a partir de seusendpoint da meta API(https://api.github.com/meta).
#!/usr/bin/env ruby
require "ipaddr"
require "json"
pubkey = "AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=="
ips = JSON.parse(STDIN.read)["git"].flat_map { |net| IPAddr.new(net.chomp).to_range.map(&:to_s) }
puts "github.com,gist.github.com,#{ips.join(',')} ssh-rsa #{pubkey}"
Use-o assim e ele produzirá uma linha muito longa que você poderá colar em seu ~/.ssh/known_hosts
arquivo:
curl --silent https://api.github.com/meta | github_known_hosts >> ~/.ssh/known_hosts