Як створити SSHFP записи?


39

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

  • Що таке записи SSHFP?
  • Як виглядають записи SSHFP?
  • Як створити SSHFP записи?

Відповіді:


49

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

Записи RR SSHFP - це записи DNS, які містять відбитки пальців для відкритих ключів, що використовуються для SSH. Вони в основному використовуються з доменами з підтримкою DNSSEC. Коли SSH-клієнт підключається до сервера, він перевіряє відповідний запис SSHFP. Якщо відбиток пальців записів відповідає серверам, сервер легітимний і підключення безпечно.

Як виглядають записи SSHFP?

Записи SSHFP складаються з трьох речей:

  1. Алгоритм
  2. Тип відбитків пальців
  3. Відбиток пальця (у шістнадцятковій формі)

Алгоритм

Існує чотири різні алгоритми, визначені в SSHFP станом на 2015 рік . Кожен алгоритм представлений цілим числом. Алгоритми:

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

Тип відбитків пальців

У SSHFP станом на 2012 рік визначено два типи відбитків пальців . Кожен тип відбитка пальців представлений цілим числом. Це:

  • 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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.