ลบคีย์ออกจาก known_hosts


129

ฉันสร้างเครื่องเสมือนหลายเครื่องในช่วงสองสามสัปดาห์ที่ผ่านมา ปัญหาคือ.ssh/known_hostsให้ฉันคนที่อยู่ตรงกลางคำเตือน สิ่งนี้เกิดขึ้นเนื่องจากมีลายนิ้วมืออื่นเชื่อมโยงกับ IP เครื่องเสมือน

อย่างไรก็ตามใน.ssh/known_hostsไฟล์ฉันไม่พบเร็กคอร์ดที่เกี่ยวข้องกับ IP มีเพียงสองสตริงที่แปลกประหลาดเช่นคีย์และ "ssh-rsa"

ไม่มีใครมีความคิดใด ๆ เกี่ยวกับการลบคีย์เก่าจากknown_hosts?


7
"สตริงที่แปลกประหลาดเหมือนคีย์" ที่คุณอ้างถึงคือที่อยู่โฮสต์ / IP ที่แฮช คุณลักษณะด้านความปลอดภัยซึ่งจะช่วยหยุดไม่ให้ผู้บุกรุกทราบว่าระบบใดที่คุณสามารถเข้าถึงได้ หากคุณเห็นสิ่งนี้แสดงว่า ssh_config ของคุณHashKnownHosts yesตั้งค่าไว้
Deebster

1
หากคุณรู้สึกว่าเนื้อหาไฟล์สับสนเกินไปคุณอาจเปิดใช้การตัดบรรทัด ปิดใช้งาน บรรทัดทั้งหมดเริ่มต้นด้วยชื่อโฮสต์หรือที่อยู่ IP
Daniel B

คำตอบ:


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

จะแก้ไขไฟล์ ~ / .ssh / known_hosts: 6 โดยลบบรรทัดที่ 6

ในความเห็นของฉันการใช้ssh-keygen -Rเป็นวิธีแก้ปัญหาที่ดีกว่าสำหรับผู้ใช้ที่ใช้ openssh ในขณะที่ผู้ดูแลระบบ Linux ทั่วไปของคุณจะทำดีกว่าเพื่อให้ทักษะการใช้งานของพวกเขาสดโดยใช้วิธีการข้างต้น


18
ฉันไม่คิดว่าเป็นคำแนะนำที่ดีในการแก้ไขไฟล์กำหนดค่าด้วยตนเองหากคุณมีแอปพลิเคชันอย่างเป็นทางการ การรับความเสี่ยงไม่ได้ทำให้คุณเป็นมืออาชีพค้นหาตัวเลือกที่เร็วและปลอดภัยที่สุด มันก็เหมือนกับการบอกคนที่จะไปข้างหน้าและแก้ไขโดยไม่ต้อง/etc/sudoers visudoหากคุณต้องการฝึกฝนsedทักษะของคุณไปข้างหน้าและทำอย่างนั้นโดยไม่ทำให้ระบบของคุณยุ่ง
kraxor

2
"หากคุณมีแอปพลิเคชันอย่างเป็นทางการสำหรับ" => ทั้งสองssh-keygen -Rและsed -i {line}dสวย "เป็นทางการ" และทั้งสองจะทำงานในอนาคตอันใกล้ Util ssh-keygen อนุญาตให้ลบด้วยหมายเลขบรรทัดทั้งสองเป็นที่ยอมรับได้อย่างสมบูรณ์ (เพราะหมายเลขบรรทัดมักจะจัดการได้ง่ายกว่าและมีข้อผิดพลาดน้อยกว่าง่ายกว่าการจัดการกับชื่อโฮสต์ของศูนย์ข้อมูลที่ทันสมัย)
ไมเคิล

2
A) การลบบรรทัดที่ 6 โดยเฉพาะนั้นคือ "look no hands" ทั้งหมด ไม่มีคำอธิบายใด ๆ เกี่ยวกับสิ่งที่สำคัญเกี่ยวกับบรรทัดที่ 6 ของไฟล์! B) man ssh-keygenพูดถึงssh-keygen -R hostname คุณเพิ่งพูดssh-keygen -Rโดยไม่ระบุชื่อโฮสต์และคุณยังไม่ได้อธิบายสิ่งที่คุณหมายถึง
barlop

124

ทางออกที่ง่ายที่สุดคือ:

rm -f .ssh/known_hosts

ssh จะสร้างไฟล์ใหม่อีกครั้ง แต่คุณสูญเสียการตรวจสอบคีย์สำหรับโฮสต์อื่น!

หรือคุณสามารถใช้:

ssh-keygen -R "hostname"

หรือข้อความ ssh "man-in-the-middle" ควรระบุว่าบรรทัดใดของไฟล์ known_hosts ที่มีลายนิ้วมือที่ละเมิด แก้ไขไฟล์ข้ามไปที่บรรทัดนั้นและลบมัน


55
ssh-keygen -R hostnameจะทำงานด้วย
grawity

6
หากเราลบไฟล์นั้นคีย์อื่น ๆ ก็จะลบเช่นกัน
shgnInc

16
การลบไฟล์ออกเป็นคำแนะนำที่ไม่ดีเหมือนกับบอกให้ใครบางคนซื้อพีซีเครื่องใหม่เพราะไฟล์เก่านั้นมีเม้าส์ที่เสีย การแก้ไขไฟล์ด้วยตนเองที่สามารถแก้ไขได้โดยแอปพลิเคชันอย่างเป็นทางการก็เป็นความคิดที่ไม่ดีเช่นกัน ssh-keygenตัวเลือกที่ถูกเพิ่มเข้ามาเนื่องจากการแสดงความคิดเห็น แต่ไม่มีคำอธิบายใด ฉันไม่คิดว่าคำตอบนี้สมควรได้รับ upvotes มากมาย
kraxor

12
-1 เนื่องจากบรรทัดแรก "ลบทั้งไฟล์ known_hosts" ทั้งหมด นี่เป็นสิ่งที่น่ากลัวน่ากลัวและน่ากลัวและควรแก้ไข
Olivier Dulac

4
การแก้ปัญหานี้เกินความจริง เพียงลบบรรทัดที่ละเมิดออก แค่นั้นแหละ.
Blake Frederick

81

มีสวิตช์ ssh-keygen ( -R) สำหรับสิ่งนี้

man ssh-keygen อ่าน:

-R ชื่อโฮสต์

ลบคีย์ทั้งหมดที่hostnameเป็นของknown_hostsไฟล์ ตัวเลือกนี้มีประโยชน์ในการลบโฮสต์ที่ถูกแฮช (ดู-Hตัวเลือกด้านบน)


8
นี่เป็นวิธีที่ง่ายที่สุดและปลอดภัยที่สุด
ไก่

หมายเหตุ: การดำเนินการนี้จะเปลี่ยนการอนุญาตของไฟล์ known_hosts เป็น 0600 หากคุณมีไฟล์ known_hosts ที่ใช้ร่วมกันไม่ว่าด้วยเหตุผลใดก็ตามสิ่งนี้อาจปิดการใช้งานการแชร์ได้
Jiri Klouda

และหนึ่งที่ถูกต้อง นอกจากนี้ฉันต้องทำ[localhost]:portโดยใช้วงเล็บเพราะฉันใช้พอร์ตที่กำหนดเองฉันเดา = / เหมือนที่คนอื่นพูดผมจะใช้วิธีการตรวจสอบกุญแจ SSH สำหรับการพัฒนาระบบทดสอบ / ชั่วคราว
Pysis

สิ่งนี้จะลบ ocurences ทั้งหมดดังนั้นวิธีที่ดีที่สุด คุณสามารถเพิ่มรหัสใหม่ด้วย:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux

18

คำเตือนจะบอกบรรทัดที่แน่นอนในไฟล์โฮสต์ที่รู้จัก

นี่คือตัวอย่าง:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       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!

ดู/home/user/.ssh/known_hosts:6ส่วนหรือไม่ มันระบุไฟล์และหมายเลขบรรทัด


10

คุณต้องเรียกใช้คำสั่งต่อไปนี้เพื่อกำจัดปัญหานี้ เปิดเทอร์มินัลแล้วพิมพ์คำสั่งต่อไปนี้:

สำหรับตัวอย่างทั้งหมดด้านล่างเพียงแทนที่ค่าหลังจาก -R

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

วิธีนี้ได้รับการแนะนำในคำตอบก่อนหน้า คุณช่วยขยายคำตอบที่แตกต่างออกไปได้ไหม?
Burgi

@Burgi - คำตอบนี้ให้รายละเอียดเพิ่มเติมเกี่ยวกับไวยากรณ์ของssh-keygen -Rคำตอบอื่น ๆ มันแสดงตามตัวอย่างสิ่งที่คุณเขียน-Rได้อย่างแน่นอน ดังนั้นคำตอบนี้จะคุ้มค่าแม้ว่ามันจะไม่ใช่คำตอบใหม่ทั้งหมด
Yitz

@Yitz ความคิดเห็นของฉันถูกสร้างขึ้นเพื่อเป็นส่วนหนึ่งของบทวิจารณ์ ในเวลา (18 เดือนที่ผ่านมา) ฉันคิดว่าคำถามต้องการความช่วยเหลือเล็กน้อยเพื่อให้ดีขึ้น
Burgi

8

คุณยังสามารถสั่งให้ ssh ไม่ตรวจสอบไฟล์ known_hosts โดยใช้การตั้งค่าสถานะ UserKnownHostsFile และ StrictHostKeyChecking

ตัวอย่างเช่น

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

เพื่อความสะดวกในการใช้งานคุณสามารถใช้นามแฝงนี้:

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

ตอนนี้คุณสามารถทำได้เพียงแค่กล้าเมื่อใดก็ตามที่คุณมั่นใจว่าคุณเชื่อถือใบรับรองของเซิร์ฟเวอร์


8
ช่างเป็นความคิดที่น่ากลัว ปิดการใช้งานเลเยอร์ความปลอดภัยอย่างถาวรเพียงเพราะคุณขี้เกียจเกินไปที่จะทำให้~/.ssh/known_hostsทันสมัยอยู่เสมอ? ทำไมไม่ลองใช้ต่อไปtelnetล่ะ? "เมื่อใดก็ตามที่คุณมั่นใจ" - ถ้าคุณแน่ใจแล้วคุณไม่มีความคิดว่าการโจมตีของ MITM คืออะไรและคุณควรใช้เวลาอ่านวรรณกรรมดีๆสักเล่ม
kraxor

2
จากคำถามของ OP ฉันคิดว่านี่เป็นคำตอบที่ถูกต้อง บางครั้งคุณมีระบบทดสอบที่คุณกำลังสร้าง / ทำลาย VMs จำนวนมาก (ฉันกำลังทำสิ่งนี้ในขณะที่ฉันเตรียมสอบ RHCE) อาจไม่มีความเกี่ยวข้องด้านความปลอดภัย ในขณะที่การสังเกตถึงผลกระทบด้านความปลอดภัยนั้นยอดเยี่ยมฉันไม่คิดว่าสิ่งนี้จะต้องมีป้ายกำกับว่าเป็น "ความคิดที่น่ากลัว"
Rick Chatham

เกี่ยวข้อง: superuser.com/a/1126243/73961
michael

3

คำตอบทั้งหมดเป็นสิ่งที่ดี แต่สำหรับ SSH จริงเราไม่มีข้อมูลวิธีการลบลายเซ็น ssh ด้วยหมายเลขพอร์ต

  • คำสั่งลบโฮสต์ SSH แบบง่าย ๆ :

    ssh-keygen -R example.com
    
  • การลบคีย์ ssh ที่ซับซ้อนเช่นคุณเชื่อมต่อกับ ssh บนพอร์ตที่ไม่ใช่มาตรฐาน 222:

    ssh example.com -p 222
    

และคุณได้รับคำเตือนและหากต้องการลบสิ่งนี้คุณต้องใช้หมายเลขพอร์ตโคลอนสแควร์วงเล็บ:

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

หวังว่านี่จะช่วยผู้ใช้ที่ไม่ได้มาตรฐาน


สิ่งที่ฉันกำลังมองหา ขอขอบคุณ!
aexl

1

นี่คือวิธีการใช้โปรแกรมแก้ไข Ex:

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

โดยที่ 6 คือหมายเลขบรรทัดของคุณที่กล่าวถึงในข้อความเตือน เช่นนี้

คีย์ที่ละเมิดสำหรับ IP ใน /home/user/.ssh/known_hosts:6 <== หมายเลขบรรทัด


โดยทั่วไปควรใช้exเพื่อแก้ไขไฟล์ที่ไม่ใช่แบบโต้ตอบแทนที่จะsedเป็นS tream ED itor และ-iพารามิเตอร์ซึ่งเป็นส่วนเสริม FreeBSD ที่ไม่ได้มาตรฐาน


0

รายการสำหรับชื่อโฮสต์หรือ ip ควรอยู่ในคอลัมน์แรก คำเตือนควรแสดงหมายเลขบรรทัดที่มีคีย์ที่ละเมิดอยู่


0

นอกจากนี้คุณยังสามารถลบบรรทัดเดียวออกจากโฮสต์ที่รู้จักด้วยเช่นrmknownhost 111 (111 เป็นบรรทัดที่จะลบ):

#! /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 * ""}

บันทึกเป็นในโฟลเดอร์จากคุณrmknownhostPATH


ประโยชน์ของการทำสิ่งนี้กับการแก้ไขข้อความใด ๆ มีเหตุผลบางอย่างที่จะไม่ทำอย่างนั้นเช่นเดียวกับวิธี sudoers จะต้องมีการแก้ไขด้วย visudo?
Andy Lester

Distros มาพร้อมกับสิ่งนี้ อูบุนตูดูเหมือนจะไม่มีมัน
flickerfly

ประโยชน์ก็คือมันเป็นระบบอัตโนมัติและรวดเร็ว / เป็นไบนารีแยกต่างหากที่คุณเพิ่มด้วยตัวคุณเอง
Grosser

2
คุณสามารถโพสต์สคริปต์ของคุณที่นี่แทนที่จะเชื่อมโยงรายการบล็อกของคุณที่คุณสร้างขึ้นในวันที่คุณโพสต์คำตอบนี้ สิ่งนี้มีคุณสมบัติเป็นสแปม IMHO ไม่ต้องพูดถึงว่าคุณสามารถสร้างนามแฝงง่ายๆเพื่อให้ได้ผลลัพธ์เดียวกันโดยไม่จำเป็นต้องใช้สคริปต์ทับทิมยาว 7 บรรทัด
kraxor

1
หรือเพียงแค่เพิ่มนี้ที่คุณ ~ / .bashrc: และเรียกมันด้วยsshdel() { sed -i "${@}d" ~/.ssh/known_hosts; } sshdel [line number]ไม่มีทับทิมไม่มีไบนารีไม่ต้องกังวล
rubynorails

0

มันเป็นไฟล์ข้อความ คุณสามารถแก้ไขได้อย่างง่ายดายด้วย vi (m) และเพียงแค่ลบบรรทัดที่เป็นปัญหา (dd) และบันทึกไฟล์ (wq) แต่ถ้ามีคำสั่งเฉพาะในการลบโฮสต์นั่นอาจเป็นวิธีที่ปลอดภัยที่สุด


ฉันไม่เห็นว่าการแก้ไขไฟล์โดยตรงใน VIM นั้นเป็น "ไม่ปลอดภัย" หรือไม่ มันขึ้นอยู่กับระดับความสะดวกสบายของคุณด้วย VIM โดยเฉพาะอย่างยิ่งกับไฟล์นี้ความเสี่ยงที่ใหญ่ที่สุดที่คุณมีคือการลบคีย์มากเกินไปซึ่งในกรณีนี้คุณจะได้รับแจ้งอีกครั้ง
Rick Chatham

"ความปลอดภัย" ฉันหมายถึงเกี่ยวข้องกับ 1) ลืม / ไม่รู้ว่าจะลบข้อมูลที่เกี่ยวข้องในไฟล์อื่น ๆ (ถ้ามี) และ 2) การลบโดยไม่ตั้งใจมากกว่าหรือน้อยกว่าความต้องการจึงทำให้ไฟล์แตก
Ryan Griggs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.