Bagaimana cara menghasilkan catatan SSHFP?

39

Saya perlu mengatur data SSHFP dalam DNS untuk host saya. Saya telah melakukan pencarian tetapi saya belum menemukan contoh yang bagus.

  • Apa catatan SSHFP?
  • Seperti apa rekaman SSHFP?
  • Bagaimana cara membuat catatan SSHFP?
Mikael Dúi Bolinder
sumber

Jawaban:

49

Apa catatan SSHFP?

Catatan SSHFP RR adalah catatan DNS yang berisi sidik jari untuk kunci publik yang digunakan untuk SSH. Mereka sebagian besar digunakan dengan domain yang diaktifkan DNSSEC. Ketika klien SSH terhubung ke server, ia akan memeriksa catatan SSHFP yang sesuai. Jika sidik jari catatan cocok dengan server, server tersebut sah dan aman untuk terhubung.

Seperti apa rekaman SSHFP?

Catatan SSHFP terdiri dari tiga hal:

  1. Algoritma
  2. Jenis sidik jari
  3. Sidik jari (dalam hex)

Algoritma

Ada empat algoritma berbeda yang didefinisikan dalam SSHFP pada 2015 . Setiap algoritma diwakili oleh integer. Algoritma tersebut adalah:

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

Jenis sidik jari

Dua jenis sidik jari didefinisikan dalam SSHFP pada 2012 . Setiap jenis sidik jari diwakili oleh bilangan bulat. Ini adalah:

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

Bagaimana cara menghasilkan catatan SSHFP?

Anda dapat menggunakan ssh-keygenuntuk menghasilkan catatan menggunakan -rparameter, diikuti oleh nama host (yang tidak mempengaruhi sidik jari sehingga Anda dapat menentukan apa pun yang Anda suka)

Contoh

Menggunakan ssh-keygendan 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

Catatan

Terkadang ssh-keygenakan menanyakan lokasi sertifikat publik. Jika diminta, Anda harus menjalankan ssh-keygenbeberapa kali dan setiap kali menentukan sertifikat yang berbeda untuk memastikan bahwa Anda menghasilkan semua catatan SSHFP yang diperlukan. Kunci publik Anda biasanya terletak di /etc/ssh.


Otentikasi berbasis DNS dari Entitas Yang Bernama

Otentikasi Entitas Bernama (DANE) berbasis DNS ( RFC 6698 ) adalah penerus potensial SSHFP RR. DANE sangat mirip dengan SSHFP RR tetapi tidak terbatas pada SSH. Ini menggunakan TLSA RR sebagai gantinya dengan format yang sangat mirip.

Mikael Dúi Bolinder
sumber
ssh-keygen -rjuga menangani catatan tipe ed25519 (menggunakan nomor eksperimental 4 dari iana iana.org/assignments/dns-sshfp-rr-parameters/... )
Brian Minton
3
Server sah, atau server DNS dikompromikan.
Michael Mior
7

Saya tidak yakin apakah ssh-keygenberfungsi dengan kunci yang ada. Jika tidak, Anda masih dapat dengan mudah merakitnya di shell Anda (yang saya sukai), dan tanpa software mewah atau antarmuka jarak jauh.

Catatan seperti disebutkan ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... ada 6 bagian:

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

Untuk memanfaatkannya, masukkan VerifyHostKeyDNS askkonfigurasi klien SSH Anda, biasanya ~/.ssh/config.

Leo
sumber
5
Sebagai catatan, ssh-keygen -r tidak menghasilkan catatan SSHFP untuk kunci yang ada meskipun fakta bahwa nama perintah menyarankan itu hanya untuk Membuat Generasi.
Celada
5

Versi ssh-keygen yang lebih lama tidak menghasilkan semua kunci yang tersedia (mis. Tidak ada dukungan untuk ecdsa dan sha256). Skrip ini memang membuat semua catatan untuk semua kunci yang tersedia di /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

Sunting: Versi Baru dengan PR dari alex-dupuy dengan dukungan * BSD.

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

pengguna4814732
sumber
3

Jika Anda menggunakan Wayang, facterada dukungan bawaan untuk sshfp. Plus jika Anda menggunakan PuppetDB, Anda dapat dengan mudah mengekstrak info ini untuk semua host Anda.

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

Sumber

Drew Michel
sumber
3

Ini adalah bagaimana saya mendapatkan catatan SSHFP saya melalui Ansible :

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