Làm cách nào để tạo bản ghi SSHFP?


39

Tôi cần thiết lập các bản ghi SSHFP trong DNS cho máy chủ của mình. Tôi đã thực hiện một số tìm kiếm nhưng tôi không tìm thấy bất kỳ ví dụ tốt.

  • Hồ sơ SSHFP là gì?
  • Bản ghi SSHFP trông như thế nào?
  • Làm cách nào để tạo bản ghi SSHFP?

Câu trả lời:


49

Hồ sơ SSHFP là gì?

Bản ghi SSHFP RR là bản ghi DNS chứa dấu vân tay cho các khóa công khai được sử dụng cho SSH. Chúng chủ yếu được sử dụng với các miền kích hoạt DNSSEC. Khi máy khách SSH kết nối với máy chủ, nó sẽ kiểm tra bản ghi SSHFP tương ứng. Nếu dấu vân tay khớp với máy chủ, máy chủ là hợp pháp và an toàn để kết nối.

Bản ghi SSHFP trông như thế nào?

Bản ghi SSHFP bao gồm ba điều:

  1. Thuật toán
  2. Loại vân tay
  3. Vân tay (trong hex)

Thuật toán

Có bốn thuật toán khác nhau được xác định trong SSHFP vào năm 2015 . Mỗi thuật toán được đại diện bởi một số nguyên. Các thuật toán là:

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

Loại vân tay

Hai loại dấu vân tay được xác định trong SSHFP vào năm 2012 . Mỗi loại dấu vân tay được đại diện bởi một số nguyên. Đó là:

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

Làm cách nào để tạo bản ghi SSHFP?

Bạn có thể sử dụng ssh-keygenđể tạo các bản ghi bằng -rtham số, theo sau là tên máy chủ (không ảnh hưởng đến dấu vân tay để bạn có thể chỉ định bất cứ điều gì bạn thích thay thế)

Thí dụ

Sử dụng ssh-keygenvà 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

chú thích

Đôi khi ssh-keygensẽ yêu cầu vị trí của giấy chứng nhận công cộng. Nếu nó yêu cầu, bạn sẽ phải chạy ssh-keygennhiều lần và mỗi lần chỉ định một chứng chỉ khác nhau để đảm bảo rằng bạn tạo tất cả các bản ghi SSHFP cần thiết. Khóa công khai của bạn thường được đặt trong /etc/ssh.


Xác thực dựa trên DNS của các thực thể được đặt tên

Xác thực dựa trên DNS của các thực thể được đặt tên (Dane) ( RFC 6698 ) là sự kế thừa tiềm năng cho SSHFP RR. Dane rất giống với SSHFP RR nhưng không giới hạn ở SSH. Nó sử dụng TLSA RR thay vì với định dạng rất giống nhau.


ssh-keygen -rcũng xử lý các bản ghi loại ed25519 (sử dụng số 4 thử nghiệm từ iana iana.org/assignments/dns-sshfp-rr-parameter / mật )
Brian Minton

3
Máy chủ là hợp pháp hoặc máy chủ DNS bị xâm phạm.
Michael Mior

7

Tôi không chắc chắn nếu ssh-keygenlàm việc với các khóa hiện có. Nếu không, bạn vẫn có thể dễ dàng lắp ráp chúng trong vỏ của mình (mà tôi thích) và không có phần mềm ưa thích hoặc giao diện từ xa.

Một hồ sơ như đã đề cập ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... tồn tại 6 phần:

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

Để sử dụng nó, hãy VerifyHostKeyDNS askthường xuyên đặt cấu hình máy khách SSH của bạn ~/.ssh/config.


5
Đối với bản ghi, ssh-keygen -r việc tạo các bản ghi SSHFP cho các khóa hiện có mặc dù thực tế rằng tên của lệnh cho thấy nó chỉ dành cho Tạo.
Celada

5

Các phiên bản cũ hơn của ssh-keygen không tạo ra tất cả các khóa có sẵn (ví dụ: không hỗ trợ cho ecdsa và sha256). Kịch bản lệnh này tạo ra tất cả các bản ghi cho tất cả các khóa có sẵn trong /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

Chỉnh sửa: Phiên bản mới với PR từ alex-dupuy với sự hỗ trợ * BSD.

https://github.com/mindfuckup/Scripts/blob/master/sshfpgen


3

Nếu bạn sử dụng Puppet, facterđã tích hợp hỗ trợ cho sshfp. Ngoài ra, nếu bạn đang sử dụng PuppetDB, bạn có thể dễ dàng trích xuất thông tin này cho tất cả các máy chủ của mình.

facter | grep -i sshfp
  sshfp_dsa => SSHFP 2 1 e1a3e639d6dbd48d3964ebfb772d2d11f1065682
  SSHFP 2 2 4f620ce2bc97d91ae5eff42fba621d65b677ab725f275f56b2abd1303c142b73
  sshfp_rsa => SSHFP 1 1 a78351af371faf3f19533c3a4a9e967543d7d2f5
  SSHFP 1 2 795943a6ee8b53c818cfef5781209e25a6eb4bc386813db60d3ff2c1569692fc

Nguồn


3

Đây là cách tôi nhận bản ghi SSHFP của mình thông qua Ansible :

- name: Capture the SSHFP entries
  shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
  register: sshfp_entries
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.