“Bilinen_host'lara doğru ana bilgisayar anahtarı ekle” / her bir ana bilgisayar adı için birden çok ssh ana bilgisayar anahtarı mı?


147

Kontrol ettiğim bir bilgisayara girmeye çalışıyorum, aşina olduğum mesajı alıyorum:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.

Gerçekten anahtarı değiştirdim. Ve bu sorunu çözmenin yolunun eski anahtarı known_hostsdosyadan silmek olduğunu söyleyerek birkaç düzine kayıt okudum .

Fakat istediğim, ssh'nin hem eski anahtarı hem de yeni anahtarı kabul etmesi. Hata iletisindeki dil (" Add correct host key"), eskisini kaldırmadan doğru ana bilgisayar anahtarını eklemenin bir yolu olması gerektiğini gösterir.

Eski olanı kaldırmadan yeni ana bilgisayar anahtarını nasıl ekleyeceğimi çözemedim.

Bu mümkün mü, yoksa hata mesajı sadece son derece yanıltıcı mı?


9
Bu, hatayı üreten ana bilgisayar anahtarıdır. Bir ana bilgisayarın bir ve yalnızca bir anahtarı olmalıdır. Bunun müşteri veya kullanıcı tuşları ile ilgisi yoktur. Farklı ana bilgisayarlar arasında yüzen bir IP adresiniz var mı?
David Schwartz

4
Benim durumumda, yakın gelecekte bazı şeylerle uğraşırken iki anahtar arasında geçiş yapacağımı biliyorum. Bu, aynı zamanda, önerdiğiniz birden fazla ana bilgisayar durumuna sahip olan bir IP’de de faydalı olacağını düşünüyor. Temel olarak, herhangi bir pratik uygulama dışında, kendi eğitimim için bunun mümkün olup olmadığını bilmek istiyorum.
Samuel Edwin Ward

Yanıtlar:


148
  1. Sunucunuza ait rsa anahtarı almak server_ipgibi sunucunuzun IP adresini ise 192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    Örnek cevap:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. ve istemcide, yanıt hattının tamamını kopyalayın server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...ve bu anahtarı ~/.ssh/known_hostsdosyanızın altına ekleyin :

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    

12
Bu çalıştı! Ancak, ben "HashKnownHosts" kullanıyorum, bu yüzden giriş biraz yerinde görünüyordu. Neyse ki ssh_config (5), ssh-keygen (1) 'e işaret etti, bu da "ssh-keygen -H"' yi, el değmemiş girişleri toplamak için kullanabileceğimi açıkladı. Teşekkür ederim!
Samuel Edwin Ward

2
Bu "işe yarıyor", ancak anahtarı doğrulamıyorsunuz, bu yüzden
mitm

3
@JasperWallace, ilk adım (örneğin kullanarak localhost için) güvenli bir bağlantı üzerinden yapılır sürece oldukça güvenli olmalıdır, bence
ony

3
Tüm anahtar türlerini sunucudan toplamanın bir yolu var mı? Bazen onların RSA, DSA, ECDSA, RSA1 ... vs. olup olmadığını bilmiyorsunuz.
Sopalajo de Arrierez

3
@SopalajodeArrierez aynı manpage aynı zamanda virgüllerle türleri ayırabileceğinizi de söyler, ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ipancak öyle yapın - ancak bulmanın rsa1ve dsaanahtarların yükseltilmesi / yeniden yapılandırılması gereken sunucuları tanımlamak olduğunu
söyleyin

94

Bu girişi, bilinen_toptanlardan aşağıdakileri kullanarak kaldırın:

ssh-keygen -R *ip_address_or_hostname*

Bu sorunlu IP veya ana bilgisayar adını known_hosts dosyasından kaldıracak ve yeniden bağlanmayı deneyecektir.

Man sayfalarından:

-R hostname
Bilinen_hosts dosyasındaki hostname'ye ait tüm anahtarları kaldırır. Bu seçenek, karma ana bilgisayarları silmek için kullanışlıdır (yukarıdaki -H seçeneğine bakın).


11
"eskisi çıkarmadan yeni ana bilgisayar anahtarını nasıl ekleyebilirim?"
Samuel Edwin Ward

4
Bu en iyi çözüm!
Thomas Decaux

8
Bunun 19 oyu nasıl? Sorulan soruyu cevaplamaya yaklaşmıyor ..
Molomby

2
"Git ssh güncelleme ana bilgisayar anahtarını otomatik olarak" için google’da sorduğumda sorunuz ikinci sırada geliyor. Bu cevap aradığım şeydi. Tam olarak istediğim şeyle yeni bir soru açmak, kopya olarak kapatılabilir.
Jason Goemaat

Ana bilgisayar adı da çalışıyor
damluar

18

Çok basit bir yol:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

Ardından, orijinal anahtarı silmek için known_hosts komutunu düzenleyin, ardından aşağıdakileri kullanarak ana makineye ssh:

ssh name@computer

Yeni anahtarı otomatik olarak ekler; sonra iki dosyayı karşılaştırın. Meld gibi bir program iki dosyayı karşılaştırmak için iyi bir yoldur. Ardından, bilinen_ ana bilgisayarların her iki anahtarı da içerecek şekilde dosyaları birleştir

İki anahtarı saklamak için 'nedenim', hedef sistemin çok önyüklü olmasıdır, anahtarları yüklemeler arasında senkronize etmenin bir yolu olduğunu söylesem de, birden çok anahtara izin vermenin daha kolay olduğu görülüyor.

EDIT 2015/06

Şimdi tekrar ziyaret etmeliyim ki, [giriş tanımlanabildiği sürece, normalde ana bilgisayar adı / IP adresinden, özel konumuna atıfta bulunulan hata mesajının yanı sıra];

  1. Known_hosts içindeki 'old' girişinin başlangıcına geçici olarak # eklemek için known_hosts dosyasını düzenleyin.
  2. [Ssh'ı ana bilgisayara bağla], yeni anahtarı 'otomatik olarak' ekleme istemini kabul edin
  3. Sonra # kaldırmak için known_hosts yeniden düzenleyin

HostKeyAlias ​​seçeneği olduğu gibi bile var

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

daha sonra, ssh istemcisi yeni anahtarı takma adı altına ekledikten sonra, bilinen_host'ları düzenleyebilir veya takma adın 'gerçek' ana bilgisayar adını / IP adresini yerine koyabilir veya o ana bilgisayarın bu takma adını başka bir takma seçenekle bağlayabilirsiniz.



işte bu meld :) apt-get / yum kurulum adı basitçe meld
Mark

Ben sizin önerinizle ilgili bir türev yaptım - cp, mv, sonra ssh yerine, sonra cat ~ / .ssh / known_hosts.bak ~ / .ssh / known_hosts> tmp; mv tmp ~ / .ssh / known_hosts
Peter N Lewis

6

Birkaç farklı sistemle başlattığım bir ahududu pi ile aynı sorunu yaşıyorum (kol ikili dosyalarını derleme, proje, xbmc, vb.) Ve aynı problemle karşılaştım. Yerel bir ağda DHCP kullanıyorlar ve yönlendiricim MAC adresi aynı olduğundan her zaman aynı IP'yi tekrar kullandılar. Ana bilgisayar dosyamda farklı alan adları kullanarak çözdüm:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

Known_hosts dosyası, parmak izlerini ana bilgisayar adına göre kaydeder, böylece aynı IP adresi olsa da, her benzersiz ana bilgisayar adı farklı bir giriş alır.

Her yeni bir sistem kullandığımda, dosyaları ana bilgisayarlara eklemek istemekten bıktım, bu yüzden ip adreslerinde önde gelen sıfırları kullanarak daha da tembel bir yolla geldim:

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110

(Kuralsızlaştırılmış) ip adresinin her bir varyasyonu, bilinen ana bilgisayarlara kendi girişini alır.


1
OpenSSH millet bana akıllıca geldi, bu boşluk artık daha yeni sürümlerde çalışmıyor.
Mike,

Sen kullanabilirsiniz CheckHostIP noyılında ~/.ssh/configyine kaçamak kullanmak mümkün. Orada takma adlarınızı bile tanımlayabilirsiniz, böylece kemanla uğraşmanıza /etc/hostsve CheckHostIP noyalnızca bu 3 ana bilgisayar adı için tanımlamanıza gerek kalmaz.
GnP

3

Hem istemcinizde hem de sunucunuzda OpenSSH 6.8 veya daha yenisi varsa, veya UpdateHostKeys yesseçeneğinizdeki seçeneği kullanabilirsiniz . Örneğin:ssh_config~/.ssh/config

Host *
    UpdateHostKeys yes

Bu, SSH'yi sunucunun sahip olması gereken tüm ana bilgisayar anahtarlarını saklamasını sağlar known_hostsve bir sunucu bir ana bilgisayar anahtarını değiştirdiğinde veya kaldırdığında, aynı zamanda anahtarınız da değişir veya kaldırılır known_hosts.


Bu, bugüne kadarki en faydalı cevap! Bir ana bilgisayar anahtarı önceden değiştirilmişse, orijinal soruyu açıkça çözmenin bir yolunu sunmasa da, yeni ana bilgisayar anahtarını doğrulamadıkları için diğer tüm yanıtlar güvensizdir. Bu seçenek yeni ana bilgisayar anahtarlarına güvenli geçiş yapmanızı sağlar.
Jaap Eldering

1

Neden iki anahtarla çalışmak istediğinizi anlamıyorum, ancak ~/.ssh/known_hostsdosyaya kesinlikle birden fazla geçerli anahtar ekleyebilirsiniz , ancak manuel olarak yapmanız gerekir.

Başka bir çözüm StrictHostKeyChecking=nobu belirli ana bilgisayar için seçeneği kullanmak olabilir :

ssh -o StrictHostKeyChecking=no user@host

ki sizin içindeki bir takma adı ~/.profileveya benzer bir şey koyabilirsiniz .

alias hc=ssh -o StrictHostKeyChecking=no user@host

StrictHostKeyChecking bu durumda yardımcı görünmüyor; Görünüşe göre, yalnızca ana bilgisayar bilinen_hosts dosyasında değilse davranışını belirtir. Burada bahsedilen: gossamer-threads.com/lists/openssh/dev/45349#45349
Samuel Edwin Ward

Burada çalışıyor. Uyarı alacaksınız, ancak giriş devam ediyor.
Sven

Bu garip. Parola doğrulaması kullanıyor musunuz? OpenSSH kullanıyor musunuz?
Samuel Edwin Ward

1

Eğer sadece yerel bir ağa ssh atarsan ...

Eski anahtar dosyayı silmek ve boş bir dosyayla değiştirmek basit bir çözümdür. Bu, tüm bağlantılarınızı yeni anahtarlarla tekrar görmenizi sağlar. Yerel ağınız dışındaki siteler için ssh anahtarlarınız varsa, ilk bağlantınızın o sunucuya ilk bağlandığınızda yaptığınız gibi güvenli olduğundan emin olmanız gerekir.

Örneğin

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

Ardından, yeni arabelleği (dosya) kaydetmek için boşluk, cntl + x ve 'y' tuşlarına basın. Kötü bir uygulama ama tamam, düzenli olarak yerel ağınızın dışına taşmadığınızdan emin olun (örneğin bir uni veya çalışma sunucusu).

Güvenli bir yerel ağda bu güvenlidir çünkü orta saldırıda bir adamı yakalayamazsınız.

Anladığınız kodu kullanmak her zaman daha iyidir!


4
known_hostsHer seferinde dosyanın tamamını silmek, aksi takdirde ssh tarafından sağlanan güvenliklerin çoğunu ortadan kaldıracaktır.
kasperd

Aslında, güvenli bir iç ağda, kodunuzu anlamanızın ve güvenliği önlemenin akılsızca kopyalamaktan daha güvenli olduğunu savunuyorum. Harici bir ağda durum farklı olacaktır.
Aaron,

-1

Çok fazla cevap, ancak tamamen katı ana bilgisayar kontrolünü kapatarak, ya da ilgisiz ana bilgisayar bilgilerini yok ederek ya da kullanıcıyı beklenmedik bir durumda, muhtemelen daha sonraki bir noktada anahtarları etkileşimli olarak kabul etmeye zorlayarak koruma sağlayan pek çok cevap.

Sıkı ev sahibi kontrolünü bırakmanıza izin veren, ancak değişmesini beklediğiniz zaman anahtarı kontrollü bir şekilde güncelleyebileceğiniz basit bir teknik :

  • Eski anahtarı kaldırın ve tek bir komutla güncelleyin

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • Kullanırsanız, IP adresleri veya diğer ana bilgisayar adlarıyla tekrarlayın.

Bu yaklaşımın avantajı, sunucuyu tam olarak bir kez yeniden anahtarlamasıdır. Ssh-keygen'in çoğu sürümü, silmeye çalıştığınız sunucu bilinen ana bilgisayar dosyasında yoksa bir hata döndürmüyor gibi görünüyor, bu sizin için bir sorunsa, iki komutu sırayla kullanın.

Bu yaklaşım aynı zamanda bağlantıyı doğrular ve ssh komutunda (giriş yapan, ana bilgisayar anahtarını günceller ve güncellenen SSH ana bilgisayar anahtarını çıkarır ve ardından hemen çıkılır) günlükler için hoş bir mesaj verir .

Eğer ssh-keygen versiyonunuz sıfır olmayan bir çıkış kodu verirse ve bunu hatasız, önceki bağlantıdan bağımsız olarak yapmayı tercih ederseniz, ssh-keygen komutundaki hataları görmezden gelmek için iki komutu sırayla kullanın.

Bu tekniği kullanırsanız, ssh komutunuzu değiştirmenize veya o ssh komutu dışında ana bilgisayar denetlemesini kapatmanıza gerek yoktur. Gelecekteki ssh oturumlarının, ssh komutu hatasız bir şekilde çalıştığı sürece, yeni bir anahtarı açıkça kabul etmek zorunda kalmadan veya çatışmadan çalışacağından emin olabilirsiniz.


-3

Ben de aynı problemi yaşadım.

Tek yaptığım sudo nano /home/user/.ssh/ host_allowanahtar oldu ve sildim.

Sunucuya geri ssh zaman yeni bir anahtar ekledi.


2
Bunun neden olduğu hakkında daha fazla bilgi cevaba yardımcı olacaktır.
Drew Khoury

-4

Suçlu çizgiyi kaldırmak için sed komutunu kullanın

OUTPUT: as show in above example
Offending key in /home/user/.ssh/known_hosts:86

Bilinen ana bilgisayarlarda belirtildiği gibi çizgiyi 86 çıkarın.

CODE: 
sed -i '86d' /home/user/.ssh/known_hosts

Bir dahaki sefere ssh kullanarak erişirken, sistem otomatik olarak yeni anahtar ekleyecektir.

ssh'ın yeni sürümleri

kullanın:

ssh-keygen -R <hostname|ip address>

Bu, ana bilgisayar adı girişini kaldıracak ve eskisi .known_hostgibi eskilerin yedeğini alacaktır.known_hosts.old


4
“Ama benim istediğim, ssh'nin hem eski anahtarı hem de yeni anahtarı kabul etmesi.” Cevabınız bunu yapmaz.
Samuel Edwin Ward
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.