Otentikasi berbasis kunci SSH: known_hosts vs otor_keys

21

Saya membaca tentang pengaturan kunci ssh di Linux dan ada beberapa pertanyaan. Koreksi saya jika saya salah ...

Katakanlah host tr-lgto ingin terhubung ke host tr-mdm menggunakan ssh. Jika kami ingin memastikan bahwa itu adalah tr-mdm asli, kami membuat sepasang kunci pada tr-mdm dan kami menambahkan kunci publik ke known_hostspada tr-lgto. Jika tr-mdm ingin memeriksa apakah itu tr-lgto yang asli, maka tr-lgto harus membuat keypair dan menambahkan kunci publik authorized_keysdi tr-mdm.

Pertanyaan 1 : Tidak ada bidang pengguna dalam file known_hosts, hanya alamat IP dan nama host. tr-mdm mungkin memiliki banyak pengguna, masing-masing dengan .sshfoldernya sendiri . Haruskah kita menambahkan kunci publik ke masing-masing known_hostsfile?

Pertanyaan 2 : Saya menemukan bahwa ssh-keyscan -t rsa tr-mdmakan mengembalikan kunci publik dari tr-mdm. Bagaimana saya tahu pengguna milik siapa kunci ini? Selain itu, kunci publik /root/.ssh/berbeda dari apa yang dikembalikan oleh perintah itu. Bagaimana ini bisa terjadi?

damluar
sumber
1
Pertanyaan serupa tentang Keamanan Informasi : Apa perbedaan antara file Authorized_key dan known_host untuk SSH?
Gilles 'SO- stop being evil'
Saya menambahkan beberapa konteks latar belakang untuk 'ssh' dalam jawaban "Tentang File Aman yang Mengandung Kunci Publik" di pertanyaan yang disebutkan oleh @Gilles: < security.stackexchange.com/questions/20706/… >
IAM_AL_X

Jawaban:

33

Anda sedang mencampur otentikasi mesin server ke mesin klien, dan otentikasi pengguna ke mesin server.

Otentikasi server

Salah satu hal pertama yang terjadi ketika koneksi SSH sedang dibuat adalah bahwa server mengirimkan kunci publiknya ke klien, dan membuktikan (berkat kriptografi kunci publik ) kepada klien bahwa ia mengetahui kunci privat terkait. Ini mengotentikasi server: jika bagian protokol ini berhasil, klien tahu bahwa server adalah siapa yang berpura-pura.

Klien dapat memeriksa apakah server tersebut adalah server yang dikenal, dan bukan server jahat yang mencoba mengirimkannya sebagai server yang benar. SSH hanya menyediakan mekanisme sederhana untuk memverifikasi keabsahan server: ia mengingat server yang sudah Anda sambungkan, dalam ~/.ssh/known_hostsfile di mesin klien (ada juga file sistem-lebar /etc/ssh/known_hosts). Pertama kali Anda terhubung ke server, Anda perlu memeriksa dengan beberapa cara lain bahwa kunci publik yang disajikan oleh server benar-benar kunci publik dari server yang ingin Anda sambungkan. Jika Anda memiliki kunci publik dari server yang akan Anda sambungkan, Anda dapat menambahkannya ~/.ssh/known_hostsdi klien secara manual.

Otentikasi server harus dilakukan sebelum Anda mengirim data rahasia apa pun ke dalamnya. Khususnya, jika otentikasi pengguna melibatkan kata sandi, kata sandi tidak boleh dikirim ke server yang tidak diautentikasi.

Otentikasi pengguna

Server hanya mengizinkan pengguna jarak jauh masuk jika pengguna itu dapat membuktikan bahwa mereka memiliki hak untuk mengakses akun itu. Bergantung pada konfigurasi server dan pilihan pengguna, pengguna dapat menyajikan salah satu dari beberapa bentuk kredensial (daftar di bawah ini tidak lengkap).

  • Pengguna dapat memberikan kata sandi untuk akun yang ia coba masuki; server kemudian memverifikasi bahwa kata sandi itu benar.
  • Pengguna dapat menyajikan kunci publik dan membuktikan bahwa ia memiliki kunci pribadi yang terkait dengan kunci publik itu. Ini adalah metode yang persis sama yang digunakan untuk mengotentikasi server, tetapi sekarang pengguna mencoba membuktikan identitas mereka dan server memverifikasi mereka. Upaya login diterima jika pengguna membuktikan bahwa dia tahu kunci privat dan kunci publik ada di daftar otorisasi akun ( ~/.ssh/authorized_keysdi server).
  • Jenis metode lain melibatkan pendelegasian bagian dari pekerjaan otentikasi pengguna ke mesin klien. Ini terjadi di lingkungan yang terkendali seperti perusahaan, ketika banyak mesin berbagi akun yang sama. Server mengotentikasi mesin klien dengan mekanisme yang sama yang digunakan sebaliknya, kemudian bergantung pada klien untuk mengotentikasi pengguna.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Bagus menjawab Gilles, tetapi pertanyaan saya adalah server mana pun dapat mengirim kunci publik acak dan membuktikan bahwa ia memiliki kunci publik terkait. Bagaimana hal itu membuktikan bahwa server tersebut asli?
Alex
@ spartacus Saya pikir Anda maksudkan "dan buktikan bahwa ia memiliki kunci pribadi yang terkait", kan? Idenya adalah bahwa klien mengirim nilai yang dihasilkan secara acak ( tantangan ) ke server, dan server membuat beberapa perhitungan berdasarkan kunci pribadi yang tergantung pada tantangan (sehingga server tidak dapat melakukan perhitungan sampai menerima ini tantangan) dan itu hanya dapat dilakukan dengan sepengetahuan kunci privat.
Gilles 'SO- stop being evil'
Saya pikir Alex mengacu pada pertama kali klien terhubung ke server. Saya pikir klien akan mempercayai server yang pertama kali. Kemudian server akan mengirimkan kunci publiknya dan klien akan dapat mengotentikasi server untuk koneksi berikut.
synack
@synack Ah, pertama kali? Sebaliknya, klien les pengguna membuat keputusan ("Apakah Anda yakin ingin terus menghubungkan (ya / tidak)?"). Server tidak membuktikan apa pun pada saat itu.
Gilles 'SANGAT berhenti menjadi jahat'
Anda benar, pengguna yang mengambil keputusan.
synack
2

Teman-teman saya memberi saya jawabannya. Secara default, kunci mengidentifikasi mesin dan bukan pengguna. Jadi kunci disimpan di / etc / ssh /. Itu sebabnya saya mendapat kunci berbeda dari yang disimpan di /root/.ssh

damluar
sumber