Como adicionar um intervalo de ip ao known_hosts?

15

Muitos serviços (como o GitHub) usam uma ampla variedade de IPs e, obviamente, a mesma chave pública.

Como posso adicionar um intervalo de IPs (de preferência em um único) ao arquivo known_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 + PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31 / YMF + Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB + weqqUUmpaaasXVal72J + UX2B + 2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi / w4yCE6gbODqnTWlg7 + wC604ydGXA8VJiS5ap43JXiUFFAaQ ==

RSFalcon7
fonte
1
esses IPs são completamente pública aqui
RSFalcon7

Respostas:

11

Conforme observado em outras respostas, known_hosts não tem suporte para intervalos de endereços IP. No entanto, ele suporta caracteres curinga. É claro que os curingas não são exatamente a mesma coisa; portanto, você precisa ter muito cuidado com a maneira como os usa nos endereços IP, mas no caso particular 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 com a documentação oficial do Github, existe 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 possibilita 1020 endereços IP possíveis que abrangem convenientemente todo o intervalo possível para o último octeto em apenas quatro blocos C diferentes.

A partir man 8 sshddisso, é com isso que devemos trabalhar em known_hosts:

Nomes de host é uma lista de padrões separados por vírgula ( *' and? 'Atuam como curingas); cada padrão, por sua vez, corresponde 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 !' 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['e ]' brackets then followed by:' e 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 pontos de extremidade possíveis do Github (e SOMENTE esses pontos de extremidade) da seguinte maneira:

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 de IP que você precisava construir não preencheu um bloco C completo e, portanto, todos os valores possíveis para um octeto, seria impossível usar caracteres curinga para uma correspondência tão precisa.

Caleb
fonte
8

Eu não acho que você possa adicionar facilmente os intervalos, mas acho que (não é possível 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 arquivo known_hosts sob o nome github-server-pool.github.com.

Suposição: o host github-server-pool.github.com não existe ou nunca está conectado através do SSH.

A idéia por trás disso é que o ssh usará a chave github-server-pool.github.com como a chave para procurar a chave do host público de todos os hosts do domínio github.com.

Vincent De Baere
fonte
Esta é uma ótima resposta e mais fácil que a original.
kael
4

Não há suporte para conjuntos de endereços IP no known_hostsarquivo. Você precisará ter uma linha por endereço.

Embora a parte do nome do host das entradas tenha um hash por padrão, isso é apenas para privacidade, para que alguém que se apossar de você .known_hostsnão possa descobrir facilmente com 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.

Gilles 'SO- parar de ser mau'
fonte
fixo, mas apenas trabalhar para redes até 0.0.0.0/24
RSFalcon7
@ RSFalcon7 De fato. A aritmética do endereço IP é irritante. Fiz uma solução rápida e suja… Se você precisar de suporte para redes maiores, converta o endereço IP em um número de 32 bits antes de fazer a enumeração.
Gilles 'SO- stop be evil'
0

O SSH parece não ter conceito de intervalos de IP para hosts_conhecidos. Eu acho que a suposição é que cada host teria uma chave exclusiva por razões de segurança.

Duas maneiras que eu posso ver para preencher previamente seus_conhecidos_hosts:

  1. ssh-keyscan- Escreva um breve script para percorrer todos esses endereços e alimente-o ssh-keyscanou um arquivo para ssh-keyscanleitura. ssh-keyscanpode varrer vários hosts por invocação, especificando em uma linha ou especificando uma lista dos hosts.

  2. Preencha- known_hostsse com um script ou editor. O formato é bastante simples se você usar a versão sem hash. Isto é:

    nome do host, endereço IP chave ssh-keytype

hostnameé o nome do host que você contata e seria o mesmo para todos os endereços do GitHub. IP addressseria o que um script iria percorrer. keyé a chave que você forneceu acima.

Nem é elegante, mas acho que o pessoal do SSH assumiu que ninguém faria o que o GitHub está fazendo.

Kurtm
fonte
Ninguém deveria estar fazendo o que o github está fazendo. É uma chave de host, não uma chave de "grupo de hosts semelhantes".
@ WumpusQ.Wumbley eu concordo. Mas duvido que o GitHub mude na minha opinião.
Kurtm
0

Olá, achei o script de Gilles bastante útil, mas apenas trabalhar para redes até 0.0.0.0/24era uma limitação, estendi o script para trabalhar com redes maiores, até que 0.0.0.0/16talvez seja útil para outra pessoa.

#!/bin/sh
# http://unix.stackexchange.com/questions/94448/how-to-add-an-ip-range-to-known-hosts
# answered Oct 11 '13 at 0:21  Gilles
# only working for networks up to 0.0.0.0/24
# Declan Forde - Increased the range up to 0.0.0.0/16 networks


NETWORKS="127.0.0.0/30 127.0.0.0/29 127.0.0.0/28 127.0.0.0/27 127.0.0.0/26 127.0.0.0/25 127.0.0.0/24 127.0.0.0/23 127.0.0.0/22 127.0.0.0/21 127.0.0.0/16"

for net in ${NETWORKS}
do
  base=${net%/*}
  bits=$((32 - ${net#*/}))

  abc=${base%.*}
  ab=${abc%.*}
  c=${abc##*.}
  d=${base##*.}

  if [ $bits -gt 8 ] && [ $bits -le 16 ]
  then
    netbits=$((bits - 8))
    bits=8
  else
    netbits=0
  fi

  netcount=0
  while [ $netcount -lt $((2 ** netbits)) ]
  do
    count=0
    while [ $count -lt $((2 ** bits)) ]
    do
      echo "$ab.$c.$((d + count))"
      echo "$ab.$c.$((d + count)) ssh-rsa AAAAB3NzaC1yc." >>~/.ssh/known_hosts
    count=$((count + 1))
    done
    netcount=$((netcount + 1))
    c=$((c + 1))
  done
done
Declan
fonte