SSH anahtar parolasını nasıl ve yalnızca gerektiğinde nasıl alabilirim?


15

(Bu sitede ilgili görünen birçok soruyu okudum ve bunun gerçekten yeni bir soru olduğuna inanıyorum.)

Birçok sunucuda çok fazla anahtarım var ve hepsi parolalarla korunuyor.

Parola girmeyi, parola girmeyi sevdiğim kadar seviyorum - bu gerçek bir verimlilik kaybı.

  • ssh-agent + ssh-add komutları, oturum açma sırasında parolanızı yalnızca bir kez girmeniz gerektiği anlamına gelir.

  • anahtarlık , bir ssh-ajanını oturumu kapatmanın ötesinde canlı tutmak için kullanılabilir, bu nedenle örneğin, parolayı sadece bir kez önyüklemede girmeniz veya bir saat kadar canlı tutmasını sağlayabilirsiniz.

Sahip olduğum sorun, bu çözümlerin her ikisi de genellikle bir kabuk girişinde başlatılır (örn. .zshrc), Kilidini açmam gerekmeyecek olsa bile, giriş yaptığımda parolamı girmeme güveniyor. (Bir ajanı süresiz olarak canlı tutmak için anahtarlıktan memnun değilim.)

Ne istiyorum sadece gerektiğinde bir parola (bir ajan için) istenir .

Böylece A sunucusuna giriş yapabilir, bazı şeyler yapabilirim, sonra ssh sunucusuna B ve bu noktada parola istenebilir. B sunucusunda bir şeyler yapın, oturumu kapatın. A'ya geri dönün, biraz daha şeyler yapın, tekrar ssh'den B'ye ve parolama gerek yok (bir ajan tarafından tutulur).

Bunun Gnome gibi grafik masaüstlerinde mümkün olduğunu not ediyorum - ssh'yi denediğiniz anda özel anahtarınızın kilidini açmak için parola isteyen bir pop-up alıyorsunuz. Bu benim peşimden ama konsoldan.


Neden sadece parola olmadan ssh anahtarları üretmiyoruz? Zaten bütün bu sıkıntıları aşacaksan?
15'de devnull

1
Birisi girerse ve şifresiz anahtarlar (veya etkin bir ssh aracısı) varsa, diğer birçok sunucuya da erişebilir. Ayrıca parolasız anahtarlar çalınabilir ve başka yerlerde kullanılabilir.
artfulrobot

Bildiğim kadarıyla, yapmak istemediğiniz gibi görünen bir güvenlik seviyesinden ödün vermeden istediğinizi yapmanın bir yolu yoktur. Thomas Nyman'ın daha önce okumadıysanız birçok olasılıkla ilgili derin bir cevap vardı: unix.stackexchange.com/a/90869/82289 . Tmux ile ssh oturumlarını yöneten bir ara sunucu kullanarak şirketimde bunu hallederim.
15'de devnull

@DevNull bir masaüstü ile yapabileceğiniz garip görünüyor, ama bir terminal ile değil, değil mi? Hiç anahtar eklenmediyse sadece tty'ye atlamak için ajana ihtiyacı var mı? Gui'lerin çalışma şekli bu olmalı mı?
artfulrobot

Cevabımı burada bulabilirsiniz: unix.stackexchange.com/a/184160/89706 (Soru bağlantısı: unix.stackexchange.com/questions/90853/… )
Johnny Wong

Yanıtlar:


16

Kabuk başlangıç ​​komut dosyalarınıza hiçbir şey eklemeyin, bu gereksiz bir hackery.

Bunun yerine,

AddKeysToAgent yes

.ssh / config dosyasına

Bunun gibi, başka bir kutuya ilk kez ssh eklediğinizde ssh-add otomatik olarak çalıştırılır. Anahtarınızı yalnızca ssh-agent'dan sona erdiğinde veya yeniden başlattıktan sonra yeniden girmeniz gerekir.


Aşağı oylama sırasında insanların yorum yapmasını diliyorum. Eğer doğru değilse, neden doğru olmadığını biliyoruz. Gönderdiğiniz için teşekkürler, önerinizi kendim denemek için zamanım olmadı.
artfulrobot

Merak ettim, belki çapraz yazılardan dolayı?
Toby

Bu benim için çalışıyor. Bununla birlikte, openssh'e (7.2) çok yeni bir ektir. Herkese yardım etmesi durumunda Debian Sid'de opensh 7.3 mevcuttur.
artfulrobot

@artfulrobot: Garip, bu aynı davranışı (ssh'ın ilk çağrısında auto-ssh-add) yaşadığım için, nihayet bir süre önce durana kadar. Nedeni ararken, AddKeysToAgent'ı buldum ve durma sebebinin yanlışlıkla .ssh / config ve AddKeysToAgent ile birlikte temizlemiş olduğumuzu varsaydım. Şimdi OpenSSH 7.2'nin yayınlanmasından çok önce neden çalıştığını merak ediyorum. Bunu hayal etmiyorum :-)
Toby

@ Bu tam da ihtiyacım olan şey. Ne yazık ki, ssh-agent kubuntu'da otomatik olarak başlamıyor gibi görünüyor, bu yüzden çözmem gereken bir sonraki şey bu.
Ogaday

7

Zsh , preexeckomut satırına girilen bir komut yürütülmeden önce bir işlevi yürüten bir kancaya sahiptir . sshKomut satırınızda arama yapan bir kanca ve bulunursa, bir ssh aracısının varlığını kontrol eder. Bu bulunmazsa, anahtarlık çalışır.

Bu şekilde, anahtarlık sadece ssh komutlarından önce ve sonra sadece gerekirse çalıştırılır.

Bunu şuna ekle ~/.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

Burada ne zaman bir komut yazılırsa, check_sshkomut yürütülmeden önce çağrılır.

İşlevin ilk satırı genişletilmiş komutu sshZsh normal ifadesi kullanarak kontrol eder . sshher \biki tarafta da kelime sınırları olmalıdır . Bu bulunmazsa işlev geri döner.

Sonraki satır, ortam değişkeninde bir SSH aracı işlemi olup olmadığını ve bu işlemin hala işlem tablosunda olduğunu ve aracıya en az bir anahtarın eklendiğini kontrol eder. Bunların hepsi TAMAM ise, ssh aracısı kurulur ve hiçbir şey yapmamız gerekmez, bu yüzden geri döner.

Sonunda anahtarlığa başlıyoruz, ajan bir saat boyunca hayatta kalacak.

Hala gibi gömülü ssh şeylere sorunu bırakır gitya rsyncya scpo fonksiyonu tetiklemez olarak (eğer regex bu ekleyebilir).


Olmadan bile zsh, aynı etkiye sahip kısa bir komut dosyası oluşturulabilir PATHve gerçek sshistemcinin önüne yerleştirilebilir . Hatta ile işe yarayabilecek rsync, vd eğer okudukları PATHçalıştırmak yerine /usr/bin/sshdoğrudan.
ilkkachu

2

Zsh için, az ya da çok istediğini yapmak için bir dizi yardımcı program ve paket yazdım: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

Çünkü Aslında bu, daha da yapar ssh-agenttüm giriş oturumları tarafından paylaşılacaktır (masaüstü veya SSH üzerinden ve birlikte bunun, örneğin gelen giriş kabukları başlarsanız GNU Ekranı çok desteklendiği shell -zshiçinde ~/.screenrcdosyası) ve sonra sadece çıkılacak son oturum sona erer.

Not: Tüm anahtarlarım için yalnızca bir parola kullanıyorum. Farklı parolaların davranışından emin değilim; bazı değişikliklerin yapılması gerekebilir.


Vay canına, bu oldukça fazla kod. Güzel iş ve paylaşım için teşekkürler. Sanırım daha basit bir şeye ihtiyacım var - SSH benim için oldukça temel bir araç.
artfulrobot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.