如何產生 SSHFP 記錄?

如何產生 SSHFP 記錄?

我需要在我的主機的 DNS 中設定 SSHFP 記錄。我做了一些搜索,但沒有找到任何很好的例子。

  • 什麼是 SSHFP 記錄?
  • SSHFP 記錄是什麼樣的?
  • 如何建立 SSHFP 記錄?

答案1

什麼是 SSHFP 記錄?

SSHFP 記錄是包含用於 SSH 的公鑰指紋的 DNS 記錄。它們主要與啟用 DNSSEC 的網域一起使用。當 SSH 用戶端連接到伺服器時,它會檢查對應的 SSHFP 記錄。如果記錄指紋與伺服器匹配,則伺服器是合法的並且可以安全連接。

SSHFP 記錄是什麼樣的?

SSHFP 記錄由三個部分組成:

  1. 公鑰演算法
  2. 指紋類型
  3. 指紋(十六進位)

公鑰演算法

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/Scr​​ipts/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

相關內容