我需要在我的主机的 DNS 中设置 SSHFP 记录。我做了一些搜索,但没有找到任何好的例子。
- 什么是 SSHFP 记录?
- SSHFP 记录是什么样的?
- 如何创建 SSHFP 记录?
答案1
什么是 SSHFP 记录?
SSHFP 记录是包含用于 SSH 的公钥指纹的 DNS 记录。它们主要与启用 DNSSEC 的域一起使用。当 SSH 客户端连接到服务器时,它会检查相应的 SSHFP 记录。如果记录指纹与服务器匹配,则服务器是合法的并且可以安全连接。
SSHFP 记录是什么样的?
SSHFP 记录由三部分组成:
- 公钥算法
- 指纹类型
- 指纹(十六进制)
公钥算法
SSHFP 中定义了五种不同的算法截至 2021 年。每个算法都用一个整数表示。算法是:
- 1 - RSA
- 2-DSA
- 3 - 椭圆曲线数字签名算法
- 4 - Ed25519
- 6 - 埃德448
指纹类型
SSHFP中定义了两种指纹类型截至2012年。每个指纹类型都由一个整数表示。这些都是:
- 1 - SHA-1
- 2 - SHA-256
如何生成 SSHFP 记录?
您可以使用ssh 密钥生成器在本地使用参数生成记录-r
,后跟主机名(这不会影响指纹,因此您可以指定您喜欢的任何内容)。
-D
您可以使用 ssh-keyscan 使用参数后跟主机名来生成远程服务器的记录。
例子
使用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
可以使用现有的密钥。如果没有,您仍然可以轻松地将它们组装在您的 shell 中(我更喜欢),而无需花哨的软件或远程接口。
诸如提到的记录...
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
编辑:来自 alex-dupuy 的 PR 的新版本,支持 *BSD。
https://github.com/mindfuckup/Scripts/blob/master/sshfpgen
答案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