Como adicionar um intervalo de IP aknown_hosts?

Como adicionar um intervalo de IP aknown_hosts?

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_hostsarquivo. 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_hostsnã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_hostsque 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_hostsarquivo:

curl --silent https://api.github.com/meta | github_known_hosts >> ~/.ssh/known_hosts

informação relacionada