Pertanyaan Dapatkah saya secara otomatis menambahkan host baru ke known_hosts?


Inilah situasi saya: Saya menyiapkan alat uji yang akan, dari klien pusat, meluncurkan sejumlah mesin virtual dan kemudian menjalankan perintah pada mereka melalui ssh. Mesin virtual akan memiliki nama host dan alamat IP yang sebelumnya tidak digunakan, sehingga mereka tidak akan berada di ~/.ssh/known_hosts file di klien pusat.

Masalah yang saya hadapi adalah yang pertama ssh perintah dijalankan terhadap contoh 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 yang saya bisa bypass ini dan mendapatkan host baru yang sudah diketahui oleh mesin klien, mungkin dengan menggunakan kunci publik yang sudah dipanggang ke dalam gambar mesin virtual? Saya benar-benar ingin menghindari menggunakan Expect atau apa pun untuk menjawab prompt interaktif jika saya bisa.


217
2018-04-16 04:15




Untuk lingkungan pengujian yang mandiri dan aman secara fisik, penerimaan kunci otomatis dapat bekerja dengan baik. Tetapi secara otomatis menerima kunci publik dalam lingkungan produksi atau di seluruh jaringan yang tidak dipercaya (seperti internet) benar-benar mengabaikan perlindungan apa pun terhadap serangan manusia-di-tengah yang mungkin akan diberikan oleh SSH. Itu hanya cara yang sah untuk memastikan Anda aman terhadap serangan MITM adalah memverifikasi kunci publik host melalui beberapa saluran tepercaya di luar jalur. Tidak ada cara aman untuk mengotomatiskannya tanpa menyiapkan infrastruktur penandatanganan kunci yang cukup rumit. - Eil


Jawaban:


Mengatur StrictHostKeyChecking opsi untuk no, baik dalam file konfigurasi atau via -o :

ssh -o StrictHostKeyChecking=no username@hostname.com


126
2018-04-16 04:34



Ini membuat Anda terbuka bagi manusia di tengah serangan, mungkin bukan ide yang bagus. - JasperWallace
@JasperWallace, sementara ini biasanya merupakan saran yang baik, kasus penggunaan spesifik (mengerahkan pengujian VM dan mengirim perintah kepada mereka) seharusnya cukup aman. - Massimo
Ini memberi a 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 known_hosts, saya lakukan: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com - Peter V. Mørch
Downvoting karena ini tidak menjawab pertanyaan dan terbuka untuk kerentanan keamanan yang serius. - marcv81
@Mnebuerquo: Jika Anda khawatir tentang keamanan maka Anda tidak akan memiliki apa pun yang berkaitan dengan pertanyaan ini. Anda akan memiliki kunci host yang tepat di depan Anda, yang dikumpulkan dari konsol sistem yang ingin Anda sambungkan, dan Anda akan memverifikasinya secara manual saat pertama kali terhubung. Anda tentu tidak akan melakukan apa-apa "secara otomatis". - Ignacio Vazquez-Abrams


IMO, cara terbaik untuk melakukan ini adalah sebagai berikut:

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

Itu akan memastikan tidak ada entri duplikat, bahwa Anda tertutup baik untuk nama host dan alamat IP, dan juga akan hash output, ukuran keamanan ekstra.


209
2017-09-27 20:51



Mengapa Anda membutuhkan semua 3 ssh-keyscan? Tidak bisakah Anda bertahan dengan hanya yang pertama karena berfungsi baik untuk nama host dan ip? - Robert
Dapatkah Anda yakin bahwa mesin yang membalas permintaan ssh-keyscan benar-benar yang ingin Anda ajak bicara? Jika tidak Anda telah membuka diri untuk seorang pria di serangan tengah. - JasperWallace
@ JayperWallace Ya, untuk itu Anda memerlukan setidaknya sidik jari atau bahkan kunci publik yang lebih baik, dalam hal ini Anda dapat menambahkannya langsung ke known_hosts, mengubah pertanyaan ini diperdebatkan. Jika Anda hanya memiliki sidik jari, Anda harus menulis langkah tambahan yang memverifikasi kunci publik yang diunduh dengan sidik jari ...
Panggilan ke ssh-keyscan gagal untuk saya karena host target saya tidak mendukung tipe kunci versi 1 default. Menambah -t rsa,dsa ke perintah diperbaiki ini. - phasetwenty
Ini mungkin ide yang buruk. Anda membuka diri terhadap serangan man-in-the-middle dengan memperbarui kunci-kunci ini. Untuk menghindari entri duplikat, periksa status pengembalian ssh-keygen -F [address] sebagai gantinya. medium.com/@wblankenship/… - retrohacker


Untuk yang malas:

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

78
2017-09-25 10:03



+1 karena bersalah seperti yang dibebankan. Terima kasih. - SaxDaddy
Rentan terhadap serangan MITM. Anda tidak memeriksa sidik jari kunci. - Mnebuerquo
@Membunuh Anda mengatakan apa yang harus dilakukan tetapi tidak bagaimana, yang akan membantu. - Jim
@jameshfisher Ya rentan terhadap serangan MITM, tetapi apakah Anda pernah membandingkan sidik jari RSA, yang ditunjukkan kepada Anda dengan yang sebenarnya dari server, ketika Anda melakukan ini secara manual? Tidak? Jadi, jawaban ini adalah cara untuk melakukannya untuk Anda. Jika ya, Anda tidak boleh menggunakan jawaban ini dan melakukannya secara manual atau menerapkan tindakan pengamanan lainnya ... - fivef
@Mnebuerquo Saya akan sangat senang jika Anda juga memberi tahu kami cara yang lebih baik untuk menangani hal ini, ketika kami perlu mengkloning repo menggunakan skrip batch yang tidak dihadiri dan kami ingin melewati permintaan ini. Tolong beri penjelasan tentang solusi nyata jika Anda pikir ini bukan yang benar! - Waqas Shah


Seperti disebutkan, menggunakan pemindaian kunci adalah cara yang tepat & tidak mengganggu untuk melakukannya.

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

Di atas akan melakukan trik untuk menambahkan host, HANYA jika belum ditambahkan. Ini juga tidak aman konkurensi; kamu tidak harus jalankan cuplikan pada mesin asal yang sama lebih dari sekali pada saat yang sama, karena file tmp_hosts dapat terhapus, akhirnya mengarah ke file known_hosts menjadi kembung ...


38
2018-03-06 09:00



Apakah ada cara untuk memeriksa apakah kuncinya ada di known_hosts sebelum  ssh-keyscan? Alasannya adalah membutuhkan beberapa waktu dan koneksi jaringan tambahan. - utapyngo
Versi poster asli dari file ini cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts, tetapi pengeditan selanjutnya mengubahnya menjadi >>. Menggunakan >> adalah kesalahan. Ini mengalahkan tujuan keunikan di baris pertama, dan menyebabkannya memasukkan entri baru ke dalamnya known_hostssetiap kali itu berjalan. (Cukup memposting hasil edit untuk mengubahnya kembali.) - paulmelnikow
Ini tunduk pada serangan MITM yang sama dengan yang lain. - Mnebuerquo
@utapyngo ssh-keygen -F akan memberi Anda sidik jari saat ini. Jika kembali kosong dengan kode kembali 1, maka Anda tidak memilikinya. Jika mencetak sesuatu dan mengembalikan kode adalah 0, maka itu sudah ada. - Rich L
Jika Anda sangat peduli tentang MITM, gunakan data DNSSEC dan SSHFP atau gunakan beberapa cara aman lain untuk mendistribusikan kunci dan solusi kludge ini tidak akan relevan. - Zart


Anda bisa menggunakannya ssh-keyscan perintah untuk mengambil kunci publik dan menambahkannya ke Anda known_hosts mengajukan.


18
2018-04-16 05:09



Pastikan Anda memeriksa sidik jari untuk memastikan itu adalah kunci yang benar. Jika tidak, Anda membuka diri untuk serangan MITM. - Mnebuerquo
@Membuat poin wajar dalam konteks umum, tetapi mengapa seseorang mencoba untuk secara terprogram mengumpulkan kunci jika mereka sudah tahu apa kunci yang benar? - Brian Cline
Ini bukan cara untuk melakukannya. MITM. - jameshfisher


Ini adalah bagaimana Anda dapat menggabungkannya ssh-keyscan ke dalam permainan Anda:

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

6
2018-02-03 03:12



Apakah Anda mengunggah file known_hosts valid yang diketahui, atau apakah Anda melakukan ssh-keyscan dan membuang output ke known_hosts tanpa memverifikasi sidik jari? - Mnebuerquo
Ini hanyalah keluaran dump dari kunci, ya. Jadi pada dasarnya itu sama dengan StrictHostKeyChecking = tidak, hanya dengan memperbarui silent_hosts tanpa mengotak-atik opsi ssh. Solusi ini juga tidak berfungsi dengan baik karena ssh-keys dapat mengembalikan banyak baris yang menyebabkan tugas ini selalu ditandai sebagai 'diubah' - Zart
Ini bukan cara untuk melakukannya. MITM. - jameshfisher
@jameshfisher Saya akan sangat senang jika Anda juga memberi tahu kami cara yang lebih baik untuk menangani ini, ketika kita perlu mengkloning repo menggunakan skrip batch yang tidak dihadiri dan kami ingin melewati prompt ini. Tolong beri penjelasan tentang solusi nyata jika Anda pikir ini bukan yang benar! Tolong beri tahu kami "bagaimana" untuk melakukannya, jika Anda pikir ini bukan cara yang tepat untuk melakukannya! - Waqas Shah


Saya memiliki masalah serupa dan menemukan bahwa beberapa jawaban yang diberikan hanya membuat saya berpisah dengan solusi otomatis. Berikut ini adalah apa yang akhirnya saya gunakan, semoga itu membantu:

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

Ini menambahkan kunci ke known_hosts dan tidak meminta kata sandi.


5
2017-10-21 17:27



Rentan terhadap serangan MITM. Anda tidak memeriksa sidik jari. - Mnebuerquo
Tidak ada yang memeriksa sidik jari. - Brendan Byrd
Ini bukan cara untuk melakukannya. MITM. - jameshfisher


ini akan menjadi solusi lengkap, menerima kunci host untuk pertama kalinya saja

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

5
2017-11-23 13:51



Ini bukan cara untuk melakukannya. MITM. - jameshfisher


Jadi, saya mencari cara biasa untuk melewati interaksi manual tuan rumah yang tidak terkendali dari kloning git repo seperti yang ditunjukkan di bawah ini:

brad@computer:~$ git clone git@bitbucket.org:viperks/viperks-api.git
Cloning into 'viperks-api'...
The authenticity of host 'bitbucket.org (104.192.143.3)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)?

Perhatikan sidik jari kunci RSA ...

Jadi, ini adalah hal SSH, ini akan bekerja untuk git melalui SSH dan hanya hal-hal terkait SSH pada umumnya ...

brad@computer:~$ nmap bitbucket.org --script ssh-hostkey

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT
Nmap scan report for bitbucket.org (104.192.143.3)
Host is up (0.032s latency).
Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
| ssh-hostkey:
|   1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA)
|_  2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA)
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds

Pertama, instal nmap pada driver harian Anda. nmap sangat membantu untuk hal-hal tertentu, seperti mendeteksi port terbuka dan ini - secara manual memverifikasi sidik jari SSH. Tapi, kembali ke apa yang kami lakukan.

Baik. Saya berkompromi di banyak tempat dan mesin yang saya periksa - atau penjelasan yang lebih masuk akal tentang segala sesuatu yang keren adalah apa yang terjadi.

'Sidik jari' itu hanyalah sebuah string yang disingkat dengan algoritma satu arah untuk kenyamanan manusia kita dengan risiko lebih dari satu string yang berubah menjadi sidik jari yang sama. Itu terjadi, mereka disebut tabrakan.

Apapun, kembali ke string asli yang dapat kita lihat dalam konteks di bawah ini.

brad@computer:~$ ssh-keyscan bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
no hostkey alg
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123
no hostkey alg

Jadi, sebelumnya, kami memiliki cara untuk meminta bentuk identifikasi dari host asli.

Pada titik ini kita secara manual adalah rentan secara otomatis - permainan string, kita memiliki data dasar yang menciptakan sidik jari, dan kita dapat meminta data dasar (mencegah tabrakan) di masa depan.

Sekarang untuk menggunakan string itu dengan cara yang mencegah bertanya tentang keaslian host ...

File known_hosts dalam kasus 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.

brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==

Baris komentar pertama muncul dengan marah - tetapi Anda dapat menyingkirkannya dengan pengalihan sederhana melalui konvensi ">" atau ">>".

Karena saya sudah melakukan yang terbaik untuk mendapatkan data tidak tercemar yang akan 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 sudah bersamaku, 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 yang Anda inginkan.

#!/bin/bash
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts

Jadi, begitulah cara kamu tetap perawan untuk hari ini. Anda dapat melakukan hal yang sama dengan github dengan mengikuti arahan serupa pada waktu Anda sendiri.

Saya melihat begitu banyak tumpukan overflow yang memberi tahu Anda untuk secara terprogram menambahkan kunci secara membabi buta tanpa memeriksa apa pun. Semakin Anda memeriksa kunci dari mesin yang berbeda pada jaringan yang berbeda, semakin yakin Anda dapat memiliki bahwa host adalah yang dikatakannya - dan itu adalah yang terbaik yang dapat Anda harapkan dari lapisan keamanan ini.

SALAH ssh -oStrictHostKeyChecking = no hostname [command]

SALAH ssh-keyscan -t rsa -H hostname >> ~ / .ssh / known_hosts

Tolong jangan melakukan hal-hal di atas. Anda diberi kesempatan untuk meningkatkan peluang Anda menghindari seseorang yang menguping data Anda melalui seorang pria di serangan tengah-- mengambil kesempatan itu. Perbedaannya secara harfiah memverifikasi bahwa kunci RSA yang Anda miliki adalah salah satu server bonafit dan sekarang Anda tahu bagaimana mendapatkan informasi itu untuk membandingkannya sehingga Anda dapat mempercayai koneksi. Ingat saja lebih banyak perbandingan dari berbagai komputer & jaringan biasanya akan meningkatkan kemampuan Anda untuk mempercayai koneksi.


4
2017-10-05 21:18



Saya pikir ini adalah solusi terbaik untuk masalah ini. Namun, berhati-hatilah saat menggunakan Nmap pada sesuatu seperti Amazon EC2, saya mendapat peringatan tentang pemindaian port yang dilakukan Nmap! Isi formulir mereka sebelum melakukan portscanning! - Waqas Shah
...yah begitulah. Saya tidak tahu mengapa Anda melakukan pemindaian port dari EC2. Jika Anda masuk ke akun Anda, Anda bisa mendapatkan kunci dari mesin yang sebenarnya. Ini lebih untuk mesin yang tidak Anda kendalikan. Saya akan berasumsi Anda akan memiliki mesin lokal yang tidak dikenakan pembatasan pemindaian port AWS untuk digunakan. Tapi, jika Anda berada dalam situasi kasus tepi di mana Anda harus menjalankan nmap dengan AWS, saya kira peringatan ini akan sangat membantu. - BradChesney79
Menggunakan nmap untuk membaca kunci host SSH dari workstation Anda dan kemudian mempercayai bahwa nilai tidak berbeda dengan menghubungkan melalui SSH dengan StructHostKeyChecking dimatikan. Itu sama rentannya dengan serangan manusia-di-tengah. - Micah R Ledbetter
... @ MicahRLedbetter itulah sebabnya saya menyarankan bahwa "lebih banyak perbandingan dari berbagai komputer & jaringan biasanya akan meningkatkan kemampuan Anda untuk mempercayai koneksi". Tapi, itulah maksud saya. Jika Anda hanya memeriksa host target Anda dari satu set kondisi lingkungan, bagaimana Anda akan tahu tentang perbedaan apa pun? Apakah Anda memiliki saran yang lebih baik? - BradChesney79
Ini adalah teater keamanan. Melakukan sesuatu yang rumit untuk menciptakan tampilan keamanan yang lebih besar. Tidak masalah berapa banyak metode berbeda yang Anda gunakan untuk menanyakan kepada tuan rumah untuk kuncinya. Seperti meminta orang yang sama beberapa kali jika Anda dapat mempercayai mereka (mungkin Anda menelepon, mengirim email, mengirim pesan, dan surat siput). Mereka akan selalu mengatakan ya, tetapi jika Anda bertanya pada orang yang salah, itu tidak masalah. - vastlysuperiorman


Saya melakukan skrip satu baris, agak panjang tetapi berguna untuk membuat tugas ini untuk host dengan banyak IP, menggunakan dig dan bash

(host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts

3
2018-04-18 21:01