Como faço para gerar registros SSHFP?

39

Preciso configurar registros SSHFP no DNS do meu host. Eu fiz algumas pesquisas, mas não encontrei nenhum bom exemplo.

  • O que são registros SSHFP?
  • Como são os registros SSHFP?
  • Como crio registros SSHFP?
Mikael Dúi Bolinder
fonte

Respostas:

49

O que são registros SSHFP?

Os registros SSHFP RR são registros DNS que contêm impressões digitais de chaves públicas usadas para SSH. Eles são usados ​​principalmente com domínios habilitados para DNSSEC. Quando um cliente SSH se conecta a um servidor, ele verifica o registro SSHFP correspondente. Se a impressão digital dos registros corresponder aos servidores, o servidor é legítimo e é seguro conectar-se.

Como são os registros SSHFP?

Os registros SSHFP consistem em três coisas:

  1. Algoritmo
  2. Tipo de impressão digital
  3. Impressão digital (em hexadecimal)

Algoritmo

Existem quatro algoritmos diferentes definidos no SSHFP a partir de 2015 . Cada algoritmo é representado por um número inteiro. Os algoritmos são:

  • 1 - RSA
  • 2 - DSA
  • 3 - ECDSA
  • 4 - Ed25519

Tipo de impressão digital

Dois tipos de impressão digital são definidos no SSHFP a partir de 2012 . Cada tipo de impressão digital é representado por um número inteiro. Esses são:

  • 1 - SHA-1
  • 2 - SHA-256

Como faço para gerar registros SSHFP?

Você pode usar ssh-keygenpara gerar os registros usando o -rparâmetro, seguido pelo nome do host (que não afeta as impressões digitais, para que você possa especificar o que quiser)

Exemplo

Usando ssh-keygene CentOS:

[root@localhost ~]# ssh-keygen -r my.domain.com
my.domain.com IN SSHFP 1 1 450c7d19d5da9a3a5b7c19992d1fbde15d8dad34
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

Nota

Às vezes ssh-keygen, solicita a localização do certificado público. Se solicitado, você precisará executar ssh-keygenvárias vezes e sempre especificar um certificado diferente para garantir que você gere todos os registros SSHFP necessários. Suas chaves públicas geralmente estão localizadas em /etc/ssh.


Autenticação baseada em DNS de entidades nomeadas

A autenticação de entidades nomeadas (DANE) baseada em DNS ( RFC 6698 ) é um sucessor em potencial do SSHFP RR. O DANE é muito semelhante ao SSHFP RR, mas não está limitado ao SSH. Ele usa TLSA RR em vez disso com um formato muito semelhante.

Mikael Dúi Bolinder
fonte
ssh-keygen -rtambém lida com ed25519 registos tipo (utilizando o número experimental 4 de iana iana.org/assignments/dns-sshfp-rr-parameters/... )
Brian Minton
3
O servidor é legítimo ou o servidor DNS está comprometido.
Michael Mior 28/01
7

Não tenho certeza se ssh-keygenfunciona com chaves existentes. Caso contrário, você ainda pode montá-los facilmente em seu shell (o que eu prefiro) e sem software sofisticado ou interfaces remotas.

A registros como mencionado ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... existem 6 partes:

part 1: hostname
part 2: Usually "IN" for internet
part 3: "SSHFP", the RR name for type 44
part 4: RSA keys     = "1"
        DSA keys     = "2"
        ECDSA keys   = "3"
        ED25519 keys = "4"
part 5: The algorithm type:
        SHA-1        = "1"
        SHA-256      = "2"
part 6: You can generate, for example:

        $ awk '{print $2}' /etc/ssh/ssh_host_dsa_key.pub | \
            openssl base64 -d -A | openssl sha1

Para usá-lo, coloque VerifyHostKeyDNS askna configuração do seu cliente SSH, normalmente ~/.ssh/config.

Leo
fonte
5
Para o registro, ssh-keygen -r não geram registros SSHFP para as chaves existentes, apesar do fato de que o nome do comando sugere que seja apenas para a geração.
Celada
5

As versões anteriores do ssh-keygen não geram todas as chaves disponíveis (por exemplo, sem suporte para ecdsa e sha256). Este script cria todos os registros para todas as chaves disponíveis em /etc/ssh/:

#!/bin/bash
#
# Creates SSHFP Records for all available keys
#

HOST="${1-$(hostname -f)}"

if [[ "$1" == "-h" || "$1" == "--help" ]]
then
  echo "Usage: sshfpgen <hostname>"
fi

if which openssl >/dev/null 2>&1
then
  if ! which sha1sum >/dev/null 2>&1
  then
    sha1sum() {
      openssl dgst -sha1 | grep -E -o "[0-9a-f]{40}"
    }
  fi
  if ! which sha256sum >/dev/null 2>&1
  then
    sha256sum() {
      openssl dgst -sha256 | grep -E -o "[0-9a-f]{64}"
    }
  fi
fi

for pubkey in /etc/ssh/ssh_host_*_key.pub /etc/ssh_host_*_key.pub
do
  case "$(cut -d _ -f3 <<< "$pubkey")"
  in
    rsa)
      echo "$HOST IN SSHFP 1 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 1 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    dsa)
      echo "$HOST IN SSHFP 2 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 2 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ecdsa)
      echo "$HOST IN SSHFP 3 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 3 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ed25519)
      echo "$HOST IN SSHFP 4 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 4 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
  esac
done

Edit: Nova versão com PR de alex-dupuy com suporte * BSD.

https://github.com/mindfuckup/Scripts/blob/master/sshfpgen

user4814732
fonte
3

Se você usa o Puppet, factertem suporte embutido para sshfp. Além disso, se você estiver usando o PuppetDB, poderá extrair facilmente essas informações para todos os seus hosts.

facter | grep -i sshfp
  sshfp_dsa => SSHFP 2 1 e1a3e639d6dbd48d3964ebfb772d2d11f1065682
  SSHFP 2 2 4f620ce2bc97d91ae5eff42fba621d65b677ab725f275f56b2abd1303c142b73
  sshfp_rsa => SSHFP 1 1 a78351af371faf3f19533c3a4a9e967543d7d2f5
  SSHFP 1 2 795943a6ee8b53c818cfef5781209e25a6eb4bc386813db60d3ff2c1569692fc

Fonte

Drew Michel
fonte
3

É assim que estou recebendo meus registros SSHFP através do Ansible :

- name: Capture the SSHFP entries
  shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
  register: sshfp_entries
Mike Schroll
fonte