Як керувати моїм .ssh / known_hosts файлом


47

Я запускаю робочий стіл Ubuntu з купою віртуальних серверів у Virtual Box для тестування матеріалів тощо. У минулому я також підключався до інших видів віддалених ящиків VPS Linux. На даний момент у моєму .ssh/known_hostsфайлі є ціла купа ключів, більшість з яких вже не використовується.

Я хочу очистити свій .ssh/known_hostsфайл, але як я можу знати, який ключ належить до хоста? Тобто як я можу знати, які ключі я можу безпечно вийняти та які слід залишити в спокої?

Відповіді:


64

Щоб дізнатись, яка запис є для відомого імені хоста в known_hosts:

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

Щоб видалити один запис із відомих_хостів:

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

27

Якщо у вас є список усіх ваших господарів, ви можете зробити щось подібне

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

Це замінить ваш .ssh / known_hosts файл із новоствореним на основі сканування хостів.

А також робити те, що пропонує інше; Тут HashKknownHosts - це більше роздратування, ніж допомога.


ssh-keyscanмає дуже суворі правила форматування list_of_hostsфайлу. Потрібно бути лише адресами та жодним іншим пробілом, а не LF після кожної адреси. Це включає LF після останньої адреси. Інакше ви отримаєте багато сміття в створеному файлі.
Nux

21

З труднощами ...

Ubuntu за замовчуванням хешує імена хостів файл відомих_хостів (це не поведінка за відкритим типом за замовчуванням), щоб ускладнювати, хто читає файл, знати, до яких систем ви маєте доступ.

Якщо ви дійсно хотіли очистити файл, найпростіший варіант - це, мабуть, просто видалити його та перевірити ключі для серверів, яких ви знаєте, як вони виникають, але насправді я б просто залишив відомі_хости в спокої.

Ви можете зупинити хешування нових записів хостів, коментуючи параметр у / etc / ssh / ssh_config

#HashKnownHosts yes

Очищення ~ / .ssh / known_hosts також допомагає, коли конфігурація віддаленого хоста змінюється і ssh показує попередження. Однак слід бути обережними з цим і ігнорувати попередження лише для надійних хостів.
Алекс

6
Кращим варіантом може бути пояснення, як генерувати хеш для конкретного імені хоста, дозволяючи йому шукати цей хеш у відомих_хостях, щоб він міг його оновити.
Серін

1
Після вищезазначеної зміни просто додайте новий запис, наприклад, підключившись до нового сервера ssh root@something-new-or-new-dns-alias. Це оновить вихідний known_hostsфайл і видалить імена / IP-адреси хостів.
Nux

2

У моєму файлі знаних_хостів було понад 300 застарілих записів. Не впевнений, що він буде працювати для всіх систем (або навіть більшості систем), але ось мій сценарій Q&D. Можливо, вам доведеться відрегулювати відповідні рядки або розташування.

#!/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

Це не працює над хешованим known_hostsфайлом, і оскільки запитуючий запитує: "як я можу знати, який ключ належить до хоста?" Він каже, що перебуває на Ubuntu, і як theotherreceiveкаже, Ubuntu хеширує за замовчуванням.
Ніл Мейхью
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.