
Мне нужно настроить записи SSHFP в DNS для моего хоста. Я провел некоторые поиски, но не нашел ни одного хорошего примера.
- Что такое записи SSHFP?
- Как выглядят записи SSHFP?
- Как создать записи SSHFP?
решение1
Что такое записи SSHFP?
Записи SSHFP — это записи DNS, содержащие отпечатки для открытых ключей, используемых для SSH. Они в основном используются с доменами с поддержкой DNSSEC. Когда клиент SSH подключается к серверу, он проверяет соответствующую запись SSHFP. Если отпечаток записи совпадает с серверами, сервер является легитимным и подключение к нему безопасно.
Как выглядят записи SSHFP?
Записи SSHFP состоят из трех частей:
- Алгоритм открытого ключа
- Тип отпечатка пальца
- Отпечаток пальца (в шестнадцатеричном формате)
Алгоритм открытого ключа
В SSHFP определены пять различных алгоритмов.по состоянию на 2021 год. Каждый алгоритм представлен целым числом.Алгоритмы есть:
- 1 - ЮАР
- 2 - ДСА
- 3 - ECDSA
- 4 - Изд25519
- 6 - Эд448
Тип отпечатка пальца
В SSHFP определены два типа отпечатков пальцевпо состоянию на 2012 год. Каждый тип отпечатка пальца представлен целым числом.Это:
- 1 - ША-1
- 2 - ША-256
Как создать записи SSHFP?
Вы можете использоватьssh-keygenлокально для генерации записей с использованием -r
параметра, за которым следует имя хоста (которое не влияет на отпечатки пальцев, поэтому вы можете указать вместо этого все, что захотите).
Вы можете использовать ssh-keyscan для генерации записей для удаленного сервера, используя -D
параметр, за которым следует имя хоста.
Пример
Использование 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
.
решение2
Я не уверен, 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"
Ed448 keys = "6"
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
.
решение3
Старые версии 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 ' ')"
;;
ed448)
echo "$HOST IN SSHFP 6 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 6 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
esac
done
Редактировать: Новая версия с PR от alex-dupuy с поддержкой *BSD.
решение4
Если вы используете 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