Bagaimana Anda mengatur ssh untuk mengotentikasi menggunakan kunci alih-alih nama pengguna / kata sandi?

34

Bagaimana Anda mengatur ssh untuk mengotentikasi pengguna menggunakan kunci daripada nama pengguna / kata sandi?

ScArcher2
sumber

Jawaban:

27

Untuk setiap pengguna: mereka harus membuat (pada mesin lokal mereka) keypair menggunakan ssh-keygen -t rsa( rsadapat diganti dengan dsaatau rsa1juga, meskipun opsi-opsi itu tidak dianjurkan). Kemudian mereka perlu memasukkan konten kunci publik mereka ( id_rsa.pub) ke ~/.ssh/authorized_keysdalam server yang sedang login.

Chris Jester-Young
sumber
Satu-satunya hal lain yang ingin saya tambahkan adalah melihat izin pada file dan direktori.
trent
2
Jangan lupa chmod 0700 .ssh chmod 0600 .ssh / official_keys
Dave Cheney
3
Pasti menghasilkan kunci dengan cara ini tetapi kemudian periksa posting @ Chris Bunch tentang "ssh-copy-id". Itulah cara mentransfer 'id_rsa.pub' Anda.
Gareth
@gyaresu: Terima kasih! Saya baru belajar sesuatu yang baru! :-D
Chris Jester-Young
23

Saya sebenarnya lebih suka ssh-copy-id , sebuah skrip yang ditemukan di * nix secara default (dapat dimasukkan ke Mac OS X dengan cukup mudah juga) yang secara otomatis melakukan ini untuk Anda. Dari halaman manual:

ssh-copy-id adalah skrip yang menggunakan ssh untuk masuk ke mesin jarak jauh (mungkin menggunakan kata sandi login, jadi otentikasi kata sandi harus diaktifkan, kecuali jika Anda telah menggunakan beberapa identitas dengan cerdas)

Itu juga mengubah izin dari rumah pengguna jarak jauh, ~ / .ssh, dan ~ / .ssh / berwenang_keys untuk menghapus kemampuan menulis grup (yang sebaliknya akan mencegah Anda dari login, jika sshd jarak jauh telah menetapkan StrictModes dalam konfigurasinya).

Jika opsi -i diberikan maka file identitas (default ke ~ / .ssh / identity.pub) digunakan, terlepas dari apakah ada kunci di ssh-agent Anda.

Chris Bunch
sumber
2
@Chris Bunch SEMUA ORANG MELIHAT DI SINI! :) ssh-copy-id jelas merupakan cara untuk membagikan id_rsa.pub seseorang
Gareth
1
Keren, saya tidak pernah tahu tentang ini ... Saya menulis skrip saya sendiri untuk melakukan hal yang persis sama: - /
David Z
6

Hum, jangan mengerti. Cukup buat kunci dan mulailah. :) HOWTO Selain itu Anda bisa melarang login melalui kata sandi. Dalam contoh / etc / ssh / sshd_config:

PasswordAuthentication no
Node
sumber
2
Dan Anda juga perlu mengatur UsePAM no (atau mengkonfigurasi PAM yang sesuai). Sungguh menakjubkan berapa banyak HOWTO yang melewatkan bagian ini. Jika tidak melakukannya, Anda masih dapat masuk menggunakan kata sandi.
Nathan
3

Ini cukup mudah dilakukan - ada langkah-langkah sederhana yang dapat ditemukan di sini .

Poin utamanya adalah:

  • Jalankan ssh-keygendi mesin Anda. Ini akan menghasilkan kunci publik dan pribadi untuk Anda.
  • Salin dan tempel konten kunci publik Anda (kemungkinan masuk ~/.ssh/id_rsa.pub) ke ~/.ssh/authorized_keyspada mesin jarak jauh.

Penting untuk diingat bahwa ini akan memberi siapa pun yang memiliki akses ke kunci privat pada mesin Anda akses yang sama ke mesin jarak jauh, jadi ketika membuat pasangan kunci Anda dapat memilih untuk memasukkan kata sandi di sini untuk keamanan ekstra.

ConroyP
sumber
Saya merekomendasikan cut-and-paste daripada menyalin. File Authorized_keys dapat berisi beberapa kunci, dan Anda tidak ingin clobber kunci lain sudah ada di sana.
Chris Jester-Young
Panduan favorit saya telah dikirim ke Wayback Machine: web.archive.org/web/20061103161446/http
Philip Durbin
@ Chris oops - Saya bermaksud menyalinnya ke file alih-alih menulis! Jawaban diperbarui sekarang untuk memperjelas
ConroyP
1

Untuk meringkas apa yang dikatakan orang lain, mengatur kunci SSH mudah dan tidak ternilai.

Pada mesin yang Anda akan SSHing dari, Anda perlu membuat pasangan kunci Anda:

claudius:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dinomite/.ssh/id_rsa): <ENTER>
Enter passphrase (empty for no passphrase): <PASSPHRASE>
Enter same passphrase again: <PASSPHRASE>
Your identification has been saved in /home/dinomite/.ssh/id_rsa.
Your public key has been saved in /home/dinomite/.ssh/id_rsa.pub.
The key fingerprint is:
a3:93:8c:27:15:67:fa:9f:5d:42:3a:bb:9d:db:93:db dinomite@claudius

Tekan saja enter di mana dicatat dan masukkan frasa sandi ketika diminta - idealnya ini berbeda dari kata sandi login reguler Anda pada host saat ini dan yang Anda akan SSHing.

Berikutnya, Anda perlu menyalin kunci Anda hanya dihasilkan ke host yang ingin Anda SSH ke . Sebagian besar distribusi Linux memiliki alat ssh-copy-iduntuk melakukan ini:

claudius:~$ ssh-copy-id caligula.dinomite.net
Now try logging into the machine, with "ssh 'caligula.dinomite.net'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Jika distribusi Anda tidak memilikinya, maka Anda harus menyalin kunci ke host tujuan dan menambahkannya ke file (mungkin ada) .ssh/authorized_keys:

claudius:~$ scp .ssh/id_dsa.pub caligula.dinomite.net:
id_dsa.pub                                    100% 1119     1.1KB/s   00:00
claudius:~$ ssh caligula.dinomite.net
Last login: Sat May  9 10:32:30 2009 from claudius.csh.rit.edu
Caligula:~$ cat id_dsa.pub >> .ssh/authorized_keys

Terakhir, untuk mendapatkan manfaat maksimal dari kunci SSH, Anda harus menjalankan agen SSH. Jika Anda menggunakan lingkungan desktop (Gnome, KDE, dll.) Maka hanya logout dan kembali akan memulai agen SSH untuk Anda. Jika tidak, Anda dapat menambahkan berikut ke shell Anda berkas RC ( .bashrc, .profile, dll):

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
trap "kill $SSH_AGENT_PID" 0
fi
Drew Stephens
sumber
1

Ini dimaksudkan sebagai daftar periksa. Jika seseorang mengikutinya poin demi poin, gotcha paling umum untuk login tanpa kata sandi harus dicakup. Sebagian besar poin ini disebutkan di tempat lain; ini adalah agregasi.

Harus ada ~/.sshdirektori chmod 700di setiap mesin di bawah akun yang akan berasal atau menerima koneksi.

Kunci (pribadi) harus dibuat tanpa frasa sandi, atau agen dapat dimulai yang akan menyimpan versi yang didekripsi dari kunci penahan frasa sandi untuk digunakan klien. Mulai agen dengan ssh-agent $SHELL. Itu $SHELLbagian yang membuatku butuh waktu untuk menemukannya. Lihat halaman manual karena ada detail yang beraneka ragam jika Anda ingin menggunakan agen.

Jangan lupa bahwa secara default kunci lemah (<2048 bit DSA) tidak diterima oleh sshd versi terbaru.

Hal-hal berikut harus dilakukan pada mesin sisi klien untuk memulai koneksi.

  1. Kunci pribadi Anda harus ditempatkan di ~/.ssh/id_rsaatau ~/.ssh/id_dsasesuai kebutuhan. Anda dapat menggunakan nama lain, tetapi kemudian harus disertakan pada opsi -i pada perintah ssh pada mesin asal untuk secara eksplisit menunjukkan kunci pribadi.

  2. Kunci pribadi Anda harus chmod 600.

  3. Periksa apakah folder rumah Anda chmod 700.

Sekarang untuk memungkinkan mesin menerima permintaan. Model umum adalah di mana admin memberi Anda akses ke mesin yang bukan milik Anda (seperti shared web hosting). Karena itu, ide dengan ssh adalah Anda menawarkan kunci publik kepada siapa pun yang memberi Anda akun. Itu sebabnya Anda biasanya tidak menaruh kunci pribadi pada mesin yang menerima permintaan. Tetapi, jika Anda ingin mesin ini melakukan ssh keluar juga, maka Anda harus memperlakukan sebagai mesin yang berasal dengan langkah-langkah di atas.

  1. Kunci publik Anda harus ditempatkan dalam file yang disebut di ~/.ssh/authorized_keysbawah akun yang akan menerima koneksi. Anda dapat menempatkan kunci lain yang diizinkan untuk terhubung melalui akun ini di sini juga. Suatu hal yang sangat rumit jika Anda berada di vi dan menempelkan kunci ke file dari buffer paste di Putty adalah ini: kunci dimulai dengan "ssh-". Jika Anda tidak dalam mode sisipkan, huruf "s" pertama akan memasukkan vi dalam mode sisipkan dan sisa tombol akan terlihat baik-baik saja. Tetapi Anda akan kehilangan huruf "s" di awal kunci. Butuh berhari-hari bagi saya untuk menemukannya.
  2. Saya suka chmod 600 ~/.ssh/authorized_keys. Setidaknya harus gw.
  3. Sekarang, Anda harus memiliki sidik jari host ditambahkan ke cache. Pergi ke mesin A, dan ssh ke mesin B secara manual. Pertama kali, Anda akan mendapatkan pertanyaan seperti "Apakah Anda ingin menambahkan ... ke cache kunci host?". Jika Anda mencoba untuk mendapatkan otomatisasi (seperti skrip) untuk menggunakan login ini, Anda harus memastikan bahwa klien ssh yang digunakan oleh otomatisasi tidak akan mendapatkan prompt ini.
Vic K
sumber
0

Seperti yang orang lain katakan, pengguna Anda harus membuat sendiri kunci pada mesin klien mereka dengan ssh-keygen dan menambahkan kunci publik mereka ke ~ / .ssh / otor_keys pada mesin yang ingin mereka masuki.

Untuk informasi lebih rinci, saya sangat merekomendasikan SSH, The Secure Shell .

Neall
sumber
0

Ada saran bagus di sini, jadi saya tidak akan mengulanginya. Setelah Anda menyiapkan satu server untuk memungkinkan Anda masuk dengan kunci, Anda dapat mengatur yang lain untuk melakukan hal yang sama dengan liner satu ini:

remote=server1 server2 server3 server4
for r in $remote; do echo connecting to $r; tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh $r "tar zxf -; chmod 700 .ssh" ; done

Cukup cd ke direktori home Anda, tentukan remote variabel sebagai satu atau banyak nama server dan lakukan banyak sekaligus. Kata sandi yang diminta akan menjadi kata sandi ssh Anda untuk server jarak jauh. Tentu saja Anda dapat menggunakan versi yang disederhanakan tanpa for-loop:

tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh YOUR_SERVER_NAME_HERE "tar ztvf -; chmod 700 .ssh"

INGAT: Hanya salin kunci publik Anda. Anda tidak ingin kunci pribadi Anda berada di beberapa server tempat siapa pun yang menggunakan sudo dapat menyalinnya dan dengan kasar memaksa frasa sandi Anda.

Bruno Bronosky
sumber