Bagaimana cara diminta frasa sandi kunci SSH satu kali dan hanya bila diperlukan?

15

(Saya telah membaca banyak pertanyaan di situs ini yang terlihat terkait dan saya percaya ini adalah pertanyaan yang benar-benar baru.)

Saya memiliki banyak kunci di banyak server dan semuanya dilindungi dengan frasa sandi.

Saya suka memasukkan frasa sandi sebanyak yang saya suka memasukkan kata sandi - ini menguras produktivitas nyata.

  • ssh-agent + ssh-add perintah dapat digunakan pada shell login yang berarti Anda hanya perlu memasukkan kata sandi Anda sekali saat login

  • gantungan kunci dapat digunakan untuk membuat ssh-agent tetap hidup di luar logout, jadi misalnya Anda dapat memilikinya sehingga Anda hanya perlu memasukkan frasa sandi sekali saat boot, atau Anda dapat membuatnya tetap hidup selama satu jam atau lebih.

Masalah yang saya miliki adalah bahwa kedua solusi ini biasanya diinisiasi dalam shell login (mis. .zshrcMengandalkan saya memasukkan frasa sandi saya ketika saya masuk, bahkan jika saya tidak akan membutuhkannya dibuka kuncinya. (Saya tidak senang dengan gantungan kunci menjaga agen tetap hidup tanpa batas waktu.)

Yang saya inginkan adalah diminta untuk passphrase (untuk agen) hanya jika diperlukan .

Jadi saya bisa masuk ke server A, melakukan beberapa hal, lalu ssh ke server B dan pada saat itu diminta untuk passphrase. Lakukan beberapa hal di server B, keluar. Kembali ke A, lakukan beberapa hal lagi, ssh ke B lagi dan tidak perlu passphrase saya (ini dipegang oleh agen).

Saya perhatikan bahwa ini dimungkinkan pada desktop grafis seperti Gnome - Anda mendapatkan pop-up yang meminta frasa sandi untuk membuka kunci kunci pribadi Anda segera setelah Anda mencoba ssh. Jadi ini yang saya cari tetapi dari konsol.

artfulrobot
sumber
Mengapa tidak hanya menghasilkan ssh-key tanpa frasa sandi? Jika Anda akan melalui semua masalah ini?
devnull
1
Jika seseorang menerobos masuk dan ada kunci tanpa kata sandi (atau agen ssh aktif), mereka juga dapat memiliki akses ke banyak server lain. Juga kunci frasa sandi dapat dicuri dan digunakan di tempat lain.
artfulrobot
Sejauh yang saya tahu, tidak ada cara untuk melakukan apa yang Anda inginkan tanpa mengorbankan beberapa tingkat keamanan, yang sepertinya Anda tidak ingin lakukan. Ada jawaban mendalam oleh Thomas Nyman di sini yang masuk ke banyak kemungkinan jika Anda belum membacanya: unix.stackexchange.com/a/90869/82289 . Saya menyiasati hal ini di perusahaan saya dengan menggunakan server perantara yang mengelola sesi ssh dengan Tmux.
devnull
@ DevNull tampaknya aneh bahwa Anda dapat melakukannya dengan desktop tetapi tidak dengan terminal, bukan? Tentunya itu hanya membutuhkan agen untuk melompat ke tty jika tidak ada kunci yang ditambahkan? Ini pasti cara kerja gui?
artfulrobot
Anda mungkin melihat jawaban saya di sini: unix.stackexchange.com/a/184160/89706 (tautan Pertanyaan: unix.stackexchange.com/questions/90853/… )
Johnny Wong

Jawaban:

16

Jangan menambahkan apa pun ke skrip startup shell Anda, ini adalah peretasan yang tidak perlu.

Sebaliknya, tambahkan

AddKeysToAgent yes

ke .ssh / config Anda

Seperti ini, ssh-add dijalankan secara otomatis saat pertama kali Anda ssh ke kotak lain. Anda hanya perlu memasukkan kembali kunci Anda ketika kadaluwarsa dari ssh-agent atau setelah Anda reboot.

Toby
sumber
Saya berharap orang akan berkomentar ketika turun voting. Jika itu tidak benar itu penting, kita tahu mengapa itu tidak benar. Terima kasih telah memposting, saya sendiri belum sempat mencoba saran Anda.
artfulrobot
Saya juga bertanya-tanya, mungkin karena postingan silang saya?
Toby
Ini bekerja untuk saya. Namun ini merupakan tambahan terbaru untuk openssh (7.2). Jika itu membantu siapa pun, openssh 7.3 tersedia di Debian Sid.
artfulrobot
@artfulrobot: Aneh, karena saya memiliki perilaku yang sama (auto-ssh-add pada panggilan pertama ssh) bekerja selama bertahun-tahun, sampai akhirnya berhenti beberapa waktu yang lalu. Mencari penyebabnya, saya menemukan AddKeysToAgent dan berasumsi bahwa alasannya berhenti adalah karena secara tidak sengaja saya harus membersihkan .ssh / config dan AddKeysToAgent saya. Sekarang saya bertanya-tanya mengapa ini bekerja lama sebelum OpenSSH 7.2 dirilis? Saya tidak membayangkan ini :-)
Toby
@Toby inilah yang saya butuhkan. Sayangnya, ssh-agent sepertinya tidak mulai secara otomatis di kubuntu, jadi itu hal berikutnya yang perlu saya pecahkan.
Ogaday
7

Zsh memiliki preexechook yang mengeksekusi fungsi sebelum perintah yang dimasukkan pada commandline dieksekusi. Berikut adalah pengait yang mencari sshdi baris perintah Anda dan jika ditemukan, periksa keberadaan agen ssh. Jika tidak ditemukan, ia menjalankan gantungan kunci.

Jadi dengan cara ini, gantungan kunci hanya dijalankan sebelum perintah ssh, dan hanya jika diperlukan.

Letakkan ini di ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

Apa yang terjadi di sini adalah setiap kali perintah diketik, check_sshdipanggil sebelum perintah dijalankan.

Baris pertama fungsi memeriksa perintah yang diperluas untuk sshmenggunakan Zsh regex. sshharus memiliki batas kata di \bkedua sisi. Jika ini tidak ditemukan maka fungsi kembali.

Baris berikutnya memeriksa bahwa ada proses agen SSH dalam variabel lingkungan, dan bahwa proses itu masih ada dalam tabel proses, dan kemudian bahwa setidaknya satu kunci telah ditambahkan ke agen. Jika semua itu OK, maka ssh agent sudah diatur dan kita tidak perlu melakukan apa-apa, jadi ssh kembali.

Akhirnya kami mulai gantungan kunci, dengan agen tetap hidup selama satu jam.

Ini masih menyisakan masalah tentang hal-hal ssh tertanam, seperti gitatau rsyncatau scpseperti itu tidak akan memicu fungsi (Anda bisa menambahkan ini ke regex).

artfulrobot
sumber
Bahkan tanpa zsh, orang dapat membuat skrip pendek dengan efek yang sama dan menempatkannya di PATHdepan sshklien yang sebenarnya . Bahkan mungkin bekerja dengan rsyncet al, jika mereka membaca PATHalih-alih berlari /usr/bin/sshsecara langsung.
ilkkachu
2

Untuk zsh, saya telah menulis satu set utilitas dan pembungkus untuk melakukan lebih kurang apa yang Anda inginkan: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

Sebenarnya ini bahkan lebih, karena ssh-agentakan dibagikan oleh semua sesi login (desktop atau melalui SSH, dan Layar GNU didukung juga jika Anda memulai shell login dari itu, misalnya dengan shell -zshdalam ~/.screenrcfile), dan itu akan berhenti hanya setelah sesi terakhir berakhir.

Catatan: Saya hanya menggunakan satu frasa sandi untuk semua kunci saya. Saya tidak yakin dengan perilaku frasa sandi yang berbeda; mungkin perlu beberapa perubahan.

vinc17
sumber
Wow itu kode yang cukup banyak. Kerja bagus dan terima kasih sudah berbagi. Saya pikir saya perlu sesuatu yang lebih sederhana - SSH adalah alat yang cukup inti bagi saya.
artfulrobot