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?
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.
Câu trả lời:
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 bao gồm ba điều:
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à:
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à:
Bạn có thể sử dụng ssh-keygen
để tạo các bản ghi bằng -r
tham 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ế)
Sử dụng ssh-keygen
và 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
Đôi khi ssh-keygen
sẽ 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-keygen
nhiề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 (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.
Tôi không chắc chắn nếu ssh-keygen
là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 ask
thường xuyên đặt cấu hình máy khách SSH của bạn ~/.ssh/config
.
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.
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.
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
Đâ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
ssh-keygen -r
cũ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 )