SSHFP 레코드를 어떻게 생성합니까?


39

호스트의 DNS에 SSHFP 레코드를 설정해야합니다. 몇 가지 검색을 수행했지만 좋은 예를 찾지 못했습니다.

  • SSHFP 레코드 란 무엇입니까?
  • SSHFP 레코드는 어떻게 생겼습니까?
  • SSHFP 레코드를 작성하는 방법

답변:


49

SSHFP 레코드 란 무엇입니까?

SSHFP RR 레코드는 SSH에 사용되는 공개 키의 지문이 포함 된 DNS 레코드입니다. 이들은 주로 DNSSEC 가능 도메인과 함께 사용됩니다. SSH 클라이언트가 서버에 연결하면 해당 SSHFP 레코드를 확인합니다. 레코드 지문이 서버와 일치하면 서버가 합법적이며 연결해도 안전합니다.

SSHFP 레코드는 어떻게 생겼습니까?

SSHFP 레코드는 다음 세 가지로 구성됩니다.

  1. 연산
  2. 지문 유형
  3. 지문 (16 진수)

연산

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 기반 인증

명명 된 엔터티 (DANE) 의 DNS 기반 인증 ( RFC 6698 )은 SSHFP RR의 후속 모델입니다. DANE는 SSHFP RR과 매우 유사하지만 SSH로 제한되지 않습니다. 그것은 사용 TLSA RR을 대신 매우 유사한 형식.


ssh-keygen -r또한 (IANA에서 실험 번호 4를 사용 ed25519 유형의 기록을 처리 iana.org/assignments/dns-sshfp-rr-parameters/... )
브라이언 민튼

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 askSSH 클라이언트의 구성에 보통을 넣으 십시오 ~/.ssh/config.


5
기록을 위해, ssh-keygen -r 않습니다 명령의 이름이 생성 만의 제안 사실에도 불구하고 기존의 키에 대한 SSHFP 레코드를 생성.
Celada

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

편집 : * BSD를 지원하는 alex-dupuy의 PR 새 버전.

https://github.com/mindfuckup/Scripts/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.