Jangan tambahkan hostkey ke known_hosts untuk SSH

107

Saya ingin terhubung ke host melalui SSH tapi saya tidak ingin nama host ditambahkan ke saya ~/.ssh/known_hosts.

Bagaimana saya bisa melakukan itu?

Albert
sumber

Jawaban:

94

Jika Anda menginginkan perilaku ini karena Anda bekerja dengan server cloud (AWS EC2, Rackspace CloudServers dll.) Atau Anda terus-menerus menyediakan gambar baru di Vagrant, Anda mungkin ingin memperbarui konfigurasi SSH Anda alih-alih menambahkan alias bash atau lebih banyak opsi pada garis komando.

Pertimbangkan untuk menambahkan sesuatu seperti:

Host *.mydomain.com 
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  User foo
  LogLevel QUIET
  • Gunakan seketat regex untuk host agar aman.
  • Mengatur LogLevel ke QUIET akan membuat Peringatan yang disebutkan Guillaume tidak muncul
cclark
sumber
Anda benar-benar harus mencoba untuk tidak sepenuhnya menonaktifkan StrictHostKeyChecking, jadi jawaban cclark adalah kompromi yang bagus untuk bekerja dengan server cloud.
Alex Recarey
Ini terbukti sangat membantu saya karena saya menggunakan Shipit (alat penyebaran JavaScript) melawan Vagrant. Saya tidak bisa dengan mudah mendapatkan parameter yang dikirimkan oleh Shipit ke SSH sehingga ini memungkinkan saya untuk menghindari alat dan mengatakan apa yang saya lakukan dan tidak ingin mengingatnya.
John Munsch
1
LogLevel adalah apa yang saya cari. Ini memiliki keuntungan tambahan karena tidak menampilkan pemberitahuan yang dikonfigurasikan perusahaan saat menjalankan skrip! (Sekarang saya menjalankan w / loglevel ERROR)
Anshu Prateek
Dalam file apa saya menambahkan ini?
Wim Deblauwe
Ini adalah file konfigurasi SSH Anda. Di Linux atau macOS file biasanya akan berada di direktori bernama .ssh di dalam direktori home Anda dan bernama config - ~ / .ssh / config
cclark
91
-o "UserKnownHostsFile /dev/null"

harus bekerja.

Albert
sumber
3
Berfungsi sebagaimana dimaksud, tetapi akan selalu melaporkan: "Peringatan: Secara permanen menambahkan 'hostname, ip' (RSA) ke daftar host yang dikenal." Saya membuatnya pergi dengan: 2> & 1 | grep -v "^Warning: Permanently added"
Guillaume Boudreau
3
tambahkan -o "LogLevel ERROR" dan tidak akan mengeluh dengan Peringatan lagi
John
1
Catatan: permintaan untuk menekan pesan itu "Peringatan: Tambahkan 'hostname, ip' (RSA) secara permanen ke daftar host yang dikenal." dilaporkan ke pengelola bugzilla.mindrot.org/show_bug.cgi?id=2413
Ben Creasy
2
Perpipaan ke grepakan menggabungkan stdout dan stderr; juga status keluar dapat berubah. Jika menggunakan bash, akan lebih baik untuk menggunakan substitusi proses untuk menyingkirkan pesan: ssh 2> >( egrep >&2 -v '^Warning: Permanently added') -o "UserKnownHostsFile /dev/null" [...]. Ini akan menghindari pipa dan dengan demikian perubahan terkait dalam penanganan status keluar.
Alex O
1
@ John Lebih baik menggunakan salah satu metode lain dalam komentar ini, jika tidak, Anda akan memperkenalkan kelemahan keamanan karena potensi untuk menyembunyikan peringatan lain yang tidak terkait
Jon Bentley
8

Saya merasa ingin menambahkan kunci host ke host diketahui Anda (orang-orang yang menjalankan layanan ini, dalam pengalaman saya, setidaknya cukup pintar untuk menjaga kunci host mereka konsisten antara mesin yang melayani nama host yang sama) dan kemudian menyalakan StrictHostKeyChecking, mematikan CheckHostIP, dan masuk dengan LogLevel ERROR akan memberi Anda pengalaman terbaik tanpa mengorbankan keamanan. (Ok, tanpa CheckHostIP Anda perlu mempercayai DNS, yang merupakan lubang menganga besar tanpa DNSSEC luas atau sesuatu yang serupa; tetapi kami hanya akan menyapu itu di bawah karpet untuk saat ini.)

Saya menggunakan file diketahui_hosts hanya-baca, jadi saya harus melakukan sesuatu atau saya mendapatkan peringatan tanpa akhir tentang tidak dapat menambahkan entri ke known_hosts.

Apa yang saya gunakan:

Host github.com *.github.com
StrictHostKeyChecking yes
CheckHostIP no
LogLevel ERROR

Saya ingin layanan ini untuk mempublikasikan kunci host SSH mereka di situs web mereka melalui HTTPS, jadi saya dapat menyalinnya secara eksplisit tanpa harus terhubung terlebih dahulu dan berpotensi membuat saya terkena serangan MITM.

Kyle Rose
sumber
7

Untuk sesi ssh tunggal, gunakan ini

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host
Quanlong
sumber
4
Ini menambahkan tidak ada yang baru untuk jawaban yang diterima pada pertanyaan yang berumur 5 tahun.
JakeGould
5

saya menyarankan

LogLevel ERROR

lebih

LogLevel QUIET

jadi Anda masih mendapatkan "Tidak dapat menyelesaikan nama host" dan kesalahan lainnya

kiloforce
sumber
Anda harus bisa mempercayai koneksi SSH Anda, imho. Bukan hanya membuatnya diam tentang risiko Anda.
sylvainulg
3
Sangat tergantung. Kami memiliki lingkungan pengembangan yang dihancurkan setiap minggu dan dibangun kembali, catatan A mereka tetap sama tetapi kunci host mereka dihasilkan setiap kali dibangun. Kami tidak dapat mempertahankan kunci host karena catatan A hanya didefinisikan dalam basis data berdasarkan nama lingkungan, dan nama lingkungan dapat dihapus atau yang baru dibuat kapan saja, sehingga solusi di atas benar-benar bermanfaat.
Alex Berry
2

Sudahkah Anda mencoba menonaktifkan StrictHostKeyChecking? Anda dapat melakukannya dengan -oopsi atau dalam file konfigurasi ~/.ssh/config.

jneves
sumber
Saya sudah menggunakan itu. Tetapi memiliki efek yang berbeda: Ini menurunkan ketatnya untuk memeriksa kunci host. Yaitu ketika tuan rumah tidak diketahui, itu masih terhubung ketika Anda menonaktifkan opsi itu. Dengan demikian, ia masih menyimpan tuan rumah. Tetapi saya pikir saya telah menemukan solusi yang tepat (lihat jawaban saya).
Albert
0

Saya menemukan entri .ssh / config berikut berguna (LAN dengan DHCP dan DNS):

 CheckHostIP no

 Host *.*
 CheckHostIP yes

Hasilnya adalah nama mesin lokal "zora" atau "goron" tidak akan memeriksa terhadap alamat IP yang ditetapkan secara dinamis, tetapi www.mycompany.com atau node42.planetlab.com masih akan memiliki IP statis mereka yang dikonfirmasi.

sylvainulg
sumber