“ เพิ่มคีย์โฮสต์ที่ถูกต้องใน known_hosts” / หลายคีย์โฮสต์ ssh ต่อชื่อโฮสต์?


147

พยายาม ssh เข้าสู่คอมพิวเตอร์ที่ฉันควบคุมฉันได้รับข้อความที่คุ้นเคย:

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

แน่นอนฉันเปลี่ยนกุญแจ และฉันอ่านโพสต์ไม่กี่โหลบอกว่าวิธีการแก้ไขปัญหานี้คือการลบคีย์เก่าออกจากknown_hostsไฟล์

แต่สิ่งที่ฉันต้องการคือให้ ssh ยอมรับทั้งคีย์เก่าและคีย์ใหม่ ภาษาในข้อความแสดงข้อผิดพลาด (" Add correct host key") แสดงว่าควรมีวิธีการเพิ่มคีย์โฮสต์ที่ถูกต้องโดยไม่ต้องลบรหัสเดิม

ฉันไม่สามารถหาวิธีเพิ่มโฮสต์คีย์ใหม่ได้โดยไม่ต้องลบคีย์เก่า

เป็นไปได้หรือเป็นข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิดมาก


9
นี่คือรหัสโฮสต์ที่สร้างข้อผิดพลาด โฮสต์ควรมีหนึ่งและคีย์เดียวเท่านั้น สิ่งนี้ไม่เกี่ยวกับไคลเอ็นต์หรือคีย์ผู้ใช้ คุณมีที่อยู่ IP หนึ่งที่ลอยระหว่างโฮสต์ที่แตกต่างกันหรือบางสิ่งบางอย่าง?
David Schwartz

4
ในกรณีของฉันฉันรู้ว่าฉันจะต้องสลับระหว่างสองปุ่มมากในอนาคตอันใกล้ขณะที่เล่นซอกับบางสิ่ง ดูเหมือนว่าสิ่งนี้จะเป็นประโยชน์ใน IP เดียวที่มีหลายโฮสต์ที่คุณแนะนำ ส่วนใหญ่ฉันแค่อยากรู้ว่ามันเป็นไปได้สำหรับการศึกษาของตัวเองนอกเหนือจากการใช้งานจริงใด ๆ
ซามูเอลเอ็ดวินวอร์ด

คำตอบ:


148
  1. รับ rsa key ของเซิร์ฟเวอร์ของคุณที่server_ipอยู่ IP ของเซิร์ฟเวอร์ของคุณอยู่ที่ใดเช่น192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    คำตอบตัวอย่าง:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. และบนไคลเอ็นต์ให้คัดลอกบรรทัดการตอบกลับทั้งหมดserver_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...และเพิ่มคีย์นี้ที่ด้านล่างของ~/.ssh/known_hostsไฟล์ของคุณ:

    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
สิ่งนี้ได้ผล! อย่างไรก็ตามฉันใช้ "HashKnownHosts" ดังนั้นรายการจึงดูแปลกไปหน่อย โชคดีที่ ssh_config (5) ชี้ให้ฉันไปที่ ssh-keygen (1) ซึ่งอธิบายว่าฉันสามารถใช้ "ssh-keygen -H" เพื่อแฮชรายการที่ไม่ได้แฮช ขอขอบคุณ!
ซามูเอลเอ็ดวินวอร์ด

2
นี้ "ผลงาน" แต่คุณจะไม่ได้รับการตรวจสอบที่สำคัญเพื่อให้คุณมีความเสี่ยงต่อการโจมตี MITM ...
JasperWallace

3
@ JasperWallace ตราบใดที่ขั้นตอนแรกจะทำผ่านการเชื่อมต่อที่ปลอดภัย (ตัวอย่างเช่นการใช้ localhost) มันควรจะค่อนข้างปลอดภัยฉันคิดว่า
ony

3
มีวิธีใดในการรวบรวมคีย์ทั้งหมดจากเซิร์ฟเวอร์หรือไม่ บางครั้งคุณไม่ทราบว่าพวกเขาเป็น RSA, DSA, ECDSA, RSA1 ... ฯลฯ
Sopalajo de Arrierez

3
@SopalajodeArrierez manpage เดียวกันก็บอกว่าคุณสามารถแยกประเภทด้วยเครื่องหมายจุลภาคได้ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip- แต่เหตุผลเดียวในการค้นหาrsa1และdsaกุญแจคือการระบุเซิร์ฟเวอร์ที่ต้องอัพเกรด / กำหนดค่าใหม่
kbolino

94

ลบรายการนั้นจาก known_hosts โดยใช้:

ssh-keygen -R *ip_address_or_hostname*

การดำเนินการนี้จะลบ IP ที่มีปัญหาหรือชื่อโฮสต์ออกจากไฟล์known_hostsแล้วลองเชื่อมต่ออีกครั้ง

จากหน้าคน:

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


11
"วิธีเพิ่มหมายเลขโฮสต์ใหม่โดยไม่ต้องลบรหัสเดิม"
ซามูเอลเอ็ดวินวอร์ด

4
นี่คือทางออกที่ดีที่สุด!
โทมัส Decaux

8
สิ่งนี้มี 19 คะแนน? ไม่ใกล้ที่จะตอบคำถามที่ถาม ..
Molomby

2
คำถามของคุณเกิดขึ้นที่สองเมื่อฉัน google หา "git ssh update host key โดยอัตโนมัติ" คำตอบนี้คือสิ่งที่ฉันกำลังมองหา การเปิดคำถามใหม่ด้วยสิ่งที่ฉันต้องการอย่างแน่นอนอาจทำให้คำถามนั้นซ้ำซ้อน
Jason Goemaat

ชื่อโฮสต์ทำงานด้วย
damluar

18

วิธีที่ง่ายมากคือ:

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

จากนั้นแก้ไข known_hosts เพื่อล้างคีย์เดิมจากนั้น ssh ไปยังโฮสต์โดยใช้:

ssh name@computer

มันจะเพิ่มรหัสใหม่โดยอัตโนมัติ จากนั้นเปรียบเทียบทั้งสองไฟล์ โปรแกรมเช่น meld เป็นวิธีที่ดีในการเปรียบเทียบสองไฟล์ จากนั้นผสานไฟล์เพื่อทำให้ known_hosts มีทั้งสองคีย์

'เหตุผล' ของฉันสำหรับการเก็บสองปุ่มคือระบบปลายทางนั้นเป็นมัลติบูทแม้ว่าฉันกล้าพูดว่ามีวิธีการซิงโครไนซ์คีย์ระหว่างการติดตั้งดูเหมือนว่าจะง่ายกว่ามากสำหรับการอนุญาตให้ใช้หลายปุ่ม

แก้ไข 2015/06

ฉันควรเพิ่มกลับมาตอนนี้ฉันสังเกตเห็นวิธีที่ง่ายยิ่งขึ้น [ตราบใดที่รายการสามารถระบุตัวตนได้ตามปกติจากชื่อโฮสต์ / ที่อยู่ IP ค่อนข้างนอกเหนือจากข้อความแสดงข้อผิดพลาดที่อ้างถึงตำแหน่งเฉพาะ];

  1. แก้ไข known_hosts เพื่อเพิ่ม # ที่จุดเริ่มต้นของรายการ 'old' ใน known_hosts ชั่วคราว
  2. เชื่อมต่อ [ssh กับโฮสต์] ยอมรับการแจ้งเตือนเพื่อเพิ่มคีย์ใหม่ 'อัตโนมัติ'
  3. จากนั้นแก้ไข known_hosts อีกครั้งเพื่อลบ #

มีแม้กระทั่งตัวเลือก HostKeyAlias ​​เหมือนกัน

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

หลังจากนั้นหลังจากลูกค้า ssh เพิ่มคีย์ใหม่ภายใต้นามแฝงคุณสามารถแก้ไข known_hosts เพื่อแทนที่ชื่อโฮสต์ / ที่อยู่ IP 'ของจริง' สำหรับนามแฝงหรือเชื่อมต่อกับการจุติของโฮสต์นั้นด้วยตัวเลือกนามแฝงอีกต่อไป


อันนี้ 'รวม'? meldmerge.org
Samuel Edwin Ward

นั่นคือ meld :) ชื่อการติดตั้ง apt-get / yum นั้นเรียบง่าย
Mark

ฉันทำข้อเสนอแนะของคุณหลายอย่างซึ่งทำงานได้ดี - แทนที่จะเป็น cp, mv, จากนั้น ssh, จากนั้น cat ~ / .ssh / known_hosts.bak ~ / .ssh / known_hosts> tmp; mv tmp ~ / .ssh / known_hosts
Peter N Lewis

6

ฉันมีปัญหาเดียวกันกับราสเบอร์รี่ปี่ที่ฉันบูตด้วยระบบที่แตกต่างกันหลายระบบ (ระบบ dev สำหรับรวบรวมแขนไบนารีโครงการ xbmc และอื่น ๆ ) และพบปัญหาเดียวกัน พวกเขาใช้ DHCP ในเครือข่ายท้องถิ่นและเราเตอร์ของฉันมักจะนำ IP เดียวกันมาใช้เสมอเนื่องจากที่อยู่ MAC เหมือนกัน ฉันแก้ไขมันโดยใช้ชื่อโดเมนอื่นในไฟล์โฮสต์ของฉัน:

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

ไฟล์ known_hosts บันทึกลายนิ้วมือด้วยชื่อโฮสต์ดังนั้นแม้ว่าจะเป็นที่อยู่ IP เดียวกัน แต่ชื่อโฮสต์ที่ไม่ซ้ำกันแต่ละชื่อก็จะมีรายการที่แตกต่างกัน

ฉันเบื่อการเพิ่มชื่อไปยังไฟล์โฮสต์ทุกครั้งที่ฉันใช้ระบบใหม่ดังนั้นฉันจึงคิดวิธีที่ขี้เกียจกว่านี้ด้วยการใช้เลขศูนย์นำหน้าในที่อยู่ IP เช่น:

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

แต่ละรูปแบบของที่อยู่ (uncanonicalized) ที่อยู่ IP จะได้รับรายการของตัวเองใน known_hosts


1
กลุ่มคน OpenSSH มีความฉลาดสำหรับฉันช่องโหว่นี้ไม่สามารถใช้งานได้ในเวอร์ชั่นล่าสุด
Mike

คุณสามารถใช้CheckHostIP noใน~/.ssh/configเพื่อให้สามารถยังคงใช้ช่องโหว่ คุณสามารถกำหนดนามแฝงของคุณที่นั่นเพื่อที่คุณจะได้ไม่ต้องทำเรื่องยุ่งยาก/etc/hostsและกำหนดCheckHostIP noเฉพาะชื่อโฮสต์ 3 ชื่อนี้
GnP

3

ถ้าทั้งลูกค้าและเซิร์ฟเวอร์ของคุณมี OpenSSH 6.8 หรือใหม่กว่า, คุณสามารถใช้UpdateHostKeys yesตัวเลือกในของคุณหรือssh_config ~/.ssh/configตัวอย่างเช่น:

Host *
    UpdateHostKeys yes

สิ่งนี้ทำให้ SSH จัดเก็บคีย์โฮสต์ทั้งหมดที่เซิร์ฟเวอร์ต้องใช้known_hostsและเมื่อเซิร์ฟเวอร์เปลี่ยนแปลงหรือลบคีย์โฮสต์หนึ่งคีย์จะมีการเปลี่ยนแปลงหรือลบคีย์ในของคุณknown_hostsด้วย


นี่คือคำตอบที่มีประโยชน์ที่สุด! แม้ว่าจะไม่ได้เสนอวิธีการแก้ไขคำถามเดิมอย่างชัดเจนหากคีย์โฮสต์เปลี่ยนไปแล้ว แต่คำตอบอื่น ๆ ทั้งหมดนั้นไม่ปลอดภัยเนื่องจากไม่ได้ตรวจสอบความถูกต้องของรหัสโฮสต์ใหม่ ตัวเลือกนี้ช่วยให้คุณสามารถรักษาความปลอดภัยแบบโรลโอเวอร์กับคีย์โฮสต์ใหม่
Jaap Eldering

1

ฉันไม่เห็นสาเหตุที่คุณต้องการทำงานกับสองปุ่ม แต่คุณสามารถเพิ่มรหัสที่ถูกต้องมากกว่าหนึ่งคีย์ใน~/.ssh/known_hostsไฟล์ได้ แต่คุณจะต้องทำด้วยตนเอง

โซลูชันอื่นอาจใช้StrictHostKeyChecking=noตัวเลือกสำหรับโฮสต์นี้:

ssh -o StrictHostKeyChecking=no user@host

ซึ่งคุณสามารถใส่นามแฝงใน~/.profileหรือสิ่งที่คล้ายกัน

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

StrictHostKeyChecking ดูเหมือนจะไม่ช่วยในกรณีนี้ เห็นได้ชัดว่ามันระบุพฤติกรรมเมื่อโฮสต์ไม่ได้อยู่ในไฟล์ known_hosts เท่านั้น พูดถึงที่นี่: gossamer-threads.com/lists/openssh/dev/45349#45349
ซามูเอลเอ็ดวินวอร์ด

มันใช้งานได้ที่นี่ คุณจะได้รับคำเตือน แต่การเข้าสู่ระบบจะดำเนินต่อไป
สเวน

มันแปลกมาก คุณใช้การตรวจสอบรหัสผ่านหรือไม่ คุณใช้ OpenSSH หรือไม่
ซามูเอลเอ็ดวินวอร์ด

1

หากคุณเพียง ssh เข้าสู่เครือข่ายท้องถิ่นแล้ว ...

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

เช่น

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

จากนั้นกด space, backspace cntl + x และ 'y' เพื่อบันทึกบัฟเฟอร์ใหม่ (ไฟล์) มันเป็นการปฏิบัติที่ไม่ดี แต่ไม่เป็นไรหากคุณไม่ได้อยู่นอกเครือข่ายท้องถิ่นของคุณเป็นประจำ (เช่นมหาวิทยาลัยเดียวหรือเซิร์ฟเวอร์ทำงาน)

ในเครือข่ายท้องถิ่นที่ปลอดภัยสิ่งนี้มีความปลอดภัยเพราะคุณไม่สามารถโจมตีชายกลางได้

มันดีกว่าเสมอที่จะใช้รหัสที่คุณเข้าใจ!


4
การเช็ดknown_hostsไฟล์ทั้งหมดในแต่ละครั้งจะเป็นการปฏิเสธความปลอดภัยส่วนใหญ่ที่ ssh จัดเตรียมไว้
kasperd

แน่นอนฉันจะยืนยันว่าในเครือข่ายภายในที่ปลอดภัยมันจะปลอดภัยกว่าที่จะเข้าใจรหัสของคุณและหลีกเลี่ยงการรักษาความปลอดภัยมากกว่าที่จะคัดลอกรหัสอย่างไร้เหตุผล บนเครือข่ายภายนอกสถานการณ์จะแตกต่างกัน
แอรอน

-1

คำตอบมากมาย แต่มากมายที่ให้การป้องกันโดยการปิดการตรวจสอบโฮสต์อย่างเข้มงวดทั้งหมดหรือทำลายข้อมูลโฮสต์ที่ไม่เกี่ยวข้องหรือเพียงบังคับให้ผู้ใช้ยอมรับการโต้ตอบคีย์อาจเป็นไปได้ในภายหลังเมื่อไม่คาดคิด

นี่เป็นเทคนิคง่ายๆที่ช่วยให้คุณสามารถออกจากการตรวจสอบโฮสต์อย่างเข้มงวด แต่อัปเดตรหัสในวิธีที่ควบคุมได้เมื่อคุณคาดว่าจะมีการเปลี่ยนแปลง:

  • ลบคีย์เก่าและอัปเดตในคำสั่งเดียว

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • ทำซ้ำกับที่อยู่ IP หรือชื่อโฮสต์อื่น ๆ หากคุณใช้

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

วิธีการนี้ยังตรวจสอบการเชื่อมต่อและส่งข้อความที่ดีสำหรับบันทึกในคำสั่ง ssh (ซึ่งเข้าสู่ระบบอัปเดตโฮสต์คีย์และส่งออกคีย์โฮสต์ SSH อัปเดตแล้วออกจากทันที

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

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


-3

ฉันมีปัญหาเดียวกัน.

สิ่งที่ฉันทำsudo nano /home/user/.ssh/ host_allowและลบกุญแจ

เมื่อฉันกลับไปที่เซิร์ฟเวอร์มันเพิ่มรหัสใหม่


2
ข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่เกิดเหตุการณ์นี้จะเป็นประโยชน์ต่อคำตอบ
Drew Khoury

-4

ใช้คำสั่ง sed เพื่อลบบรรทัดที่ละเมิดออก

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

ลบบรรทัด 86 ดังที่กล่าวไว้ในโฮสต์ที่รู้จัก

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

ครั้งต่อไปเมื่อเข้าถึงโดยใช้ ssh ระบบจะเพิ่มรหัสใหม่โดยอัตโนมัติ

รุ่นที่ใหม่กว่าของ ssh

ใช้:

ssh-keygen -R <hostname|ip address>

มันจะลบรายการชื่อโฮสต์และสำรองข้อมูลเก่า.known_hostเป็นknown_hosts.old


4
"แต่สิ่งที่ฉันต้องการคือให้ ssh ยอมรับทั้งคีย์เก่าและคีย์ใหม่" คำตอบของคุณไม่ได้ทำเช่นนี้
ซามูเอลเอ็ดวินวอร์ด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.