如何生成SSHFP记录?


39

我需要在DNS中为主机设置SSHFP记录。我进行了一些搜索,但没有找到任何好的例子。

  • 什么是SSHFP记录?
  • SSHFP记录是什么样的?
  • 如何创建SSHFP记录?

Answers:


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类型的记录(使用ianaiana.org/assignments/dns-sshfp-rr-parameters/…的实验编号4 )
Brian Minton,

3
服务器是合法的, DNS服务器已损坏。
Michael Mior

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记录,尽管该命令的名称表明它仅用于GENerating。
Celada 2014年

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

编辑:来自alex-dupuy的具有PR的新版本,具有* BSD支持。

https://github.com/mindfuckup/Scr​​ipts/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

这就是我通过Ansible获取SSHFP记录的方式:

- name: Capture the SSHFP entries
  shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
  register: sshfp_entries
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.