Aman menambahkan host (misalnya GitHub) ke file SSH known_hosts

20

Bagaimana saya bisa menambahkan kunci host ke known_hostsfile SSH dengan aman?

Saya menyiapkan mesin pengembangan, dan saya ingin (misalnya) mencegah gitdari meminta ketika saya mengkloning repositori github.commenggunakan SSH.

Saya tahu bahwa saya dapat menggunakan StrictHostKeyChecking=no(misalnya jawaban ini ), tetapi itu tidak aman.

Sejauh ini, saya telah menemukan ...

  1. GitHub menerbitkan sidik jari kunci SSH mereka di https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Saya dapat menggunakan ssh-keyscanuntuk mendapatkan kunci host github.com.

Bagaimana saya menggabungkan fakta-fakta ini? Diberi daftar sidik jari yang telah ssh-keyscandiisi sebelumnya , bagaimana cara saya memverifikasi bahwa output dapat ditambahkan ke known_hostsfile?


Saya kira saya bertanya yang berikut:

Bagaimana cara saya mendapatkan sidik jari untuk kunci yang dikembalikan ssh-keyscan?

Mari kita asumsikan bahwa saya sudah menjadi MITM-ed untuk SSH, tetapi saya dapat mempercayai halaman GitHub HTTPS (karena memiliki rantai sertifikat yang valid).

Itu berarti bahwa saya memiliki beberapa kunci host (tersangka) SSH (dari ssh-keyscan) dan beberapa sidik jari kunci (tepercaya). Bagaimana saya memverifikasi satu terhadap yang lain?


Terkait: bagaimana cara hash bagian host dari output dari ssh-keyscan? Atau bisakah saya mencampur host yang di-hash / tidak di-host known_hosts?

Roger Lipscombe
sumber
Mengapa itu tidak aman untuk kasus penggunaan Anda?
quadruplebucky
StrictHostKeyChecking=norentan terhadap MITM. Apakah ssh-keyscanaman terhadap MITM?
Roger Lipscombe
Saya gagal memahami mengapa saya terlalu khawatir tentang seseorang yang menyamar sebagai orang asing yang belum pernah saya temui yang cukup saya percayai untuk menulis kode yang akan saya unduh dan jalankan ...
quadruplebucky
Karena ini adalah kode sumber saya di repo pribadi di github, dan saya tidak ingin MITM (mis.) Memperkenalkan perubahan berbahaya ketika saya mendorong commit. Itu hanya satu contoh.
Roger Lipscombe
Saya (baik atau buruk) memilih untuk mempercayai github. Saya tidak memilih untuk mempercayai setiap tautan jaringan acak antara saya dan mereka.
Roger Lipscombe

Jawaban:

11

Bagian terpenting dari "aman" menambahkan kunci ke known_hostsfile adalah untuk mendapatkan sidik jari kunci dari administrator server. Sidik jari kunci akan terlihat seperti ini:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

Dalam kasus GitHub, biasanya kita tidak dapat berbicara langsung dengan administrator. Namun, mereka meletakkan kunci di halaman web mereka sehingga kami dapat memulihkan informasi dari sana.

Pemasangan kunci manual

1) Ambil salinan kunci dari server dan dapatkan sidik jarinya. NB: Lakukan ini sebelum memeriksa sidik jari.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Dapatkan salinan sidik jari kunci dari administrator server - dalam hal ini navigasikan ke halaman dengan informasi di github.com

  1. Pergi ke github.com
  2. Pergi ke halaman bantuan (pada menu di sebelah kanan jika masuk; di bagian bawah beranda sebaliknya).
  3. Di bagian Persiapan, buka Menghubungkan ke GitHub dengan SSH
  4. Pergi ke Menguji koneksi SSH Anda
  5. Salin sidik jari SHA256 dari halaman itu ke editor teks Anda untuk digunakan nanti.

3) Bandingkan kunci dari dua sumber

Dengan menempatkan mereka secara langsung di atas yang lain dalam editor teks, mudah untuk melihat apakah ada sesuatu yang berubah

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(Perhatikan bahwa kunci kedua telah dimanipulasi, tetapi terlihat sangat mirip dengan aslinya - jika sesuatu seperti ini terjadi, Anda sedang diserang serius dan harus menghubungi pakar keamanan tepercaya.)

Jika kuncinya berbeda batalkan prosedur dan hubungi pakar keamanan

4) Jika tombol dibandingkan dengan benar maka Anda harus menginstal kunci yang sudah Anda unduh

cat github-key-temp >> ~/.ssh/known_hosts

Atau untuk menginstal untuk semua pengguna di sistem (sebagai root):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Instalasi kunci otomatis

Jika Anda perlu menambahkan kunci selama proses pembuatan maka Anda harus mengikuti langkah 1-3 dari proses manual di atas.

Setelah melakukannya, periksa konten github-key-tempfile Anda dan buat skrip untuk menambahkan konten itu ke file host yang dikenal.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Anda sekarang harus menyingkirkan semua sshperintah yang telah StrictHostKeyCheckingdinonaktifkan.

Michael
sumber
17

Anda dapat mencampur entri yang hash / tidak di-shash dalam file known_hosts Anda.

Jadi, jika Anda ingin menambahkan kunci github, Anda bisa melakukannya:

ssh-keyscan github.com >> ~/.ssh/known_hosts

Jika Anda ingin hash, tambahkan -H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts

Wee
sumber
1
Apa perbedaan antara hash / tidak hash? Saya tahu apa hashing, hanya saja tidak mengapa hashing diterapkan dalam konteks ini.
Glen Thomas
3
Hashing entri Anda memungkinkan Anda untuk menyembunyikan informasi tentang host yang Anda gunakan untuk terhubung. Periksa jawaban yang diterima di security.stackexchange.com/questions/56268/…
Wee
4
Ini tidak menjawab pertanyaan. Menggunakan ssh-keyscan tunduk pada seorang pria dalam serangan tengah yang berarti bahwa kunci yang Anda simpan bisa menjadi kunci milik penyerang yang mencoba masuk ke sistem Anda. Silakan lihat jawaban saya untuk cara memeriksa sesuatu.
Michael
Att. Mendapatkan perhatian untuk jawaban yang keliru - "dua jawaban teratas sebenarnya tidak aman"
Peter Mortensen
6

Cara termudah adalah dengan mengambil kunci ssh-keyscansecara manual, verifikasi secara manual:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

Dan tambahkan ke skrip Anda, yang kemudian akan membawa kunci publik "otoritatif".

Jakuje
sumber
Saya punya kunci seperti yang Anda katakan, bagaimana cara 'menambahkannya ke skrip saya'?
Glen Thomas
Baik sebagai file terpisah atau sebagai string dalam skrip Anda.
Jakuje
Jawaban ini berbahaya karena tersembunyi di "verifikasi secara manual" adalah proses yang sangat sulit. Saya telah menambahkan jawaban di bawah ini yang mencoba menjelaskan cara melakukan itu dan menggunakan hasilnya dengan aman.
Michael
Att. Mendapatkan perhatian untuk jawaban yang keliru - "dua jawaban teratas sebenarnya tidak aman"
Peter Mortensen
1
@RogerLipscombe Saya setuju bahwa jawabannya dapat ditafsirkan dengan aman - "verifikasi secara manual" tidak dijelaskan, tetapi jika Anda memahaminya berarti "mengikuti petunjuk di halaman manual ssh" maka itu mungkin akan baik-baik saja. Risiko di sini adalah bahwa seseorang mungkin tidak memahami hal itu dan dapat, misalnya, mencoba hal-hal yang tidak aman seperti memeriksa kunci setelah masuk ke server. Itu sebabnya saya menyebut jawaban ini "berbahaya" dan yang lainnya "tidak aman" - detail cara Anda memeriksa secara manual adalah bagian penting. Terima kasih sudah menerima.
Michael