SSHFP レコードを生成するにはどうすればよいですか?

SSHFP レコードを生成するにはどうすればよいですか?

ホストの DNS に SSHFP レコードを設定する必要があります。検索してみましたが、良い例が見つかりませんでした。

  • SSHFP レコードとは何ですか?
  • SSHFP レコードはどのようになっているのでしょうか?
  • SSHFP レコードを作成するにはどうすればよいですか?

答え1

SSHFP レコードとは何ですか?

SSHFP レコードは、SSH に使用される公開キーのフィンガープリントを含む DNS レコードです。主に DNSSEC 対応ドメインで使用されます。SSH クライアントがサーバーに接続すると、対応する SSHFP レコードがチェックされます。レコードのフィンガープリントがサーバーと一致する場合、サーバーは正当であり、接続しても安全です。

SSHFP レコードはどのようになっているのでしょうか?

SSHFP レコードは次の 3 つの要素で構成されます。

  1. 公開鍵アルゴリズム
  2. 指紋の種類
  3. 指紋(16進数)

公開鍵アルゴリズム

SSHFPには5つの異なるアルゴリズムが定義されている。2021年現在各アルゴリズムは整数で表されます。アルゴリズムは:

  • 1 - 南アフリカ
  • 2 - ダッソー・ステート・アナリシス
  • 3 - ECDSA
  • 4 - エド25519
  • 6 - エド448

指紋の種類

SSHFPでは2つの指紋タイプが定義されている2012年現在各指紋タイプは整数で表されます。これらは:

  • 1 - SHA-1
  • 2 - SHA-256

SSHFP レコードを生成するにはどうすればよいですか?

使用できますsshキー生成パラメータとそれに続くホスト名を使用してレコードを生成するには-r、ローカルで実行します (これはフィンガープリントには影響しないため、代わりに任意の名前を指定できます)。

ssh-keyscan を使用すると、パラメータに続いてホスト名を指定して、リモート サーバーのレコードを生成できます-D

CentOS の使用ssh-keygen:

[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。尋ねられた場合は、複数回実行し、毎回異なる証明書を指定して、必要な SSHFP レコードがすべて生成されるようにする必要がありますssh-keygen。公開キーは通常、 にあります/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

編集: 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

関連情報