Bagaimana saya bisa mengatur login SSH-less-password?


252

Saya ingin dapat masuk ke remote melalui ssh tanpa harus memasukkan kata sandi setiap saat.

  • Bagaimana cara mengaturnya?
  • Apakah perintah berbeda diperlukan untuk menjalankan sesi tanpa kata sandi?

Apakah Anda menggunakan openssh? (jika itu mudah;))
Rinzwind

@Rinzwind, Mengapa saya repot-repot mendapatkan versi eksklusif ketika OpenSSH sudah diinstal sebelumnya?
Oxwivi

15
Saya mencoba untuk tidak membuat assuptions;)
Rinzwind

1
@ Kevin, mohon klarifikasi diri Anda. Kita berbicara tentang ssh-ing tanpa kata sandi, yang umumnya merupakan praktik yang baik . Apakah maksud Anda ssh-ing menjadi shell root? Itu tidak tercakup oleh pertanyaan ini.
Oxwivi

@Oxwivi: Maaf, ini seharusnya komentar tentang jawaban Ravindra, yang ditargetkan pada login root.
Kevin

Jawaban:


266

Menjawab

Jalankan perintah ini:

ssh-keygen

Maka Anda harus menyalin kunci baru ke server Anda :

ssh-copy-id user@host
## or if your server uses custom port no:
ssh-copy-id "user@host -p 1234"

Setelah kunci disalin, ssh ke mesin seperti biasa:

ssh user@host

Anda sekarang dapat masuk tanpa memasukkan kata sandi dari mesin tertentu tempat Anda menjalankan perintah.

Contoh

not-marco@rinzwind-desktop:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/not-marco/.ssh/id_rsa): 
Created directory '/home/not-marco/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/not-marco/.ssh/id_rsa.
Your public key has been saved in /home/not-marco/.ssh/id_rsa.pub.
The key fingerprint is:
b1:25:04:21:1a:38:73:38:3c:e9:e4:5b:81:e9:ac:0f not-marco@rinzwind-desktop
The key's randomart image is:
+--[ RSA 2048]----+
|.o= . oo.        |
|*B.+ . .         |
|*=o .   o .      |
| = .     =       |
|. o     S        |
|E.               |
| o               |
|  .              |
|                 |
+-----------------+

not-marco@rinzwind-desktop:~$ ssh-copy-id not-marco@server
not-marco@server's password: 
Now try logging into the machine, with "ssh 'not-marco@server'", and check in:

  ~/.ssh/authorized_keys

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

Penjelasan

Ini mengasumsikan Anda sudah berhasil terhubung ke server Anda melalui SSH.

Anda harus membuat SSH Keypair yang memungkinkan Anda mengidentifikasi Anda sendiri tanpa menggunakan kata sandi. Anda dapat memilih untuk melindungi kunci dengan kode sandi jika diinginkan, tetapi ini dapat dibiarkan kosong sehingga memungkinkan akses SSH yang benar-benar tanpa kata sandi.

  1. Pertama buat SSH Keypair Anda dengan menjalankan ssh-keygenini akan membuat id_rsadan id_rsa.pubfile. The pubfile apa yang terjadi di server, kunci pribadi ( id_rsa) adalah apa yang tetap dengan Anda dan bagaimana Anda mengidentifikasi diri.
  2. Selanjutnya salin kunci publik ke server Anda dengan ssh-copy-id user@servermengganti pengguna dengan pengguna jarak jauh Anda dan server dengan nama DNS mesin atau alamat IP. Ini akan meminta kata sandi SSH Anda, masukkan dan jika semua selesai dengan sukses Anda akan dapat mengakses mesin melalui ssh user@servertanpa perlu kata sandi.

Referensi


11
@Oxwivi jawaban ini adalah cara yang lebih benar untuk melakukannya - tetapi tampaknya lebih lama. Yang perlu Anda lakukan adalah mengetik ssh-keygenikuti petunjuk di layar, lalu ketik ssh-copy-id user@servermengganti pengguna dengan pengguna jarak jauh dan server dengan mesin jarak jauh
Marco Ceppi

3
Saya memiliki kesalahan ini, "Agen mengaku gagal mendaftar menggunakan kunci." setiap kali ketika mencoba masuk setelah mengikuti prosedur ini. Solusinya adalah menjalankan "> ssh-add" pada mesin lokal dan sekarang saya bisa masuk ke mesin jarak jauh seperti yang diharapkan.
jmbouffard

1
Ini perlu untuk menyebutkan bahwa jika Anda perlu untuk menggunakan port kustom untuk @ Server, Anda perlu melakukan hal ini dengan: ssh-copy-id "not-marco@127.0.0.1 -p 1234".
s3m3n

@Rinzwind: Apakah ini berarti bahwa saya tidak pernah dapat mengautentikasi dari klien / mesin yang tidak dikenal ke server saya jika saya menonaktifkan otentikasi passwd & hanya mengizinkan otentikasi kunci. Apakah ada cara untuk mengizinkan masuk dari mesin yang tidak dikenal menggunakan kunci pribadi yang dibuat untuk klien yang dikenal / dikonfigurasi untuk berkomunikasi ke server? Maksud saya, apakah kunci pribadi ini portabel & dapat digunakan untuk mengotentikasi diri saya ke server dari mesin lain, dalam hal kebutuhan darurat ??
Rajat Gupta

4
Tetapi server masih meminta kata sandi ,,,
Lerner Zhang

34

Ketikkan perintah berikut:

  1. ssh-keygen

    Tekan Entertombol hingga Anda mendapatkan prompt

  2. ssh-copy-id -i root@ip_address

    (Ini akan meminta kata sandi sistem host)

  3. ssh root@ip_address

Sekarang Anda harus bisa masuk tanpa kata sandi.


25

Cara saya biasanya melakukan ini adalah sebagai berikut:

ssh-keygen -t rsa

(Saat diminta kata sandi, biarkan kosong)

Kemudian: cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'

(Ini membutuhkan folder .ssh berada di direktori home pada hostname yang ditargetkan, dengan file Authorized_key di dalamnya)

Tentu saja, ganti nama pengguna dengan nama pengguna yang diinginkan, dan nama host dengan nama host atau alamat IP yang diinginkan

Setelah itu, hanya SSH ke kotak itu seperti yang biasa Anda lakukan.


Bagaimana dengan touchdan chmodperintah dalam jawaban Rinzwind?
Oxwivi

7
Anda harus chmod .ssh/authorized_keysfile ke 0600 atau ini tidak akan berhasil
Marco Ceppi

Ini sangat membantu karena saya tidak bisa mendapatkan ssh-copy-id untuk root pada server saya. itu harus di-root dalam situasi di mana backuppc (atau sembarang daemon lainnya) perlu ssh ke komputer lain.
Adam

18

Biasanya saya gunakan sshpassuntuk itu, instal dengan sudo apt-get install sshpassdan gunakan seperti ini

sshpass -p 'password' ssh your_username@your_server

6
Mengapa tidak menggunakan kunci ssh?
enzotib

1
Ini bukan situasi "mengapa tidak", itu masih berfungsi sempurna tanpa menambahkan kunci, itu hanya metode lain yang akan saya katakan.
Bruno Pereira

Terima kasih atas informasi tentang sshpass, belum pernah mendengarnya sebelumnya.
Panther

7
Kunci SSH adalah jawaban "benar" untuk pertanyaan tersebut, tetapi sshpassmerupakan peretasan yang sangat berguna jika Anda tidak dapat mengubah metode otentikasi pada server jarak jauh!
Jacob Krall

9
Ini sangat berbahaya, Anda akan tetap menggunakan bash_history atau apa pun kata sandi polos untuk host yang Anda hubungkan ..
kappa

10

Nonaktifkan Otentikasi Kata Sandi

Karena banyak orang dengan server SSH menggunakan kata sandi yang lemah, banyak penyerang online akan mencari server SSH, kemudian mulai menebak kata sandi secara acak. Seorang penyerang dapat mencoba ribuan kata sandi dalam satu jam, dan menebak kata sandi terkuat yang diberikan waktu yang cukup. Solusi yang disarankan adalah menggunakan kunci SSH alih-alih kata sandi. Agar sulit ditebak seperti kunci SSH normal, kata sandi harus berisi 634 huruf dan angka acak. Jika Anda selalu dapat masuk ke komputer dengan kunci SSH, Anda harus menonaktifkan otentikasi kata sandi sama sekali.

Jika Anda menonaktifkan otentikasi kata sandi, Anda hanya dapat terhubung dari komputer yang telah Anda setujui secara khusus. Ini secara besar-besaran meningkatkan keamanan Anda, tetapi membuatnya tidak mungkin bagi Anda untuk terhubung ke komputer Anda sendiri dari PC teman tanpa terlebih dahulu menyetujui PC, atau dari laptop Anda sendiri ketika Anda secara tidak sengaja menghapus kunci Anda.

Disarankan untuk menonaktifkan otentikasi kata sandi kecuali Anda memiliki alasan khusus untuk tidak melakukannya.

Untuk menonaktifkan otentikasi kata sandi, cari baris berikut di file sshd_config Anda:

#PasswordAuthentication yes

ganti dengan garis yang terlihat seperti ini:

PasswordAuthentication no

Setelah Anda menyimpan file dan me-restart server SSH Anda, Anda bahkan tidak akan diminta kata sandi ketika Anda login.

https://help.ubuntu.com/community/SSH/OpenSSH/Configuring#disable-password-authentication


2
Ini adalah jawaban paling dasar yang paling dasar tetapi bagus untuk keamanan! Nonaktifkan login root juga bagus
FreeSoftwareServers

Apakah PasswordAuthentication nomemengaruhi semua pengguna? Jika tidak, bagaimana cara mematikannya untuk pengguna normal tetapi membiarkannya tidak berubah untuk root saat saya mengujinya? Saya tidak benar-benar ingin membuatnya dan mengunci diri sepenuhnya.
Adam

Biarkan sesi ssh tetap terbuka sehingga Anda dapat mengubahnya kembali. Anda ingin menonaktifkan kata sandi DAN root. Ya, Anda bisa menguburkannya. Jangan;)
Thufir

Selama ssh, saya memiliki kesalahan Permission denied (publickey).dengan PasswordAuthentication no. Apa yang harus saya lakukan? Apakah saya mengganti PasswordAuthentication nohost lain?
ParisaN

9

Solusi ini khusus untuk pengguna yang menggunakan Windows untuk ssh ke mesin jarak jauh mereka termasuk gambar cloud di AWS Cloud dan GCE Cloud

Penolakan

Baru-baru ini menggunakan solusi ini untuk login jarak jauh gambar vm baru yang digunakan di GCE.


Alat yang digunakan:

  1. puttygen unduhan puttygen
  2. winscp download wincp

Langkah-langkah untuk melakukan:

  1. Hasilkan pasangan kunci publik / pribadi menggunakan puttygen.
  2. Unggah kunci publik ke server Anda di cloud atau lokasi jauh.

Bagaimana cara melakukannya:

1. Hasilkan kunci / pasangan atau gunakan kunci pribadi yang ada

Jika Anda memiliki kunci pribadi:

Buka puttygen, tekan tombol muat dan pilih *.pemfile kunci pribadi Anda ( ).


Jika Anda tidak memiliki kunci pribadi:

  • Buka puttygen,
  • Pilih jenis kunci yang diinginkan SSH2 DSA (Anda dapat menggunakan RSA atau DSA) di dalam bagian Parameter . Penting bahwa Anda membiarkan bidang kata sandi kosong.
  • Tekan generatedan ikuti instruksi untuk menghasilkan pasangan kunci (publik / pribadi).

Contoh Generasi Kunci foto

(dari sumber 1, tautan diberikan di bawah ini)

2. Buat file 'otor_keys' baru (dengan notepad)

Salin data kunci publik Anda dari bagian "Kunci publik untuk menempel ke file OpenSSH official_keys" dari Generator Kunci Putty, dan tempelkan data kunci ke authorized_keysfile.


Pastikan hanya ada satu baris teks dalam file ini.


3. Unggah kunci ke server Linux

  • Buka WinSCP,
  • Pilih protokol file SFTP dan login dengan kredensial ssh Anda.
  • Jika berhasil, Anda melihat struktur direktori home di mesin jarak jauh Anda.

Unggah file berwenang_keys ke direktori home di mesin jarak jauh.


4. Tetapkan izin yang tepat

Buat .sshdirektori (jika tidak ada)


Salin authorized_keysfile ke .sshdirektori.
(ini akan menggantikan authorized_keysfile yang ada , perhatikan ini).

Jika file ada, cukup tambahkan konten file ini ke file yang ada.


Jalankan perintah untuk mengatur izin:

sudo chmod 700 .ssh && chmod 600 .ssh/authorized_keys

Sekarang Anda akan dapat sshmasuk ke mesin jarak jauh tanpa memasukkan kredensial setiap waktu.

Bacaan lebih lanjut:


4

Jika Anda membuat kunci publik / pricate dan masuk menggunakan kunci publik kami yang baru dibuat, Anda tidak perlu mengetikkan kata sandi Anda. Bergantung pada konfigurasi key-ring dan / atau ssh agent Anda, Anda mungkin perlu melindungi kunci Anda dengan frasa sandi.

Berikut adalah salah satu dari banyak howto singkat untuk Anda. Sangat penting untuk keselamatan metode ini, bahwa kunci pribadi yang dihasilkan tetap pribadi! Anda tidak boleh membaginya dengan siapa pun atau mengizinkan akses itu dalam kapasitas apa pun.

Perintah ini menghasilkan kunci yang cukup kuat di ~/.ssh/:

ssh-keygen -b 4096

Di dalam ~/.ssh/Anda akan menemukan kunci publik Anda sebagai id_rsa.pub. Isinya harus ditambahkan ke authorized_keysfile server Anda dengan mengangkut melalui media yang dapat diangkut (pen drive) atau dengan segera mengaktifkan otentikasi kata sandi di server, kemudian menggunakan ssh-copy-id ~/.ssh/id_rsa.pub username@serverdan kemudian menonaktifkannya lagi.

Jika Anda memilih untuk mengamankan kunci Anda dengan frasa sandi (pada langkah pertama), Anda dapat menggunakan ssh-agentatau kunci Ubuntu untuk mengamankan yang kasar secara lokal sehingga Anda tidak harus mengetikkannya setiap saat.


3

Untuk membuat beberapa tambahan:

  • Mac secara default tidak memiliki ssh-copy-id, Anda harus menginstalnya sendiri:

    curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
    chmod +x /usr/local/bin/ssh-copy-id
    

temukan lebih lanjut di sini: https://github.com/beautifulcode/ssh-copy-id-for-OSX

  • jika Anda telah membuat port-forwarding, perintahnya harus seperti ini:

    ssh-copy-id "not-marco@127.0.0.1 -p 2222"
    

perhatikan bahwa tanda kutip diperlukan.


3

Login / salin jarak jauh tanpa memberikan kata sandi

Aplikasi sshdan scpuntuk login jarak jauh dan salinan jarak jauh, masing-masing, memungkinkan Anda untuk berkomunikasi dengan host jarak jauh tanpa memberikan kata sandi. Ini mengharuskan Anda mengikuti prosedur otentikasi seperti yang dijelaskan di bawah ini. Yang kami maksud dengan klien adalah mesin yang Anda duduki dan server yang kami maksud adalah mesin yang ingin Anda masuki tanpa memberikan kata sandi. Langkah-langkah prosedur otentikasi adalah:

  1. Jalankan ssh-keygen untuk menghasilkan kunci pribadi dan publik, kecuali jika ini sudah dilakukan pada mesin Anda. Ini disimpan dalam file di $HOME/.ssh.
  2. Tambahkan konten file kunci publik ke file $HOME/.ssh/authorized_keysatau $HOME/.ssh/authorized_keys2di server.

Ada tiga jenis protokol otentikasi. Anda menentukan jenisnya ketika menjalankan ssh-keygen:

  1. Protokol SSH versi 1, RSA1: ini adalah pilihan default dan menghasilkan identitas file (kunci pribadi, harus chmod 0700memastikan bahwa file ini tidak dapat dibaca oleh orang lain) dan identity.pub (kunci publik).
  2. Protokol SSH versi 1, RSA : ini diperoleh dengan menjalankan ssh-keygen -t rsadan menghasilkan file id_rsa(kunci pribadi) dan id_rsa.pub(kunci publik)
  3. Protokol SSH versi 1, DSA : ini diperoleh dengan menjalankan ssh-keygen -t dsadan menghasilkan file id_dsa(kunci pribadi) dan id_dsa.pub(kunci publik)

Saat menjalankan ssh-keygen Anda dapat mengandalkan jawaban default (menyiratkan bahwa Anda tidak memberikan frasa sandi). Ini membuat seluruh pengaturan sederhana, tetapi juga tidak aman.

Anda dapat menentukan jenis kunci yang akan digunakan oleh opsi untuk ssh ; ssh -1memaksa penggunaan kunci RSA1 (protokol versi 1), sedangkan ssh -2memaksa ssh untuk mencoba kunci RSA atau DSA saja (protokol versi 2). Dalam contoh di bawah ini, kami membuat dan menginstal kunci RSA1 dan DSA pada host jarak jauh sehingga Anda memiliki lebih banyak fleksibilitas. Anda dapat membuat file konfigurasi di .sshdirektori Anda dengan baris tersebut

Protocol 1,2

Ini membuat ssh mencoba koneksi RSA1 (versi protokol 1) sebelum RSA / DSA (versi protokol 2).

Menggunakan kunci RSA1

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat identity.pub >> authorized_keys"

Menggunakan kunci DSA

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy DSA key: 
scp id_dsa.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat id_dsa.pub >> authorized_keys2"

Ini semua yang harus Anda lakukan jika Anda tidak menggunakan kata sandi saat membuat kunci. Anda dapat menguji koneksi dengan menjalankan ssh $ remote dan melihat apakah Anda dapat masuk tanpa memberikan kata sandi (Anda mungkin perlu menggunakan -1atau -2sebagai opsi untuk ssh ). Prosedur ini, tentu saja, dapat diulang untuk mesin yang ingin Anda masuki.

Jika Anda memang menggunakan kata sandi, Anda harus menjalankan program ssh-agentuntuk memulai shell khusus, diikuti dengan ssh-addmendaftarkan kombinasi kunci / kata sandi Andasshd . Lihat halaman manual untuk program-program ini untuk informasi lebih lanjut.

Skrip untuk mengotomatiskan koneksi bebas kata sandi: ssh-no-password.sh

#!/bin/sh

# create ssh connections without giving a password

if [ $# -lt 1 ]; then
  echo Usage: $0 username@remotehost
  exit
fi
remote="$1"  # 1st command-line argument is the user@remotehost address
this=$HOST   # name of client host

# first check if we need to run ssh-keygen for generating
# $HOME/.ssh with public and private keys:
if [ ! -d $HOME/.ssh ]; then
  echo "just type RETURN for each question:" # no passphrase - unsecure!!
  # generate RSA1, RSA and DSA keys:
  echo; echo; echo
  ssh-keygen
  echo; echo; echo
  ssh-keygen -t rsa
  echo; echo; echo
  ssh-keygen -t dsa
else
  # we have $HOME/.ssh, but check that we have all types of
  # keys (RSA1, RSA, DSA):
  if [ ! -f $HOME/.ssh/identity ]; then
     # generate RSA1 keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate RSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t rsa
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate DSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t dsa
  fi
fi


cd $HOME/.ssh

if [ ! -f config ]; then
  # make ssh try ssh -1 (RSA1 keys) first and then ssh -2 (DSA keys)
  echo "Protocol 1,2" > config
fi

# copy public keys (all three types) to the destination host:

echo; echo; echo
# create .ssh on remote host if it's not there:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh/${this}_rsa1.pub
# copy RSA key:
#scp id_rsa.pub ${remote}:.ssh/${this}_rsa.pub
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh/${this}_dsa.pub
# make authorized_keys(2) files on remote host:

echo; echo; echo
# this one copies all three keys:
#ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_rsa.pub >> authorized_keys2; cat ${this}_dsa.pub >> authorized_keys2;"
# this one copies RSA1 and DSA keys:
ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_dsa.pub >> authorized_keys2;"

echo; echo; echo
echo "try an ssh $remote"

disalin dari: http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html


1

Saya ingin menambahkan jawaban bagi mereka yang mungkin menemukan mereka harus memasukkan kata sandi bahkan mereka telah membaca semua jawaban di sini karena Anda telah menetapkan IdentitiesOnly sebagai ya. Dan jawabannya di sini dapat menghemat banyak waktu untuk mengelola beberapa kunci, menjadi kunci untuk git atau server.

Setelah saya membuat kunci dan menyalinnya ke server:

ssh-keygen  # change the file to /home/yourname/.ssh/something
ssh-copy-id -i ~/.ssh/something.pub lerner@192.168.20.160

Saya menemukan itu tidak berhasil.

Lalu saya pergi untuk memeriksa ~/.ssh/configfile pada klien, saya melihat ini di bagian bawah:

Host *
IdentitiesOnly yes

Lalu saya tambahkan ini di atas:

Host somename
HostName 192.168.20.160
User lerner
IdentityFile ~/.ssh/something

Saya bisa masuk dengan memasukkan ssh somename.

Kemudian Anda dapat menambahkan beberapa kunci ssh menggunakan nama favorit Anda, dan Anda hanya perlu menambahkan pengaturan seperti empat baris di atas ke file konfigurasi.

Host adalah nama yang ingin Anda masukkan ketika Anda menghubungkan server nanti; HostName adalah ip server; Pengguna adalah nama pengguna yang Anda login di server; dan file identitas adalah file tempat Anda menyimpan kunci yang Anda buat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.