Apakah kunci ssh perlu dinamai id_rsa?

130

Saya telah menemukan masalah ini beberapa kali ketika membuat membangun server dengan otentikasi kunci.

Saya bertanya-tanya apakah ada orang lain yang mengalami hal ini. Saya memiliki beberapa kunci untuk pengguna saya saat ini yang dapat terhubung ke mesin yang berbeda. Katakanlah machine1 dan machine2. Saya telah menempelkan kunci publik saya ke file otor_keys masing-masing. Yang pertama saya beri nama id_rsa kunci pertama dan bender kunci kedua.

Ketika saya mencoba untuk terhubung ke bender saya mendapatkan output berikut dengan koneksi ssh verbose saya

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

Ini hanya menawarkan kunci id_rsa, seperti yang Anda lihat di atas. Apakah ini benar? Jika demikian mengapa? Bagaimana saya mendapatkannya untuk menawarkan lebih banyak kunci? Saya tahu ini adalah masalah yang saya lihat sebentar-sebentar, karena di rumah saya punya banyak kunci tanpa banyak masalah.

Saya juga akan menghargai tinjauan umum tentang bagaimana pub dan kunci pribadi berinteraksi dengan klien dan server. Saya pikir saya punya ide yang cukup baik, tetapi ternyata saya kehilangan sesuatu.

Silahkan dan terima kasih.

myusuf3
sumber

Jawaban:

157

Secara default, ssh mencari id_dsadan id_rsafile. Kunci tidak harus dinamai seperti ini, Anda dapat menamainya mykeyjuga, atau bahkan menempatkannya di direktori yang berbeda. Namun, jika Anda melakukan salah satu dari itu, maka Anda perlu secara eksplisit merujuk kunci pada perintah ssh seperti:

ssh user@server -i /path/to/mykey

Jika suatu perintah tidak menerima -i, misalnya sshfs, gunakan IdentityFileopsi:

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

Bagaimana itu bekerja

Saat membuat kunci, Anda akan mendapatkan dua file: id_rsa(kunci pribadi) dan id_rsa.pub(kunci publik). Seperti namanya, kunci pribadi harus dirahasiakan dan kunci publik dapat dipublikasikan kepada publik.

Otentikasi kunci publik berfungsi dengan kunci publik dan pribadi. Baik klien dan server memiliki kunci sendiri. Saat memasang openssh-serverserver kunci publik dan pribadi dihasilkan secara otomatis. Untuk klien, Anda harus melakukannya sendiri.

Ketika Anda (klien) terhubung dengan server, kunci publik dipertukarkan. Anda akan menerima satu server, dan server milik Anda. Pertama kali Anda menerima kunci publik server, Anda akan diminta untuk menerimanya. Jika kunci publik ini berubah dari waktu ke waktu, Anda akan diperingatkan karena kemungkinan serangan MITM (Manusia di tengah) sedang berlangsung, memotong lalu lintas antara klien dan server.

Server memeriksa apakah Anda diizinkan untuk terhubung (didefinisikan dalam /etc/ssh/sshd_config) dan apakah kunci publik Anda tercantum dalam ~/.ssh/authorized_keysfile. Kemungkinan alasan mengapa kunci publik ditolak:

  • /etc/ssh/sshd_config:
    • AllowUsersatau AllowGroupsditentukan, tetapi pengguna server Anda tidak terdaftar dalam grup atau daftar pengguna (standarnya tidak ditentukan, tidak membatasi pengguna atau grup untuk masuk).
    • DenyUsersatau DenyGroupsditentukan dan Anda berada di daftar pengguna atau grup.
    • Anda mencoba masuk sebagai root, tetapi PermitRootLogindisetel ke No(default yes).
    • PubkeyAuthenticationdiatur ke No(default yes).
    • AuthorizedKeysFilediatur ke lokasi yang berbeda, dan kunci publik tidak ditambahkan ke file itu (default .ssh/authorized_keys, relatif terhadap dir home)
  • ~/.ssh/authorized_keys: kunci publik Anda tidak ditambahkan dalam file ini (perhatikan bahwa file ini dibaca sebagai pengguna root)

Menggunakan beberapa tombol

Tidak jarang menggunakan beberapa kunci. Alih-alih menjalankan ssh user@host -i /path/to/identity_file, Anda dapat menggunakan file konfigurasi ~/.ssh/config,.

Pengaturan umum adalah IdentityFile (tombol) dan port. Konfigurasi selanjutnya akan memeriksa "id_dsa" dan "bender" hanya saat terhubung dengan ssh youruser@yourhost:

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

Jika Anda menghilangkan Host yourhost, pengaturan akan berlaku untuk semua koneksi SSH. Pilihan lain juga dapat ditentukan untuk pertandingan tuan rumah ini, seperti User youruser, Port 2222, dll Hal ini akan memungkinkan Anda untuk menghubungkan dengan singkatan ssh yourhostbukan ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender.

Lekensteyn
sumber
1
mengapa saya harus menentukan kunci? intinya adalah supaya saya bisa ssh ke mesin lebih mudah.
myusuf3
2
@StevenRoose from ssh_config(5): Nama file dapat menggunakan sintaksis tilde untuk merujuk ke direktori home pengguna atau salah satu dari karakter escape berikut: '% d' (direktori home user lokal), '% u' (nama pengguna lokal), '% l '(nama host lokal),'% h '(nama host jarak jauh) atau'% r '(nama pengguna jarak jauh). Tidak mungkin untuk menentukan kartu liar, tapi ini seharusnya cukup nyaman kurasa. Ketahuilah bahwa server harus menyelidiki setiap kunci yang Anda kirim, jadi lebih sedikit menentukan kunci lebih baik. Wildcard pada pekerjaan Host, lihat lagi halaman manual ssh_config(5).
Lekensteyn
2
@therobyouknow Anda tidak harus membuat pasangan kunci unik untuk setiap mesin. Biasanya Anda memiliki beberapa kunci, dan menambahkan kunci publik dari salah satu kunci ke .ssh/authorized_keysfile di mesin remote. Jika Anda menggunakan .ssh/id_rsanama file standar (atau id_dsa, id_ecdsa atau id_ed25519 baru-baru ini), maka ssh akan mencoba ini secara otomatis dan Anda tidak perlu menentukan IdentityFiledalam konfigurasi Anda (atau -i path/to/id_fileparameter untuk ssh).
Lekensteyn
4
Saya suka jawaban yang melampaui detail yang diperlukan dan meluangkan waktu untuk menjelaskan konsep. Kerja bagus! +1
user2490003
1
@landed Ini adalah host dari server SSH (bisa berupa alamat IP atau nama DNS). Saya telah mencoba memperjelas bagian itu, semoga membantu.
Lekensteyn
40

Metode favorit saya memungkinkan kunci pribadi untuk dipilih secara otomatis

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH akan mengganti% l dengan nama mesin lokal,% r dengan nama pengguna jarak jauh, dan% h dengan host jarak jauh, jadi jika saya ingin terhubung dari mesin saya yang disebut foo to bar sebagai pengguna, saya menjalankan:

ssh bar

Dan ssh akan secara otomatis menggunakan:

~/.ssh/foo_user@bar_id_rsa

Karena host lokal juga disimpan, ini memungkinkan direktori home yang dibagikan melalui NFS (kunci berbeda per mesin!) Atau bahkan mengidentifikasi mesin mana yang menjadi kunci ...

Viperfang
sumber
1

Mempertimbangkan komentar StevenRoose bahwa perlu waktu lebih lama untuk menentukan banyak kunci, dan saya kebetulan bermain-main dengan banyak kunci, saya ingin menyarankan solusi pribadi saya.

Saya membuat symlink ke kunci yang ingin saya gunakan pada saat itu, dan karena itu jarang berubah tergantung pada proyek yang sedang saya kerjakan, saya senang dengan itu.

Di sini saya telah ditautkan ke kunci saya untuk mesin yang berjalan di bawah virtualbox:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

Kita juga bisa menambahkan skrip yang sangat cepat untuk mengubah set lain tanpa harus mengetikkan perintah ln secara manual lagi.

Sekali lagi, ini bukan solusi untuk dua kunci saja, tetapi untuk jumlah yang lebih besar, mungkin bisa diterapkan.

ajhcasual
sumber
1
Saya hanya menambahkan alias di oleh bash_profile untuk setiap server tempat saya bekerja. Jadi untuk server bernama bob saya hanya punya ini ... alias bob = "ssh bob.example.com -l pete -i / path / to / key" - maka saya cukup mengetik bob - dan saya masuk!
Peter Bagnall
2
Meskipun terkadang lebih mudah untuk "menyelesaikan sesuatu dengan cara yang sudah Anda ketahui", ada beberapa pendekatan yang lebih mudah jika Anda mensetup .ssh / config kunci dan host. Komentar ini diarahkan pada poster komentar dan komentator @ Peter-Bagnall
Scott Prive