Bilinen_host'lardan anahtarı kaldır


129

Son birkaç hafta boyunca birkaç sanal makine yaptım. Sorun şu ki, .ssh/known_hostsbana ortadaki uyarıda Adam veriyor . Bu, başka bir parmak izi sanal makine IP adresiyle ilişkilendirildiği için gerçekleşir.

Gelen .ssh/known_hostsdosyanın, ancak, IP ile ilgili kayıt, sadece iki tuhaf, anahtar benzeri dizeleri ve "ssh-rsa" bulmuyorum.

Eski anahtarın nasıl kaldırılacağı hakkında fikri olan var mı known_hosts?


7
Bahsettiğiniz "tuhaf, anahtar benzeri dizeler", karma host / ip adresleridir. Bu, davetsiz misafirlerin hangi sistemlere erişiminiz olduğunu bilmesini engelleyen bir güvenlik özelliğidir. Bunu görürseniz, ssh_config'iniz HashKnownHosts yesayarlamıştır.
Deebster

1
Dosya içeriğinin çok kafa karıştırıcı olduğunu düşünüyorsanız, muhtemelen satır sarma etkindir. Devre dışı bırak. Tüm satırlar bir ana bilgisayar adı veya IP adresi ile başlar.
Daniel B,

Yanıtlar:


90
sed -i '6d' ~/.ssh/known_hosts

Dosyayı değiştirecek ~ / .ssh / known_hosts: 6, 6. satırı kaldırarak.

Bence, ssh-keygen -Rbir openssh uzman kullanıcı için kullanmak daha iyi bir çözümken, düzenli Linux yöneticiniz yukarıdaki yöntemi kullanarak becerilerini taze tutmak için daha iyisini yapacaktır.


18
Resmi bir başvurunuz varsa, bir yapılandırma dosyasını el ile düzenlemenin iyi bir fikir olduğunu sanmıyorum. Risk almak sizi profesyonel yapmaz, en hızlı ve en güvenli seçeneği bulur. Bu devam edin ve düzenlemek için kişi demek gibi bir şey /etc/sudoersolmadan visudo. sedBecerilerinizi geliştirmek istiyorsanız , devam edin ve bunu sisteminizi mahvetmeden yapın.
kraxor

2
"Bunun için resmi bir başvurunuz varsa" => her ikisi de ssh-keygen -Rve sed -i {line}doldukça "resmi" iseniz ve her ikisi de öngörülebilir gelecek için çalışacaktır. Util ssh-keygen satır numarasına göre kaldırılmasını sağlar, her ikisi de mükemmel şekilde kabul edilebilir (satır numaralarının üstesinden gelmek genellikle daha kolaydır ve modern veri merkezi ana bilgisayar adları ile uğraşmaktan daha az hataya eğilimlidir).
michael

2
A) Spesifik olarak 6. çizginin silinmesi, hepsi "el ele görünmüyor". Dosyanın 6. satırıyla ilgili neyin önemli olduğuna dair hiçbir açıklama yok !! B) Ayrıca man ssh-keygen, henüz bir ana bilgisayar adı belirtilmemişken ssh-keygen -R hostname söylediğinizden bahsettiniz ssh-keygen -Rve bununla ne demek istediğinizi açıklamadınız.
barlop

124

En basit çözüm şudur:

rm -f .ssh/known_hosts

ssh dosyayı yeniden oluşturur, ancak diğer ana bilgisayarlar için anahtar kontrolünü kaybedersiniz!

Veya kullanabilirsiniz:

ssh-keygen -R "hostname"

Veya ssh "ortadaki adam" mesajı, known_hosts dosyasının hangi satırının rahatsız edici parmak izine sahip olduğunu göstermelidir. Dosyayı düzenleyin, o satıra atlayın ve silin.


55
ssh-keygen -R hostnamede çalışacak.
Grawity

6
Bu dosyayı kaldırırsak, diğer anahtarlar da kaldırılır.
shgnInc

16
Dosyayı kaldırmak kötü bir tavsiyedir, eskiine bozuk bir fare olduğundan birisine yeni bir PC almasını söylemek gibi bir şey. Resmi bir başvuru ile düzenlenebilecek bir dosyayı elle düzenlemek de kötü bir fikirdir. Bu ssh-keygenseçenek yorum nedeniyle eklenmiştir, ancak açıklama yapılmamıştır. Bu cevabın o kadar çok hak etmediğini sanmıyorum.
kraxor

12
-1 çünkü "tüm bilinen_hosts dosyasını sil" ilk satırları. Bu, teklif etmek için korkunç, korkunç, korkunç bir şeydir ve düzenlenmelidir.
Olivier Dulac

4
Bu çözüm overkill. Sadece rahatsız edici çizgiyi kaldırın. Bu kadar.
Blake Frederick

81

Bunun için bir ssh-keygen anahtarı ( -R) var.

man ssh-keygen okur:

-R hostname

hostnameBir known_hostsdosyaya ait tüm anahtarları kaldırır . Bu seçenek, karma ana bilgisayarları silmek için kullanışlıdır ( -Hyukarıdaki seçeneğe bakın ).


8
Bu en kolay ve en güvenli yöntemdir.
tavuk

Not: Bu, known_hosts dosyasının izinlerini 0600 olarak değiştirir. Herhangi bir nedenle paylaşılan bir bilinen_hosts dosyanız varsa, bu dosyanın paylaşımını devre dışı bırakabilir.
Jiri Klouda

ve doğru olanı. Ayrıca, [localhost]:portparantez kullanarak yapmak zorunda kaldım çünkü sanırım özel bir port kullandım. Diğerlerinin de dediği gibi, geçici / test sistem geliştirmem için SSH anahtar kontrol yaklaşımını kullanmayacağım.
Pysis

Bu, tüm olayları en iyi şekilde ortadan kaldırır. Ile yeni anahtar ekleyebilirsiniz:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux

18

Uyarı size bilinen ana bilgisayar dosyasındaki tam satırı söyleyecektir.

İşte bir örnek:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Bkz /home/user/.ssh/known_hosts:6parçasını? Dosya ve satır numarasını belirtir.


10

Bu sorundan kurtulmak için aşağıdaki komutu kullanmanız gerekir. Terminali açın ve aşağıdaki komutu yazın:

Aşağıdaki tüm örnekler için sadece -R sonrası değeri değiştiriniz.

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com

Bu yöntem önceki cevaplarda zaten önerilmişti. Cevabınızda farklı olan şeyleri genişletebilir misiniz?
Burgi

@Burgi - bu cevap, ssh-keygen -Rşu ana kadarki cevaplardan herhangi birinin sözdizimi hakkında daha fazla ayrıntı verir . Örnek olarak tam olarak ne yazabileceğinizi gösterir -R. Bu yüzden bu cevap tamamen yeni bir cevap olmasa da faydalıdır.
Yitz

@Yitz Yorumumun bir incelemesi yapıldı. O sırada (18 ay önce), sorunun daha iyi olması için biraz yardıma ihtiyacı olduğunu düşündüm.
Burgi

8

Ssh'ye, UserKnownHostsFile ve StrictHostKeyChecking bayraklarını kullanarak known_hosts dosyasını kontrol etmemesini söyleyebilirsiniz.

Örneğin:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

Kullanım kolaylığı için bu takma adı kullanabilirsiniz:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Artık, sunucunun sertifikasına güvendiğinizden emin olduğunuzda sadece cıvatalayabilirsiniz.


8
Ne korkunç bir fikir. Güncelliğinizi korumak için fazla tembel olduğunuz için kalıcı olarak bir güvenlik katmanını devre dışı bırakın ~/.ssh/known_hosts. Neden sadece devam edip kullanmıyorsun telnet? "Ne zaman emin olursanız olun" - emin iseniz, o zaman bir MITM saldırısının ne olduğu hakkında hiçbir fikriniz yoktur ve muhtemelen iyi bir edebiyat okumak için biraz zaman harcamalısınız.
kraxor

2
OP'nin sorusuna dayanarak bence bu geçerli bir cevap. Bazen üzerinde çok sayıda VM oluşturduğunuz / imha ettiğiniz bir test sisteminiz vardır. (RHCE sınavına hazırlanırken şu anda bunu yapıyorum.) Herhangi bir güvenlik çıkarımı olmayabilir. Güvenlik etkilerini belirtmek harika olsa da, bunun "korkunç bir fikir" olarak etiketlenmesi gerektiğini düşünmüyorum.
Rick Chatham,


3

Tüm cevaplar iyidir, ancak gerçek SSH profesyonelleri için ssh imzasının port numarası ile nasıl kaldırılacağı konusunda bilgi eksik.

  • Basit SSH ana bilgisayar imzası kaldırma komutu:

    ssh-keygen -R example.com
    
  • Karmaşık ssh anahtarı kaldırılır, örneğin standart olmayan 222 numaralı bağlantı noktasındaki ssh'ye bağlanırsınız:

    ssh example.com -p 222
    

ve uyarı alırsınız ve bunu kaldırmak için köşeli parantez sütun port numarası kullanmanız gerekir:

    ssh-keygen -R [example.com]:222

Bu standart olmayan yapılandırma kullanıcıları için yardımcı olur umarım.


Tam olarak aradığım şey. Teşekkür ederim!
aexl

1

Ex editörü kullanarak bir yöntem:

ex +6d -scwq ~/.ssh/known_hosts

Buradaki 6. numara, uyarı mesajında ​​belirtilen numaradır. Bunun gibi:

/Home/user/.ssh/known_hosts:6 adresindeki IP için kırılgan anahtar: <== LINE NUMBER


Genel olarak, kullanımı tavsiye edilirex üzere olmayan etkileşimli dosyaları düzenlemek yerine seddaha bir olan S Team, ED in- ve -istandart dışı bir FreeBSD uzantısıdır parametresi.


0

Ana bilgisayar adı veya ip için giriş ilk sütunda olmalıdır. Uyarı ayrıca, rahatsız edici anahtarın bulunduğu satır numarasını da listelemelidir.


0

Tek bir satırı, örneğin rmknownhost 111 ile bilinen ana bilgisayarlardan kaldırabilirsiniz (111, kaldırılacak satırdır):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

Bunu, rmknownhostiçindeki bir klasöre kaydedin PATH.


Bunun herhangi bir metin editöründe yapmanın faydası nedir? Bu şekilde yapmamak için bir neden var mı, sudo'ların visudo ile nasıl düzenlenmeleri gerektiği gibi?
Andy Lester,

Bununla hangi dağıtımlar geliyor? Ubuntu'da görünmüyor.
flickerfly

Avantajı otomatik ve hızlı olmasıdır / kendinize eklediğiniz ayrı bir ikilidir
grosser

2
Bu yanıtı gönderdiğiniz gün oluşturduğunuz kendi blog girişinizi bağlamak yerine betiğinizi burada yayınlamış olabilirsiniz. Bu spam IMHO olarak nitelendirir. Aynı sonucu elde etmek için basit bir takma ad oluşturacağınızdan bahsetmiyorum bile, 7 satırlık bir yakut komut dosyasına gerek yok.
kraxor

1
veya bunu ~ / .bashrc: cihazınıza ekleyin sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }ve ile arayın sshdel [line number]. yakut yok, ikili yok, endişelenme.
rubynorails

0

Bu bir metin dosyasıdır. Vi (m) ile kolayca düzenleyebilir ve söz konusu satırı (dd) silebilir ve dosyayı (wq) kaydedebilirsiniz. Ancak bir ana bilgisayarı kaldırmak için belirli bir komut varsa, bu muhtemelen en güvenli yöntemdir.


Dosyayı doğrudan VIM'de düzenlemenin "güvensiz" olduğunu anlamıyorum. VIM ile konfor seviyenizi temel alır. Özellikle bu dosyada, sahip olduğunuz en büyük risk çok fazla anahtarı silmektir, bu durumda tekrar istenir.
Rick Chatham,

“Güvenlik”, 1) diğer dosyalardaki (eğer varsa) bağımlı bilgileri silmeyi unutmamak / bilmemek ve 2) istemeden gerekenden daha fazla veya daha azının yanlışlıkla silinmesini ve böylece dosyanın parçalanmasını içerir.
Ryan Griggs
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.