Como adicionar um intervalo de ip a known_hosts?

14

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

Como posso adicionar um intervalo de IP (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==

    
por RSFalcon7 10.10.2013 / 16:18

5 respostas

11

Como observado em outras respostas, o known_hosts não tem suporte para intervalos de endereços IP. No entanto, suporta curingas. É claro que os curingas não são exatamente a mesma coisa, então você precisa ser muito cuidadoso sobre como usá-los 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 se refere ao IPv4). Este é o intervalo 192.30.252.0/22. Isso faz com que 1020 endereços IP possíveis abranjam convenientemente todo o alcance possível do último octeto em apenas quatro blocos C diferentes.

De man 8 sshd , é com isso que temos que trabalhar em known_hosts:

Hostnames is a comma-separated list of patterns (*' and?' act as wildcards); each pattern in turn is matched against the canonical host name (when authenticating a client) or against the user-supplied name (when authenticating a server). A pattern may also be preceded by !' 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[' and ]' brackets then followed by:' and a non-standard port number.

Usando essas informações, podemos construir uma entrada usando o caractere curinga * para o último octeto que corresponde a todos os possíveis pontos de extremidade do Github (e SOMENTE esses pontos de extremidade) da seguinte forma:

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 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.

    
por 27.10.2014 / 12:20
6

Eu não acho que você possa adicionar facilmente os intervalos, mas acho que (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 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 ao 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 para todos os hosts do domínio github.com.

    
por 10.10.2013 / 16:33
4

Não há suporte para conjuntos de endereços IP no arquivo known_hosts . 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 se apossar de seu .known_hosts não consiga descobrir com facilidade com quais hosts você está se conectando. (Eles ainda podem verificar adivinhações.) Você pode usar um nome de host simples ou endereço IP.

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.

    
por 11.10.2013 / 02:21
0

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

Duas maneiras que eu posso ver para preencher previamente o seu known_hosts:

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

  2. Preencha o known_hosts com um script ou editor. O formato é bastante simples se você usar a versão não hash. É:

    hostname, 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 address seria o que um script iria percorrer. key é a chave que você forneceu acima.

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

    
por 10.10.2013 / 16:34
0

Oi eu achei o script do Gilles bastante útil, mas só trabalhando para redes até 0.0.0.0/24 foi uma limitação, estendi o script para trabalhar com redes maiores até 0.0.0.0/16 talvez seja útil para alguém mais.

#!/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
    
por 04.08.2016 / 17:21

Tags