ssh: automatycznie akceptuje klucze

218

Napisałem ten mały skrypt narzędziowy:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Po dodaniu nowego serwera $SERVER_LISTskrypt jest zatrzymywany za pomocą:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

Próbowałem yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

bez powodzenia.

Czy istnieje sposób na parametryzację, sshaby automatycznie akceptować nowy klucz?

Adam Matan
źródło
6
Odpowiedź Lekensteyna jest doskonała i poprawna, ale chciałem tylko zauważyć, że skoro ssh oczekuje „tak” i yeswypisuje „y”, być może powinieneś mieć więcej szczęścia for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(zwróć uwagę na dodatkowe tak, które mówi tak, co powiedzieć zamiast „y” „).
chazomaticus

Odpowiedzi:

239

Użyj opcji StrictHostKeyChecking, na przykład:

ssh -oStrictHostKeyChecking=no $h uptime

Tę opcję można również dodać do ~ / .ssh / config, np .:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Pamiętaj, że po zmianie kluczy hosta otrzymasz ostrzeżenie, nawet z tą opcją:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

Jeśli hosty nie są często instalowane ponownie, możesz uczynić to mniej bezpiecznym (ale wygodniejszym dla często zmieniających się kluczy hosta) za pomocą tej -oUserKnownHostsFile=/dev/nullopcji. Spowoduje to odrzucenie wszystkich odebranych kluczy hosta, więc nigdy nie wygeneruje ostrzeżenia.


Z 18.04, nowe możliwości: StrictHostKeyChecking=accept-new. Od man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.
Lekensteyn
źródło
10
To nie jest najlepsze rozwiązanie, ponieważ omija wbudowane narzędzia bezpieczeństwa. ssh-keyscanjest preferowane, jeśli jest dostępne w twoim systemie.
Stefan Lasiewski
2
@StefanLasiewski Pozwala atakować ludzi w środku, jeśli jesteś w niezaufanych sieciach. ssh-keyscanPodejście do przyjmowania nowych kluczy do stałych hostów jest bardziej rozsądne. W przypadku lokalnych maszyn wirtualnych i innych hostów w zaufanych sieciach z dynamicznymi / ponownie wykorzystywanymi adresami IP opisane podejście jest wystarczająco dobre.
Lekensteyn,
8
Aby wyjaśnić różnicę między tymi dwoma rozwiązaniami: ssh-keyscanRozwiązanie jest podatne tylko na atak typu man-in-the-middle za jednym razem ssh-keyscan. -oStrictHostKeyChecking=noRozwiązaniem jest podatny na atak typu man-in-the-middle każdym razem sshuruchomionego.
Erik Sjölund,
121

Możesz użyć następującego polecenia, aby dodać odcisk palca dla serwera do znanych_hostów

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

UWAGA: Zamień <adres ip> i <nazwa hosta> na adres IP i dns serwera, który chcesz dodać.

Jedyny problem polega na tym, że niektóre serwery na twoich znanych serwerach kończą się dwa razy. To naprawdę nie jest wielka sprawa, tylko wspomnę. Aby upewnić się, że nie ma duplikatów, możesz najpierw usunąć wszystkie serwery, uruchamiając najpierw następujące:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

Abyś mógł uruchomić:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

Jedną rzeczą, o której należy pamiętać przy usuwaniu tylko w celu ponownego dodania, jest zasadniczo usunięcie bezpieczeństwa weryfikacji odcisku palca. Dlatego zdecydowanie nie chcesz uruchamiać tego skryptu przed każdym uruchomieniem skryptu narzędziowego.

mhost
źródło
1
przeglądając to | uniq, a następnie wyszukiwanie zduplikowanego hosta za pomocą awk po, sprawiłoby, że skrypt byłby w stanie wykrywać zmienione hosty i ostrzegać użytkowników tylko o nich, ponieważ ten sam host z różnymi kluczami może oznaczać problemy
Lennart Rolland
2
Możesz dodać notatkę, która -Hhaszy nazwy hostów i adresy.
David Cullen,
25

Trochę się spóźniłem z tą odpowiedzią, ale rozsądnym sposobem byłoby zrobienie ssh-keycan na nowej maszynie przed uruchomieniem zbierania czasu pracy.

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

Wyłączenie kontroli poczytalności dla wygody brzmi jak zły plan, nawet jeśli uważasz, że masz całkowitą kontrolę nad środowiskiem.

zadzwonić
źródło
uruchomienie powyższej komendy i faktyczne sprawdzenie kluczy hosta pod StrictHostKeyChecking no
kątem
3
@code_monk: nie, nie jest. Otwieram jednorazową możliwość niepowodzenia (przyjęcie klucza z niewłaściwego hosta w celu dodania go do znanych hostów). StrictHostKeyChecking no pozwoli na wielokrotne akceptowanie dla innych komputerów.
zadzwonić
0

Aby automatycznie dodać listę serwerów, możemy zrobić poniżej:

Dodaj IP serwerów na liście serwerów plików

Adresy IP należy dodać w poniższym formacie.

Wyjście z cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Zmień powyższe adresy IP, zastępując swoje.

Poniższe polecenie doda wszystkie serwery z listy.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Waqas Khan
źródło