Jak wygenerować rekordy SSHFP?

39

Muszę skonfigurować rekordy SSHFP w DNS dla mojego hosta. Przeszukałem trochę, ale nie znalazłem dobrego przykładu.

  • Co to są rekordy SSHFP?
  • Jak wyglądają rekordy SSHFP?
  • Jak utworzyć rekordy SSHFP?
Mikael Dúi Bolinder
źródło

Odpowiedzi:

49

Co to są rekordy SSHFP?

Rekordy RR SSHFP to rekordy DNS zawierające odciski palców dla kluczy publicznych używanych do SSH. Są one najczęściej używane z domenami obsługującymi DNSSEC. Gdy klient SSH łączy się z serwerem, sprawdza odpowiedni rekord SSHFP. Jeśli odcisk palca rekordów pasuje do serwerów, serwer jest legalny i można się z nim bezpiecznie połączyć.

Jak wyglądają rekordy SSHFP?

Rekordy SSHFP składają się z trzech rzeczy:

  1. Algorytm
  2. Rodzaj odcisku palca
  3. Odcisk palca (szesnastkowy)

Algorytm

Istnieją cztery różne algorytmy zdefiniowane w SSHFP od 2015 r . Każdy algorytm jest reprezentowany przez liczbę całkowitą. Algorytmy to:

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

Rodzaj odcisku palca

Dwa typy odcisków palców są zdefiniowane w SSHFP od 2012 r . Każdy typ odcisku palca jest reprezentowany przez liczbę całkowitą. To są:

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

Jak wygenerować rekordy SSHFP?

Możesz użyć ssh-keygendo wygenerowania rekordów za pomocą -rparametru, po którym następuje nazwa hosta (co nie wpływa na odciski palców, więc możesz zamiast tego określić, co chcesz)

Przykład

Korzystanie ssh-keygeni 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

Uwaga

Czasami ssh-keygenpoprosi o lokalizację certyfikatu publicznego. Jeśli pojawi się monit, będziesz musiał uruchomić ssh-keygenwiele razy i za każdym razem określ inny certyfikat, aby mieć pewność, że wygenerujesz wszystkie niezbędne rekordy SSHFP. Twoje klucze publiczne zwykle znajdują się w /etc/ssh.


Uwierzytelnianie nazwanych podmiotów na podstawie DNS

Uwierzytelnianie nazwanych podmiotów (DANE) na podstawie DNS ( RFC 6698 ) jest potencjalnym następcą RR SSHFP. DANE jest bardzo podobny do SSHFP RR, ale nie ogranicza się do SSH. Zamiast tegoużywa TLSA RR z bardzo podobnym formatem.

Mikael Dúi Bolinder
źródło
ssh-keygen -robsługuje również rekordy typu ed25519 (używając eksperymentalnego numeru 4 z iana iana.org/assignments/dns-sshfp-rr-parameters/... )
Brian Minton
3
Serwer jest legalny lub serwer DNS jest zagrożony.
Michael Mior
7

Nie jestem pewien, czy ssh-keygendziała z istniejącymi kluczami. Jeśli nie, nadal możesz łatwo złożyć je w swojej powłoce (co wolę) i bez wymyślnego oprogramowania lub zdalnych interfejsów.

Rekordy takie jak wspomniane ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... składa się z 6 części:

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

Aby z niego skorzystać VerifyHostKeyDNS ask, zwykle należy skonfigurować konfigurację klienta SSH ~/.ssh/config.

Lew
źródło
5
Dla przypomnienia, ssh-keygen -r nie generuje rekordy SSHFP dla istniejących kluczy pomimo faktu, że nazwa polecenia sugeruje to tylko do generowania.
Celada
5

Starsze wersje ssh-keygen nie generują wszystkich dostępnych kluczy (np. Brak obsługi ecdsa i sha256). Ten skrypt tworzy wszystkie rekordy dla wszystkich dostępnych kluczy w /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

Edycja: Nowa wersja z PR od Alex-Dupuy z obsługą * BSD.

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

użytkownik4814732
źródło
3

Jeśli używasz Puppet, facterma wbudowaną obsługę sshfp. Dodatkowo, jeśli używasz PuppetDB, możesz łatwo wyodrębnić te informacje dla wszystkich swoich hostów.

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

Źródło

Drew Michel
źródło
3

W ten sposób otrzymuję moje rekordy SSHFP przez Ansible :

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