Как мне генерировать записи SSHFP?

39

Мне нужно настроить записи SSHFP в DNS для моего хоста. Я немного искал, но не нашел хорошего примера.

  • Что такое записи SSHFP?
  • Как выглядят записи SSHFP?
  • Как мне создать записи SSHFP?
Микаэль Дуй Болиндер
источник

Ответы:

49

Что такое записи SSHFP?

Записи SSHFP RR - это записи DNS, которые содержат отпечатки открытых ключей, используемых для SSH. Они в основном используются с доменами с поддержкой DNSSEC. Когда клиент SSH подключается к серверу, он проверяет соответствующую запись SSHFP. Если отпечаток записи соответствует серверам, сервер является законным и безопасным для подключения.

Как выглядят записи SSHFP?

Записи SSHFP состоят из трех вещей:

  1. Алгоритм
  2. Тип отпечатка пальца
  3. Отпечаток пальца (в шестнадцатеричном формате)

Алгоритм

Начиная с 2015 года в SSHFP определены четыре различных алгоритма . Каждый алгоритм представлен целым числом. Алгоритмы:

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

Тип отпечатка пальца

Начиная с 2012 года в SSHFP определены два типа отпечатков пальцев . Каждый тип отпечатка пальца представлен целым числом. Эти:

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

Как мне генерировать записи SSHFP?

Вы можете использовать ssh-keygenдля генерации записей, используя -rпараметр, за которым следует имя хоста (которое не влияет на отпечатки пальцев, поэтому вы можете указать все, что вам нравится)

пример

Использование ssh-keygenи 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

Заметка

Иногда ssh-keygenбудет спрашивать о местонахождении публичного сертификата. Если появится ssh-keygenзапрос , вам придется запускаться несколько раз и каждый раз указывать другой сертификат, чтобы убедиться, что вы сгенерировали все необходимые записи SSHFP. Ваши открытые ключи обычно находятся в /etc/ssh.


DNS-аутентификация именованных объектов

DNS-аутентификация именованных объектов (DANE) ( RFC 6698 ) является потенциальным преемником SSHFP RR. DANE очень похож на SSHFP RR, но не ограничивается SSH. Вместо этогоон использует TLSA RR с очень похожим форматом.

Микаэль Дуй Болиндер
источник
ssh-keygen -rтакже обрабатывает записи типа ed25519 (используя эксперимент № 4 от iana iana.org/assignments/dns-sshfp-rr-parameters/… )
Брайан Минтон,
3
Сервер является законным, или DNS-сервер скомпрометирован.
Майкл Миор
7

Я не уверен, ssh-keygenработает ли с существующими ключами. Если нет, вы все равно можете легко собрать их в своей оболочке (что я предпочитаю) и без шикарного программного обеспечения или удаленных интерфейсов.

А записи, такие как упомянутые ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... существует 6 частей:

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

Чтобы использовать это VerifyHostKeyDNS ask, обычно включайте конфигурацию вашего SSH-клиента ~/.ssh/config.

Лео
источник
5
Для записи, ssh-keygen -r это генерировать SSHFP запись для существующих ключей , несмотря на то , что название команды наводит на мысль , что это только для порождающего.
Селада
5

Более старые версии ssh-keygen не генерируют все доступные ключи (например, нет поддержки ecdsa и sha256). Этот скрипт создает все записи для всех доступных ключей в/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

Изменить: Новая версия с PR от alex-dupuy с поддержкой * BSD.

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

user4814732
источник
3

Если вы используете Puppet, facterимеет встроенную поддержку sshfp. Кроме того, если вы используете PuppetDB, вы можете легко извлечь эту информацию для всех ваших хостов.

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

Источник

Дрю Мишель
источник
3

Вот как я получаю свои записи SSHFP через Ansible :

- name: Capture the SSHFP entries
  shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
  register: sshfp_entries
Майк Шролл
источник