Pertanyaan ssh: secara otomatis menerima kunci


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

tidak berhasil.

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


171
2018-04-18 09:11


asal


Jawaban Lekensteyn sangat bagus dan benar, tetapi saya hanya ingin mencatat bahwa karena ssh mengharapkan "ya" dan yes output "y", Anda mungkin lebih beruntung dengan for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done (perhatikan ekstra ya, yang mengatakan ya apa yang harus dikatakan bukan "y"). - chazomaticus


Jawaban:


Gunakan opsi StrictHostKeyChecking, misalnya:

ssh -oStrictHostKeyChecking=no $h uptime

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

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 dapat membuat ini kurang aman (tetapi lebih nyaman untuk kunci host yang sering berubah) dengan -oUserKnownHostsFile=/dev/null pilihan. Ini membuang semua kunci host yang diterima sehingga tidak akan 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.

185
2018-04-18 09:29



Ini bukan solusi terbaik karena melewati alat keamanan bawaan. ssh-keyscan lebih baik, jika tersedia di sistem Anda. - Stefan Lasiewski
@StefanLasiewski Hal ini memungkinkan manusia dalam serangan tengah jika Anda berada di jaringan yang tidak dipercaya. Untuk menerima kunci baru untuk host tetap, ssh-keyscan pendekatan lebih waras. Untuk mesin virtual lokal dan host lain di jaringan tepercaya dengan alamat IP dinamis / digunakan kembali, pendekatan yang dijelaskan sudah cukup baik. - Lekensteyn
Hanya untuk memperjelas perbedaan antara dua solusi: The ssh-keyscan solusi hanya rentan terhadap serangan man-in-the-middle satu kali ssh-keyscan sedang dijalankan. Itu -oStrictHostKeyChecking=no solusi rentan terhadap serangan man-in-the-middle setiap saat sshsedang dijalankan. - Erik Sjölund


Anda dapat menggunakan perintah berikut untuk menambahkan sidik jari untuk server ke known_hosts Anda

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

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

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

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

Jadi Anda bisa menjalankan:

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 verifikasi sidik jari. Jadi Anda pasti tidak ingin menjalankan skrip ini sebelum setiap eksekusi skrip utilitas Anda.


96
2017-10-17 00:24



menjalankannya melalui sort | uniq dan kemudian mencari duplikat host menggunakan awk setelah akan membuat script mampu mendeteksi host yang diubah dan memperingatkan pengguna hanya tentang itu, karena host yang sama dengan kunci yang berbeda bisa berarti masalah - Lennart Rolland
Anda mungkin ingin menambahkan catatan itu -H hash nama host dan alamat. - David Cullen


Saya agak terlambat dengan respons ini, tetapi cara yang masuk akal adalah dengan melakukan ssh-keyscan pada komputer 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 sepenuhnya mengendalikan lingkungan.


23
2017-11-24 19:47



Ini sebenarnya yang saya cari. Terima kasih. - user156516
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 seperti StrictHostKeyChecking no - code_monk
@code_monk: tidak, tidak. Saya membuka a satu kali kesempatan untuk kegagalan (menerima kunci dari host yang salah untuk ditambahkan ke host yang dikenal). StrictHostKeyChecking no akan memungkinkan pengulangan menerima untuk mesin lain. - tink


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

Tambahkan server IP dalam file server-list

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.

Di bawah perintah akan menambahkan semua server dari daftar.

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

0
2018-02-16 07:46