ssh: menerima kunci secara otomatis

218

Saya telah menulis skrip utilitas kecil ini:

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

Ketika server baru ditambahkan ke $SERVER_LIST, skrip dihentikan dengan:

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

Saya sudah mencoba yes:

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

tanpa keberuntungan.

Apakah ada cara untuk parametrize sshuntuk secara otomatis menerima kunci baru?

Adam Matan
sumber
6
Jawaban Lekensteyn sangat bagus dan benar, tetapi saya hanya ingin mencatat bahwa karena ssh mengharapkan "ya" dan yesmenampilkan "y", Anda mungkin lebih beruntung for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(perhatikan tambahan ya, yang memberi tahu ya apa yang harus dikatakan daripada "y" ").
chazomaticus

Jawaban:

240

Gunakan opsi StrictHostKeyChecking, misalnya:

ssh -oStrictHostKeyChecking=no $h uptime

Opsi ini juga dapat ditambahkan ke ~ / .ssh / config, misal:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Perhatikan bahwa ketika kunci host telah berubah, Anda akan mendapatkan peringatan, bahkan dengan opsi ini:

$ 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

Jika host Anda tidak sering diinstal ulang, Anda bisa membuatnya kurang aman (tetapi lebih nyaman untuk kunci host yang sering berubah) dengan -oUserKnownHostsFile=/dev/nullopsi. Ini membuang semua kunci host yang diterima sehingga tidak akan pernah menghasilkan peringatan.


Dengan 18,04, ada kemungkinan baru: StrictHostKeyChecking=accept-new. Dari 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.
Lekensteyn
sumber
10
Ini bukan solusi terbaik karena memotong alat keamanan bawaan. ssh-keyscanlebih disukai, jika tersedia di sistem Anda.
Stefan Lasiewski
2
@StefanLasiewski Memungkinkan man in the middle attack jika Anda berada di jaringan yang tidak terpercaya. Untuk menerima kunci baru ke host tetap, ssh-keyscanpendekatannya lebih waras. Untuk mesin virtual lokal dan host lain di jaringan tepercaya dengan alamat IP dinamis / digunakan kembali, pendekatan yang dijelaskan cukup baik.
Lekensteyn
8
Hanya untuk memperjelas perbedaan antara dua solusi: ssh-keyscanSolusi ini hanya rentan terhadap serangan man-in-the-middle saat satu kali ssh-keyscandijalankan. The -oStrictHostKeyChecking=nosolusi adalah rentan terhadap serangan man-in-the-middle setiap kali sshsedang dijalankan.
Erik Sjölund
121

Anda dapat menggunakan perintah berikut untuk menambahkan sidik jari untuk server ke hosting Anda yang dikenal

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

CATATAN: Ganti <ip-address> dan <hostname> dengan IP dan dns nama server yang ingin Anda tambahkan.

Satu-satunya masalah dengan ini adalah bahwa Anda akan berakhir dengan beberapa server di hosting yang dikenal dua kali. Ini bukan masalah besar, hanya menyebutkan. Untuk memastikan tidak ada duplikat, Anda dapat menghapus semua server terlebih dahulu dengan menjalankan yang berikut ini:

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

Jadi Anda bisa lari:

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

Satu hal yang perlu diingat ketika menghapus hanya untuk menambahkan kembali, Anda pada dasarnya menghapus keamanan memverifikasi sidik jari. Jadi, Anda pasti tidak ingin menjalankan skrip ini sebelum setiap eksekusi skrip utilitas Anda.

mhost
sumber
1
menjalankannya melalui sort | uniq dan kemudian mencari host duplikat menggunakan awk setelahnya akan membuat skrip mampu mendeteksi host yang diubah dan hanya memperingatkan pengguna tentang hal itu, karena host yang sama dengan kunci yang berbeda dapat berarti masalah
Lennart Rolland
2
Anda mungkin ingin menambahkan catatan yang -Hhash nama host dan alamat.
David Cullen
25

Saya agak terlambat dengan respons ini, tetapi cara yang masuk akal adalah dengan melakukan ssh-keyscan pada mesin baru sebelum Anda menjalankan pengumpulan uptime.

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

Menonaktifkan pemeriksaan kewarasan demi kenyamanan terdengar seperti rencana yang buruk, bahkan jika Anda berpikir Anda benar-benar mengendalikan lingkungan.

Tink
sumber
menjalankan perintah di atas dan tidak benar-benar memeriksa kunci host terhadap sidik jari yang Anda peroleh dari band rentan dengan cara yang sama persis sepertiStrictHostKeyChecking no
code_monk
3
@code_monk: tidak, tidak. Saya membuka peluang satu kali untuk kegagalan (menerima kunci dari host yang salah untuk ditambahkan ke host yang dikenal). StrictHostKeyChecking no akan memungkinkan penerimaan berulang untuk mesin lain.
tink
0

Untuk menambahkan daftar server secara otomatis yang dapat kita lakukan di bawah:

Tambahkan server IP dalam daftar server file

IP harus ditambahkan dalam format di bawah ini.

Output dari cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Ubah IP di atas dengan mengganti milik Anda.

Perintah di bawah ini akan menambahkan semua server dari daftar.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Waqas Khan
sumber