ฉันจะสร้างระเบียน SSHFP ได้อย่างไร


39

ฉันต้องตั้งค่าระเบียน SSHFP ใน DNS สำหรับโฮสต์ของฉัน ฉันค้นหาเสร็จแล้ว แต่ฉันไม่พบตัวอย่างที่ดี

  • บันทึก SSHFP คืออะไร
  • ระเบียน SSHFP มีลักษณะอย่างไร
  • ฉันจะสร้างระเบียน SSHFP ได้อย่างไร

คำตอบ:


49

บันทึก SSHFP คืออะไร

SSHFP RR records เป็นระเบียน DNS ที่มีลายนิ้วมือสำหรับกุญแจสาธารณะที่ใช้สำหรับ SSH ส่วนใหญ่จะใช้กับโดเมนที่เปิดใช้งาน DNSSEC เมื่อไคลเอ็นต์ SSH เชื่อมต่อกับเซิร์ฟเวอร์มันจะตรวจสอบบันทึก SSHFP ที่เกี่ยวข้อง หากบันทึกลายนิ้วมือตรงกับเซิร์ฟเวอร์แสดงว่าเซิร์ฟเวอร์นั้นถูกต้องและปลอดภัยในการเชื่อมต่อ

ระเบียน SSHFP มีลักษณะอย่างไร

บันทึก SSHFP ประกอบด้วยสามสิ่ง:

  1. ขั้นตอนวิธี
  2. ประเภทลายนิ้วมือ
  3. ลายนิ้วมือ (เป็นเลขฐานสิบหก)

ขั้นตอนวิธี

มีสี่ขั้นตอนวิธีการที่แตกต่างกันที่กำหนดไว้ใน SSHFP มีเป็นปี 2015 แต่ละอัลกอริทึมจะถูกแทนด้วยจำนวนเต็ม อัลกอริทึมคือ:

  • 1 - RSA
  • 2 - DSA
  • 3 - ECDSA
  • 4 - Ed25519

ประเภทลายนิ้วมือ

ลายนิ้วมือทั้งสองประเภทที่กำหนดไว้ใน SSHFP เป็นของปี 2012 ลายนิ้วมือแต่ละประเภทจะถูกแทนด้วยจำนวนเต็ม เหล่านี้คือ:

  • 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 ด้วย (ใช้หมายเลขทดลอง 4 จาก iana iana.org/assignments/dns-sshfp-rr-parameters/… )
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 สำหรับคีย์ที่มีอยู่แม้จะมีความจริงที่ว่าชื่อของคำสั่งที่แสดงให้เห็นว่ามันเป็นเพียงการสร้าง
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

แก้ไข: เวอร์ชันใหม่พร้อม PR จาก alex-dupuy พร้อมรองรับ * BSD

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

นี่คือวิธีที่ฉันได้รับการบันทึก 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.