ssh: otomatik olarak anahtarları kabul eder


218

Bu küçük yardımcı program komut dosyasını yazdım:

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

Yeni bir sunucu eklendiğinde $SERVER_LIST, komut dosyası ile durdurulur:

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)?

Denedim yes:

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

şanssız.

sshHerhangi bir yeni anahtarı otomatik olarak kabul etmek için parametrize etmenin bir yolu var mı ?


6
Lekensteyn'in cevabı mükemmel ve doğru, ama sadece ssh'ın “evet” beklediğinden ve yes“y” çıktığından beri daha iyi şanslar elde edebileceğini not etmek istedim for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(fazladan evet, bunun yerine evet diyenleri söyleyin) ").
chazomaticus

Yanıtlar:


240

StrictHostKeyChecking seçeneğini kullanın, örneğin:

ssh -oStrictHostKeyChecking=no $h uptime

Bu seçenek ~ / .ssh / config dosyasına da eklenebilir, örneğin:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Ana bilgisayar anahtarları değiştiğinde, bu seçenek olsa bile bir uyarı alacağınızı unutmayın:

$ 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

Ana bilgisayarlarınız sık sık yeniden yüklenmezse, bu seçeneği kullanarak daha az güvenli (ancak genellikle değişen ana bilgisayar anahtarları için daha uygun) yapabilirsiniz -oUserKnownHostsFile=/dev/null. Bu, alınan tüm ana bilgisayar anahtarlarını atar ve böylece hiçbir zaman uyarı oluşturmaz.


18.04 ile yeni bir olasılık var: StrictHostKeyChecking=accept-new. Kimden 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.

10
Bu, yerleşik güvenlik araçlarını atladığı için en iyi çözüm değildir. ssh-keyscansisteminizde varsa tercih edilir.
Stefan Lasiewski

2
@StefanLasiewski Eğer güvenilmez ağlarda iseniz orta saldırıda adam sağlar. Sabit ana bilgisayarlara yeni anahtarlar kabul etmek için ssh-keyscanyaklaşım daha mantıklıdır. Yerel sanal makineler ve dinamik / yeniden kullanılan IP adreslerine sahip güvenilir ağlardaki diğer ana bilgisayarlar için, açıklanan yaklaşım yeterince iyidir.
Lekensteyn

8
Sadece iki çözüm arasındaki farkı açıklığa kavuşturmak için: ssh-keyscanÇözüm yalnızca bir kez ssh-keyscançalıştırılan ortadaki adam saldırısına yatkındır . -oStrictHostKeyChecking=noÇözelti her zaman man-in-the-middle saldırısı eğilimli sshçalıştırılıyor.
Erik Sjölund

121

Bir sunucunun parmak izini bilinen_host'larınıza eklemek için aşağıdaki komutu kullanabilirsiniz

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

NOT: <ip adresi> ve <ana bilgisayar adı> yerine eklemek istediğiniz sunucunun IP ve dns adını kullanın.

Bununla ilgili tek sorun bilinen_host'larınızdaki bazı sunucularla iki kez sonuçlanmanızdır. Bu gerçekten büyük bir olay değil, sadece söz. Çoğaltma olmadığından emin olmak için, önce aşağıdakileri çalıştırarak tüm sunucuları kaldırabilirsiniz:

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

Böylece koşabilirsin:

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

Sadece yeniden eklemek için kaldırırken akılda tutulması gereken bir şey, aslında parmak izi doğrulama güvenliğini kaldırıyorsunuz. Bu nedenle, kesinlikle bu komut dosyasını, yardımcı program komut dosyanızın her yürütmesinden önce çalıştırmak istemezsiniz.


1
sıralama yoluyla çalışan | Farklı anahtarlar ile aynı ana sorun anlamına gelebilir çünkü uniq ardından, değiştirilen ana algılama komut yetenekli yapabilir ve sadece bu hakkında kullanıcıları uyarmak sonra awk kullanarak yinelenen host arıyoruz
Lennart Rolland

2
Ana -Hbilgisayar adlarına ve adreslere sahip bir not eklemek isteyebilirsiniz .
David Cullen

25

Bu cevaba biraz geç kaldım, ancak mantıklı bir yol, çalışma süresi toplanmasından önce yeni makinede bir ssh-keyscan yapmak olacaktır.

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

Akıl sağlığı kontrolünü devre dışı bırakmak, iyilik uğruna kötü bir plana benziyor, tamamen çevreyi kontrol ediyor olsanız bile.


gibi bandın dışına edinilen parmak izlerine karşı konak anahtarlarını yukarıdaki komutu çalıştırarak ve aslında kontrol etmiyor tam aynı şekilde savunmasızdırStrictHostKeyChecking no
code_monk

3
@code_monk: hayır, değil. Başarısızlık için bir kereye mahsus bir fırsat açıyorum (yanlış bir ana bilgisayardan bilinen ana bilgisayarlara eklenecek anahtarı kabul ediyorum ). StrictHostKeyChecking no , diğer makineler için tekrarlamanın kabul edilmesine izin vermez.
t4

0

Sunucuların listesini otomatik olarak eklemek için aşağıdakileri yapabiliriz:

Dosya sunucuları listesine sunucu IP'si ekle

IP'ler aşağıdaki formatta eklenmelidir.

Çıktısı cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Sizinkini değiştirerek yukarıdaki IP'leri değiştirin.

Alttaki komut listedeki tüm sunucuları ekleyecektir.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.