Hentikan ssh klien dari menawarkan semua kunci publik yang dapat ditemukan?

32

Seperti kebanyakan sysadmin saya menggunakan openssh setiap saat. Saya memiliki sekitar selusin kunci ssh, saya ingin memiliki kunci ssh yang berbeda untuk setiap host. Namun ini menyebabkan masalah ketika saya terhubung ke host untuk pertama kalinya, dan yang saya miliki hanyalah kata sandi. Saya hanya ingin terhubung ke host menggunakan kata sandi, tidak ada kunci ssh dalam hal ini. Namun klien ssh akan menawarkan semua kunci publik di ~/.ssh/(saya tahu ini dari melihat keluaran ssh -v). Karena saya memiliki begitu banyak, saya akan terputus karena terlalu banyak kegagalan otentikasi.

Apakah ada cara untuk memberi tahu klien ssh saya untuk tidak menawarkan semua kunci ssh?

Rory
sumber
2
Mengapa Anda menginginkan kunci yang berbeda untuk setiap host? Kunci juga dapat dibagikan di seluruh host dalam satu domain administratif. Jelas, Anda akan menggunakan satu kunci untuk mesin kerja Anda dan satu lagi untuk mesin pribadi Anda, tetapi apa logika di balik menggunakan kunci terpisah untuk setiap mesin di tempat kerja?
Alex Holst
@AlexHolst Saya menggunakan banyak tombol. Saya memiliki kata sandi terenkripsi (yang mengharuskan saya memasukkan kata sandi) untuk infrastruktur internal. Saya punya satu lagi yang tidak dienkripsi (tanpa kata sandi) yang saya gunakan untuk satu layanan tertentu di mana saya tidak bisa menggunakan agen atau ingin mengetik setiap menit kata sandi. Saya punya orang lain untuk koneksi yang bukan bagian dari infrastruktur internal kami. Ini adalah praktik yang baik, karena meskipun harus cukup sulit bagi seseorang untuk memulihkan kunci privat dari kunci publik, itu bisa dilakukan. misalnya bug openssh Debian beberapa tahun yang lalu ...
Huygens
@Huygens Saya ingin melihat dokumen analisis risiko Anda yang menghasilkan kesimpulan bahwa Anda perlu menggunakan beberapa kunci SSH tetapi memiliki kunci teks yang jelas tidak masalah. Bisakah Anda memposting tautan?
Alex Holst
@AlexHolst Anda tidak harus menjadi "langsung". Pertama-tama jawaban saya adalah tentang alasan memiliki banyak pasangan kunci. Saya pikir saya memberi Anda beberapa. Setelah itu, kita semua harus berurusan dengan kebiasaan dan apa yang tidak. Saya memiliki sistem pengujian yang saya tidak dapat menggunakan aplikasi yang melakukan tunneling data melalui SSH tanpa diminta terus menerus untuk kata sandi utama membuat perangkat lunak tidak dapat digunakan. Tampaknya menjadi bug karena ketidakcocokan versi atau apa yang tidak. Saya mendapat pemberitahuan email untuk info masuk SSH, dan hanya saya yang masuk ke kotak itu. Jadi risikonya bisa diterima.
Huygens

Jawaban:

31

Ini adalah perilaku yang diharapkan menurut halaman manual dari ssh_config:

 IdentityFile
         Specifies a file from which the user's DSA, ECDSA or DSA authentica‐
         tion identity is read.  The default is ~/.ssh/identity for protocol
         version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and ~/.ssh/id_rsa for
         protocol version 2.  Additionally, any identities represented by the
         authentication agent will be used for authentication.  

         [...]

         It is possible to have multiple identity files specified in configu‐
         ration files; all these identities will be tried in sequence.  Mul‐
         tiple IdentityFile directives will add to the list of identities
         tried (this behaviour differs from that of other configuration
         directives).

Pada dasarnya, menetapkan IdentityFilehanya menambah kunci ke daftar saat ini agen SSH sudah disajikan kepada klien.

Coba timpa perilaku ini dengan ini di bagian bawah .ssh/configfile Anda :

Host *
  IdentitiesOnly yes

Anda juga dapat mengesampingkan pengaturan ini di tingkat host, misalnya:

Host foo
  User bar
  IdentityFile /path/to/key
  IdentitiesOnly yes
Mathias Bynens
sumber
4
Anda juga dapat menggunakan ssh -o "IdentitiesOnly true" -v -A user@hostapa yang saya gunakan untuk masuk ke mesin yang tidak memiliki kunci saya tetapi saya ingin menawarkan penerusan agen untuk melanjutkan. ( -vuntuk debugging verbose).
eckes
1
@eckes itu tip yang bagus, tapi bukankah seharusnya yes(dan tidak true)?
aexl
IdentitiesOnlymungkin tidak selalu membantu, Anda mungkin harus mengecualikan host secara khusus; lihat superuser.com/questions/859661/…
aexl
38

Meskipun orang lain telah mengisyaratkan hal ini dengan solusi berbasis konfigurasi, mungkin perlu menunjukkan bahwa Anda dapat dengan mudah melakukan ini satu kali saja pada baris perintah dengan:

ssh -o 'PubkeyAuthentication no' myhostname.mydomain
Andrew Ferrier
sumber
3
Sempurna .. solusinya IMHO
drAlberT
1
Benar ini seharusnya jawaban yang diterima.
JM Becker
11

Mengikuti solusi James Sneeringer, Anda mungkin hanya ingin mengatur ssh_config di sepanjang baris:

Host *.mycompany.com
  IdentityFile .ssh/id_dsa_mycompany_main

Host *.mycustomer.com
  IdentityFile .ssh/id_dsa_mycustomer

Host *
  RSAAuthentication no #this should be up top, avoid ssh1 at all costs
  PubkeyAuthentication no

Jika Anda terhubung dengan kunci tertentu ke banyak mesin yang tidak berada dalam domain yang sama, pertimbangkan untuk memberi mereka semua CNAME di DNS Anda sendiri. Saya melakukan ini dengan semua sistem pelanggan.

Justin Alan Ryan
sumber
2

Mirip dengan solusi user23413, Anda dapat menonaktifkan otentikasi kunci publik sama sekali untuk host tertentu (atau pola wildcard):

Host *.example.org
RSAAuthentication no        # SSHv1
PubkeyAuthentication no     # SSHv2
James Sneeringer
sumber
-1

Jika Anda menunjuk ke file kunci tertentu dengan ssh -i / path / to / key, ia hanya akan menggunakan yang itu bahkan jika orang lain dimasukkan ke dalam agen, dan Anda tidak akan dimintai kata sandi. Anda juga dapat mengedit Anda ~ / .ssh / config dan iklankan sesuatu seperti ini ...

Host foo.example.com
IdentityFile .ssh / id_rsa_foo.example.com

Anda juga bisa melakukan ...

Host * .example.org
IdentityFile .ssh / id_rsa_example.org

ryanc
sumber
Itu hanya menambah kunci target ke akhir daftar, yang tidak akan menyelesaikan masalah. IdentitiesOnlyhanya dengan keinginan itu.
Jo Rhett