Inilah situasi saya: Saya sedang menyiapkan test harness yang akan, dari klien pusat, meluncurkan sejumlah mesin virtual dan kemudian menjalankan perintah pada mereka melalui ssh
. Mesin virtual sebelumnya akan memiliki nama host dan alamat IP yang tidak digunakan, sehingga mereka tidak akan ada di ~/.ssh/known_hosts
file pada klien pusat.
Masalah yang saya alami adalah bahwa ssh
perintah pertama dijalankan terhadap instance virtual baru selalu muncul dengan prompt interaktif:
The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?
Apakah ada cara saya bisa mem-bypass ini dan membuat host baru sudah dikenal oleh mesin klien, mungkin dengan menggunakan kunci publik yang sudah dimasukkan ke dalam citra mesin virtual? Saya benar-benar ingin menghindari penggunaan Expect atau apa pun untuk menjawab prompt interaktif jika saya bisa.
sumber
Jawaban:
Setel
StrictHostKeyChecking
opsi menjadino
, baik dalam file konfigurasi atau via-o
:ssh -o StrictHostKeyChecking=no [email protected]
sumber
Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.
Untuk menghindari peringatan, dan untuk menghindari entri yang ditambahkan ke file diketahui_hosts, saya lakukan:ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null [email protected]
IMO, cara terbaik untuk melakukan ini adalah sebagai berikut:
Itu akan memastikan tidak ada entri duplikat, bahwa Anda dilindungi untuk kedua nama host dan alamat IP, dan juga akan hash output, langkah keamanan tambahan.
sumber
ssh-keyscan
saya gagal karena host target saya tidak mendukung tipe kunci versi 1 yang standar. Menambahkan-t rsa,dsa
ke perintah memperbaiki ini.ssh-keygen -F [address]
sebagai gantinya. medium.com/@wblankenship/…Untuk yang malas:
-H hash nama host / alamat IP
sumber
Seperti disebutkan, menggunakan pemindaian kunci akan menjadi cara yang tepat & tidak mencolok untuk melakukannya.
Hal di atas akan melakukan trik untuk menambahkan host, HANYA jika belum ditambahkan. Itu juga tidak aman konkurensi; Anda tidak boleh mengeksekusi snippet pada mesin asal yang sama lebih dari satu kali pada saat yang sama, karena file tmp_hosts dapat musnah, akhirnya mengarah ke file known_hosts menjadi membengkak ...
sumber
ssh-keyscan
? Alasannya adalah karena memerlukan beberapa waktu dan koneksi jaringan tambahan.cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts
, tetapi edit berikutnya mengubahnya menjadi>>
. Menggunakan>>
adalah kesalahan. Itu mengalahkan tujuan keunikan di baris pertama, dan menyebabkannya membuang entri baru keknown_hosts
setiap kali berjalan. (Baru saja mengirim suntingan untuk mengubahnya kembali.)Anda bisa menggunakan
ssh-keyscan
perintah untuk mengambil kunci publik dan menambahkannya keknown_hosts
file Anda .sumber
Ini adalah bagaimana Anda dapat memasukkan ssh-keyscan ke dalam permainan Anda:
sumber
ini akan menjadi solusi lengkap, menerima kunci host untuk pertama kalinya saja
sumber
Saya memiliki masalah serupa dan menemukan bahwa beberapa jawaban yang diberikan hanya membuat saya berpisah untuk solusi otomatis. Berikut ini adalah apa yang akhirnya saya gunakan, semoga membantu:
Itu menambah kunci
known_hosts
dan tidak meminta kata sandi.sumber
Jadi, saya sedang mencari cara biasa untuk mem-bypass interaksi manual host yang tidak dikenal dalam mengkloning git repo seperti yang ditunjukkan di bawah ini:
Perhatikan sidik jari kunci RSA ...
Jadi, ini adalah hal SSH, ini akan bekerja untuk git atas SSH dan hanya hal-hal terkait SSH secara umum ...
Pertama, instal nmap pada driver harian Anda. nmap sangat membantu untuk hal-hal tertentu, seperti mendeteksi port terbuka dan ini-- memverifikasi sidik jari SSH secara manual. Tapi, kembali ke apa yang kita lakukan.
Baik. Saya entah dikompromikan di beberapa tempat dan mesin saya sudah memeriksanya - atau penjelasan yang lebih masuk akal dari segala sesuatu yang keren adalah apa yang terjadi.
'Sidik jari' itu hanyalah sebuah string yang dipersingkat dengan algoritma satu arah untuk kenyamanan manusia kita dengan risiko lebih dari satu string menyelesaikan ke dalam sidik jari yang sama. Itu terjadi, mereka disebut tabrakan.
Apapun, kembali ke string asli yang bisa kita lihat dalam konteks di bawah ini.
Jadi, sebelumnya, kami memiliki cara untuk meminta bentuk identifikasi dari tuan rumah asli.
Pada titik ini kami secara manual sama rentannya dengan otomatis - kecocokan string, kami memiliki data dasar yang membuat sidik jari, dan kami dapat meminta data dasar itu (mencegah tabrakan) di masa mendatang.
Sekarang untuk menggunakan string dengan cara yang mencegah bertanya tentang keaslian host ...
File known_hosts dalam hal ini tidak menggunakan entri plaintext. Anda akan tahu entri hash ketika Anda melihatnya, mereka terlihat seperti hash dengan karakter acak, bukan xyz.com atau 123.45.67.89.
Baris komentar pertama muncul dengan marah - tetapi Anda dapat menyingkirkannya dengan redirect sederhana melalui konvensi ">" atau ">>".
Karena saya sudah melakukan yang terbaik untuk mendapatkan data yang tidak ternoda untuk digunakan untuk mengidentifikasi "host" dan kepercayaan, saya akan menambahkan identifikasi ini ke file known_hosts saya di direktori ~ / .ssh saya. Karena sekarang akan diidentifikasi sebagai host yang dikenal, saya tidak akan mendapatkan prompt yang disebutkan di atas ketika Anda masih muda.
Terima kasih telah bertahan dengan saya, ini dia. Saya menambahkan kunci RSA bitbucket sehingga saya dapat berinteraksi dengan repositori git saya di sana dengan cara non-interaktif sebagai bagian dari alur kerja CI, tetapi apa pun yang Anda lakukan apa yang Anda inginkan.
Jadi, begitulah cara Anda tetap perawan untuk hari ini. Anda dapat melakukan hal yang sama dengan github dengan mengikuti petunjuk serupa di waktu Anda sendiri.
Saya melihat begitu banyak posting stack overflow yang memberitahu Anda untuk menambahkan kunci secara terprogram tanpa memeriksa. Semakin banyak Anda memeriksa kunci dari mesin yang berbeda di jaringan yang berbeda, semakin banyak kepercayaan yang dapat Anda miliki bahwa host adalah yang dikatakannya - dan itulah yang terbaik yang dapat Anda harapkan dari lapisan keamanan ini.
SALAH
ssh -oStrictHostKeyChecking = tidak ada nama host [perintah]SALAH
ssh-keyscan -t rsa -H hostname >> ~ / .ssh / known_hostsTolong jangan lakukan salah satu dari hal-hal di atas. Anda diberi kesempatan untuk meningkatkan peluang Anda menghindari seseorang yang menguping transfer data Anda melalui seorang pria di tengah serangan - ambil kesempatan itu. Perbedaannya adalah memverifikasi bahwa kunci RSA yang Anda miliki adalah salah satu server yang bonafid dan sekarang Anda tahu cara mendapatkan informasi itu untuk membandingkannya sehingga Anda dapat mempercayai koneksi tersebut. Ingatlah bahwa lebih banyak perbandingan dari berbagai komputer & jaringan biasanya akan meningkatkan kemampuan Anda untuk mempercayai koneksi.
sumber
Saya membuat skrip satu baris, agak panjang tapi berguna untuk membuat tugas ini untuk host dengan banyak IP, menggunakan
dig
danbash
sumber
Berikut ini menghindari entri duplikat di ~ / .ssh / known_hosts:
sumber
mkdir -p ~/.ssh/known_hosts;
Bagaimana Anda membangun mesin ini? dapatkah Anda menjalankan skrip pembaruan dns? dapatkah Anda bergabung dengan Domain IPA?
FreeIPA melakukan ini secara otomatis, tetapi pada dasarnya yang Anda butuhkan adalah SSHFP catatan dns dan DNSSEC di zona Anda (freeipa menyediakan opsi yang dapat dikonfigurasi (dnssec dinonaktifkan secara default)).
Anda bisa mendapatkan catatan SSHFP yang ada dari host Anda dengan menjalankan.
ssh-keygen -r jersey.jacobdevans.com
kemudian setelah dipublikasikan, Anda akan menambah
VerifyHostKeyDNS yes
ssh_config atau ~ / .ssh / config AndaJika / Ketika google memutuskan untuk mengaktifkan DNSSEC, Anda dapat ssh in tanpa prompt hostkey.
ssh jersey.jacobdevans.com
TETAPI domain saya belum ditandatangani, jadi untuk sekarang Anda akan melihat ....
sumber
Untuk melakukan ini dengan benar, apa yang benar-benar ingin Anda lakukan adalah mengumpulkan kunci publik host dari VM saat Anda membuatnya dan memasukkannya ke dalam
known_hosts
format file . Anda kemudian dapat menggunakan-o GlobalKnownHostsFile=...
, menunjuk ke file itu, untuk memastikan bahwa Anda terhubung ke host yang Anda yakin harus Anda sambungkan. Bagaimana Anda melakukan ini tergantung pada bagaimana Anda mengatur mesin virtual, tetapi membacanya dari sistem file virtual, jika mungkin, atau bahkan membuat host untuk mencetak konten/etc/ssh/ssh_host_rsa_key.pub
selama konfigurasi dapat melakukan trik.Yang mengatakan, ini mungkin tidak bermanfaat, tergantung pada lingkungan seperti apa Anda bekerja dan siapa musuh yang Anda antisipasi. Melakukan "store on first connect" sederhana (melalui pemindaian atau hanya selama koneksi "nyata" pertama) seperti yang dijelaskan dalam beberapa jawaban lain di atas mungkin jauh lebih mudah dan masih memberikan sedikit keamanan. Namun, jika Anda melakukan ini, saya sangat menyarankan Anda mengubah file host yang dikenal pengguna (
-o UserKnownHostsFile=...
) menjadi file khusus untuk instalasi pengujian khusus ini; ini akan menghindari mencemari file host dikenal pribadi Anda dengan informasi tes dan membuatnya mudah untuk membersihkan kunci publik yang sekarang tidak berguna ketika Anda menghapus VMs Anda.sumber
Seluruh ini
bisnis terus mengganggu saya, jadi saya memilih
Satu skrip untuk mengatur semuanya
Ini adalah varian dari skrip di https://askubuntu.com/a/949731/129227 dengan jawaban Amadu Bah https://serverfault.com/a/858957/162693 dalam satu lingkaran.
contoh panggilan
./sshcheck somedomain site1 site2 site3
Script akan mengulangi nama-nama situs dan memodifikasi file .ssh / config dan .ssh / known_hosts dan melakukan ssh-copy-id berdasarkan permintaan - untuk fitur terakhir hanya biarkan panggilan uji coba ssh gagal misalnya dengan menekan enter 3 kali pada permintaan kata sandi.
skrip sshcheck
sumber
Berikut adalah cara melakukan kumpulan host
tentukan koleksi host
Kemudian tentukan dua tugas untuk menambahkan kunci ke host yang dikenal:
sumber
Yang terbaik adalah Anda memeriksa sidik jari setiap server / host baru. Ini adalah satu-satunya cara untuk mengotentikasi server. Tanpa itu, koneksi SSH Anda dapat terkena serangan man-in-the-middle .
Jika Anda benar-benar yakin ingin mengabaikan pengecekan sidik jari, maka opsi terbaik kedua yang kurang aman adalah yang digunakan
StrictHostKeyChecking=accept-new
, yang diperkenalkan di OpenSSH versi 7.6 (2017-10-03) :Jangan gunakan nilai lama
StrictHostKeyChecking=no
yang tidak pernah memeriksa keaslian server sama sekali. (Meskipun arti dari=no
pengaturan ini akan membalik beberapa rilis nanti .)sumber