apa tujuan ssh-agent?

70

Saya telah membaca definisi resmi:

ssh-agent adalah program untuk menyimpan kunci privat yang digunakan untuk otentikasi kunci publik (RSA, DSA, ECDSA). Idenya adalah bahwa ssh-agent dimulai pada awal sesi X atau sesi login, dan semua jendela atau program lainnya dimulai sebagai klien untuk program ssh-agent. Melalui penggunaan variabel lingkungan, agen dapat ditemukan dan secara otomatis digunakan untuk otentikasi ketika masuk ke mesin lain menggunakan ssh (1).

"..sebuah program untuk menahan kunci privat .." - IMHO - kunci ssh dihasilkan oleh pengguna dengan perintah ssh-keygen dan secara sederhana & langsung disimpan di ~ / .ssh - mengapa saya memerlukan beberapa daemon untuk menahan kunci ini? Bagaimana tepatnya itu menahan mereka - bukankah mereka hanya disimpan di .ssh?

"Dimulai sebagai klien ke program ssh-agent" - Saya tidak mengerti. Di mana orang membutuhkan itu? Saya biasanya hanya menggunakan ssh karena ini:

 ssh -i ~/.ssh/private_key_name username@hostname

Apa sebenarnya yang dimaksud dengan "klien" manual - klien apa? Tidakkah Anda hanya menjalankan perintah ssh dari terminal untuk terhubung - apa klien lain yang ada di sana dan mengapa mereka tidak bisa menggunakan path ke file pribadi ssh itu, seperti halnya perintah ssh?

agent_smith
sumber

Jawaban:

76

Agen SSH menangani penandatanganan data otentikasi untuk Anda. Ketika mengautentikasi ke server, Anda harus menandatangani beberapa data menggunakan kunci pribadi Anda, untuk membuktikan bahwa Anda, ya, Anda.

Sebagai langkah keamanan, sebagian besar orang dengan bijaksana melindungi kunci pribadi mereka dengan frasa sandi, sehingga setiap upaya otentikasi akan mengharuskan Anda memasukkan frasa sandi ini. Ini bisa tidak diinginkan, jadi ssh-agent cache kunci untuk Anda dan Anda hanya perlu memasukkan kata sandi sekali, ketika agen ingin mendekripsi (dan sering bahkan tidak, karena ssh-agent dapat diintegrasikan dengan pam, yang dilakukan banyak distro).

Agen SSH tidak pernah menyerahkan kunci-kunci ini ke program-program klien, tetapi hanya menyajikan soket di mana klien dapat mengirimkan data dan di mana ia merespons dengan data yang ditandatangani. Keuntungan sampingan dari hal ini adalah Anda dapat menggunakan kunci pribadi Anda bahkan dengan program yang tidak sepenuhnya Anda percayai.

Manfaat lain dari agen SSH adalah dapat diteruskan melalui SSH. Jadi ketika Anda ssh menjadi tuan rumah A, saat meneruskan agen Anda, Anda kemudian dapat ssh dari A ke tuan rumah B lainnya tanpa perlu hadiah kunci Anda (bahkan dalam bentuk terenkripsi) di host A.

Dennis Kaarsemaker
sumber
10
Saya merasa ini adalah jawaban yang paling lengkap, tetapi masih ada satu poin yang hilang. Menggunakan agen kunci juga memungkinkan penggunaan beberapa kunci dengan mudah. Alih-alih harus menentukan jalur ke kunci, ketika menggunakan agen kunci ssh akan mencoba setiap kunci di dalamnya.
Patrick
3
@Patrick yang mungkin juga merupakan kelemahannya - cobalah terlalu banyak kunci tidak valid di server dan itu akan menutup koneksi sebelum Anda sampai pada kunci yang valid. Tentu saja, itulah yang ~/.ssh/config's IdentityFilepilihan yang baik untuk, dengan atau tanpa agen
Tobias Kienzler
@ Patrick yang sepertinya sama-sama mungkin tanpa agen
Andrey Fedorov
@AndreyFedorov Ya Anda dapat memiliki beberapa kunci tanpa agen, tetapi Anda juga dapat menentukan di ~/.ssh/configkunci mana yang akan digunakan untuk host jarak jauh mana, sehingga ia tahu persis mana yang dibutuhkan.
Patrick
3
jadi orang dapat menganggap itu ssh-agenttidak perlu jika kunci pribadi tidak dilindungi oleh frasa sandi?
pkaramol
16

Manfaatnya ssh-agentadalah Anda hanya perlu memasukkan frasa sandi satu kali. Jika kunci RSA pribadi Anda tidak dienkripsi dengan frasa sandi, maka ssh-agent tidak diperlukan. The sshperintah akan menjadi contoh dari klien.

jordanm
sumber
7

Jika Anda secara rutin sshmemasuki berbagai mesin yang berbeda, masing-masing dengan kunci dan frasa sandi mereka sendiri, maka menjalankan ssh-agentmemungkinkan Anda untuk memasukkan frasa sandi untuk setiap tombol 1 pada awal sesi Anda dan kemudian Anda dapat mengautentikasi ke setiap mesin sebanyak mungkin sesuka Anda tanpa harus memasukkan kembali frasa sandi Anda.

Manfaat lebih lanjut adalah bahwa, sesuai manhalaman, agen tidak pernah mengirim kunci pribadi melalui saluran permintaannya; jadi jika Anda berpindah antar kotak yang berbeda, kunci pribadi Anda terlindungi.

1 Anda dapat mengatur lifewaktu tombol ditahan di agen.

jasonwryan
sumber
6

Artikel Wikipedia mungkin memiliki deskripsi terbaik:

Verifikasi ke server didasarkan pada otentikasi tantangan-respons. ssh terhubung ke server dengan nama pengguna dan permintaan kunci. Daemon ssh mendapatkan permintaan dan mengirim kembali tantangan berdasarkan kunci publik yang disimpan dalam file otentikasi. ssh menggunakan kunci pribadi untuk membangun respons kunci, dan mengirimkannya ke sshd yang menunggu di ujung koneksi lainnya. Itu tidak mengirim kunci pribadi itu sendiri. Daemon ssh memvalidasi respons utama, dan jika valid, memberikan akses ke sistem. ssh-agent menyederhanakan ini dengan membuat soket yang mendengarkan koneksi SSH. Pengguna cukup memulai ssh-agent, memberi tahu cara menemukan kunci mereka (jika tidak ada di lokasi default), memasukkan frasa sandi untuk setiap kunci yang akan digunakan, satu kali,

Lagi kata demi kata dari artikel wikipedia:

... ssh-agent membuat socket dan kemudian memeriksa koneksi dari ssh. Setiap orang yang dapat terhubung ke soket ini juga memiliki akses ke ssh-agent. Izin diatur seperti dalam sistem Linux atau Unix yang biasa. Ketika agen mulai, itu menciptakan direktori baru di / tmp dengan izin terbatas. Soket terletak di folder.

Biasanya diletakkan di sistem atau file rc pengguna seperti $HOME/.bashrcatau $HOME/.profile(untuk shell bash) sehingga variabel lingkungan yang ssh-agentditetapkan dapat dimasukkan ke dalam lingkungan Anda sepenuhnya.

Pada sistem Fedora 14 saya, ini dimulai cukup awal sebagai bagian dari subsistem X11. Dalam file ini, /etc/X11/xinit/xinitrc-common:

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

Variabel $SSH_AGENTtersebut kemudian digunakan dalam skrip start-up X11 lainnya seperti di sini /etc/X11/xinit/Xclients:

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

Dengan memasukkannya ke sini, variabel lingkungan berikut ditetapkan sebagai bagian dari shell induk, oleh karena itu semua anak yang bercabang juga harus memilikinya, misalnya:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

Ada sedikit lebih rumit untuk ini tetapi singkatnya pada dasarnya ini adalah apa yang terjadi ssh-agent.

Misalnya di GNOME, ssh-agentsebenarnya diluncurkan per pengguna sebagai aplikasi awal:

                     s dari aplikasi startup

TL; DR

Intinya, ssh-agentada sehingga ketika kunci ssh Anda diperlukan, Anda hanya perlu membukanya satu kali dengan frasa sandi mereka (dengan asumsi mereka memiliki satu), dan sejak saat itu mereka tersedia dalam bentuk dekripsi dalam memori (RAM).

slm
sumber
1

"dimulai sebagai klien ke program ssh-agent" mengacu pada gagasan bahwa ssh-agent dimulai selama inisialisasi sesi login (lokal) sehingga semua program mendapatkan variabel lingkungan $SSH_AGENT_PIDdan $SSH_AUTH_SOCKyang diperlukan untuk menghubungkan agen.

Keuntungan lain dari mengeluarkan kunci privat dari ssh adalah ssh-agent dapat digantikan oleh gpg-agent. Dengan demikian Anda dapat menggunakan kunci OpenPGP (dengan kemampuan otentikasi) untuk SSH. Itu solusi yang bagus untuk kunci OpenPGP pada kartu pintar.

Hauke ​​Laging
sumber