Cách quản lý tệp .ssh / know_hosts của tôi


47

Tôi chạy một máy tính để bàn Ubuntu với một loạt các máy chủ ảo trong Virtual Box để kiểm tra mọi thứ, v.v. Trước đây tôi cũng đã kết nối với các loại hộp VPS Linux từ xa khác. Hiện tại .ssh/known_hoststệp của tôi có cả đống khóa trong đó, hầu hết chúng không được sử dụng nữa.

Tôi muốn dọn sạch .ssh/known_hoststệp của mình , nhưng làm cách nào để biết khóa nào thuộc về máy chủ nào? Tức là làm thế nào để tôi biết những phím nào tôi có thể loại bỏ một cách an toàn và những phím nào tôi nên để lại một mình?

Câu trả lời:


64

Để tìm ra mục nhập nào dành cho tên máy chủ đã biết trong know_hosts:

 # ssh-keygen -H  -F <hostname or IP address>

Để xóa một mục duy nhất từ ​​know_hosts:

 # ssh-keygen -R <hostname or IP address>

27

Nếu bạn có một danh sách tất cả các máy chủ của mình, bạn có thể làm một cái gì đó như

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

Điều đó sẽ ghi đè lên tệp .ssh / know_hosts của bạn với tệp mới được tạo dựa trên việc quét các máy chủ.

Và cũng làm những gì nhiệt đới gợi ý; HashKnownhosts gây phiền nhiễu nhiều hơn là giúp đỡ ở đây.


ssh-keyscancó một quy tắc định dạng rất nghiêm ngặt của list_of_hoststập tin. Nó cần phải chỉ là địa chỉ và không có khoảng trắng nào khác sau đó sau mỗi địa chỉ. Điều đó bao gồm cả LF sau địa chỉ cuối cùng. Nếu không, bạn nhận được rất nhiều rác trong tệp được tạo.
Nux

21

Với khó khăn...

Ubuntu theo mặc định băm tên máy chủ lưu trữ tệp đã biết (đây không phải là hành vi openssh mặc định), để gây khó khăn cho bất kỳ ai đọc tệp để biết bạn truy cập hệ thống nào.

Nếu bạn thực sự muốn xóa sạch tệp, tùy chọn đơn giản nhất có lẽ chỉ là xóa nó và kiểm tra các khóa cho các máy chủ mà bạn biết khi chúng phát sinh, nhưng thực sự tôi chỉ để lại know_hosts.

Bạn có thể ngăn các mục lưu trữ mới khỏi bị băm bằng cách nhận xét tùy chọn trong / etc / ssh / ssh_config

#HashKnownHosts yes

Dọn dẹp ~ / .ssh / know_hosts cũng giúp khi cấu hình của máy chủ từ xa thay đổi và ssh hiển thị cảnh báo. Tuy nhiên, người ta nên cẩn thận với điều đó và bỏ qua warnnig chỉ dành cho các máy chủ đáng tin cậy.
Alex

6
Một lựa chọn tốt hơn có thể là giải thích cách tạo ra hàm băm cho một tên máy chủ cụ thể, cho phép anh ta tìm kiếm hàm băm đó trong know_host để anh ta có thể cập nhật nó.
Cerin

1
Sau khi thay đổi, chỉ cần thêm một mục mới, ví dụ bằng cách kết nối với máy chủ mới với ssh root@something-new-or-new-dns-alias. Điều này sẽ làm mới known_hoststệp gốc và giải mã tên máy chủ / IP.
Nux

2

Tôi đã có hơn 300 mục cũ cũ trong tệp know_hosts của tôi. Không chắc chắn rằng nó sẽ hoạt động cho tất cả các hệ thống (hoặc thậm chí hầu hết các hệ thống) nhưng đây là tập lệnh Q & D của tôi. Bạn có thể phải điều chỉnh các chuỗi hoặc vị trí phù hợp.

#!/bin/sh
list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for host in $listsorted ;
do
echo $host 
ssh -oBatchMode=yes -oConnectTimeout=2  root@${host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $host"
     echo sed -i.bak \"/$host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list

Điều này không hoạt động trên một known_hoststệp được băm và vì người hỏi hỏi, "làm thế nào để tôi biết khóa nào thuộc về máy chủ nào" Tôi nghĩ rằng rất có khả năng tệp của mình bị băm. Anh ta nói rằng anh ta đang dùng Ubuntu, và như đã theotherreceivenói, Ubuntu băm theo mặc định.
Neil Mayhew
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.