Saya ingin berkomunikasi antara beberapa komputer di jaringan saya (Ethernet statis), melalui SSH. Untuk melakukan itu saya perlu menjalankan ssh-add setiap kali saya masuk pada mesin tertentu, bagaimana saya bisa melakukannya sehingga sudah diatur sekali dan tidak meminta saya untuk frasa sandi setiap kali saya masuk atau reboot mesin saya?
Saya tahu bahwa ada cara Anda harus menambahkan beberapa baris ke bash_profile
file, tetapi saya masih perlu mengetikkan kata sandi setiap kali saya reboot / masuk ke mesin tertentu.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Jawaban:
Ini adalah contoh khas dari pertukaran antara keamanan dan kenyamanan. Untungnya ada sejumlah opsi. Solusi yang paling tepat tergantung pada skenario penggunaan dan tingkat keamanan yang diinginkan.
ssh-key dengan frasa sandi, no
ssh-agent
Sekarang frasa sandi harus dimasukkan setiap kali kunci digunakan untuk otentikasi. Meskipun ini adalah opsi terbaik dari sudut pandang keamanan, ia menawarkan kegunaan terburuk. Ini juga dapat menyebabkan frasa sandi yang lemah dipilih secara berurutan - untuk mengurangi beban memasukkannya berulang kali.
ssh-key dengan frasa sandi, dengan
ssh-agent
Menambahkan yang berikut ini
~/.bash_profile
akan secara otomatis memulaissh-agent
dan memuat kunci ssh saat login:Sekarang frasa sandi harus dimasukkan pada setiap login. Meskipun sedikit lebih baik dari perspektif kegunaan, ini memiliki kelemahan yang
ssh-agent
meminta frasa sandi terlepas dari apakah kunci akan digunakan atau tidak selama sesi login. Setiap login baru juga memunculkanssh-agent
instance berbeda yang tetap berjalan dengan kunci yang ditambahkan dalam memori bahkan setelah logout, kecuali jika dibunuh secara eksplisit.Untuk membunuh
ssh_agent
saat keluar, tambahkan yang berikut ke~/.bash_logout
atau yang berikut ke
~/.bash_profile
Membuat banyak
ssh-agent
contoh dapat dihindari dengan membuat soket komunikasi persisten ke agen di lokasi tetap dalam sistem file, seperti dalam jawaban Collin Anderson . Namun, ini merupakan peningkatan dari pemunculan beberapa agen, kecuali jika secara eksplisit membunuh kunci yang didekripsi masih tetap ada dalam memori setelah keluar.Pada desktop, ssh-agent yang disertakan dengan lingkungan desktop, seperti Gnome Keyring SSH Agent , bisa menjadi pendekatan yang lebih baik karena mereka biasanya dapat dibuat untuk meminta frasa sandi saat pertama kali ssh-key digunakan saat sesi login dan menyimpan kunci privat yang didekripsi dalam memori sampai akhir sesi.
ssh-key dengan frasa sandi, dengan
ssh-ident
ssh-ident
adalah utilitas yang dapat mengelolassh-agent
atas nama Anda dan memuat identitas yang diperlukan. Ia menambahkan kunci hanya sekali sesuai kebutuhan, terlepas dari berapa banyak terminal, ssh atau sesi login yang memerlukan akses kessh-agent
. Itu juga dapat menambah dan menggunakan agen yang berbeda dan set kunci yang berbeda tergantung pada host yang terhubung, atau direktori ssh dipanggil. Ini memungkinkan untuk mengisolasi kunci ketika menggunakan penerusan agen dengan host yang berbeda. Ini juga memungkinkan untuk menggunakan beberapa akun di situs-situs seperti GitHub.Untuk mengaktifkan
ssh-ident
, instal dan tambahkan alias berikut ke Anda~/bash_profile
:ssh-key dengan frasa sandi, dengan
keychain
keychain
adalah utilitas kecil yang mengelolassh-agent
atas nama Anda dan memungkinkannyassh-agent
tetap berjalan saat sesi login berakhir. Pada login selanjutnya,keychain
akan terhubung kessh-agent
instance yang ada . Dalam praktiknya, ini berarti frasa sandi harus dimasukkan hanya selama login pertama setelah reboot. Pada login berikutnya, kunci yang tidak dienkripsi darissh-agent
instance yang ada digunakan. Ini juga dapat berguna untuk memungkinkan otentikasi RSA / DSAcron
tanpa kata sandi dalam pekerjaan tanpa kunci ssh tanpa kata sandi.Untuk mengaktifkan
keychain
, instal dan tambahkan sesuatu seperti berikut ke~/.bash_profile
:Dari sudut pandang keamanan,
ssh-ident
dankeychain
lebih buruk daripadassh-agent
kejadian terbatas pada masa hidup sesi tertentu, tetapi mereka menawarkan tingkat kenyamanan yang tinggi. Untuk meningkatkan keamanankeychain
, beberapa orang menambahkan--clear
opsi untuk~/.bash_profile
permintaan gantungan kunci mereka . Dengan melakukan frasa sandi ini harus dimasukkan kembali saat login seperti di atas, tetapicron
pekerjaan masih akan memiliki akses ke kunci yang tidak dienkripsi setelah pengguna logout. Thekeychain
halaman wiki memiliki informasi lebih lanjut dan contoh.ssh-key tanpa frasa sandi
Dari sudut pandang keamanan, ini adalah opsi terburuk karena kunci privat sepenuhnya tidak terlindungi jika terbuka. Namun, ini adalah satu-satunya cara untuk memastikan bahwa frasa sandi tidak perlu dimasukkan kembali setelah reboot.
ssh-key dengan frasa sandi, dengan
ssh-agent
, meneruskan frasa sandi kessh-add
dari skripMeskipun mungkin tampak seperti ide langsung untuk meneruskan frasa sandi
ssh-add
dari sebuah skrip, misalnyaecho "passphrase\n" | ssh-add
, ini tidak setegas yang sepertinyassh-add
tidak membaca frasa sandistdin
, tetapi membuka/dev/tty
langsung untuk membaca .Hal ini dapat bekerja di sekitar dengan
expect
, alat untuk mengotomatisasi aplikasi interaktif. Di bawah ini adalah contoh skrip yang menambahkan kunci ssh menggunakan frasa sandi yang disimpan dalam skrip:Perhatikan bahwa frasa sandi disimpan dalam plaintext dalam skrip, dari perspektif keamanan, ini hampir tidak lebih baik daripada memiliki ssh-key tanpa kata sandi. Jika pendekatan ini akan digunakan, penting untuk memastikan bahwa
expect
skrip yang berisi frasa sandi memiliki izin yang tepat, membuatnya dapat dibaca, dapat ditulis, dan hanya dapat dijalankan oleh pemilik kunci.sumber
ssh-agent
cuplikannya~/.bash_profile
berperilaku seperti dijelaskan dalam jawaban. Anda mungkin ingin melihatkeychain
utilitasnya. Dengankeychain
Anda harus memasukkan kata sandi pada login pertama setelah reboot, tetapi pada login berikutnyakeychain
akan terhubung kessh-agent
instance yang ada dengan kunci yang di-dekripsi dalam memori. Selain itu ada opsi untuk menghasilkan kunci ssh tanpa frasa sandi, tetapi ini tentu saja tidak disarankan.ssh-add
dari skrip. Alasannyaecho "pass\n" | ssh-add
tidak bekerja adalah karenassh-add
tidak membaca kata sandistdin
, tetapi/dev/tty
langsung terbuka untuk membaca. Memperbarui jawaban untuk menyertakan solusi untuk ini, menggunakan utilitas yang disebutexpect
.gssapi-with-mic
. Ini biasanya digunakan dalam jaringan yang lebih besar, tetapi tentu saja jika Anda memiliki minat dalam hal ini mungkin layak untuk dilihat.Tambahkan ini ke Anda
~/.bashrc
, lalu keluar dan kembali untuk memberi efek.Ini seharusnya hanya meminta kata sandi saat pertama kali Anda login setelah setiap reboot. Itu akan tetap menggunakan kembali sama
ssh-agent
selama itu tetap berjalan.sumber
ssh-add -l
mengembalikan kode keluar 0 ketika agen memiliki identitas dan 1 ketika tidak sehingga Anda dapat memotong grep dari perintah terakhir dan menggunakanssh-add -l > '/dev/null' || ssh-add
Tidak terkait erat dengan pertanyaan OP, tetapi mungkin bermanfaat bagi orang lain: karena 7.2.0 ssh (1) memiliki opsi yang memungkinkan menambahkan kunci ke ssh-agent setelah otentikasi pertama; pilihan tersebut
AddKeysToAgent
dan dapat diatur untukyes
,no
,ask
, atauconfirm
, systemwide atau pribadi Anda.ssh/config
berkas.Referensi: https://www.openssh.com/txt/release-7.2
sumber
.ssh/config
mengenal file: ini berlaku untukssh
dan apa pun yang menggunakan dissh
belakangnya, misalnyascp
, dan dapat dilakukan berdasarkan per-host.ssh-agent
men-cache berbagai kunci ssh yang tidak dikunci, sehingga Anda dapat memiliki kunci ssh yang dilindungi oleh kata sandi, tetapi tanpa harus mengetikkannya setiap saat.Untuk melakukan cache kunci tidak terkunci, itu jelas perlu membuka kunci kunci itu. Untuk membuka kunci kunci yang dikunci dengan frasa sandi, jelas perlu mengetahui frasa sandi ini.
Metode apa pun yang tidak memerlukan otorisasi dari manusia (mis. "Mengetikkan kata sandi") tidak hanya akan membuat sistem Anda tidak aman; itu juga akan membuat seluruh tujuan ssh-agent menjadi tidak berarti.
Setelah mengatakan semua ini, Anda cukup menggunakan ssh-key yang tidak dilindungi kata sandi (tekan Entersaat ditanya kata sandi selama pembuatan kunci). Karena tidak ada kata sandi,
ssh-agent
Anda tidak perlu meminta kata sandi untuk (tidak) menyimpannya.sumber
Ini adalah solusi untuk mengotomatiskan frasa sandi SSH Anda.
Buat skrip satu baris yang mencetak frasa sandi Anda ke output standar, misalnya:
Penting: Pastikan Anda menyalin ruang utama untuk mencegah penyimpanan kata sandi ke riwayat Anda .
Dan gunakan salah satu metode di bawah ini.
menggunakan pendekatan input standar:
atau pendekatan pipa bernama :
Buat pipa bernama (Anda juga bisa mencoba substitusi proses ):
Jalankan
ssh-add
dengan menentukan program yang digunakan untuk otentikasi:Lihat:
man ssh-add
untuk membaca lebih lanjut tentangSSH_ASKPASS
.sumber
echo my_passphrase
adalah lubang keamanan besar. Pertama setelah Anda mengetiknya, kata sandi dalam teks yang jelas dalam file sejarah apa yang pernah Anda gunakan. Dan argumen baris perintah kedua dapat dibaca dunia di Unix (ps -ef
). Jangan pernah memasukkan kata sandi dalam argumen baris perintah!ps
output. File histori biasanya hanya dapat dibaca oleh pengguna yang memiliki, tetapi baris perintah dapat dibaca oleh semua pengguna pada suatu sistem.Saya tidak akan merekomendasikan Anda ssh-add (yang perlu membuka ssh-agent) saat login. Ini karena Anda tidak dapat mengontrol kapan bagian ssh-agent berakhir, dan dapat membuat risiko keamanan ketika Anda tidak perlu menggunakan file keyfile pada satu bagian login.
Sebaliknya, saya sarankan untuk menulis skrip yang membuka sub-shell bagian ssh-agent, dengan semua keyfiles otomatis ditambahkan, dan dipanggil ketika diperlukan untuk menggunakan ssh. Jika Anda bisa mengadopsinya, baca terus.
Anda akan memiliki dua pilihan:
Hapus semua frasa sandi untuk kunci Anda, yang memiliki keamanan lemah jika file kunci Anda dicuri. (dengan demikian tidak disarankan )
Gunakan frasa sandi yang sama untuk kunci Anda. Maka ketika Anda
ssh-add keyfile1 keyfile2 ...
, Anda hanya perlu mengetikkan frasa sandi satu kali, per bagian.Dalam kedua kasus, Anda dapat menulis file skrip seperti "ssh_keys_section.sh" seperti di bawah ini:
Catatan:
ssh-keygen -p -f keyfile
/path/to/yourterminal &
(tergantung pada OS)sumber
/path/to/yourterminal &
==>mintty &
sumber
Saya dulu menggunakan script yang disebutkan oleh steampowered, saya sudah membuat yang di bawah ini sekarang, karena tidak meninggalkan file yang tergeletak di sekitar.
Bekerja
zsh
hanya pada shell.sumber
Memberikan kredit di sini: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
Solusi ini juga didukung di sini: http://mah.everybody.org/docs/ssh
sumber
Solusi single sign on untuk SSH bisa menuntun saya
pam_ssh
.Menurut artikel ini , konsepnya adalah:
Saya belum memverifikasi ini benar-benar berfungsi.
sumber
Tambahkan ini ke
~/.bashrc
file Anda :sumber
Untuk menambahkan kunci (mungkin tanpa kata sandi) dan memastikan bahwa
ssh-add
tidak akan meminta kata sandi, apa pun yang terjadi, bahkan ketika berjalan di bawah X :Status keluar menunjukkan keberhasilan atau kegagalan.
sumber
Jika Anda menjalankan kuda laut sebagai pengelola kata sandi ... Mungkin Anda ini; D
Solusi lain yang mencapai tujuan yang Anda cari hanyalah menambahkan kunci ssh ke kuda laut untuk membuka kunci otomatis saat masuk. Manfaat utama dari hal ini adalah Anda tidak perlu memasukkan kata sandi untuk kunci setelah Anda masuk melalui gdm, atau apa pun yang Anda lakukan dengan masuk meskipun kunci tersebut memiliki kata sandi. Ini MEMBUTUHKAN kunci pribadi dan kunci publik. Mereka juga HARUS mengikuti konvensi penamaan untuk kuda laut. Defaultnya dapat diterima (id_rsa untuk kunci pribadi dan id_rsa.pub untuk kunci publik ... Benar-benar segala sesuatu yang privatekeyname dan privatekeyname.pub )
Untuk menambahkan Anda kunci ssh ke kuda laut untuk membuka kunci otomatis saat masuk; (pada fedora25, saya tidak yakin di mana jalannya di distro lain meskipun kemungkinan besar sangat mirip)
Bagi saya, itu
(kuda laut akan secara otomatis menganggap bahwa kunci publik dalam kasus saya adalah id_rsa.pub)
Setelah menjalankan perintah, kuda laut akan membuka bidang kata sandi gtk kecil yang lucu untuk memasukkan kata sandi ke kunci pribadi. atau biarkan kosong jika Anda membuat kunci tanpa kata sandi.
Kuda laut tidak akan meminta Anda jika semuanya berjalan baik. Anda perlu mencoba ssh ke mesin target. Kemudian kuda laut akan meminta Anda untuk membuka kunci dengan kata sandi grafis (INI AKAN HANYA TERJADI SEKALI) tetapi akan terlihat sedikit berbeda kali ini; P (ini juga merupakan bagian di mana kuda laut melakukan beberapa kuda laut untuk ssh-tambahkan sihir. Saya percaya ), dan menawarkan OPSI untuk membuka kunci saat masuk, Anda harus memeriksa opsi ini untuk mencapai tujuan Anda.
Hanya karena saya tidak membaca semua jawaban, saya akan merekomendasikan untuk membatalkan apa yang semua orang katakan agar Anda lakukan dengan ssh-add sebelum mencoba jawaban ini. Melakukan hal yang sebaliknya dapat mengakibatkan sesuatu yang buruk terjadi pada kunci Anda, idk.
sumber
Ini skrip definitif.
Perbarui $ PASSW, lalu salin dan tempel di Terminal Anda
sumber
Cara terbaik yang saya ketahui adalah menggunakan skrip login PAM yang saya adaptasi dari pekerjaan sebelumnya karena saya tidak dapat menemukan jawaban yang memuaskan dalam pertanyaan ini.
Frasa sandi Anda disimpan terenkripsi dengan kata sandi sistem Anda dan fungsi derivasi berat. Saat masuk, kata sandi sistem Anda digunakan untuk mendekripsi frasa sandi Anda dan menambahkannya ke agen.
https://github.com/capocasa/systemd-user-pam-ssh
Keuntungan dari setiap solusi lain yang disajikan adalah menggabungkan keamanan yang setara dengan menjalankan ssh-add secara manual saat boot dengan upaya nol. Ini tidak memerlukan alat tambahan dan memiliki satu ketergantungan ekstra yang sudah diinstal secara default pada sebagian besar sistem (OpenSSL).
sumber
Setup saya di macOS adalah sebagai berikut (di
.zshrc
, atau.bash_profile
untuk bash people):Bagian
|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]
ini diperlukan pada macOS karena nilai defaultnya adalah/private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners
. Kalau tidak, @Thomas Nyman jawaban komprehensif gagal karena$SSH_AUTH_SOCK
selalu diatur ke sesuatu.Kemudian di
.zlogout
(atau.bash_logout
untuk bash people):Diuji pada macOS Mojave 10.14.5
sumber