ssh: รับกุญแจอัตโนมัติ


218

ฉันได้เขียนสคริปต์อรรถประโยชน์นี้ขนาดเล็ก:

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

เมื่อเซิร์ฟเวอร์ใหม่ถูกเพิ่มเข้าไป$SERVER_LISTสคริปต์จะหยุดทำงานด้วย:

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

ฉันได้ลองyes:

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

โดยไม่มีโชค

มีวิธีในsshการ จำกัด การรับรหัสใหม่ใด ๆ โดยอัตโนมัติหรือไม่?


6
คำตอบของ Lekensteyn นั้นยอดเยี่ยมและถูกต้อง แต่ฉันแค่ต้องการทราบว่าเนื่องจาก ssh คาดหวังว่า "ใช่" และyesเอาท์พุท "y" คุณอาจโชคดีกว่าด้วยfor h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(หมายเหตุพิเศษใช่ซึ่งบอกใช่ว่าจะพูดอะไรแทน "y ")
chazomaticus

คำตอบ:


240

ใช้ตัวเลือก StrictHostKeyChecking ตัวอย่างเช่น:

ssh -oStrictHostKeyChecking=no $h uptime

ตัวเลือกนี้ยังสามารถเพิ่มใน ~ / .ssh / config เช่น:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

โปรดทราบว่าเมื่อคีย์โฮสต์มีการเปลี่ยนแปลงคุณจะได้รับคำเตือนแม้จะมีตัวเลือกนี้:

$ 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

หากโฮสต์ของคุณไม่ได้ติดตั้งใหม่บ่อยครั้งคุณสามารถทำให้ตัวเลือกนี้ปลอดภัยน้อยลง (แต่จะสะดวกกว่าสำหรับการเปลี่ยนโฮสต์คีย์) ด้วย-oUserKnownHostsFile=/dev/nullตัวเลือก สิ่งนี้จะทิ้งคีย์โฮสต์ที่ได้รับทั้งหมดดังนั้นมันจะไม่สร้างคำเตือน


ด้วย 18.04 StrictHostKeyChecking=accept-newมีความเป็นไปได้ใหม่ จาก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
นี่ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุดเพราะจะผ่านเครื่องมือรักษาความปลอดภัยในตัว ssh-keyscanจะดีกว่าถ้ามีอยู่ในระบบของคุณ
Stefan Lasiewski

2
@StefanLasiewski จะช่วยให้มนุษย์อยู่ในการโจมตีกลางถ้าคุณอยู่ในเครือข่ายที่ไม่น่าเชื่อถือ สำหรับการรับคีย์ใหม่ไปยังโฮสต์ที่คงที่ssh-keyscanวิธีการมีสติมากขึ้น สำหรับเครื่องเสมือนและโฮสต์อื่น ๆ ในเครือข่ายที่เชื่อถือได้ที่มีที่อยู่ IP แบบไดนามิก / นำกลับมาใช้ใหม่วิธีการที่อธิบายไว้นั้นดีพอ
Lekensteyn

8
เพียงเพื่อชี้แจงความแตกต่างระหว่างสองโซลูชั่น: การssh-keyscanแก้ปัญหามีแนวโน้มที่จะโจมตีคนที่อยู่ตรงกลางในครั้งเดียวที่ssh-keyscanกำลังทำงานอยู่ การ-oStrictHostKeyChecking=noแก้ปัญหามีแนวโน้มที่จะโจมตีคนที่sshอยู่ตรงกลางทุกครั้งที่มีการเรียกใช้
Erik Sjölund

121

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

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

หมายเหตุ:แทนที่ <ip-address> และ <hostname> ด้วยชื่อ IP และ dns ของเซิร์ฟเวอร์ที่คุณต้องการเพิ่ม

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

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

ดังนั้นคุณสามารถเรียกใช้:

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

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


1
รันมันผ่านการเรียงลำดับ uniq แล้วมองหาโฮสต์ที่ซ้ำกันโดยใช้ awk หลังจากที่จะทำให้สคริปต์สามารถตรวจจับโฮสต์ที่มีการเปลี่ยนแปลงและเตือนผู้ใช้เกี่ยวกับสิ่งเหล่านั้นได้เนื่องจากโฮสต์เดียวกันที่มีคีย์ที่แตกต่างกันอาจหมายถึงปัญหา
Lennart Rolland

2
คุณอาจต้องการเพิ่มบันทึกย่อที่-Hแฮชชื่อโฮสต์และที่อยู่
David Cullen

25

ฉันสายไปเล็กน้อยกับการตอบสนองนี้ แต่วิธีที่เหมาะสมคือการทำ ssh-keyscan บนเครื่องใหม่ก่อนที่คุณจะเรียกใช้การรวบรวมเวลาที่เหมาะสม

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

การปิดใช้งานการตรวจสอบสติเพื่อความสะดวกเพราะฟังดูเหมือนแผนไม่ดีแม้ว่าคุณคิดว่าคุณควบคุมสภาพแวดล้อมโดยสิ้นเชิง


การรันคำสั่งด้านบนและไม่ได้ตรวจสอบคีย์โฮสต์กับลายนิ้วมือที่คุณได้รับนอกแบนด์StrictHostKeyChecking no
วิด

3
@code_monk: ไม่มันไม่ใช่ ฉันเปิดโอกาสครั้งเดียวสำหรับความล้มเหลว (การยอมรับคีย์จากโฮสต์ที่ไม่ถูกต้องเพื่อเพิ่มไปยังโฮสต์ที่รู้จัก) StrictHostKeyChecking noจะอนุญาตให้ยอมรับซ้ำสำหรับเครื่องอื่น ๆ
ทิงค์

0

ในการเพิ่มรายการเซิร์ฟเวอร์โดยอัตโนมัติเราสามารถทำด้านล่าง:

เพิ่ม IP ของเซิร์ฟเวอร์ในไฟล์เซิร์ฟเวอร์รายการ

ควรเพิ่ม IP ในรูปแบบด้านล่าง

ผลผลิตของ cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

เปลี่ยน IP ข้างต้นโดยแทนที่ของคุณ

คำสั่งด้านล่างจะเพิ่มเซิร์ฟเวอร์ทั้งหมดจากรายการ

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.