Chci komunikovat mezi několika počítači v mé síti (statický Ethernet) prostřednictvím SSH. Abych to udělal, musím spustit ssh-add pokaždé, když se přihlásím na konkrétním počítači, jak to udělat, aby se to nastavilo jednou a nepožadovalo po mě heslo při každém přihlášení nebo restartu můj stroj?
Vím, že existuje způsob, jak byste měli přidat nějaké řádky do bash_profile
soubor, ale i tak musím zadat heslo pokaždé, když restartuji/přihlásím se ke konkrétnímu počítači.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Přijatá odpověď:
Toto je typický příklad kompromisu mezi bezpečností a pohodlím. Naštěstí existuje několik možností. Nejvhodnější řešení závisí na scénáři použití a požadované úrovni zabezpečení.
klíč ssh s přístupovou frází, ne ssh-agent
Nyní je třeba zadat přístupovou frázi pokaždé, když je klíč použit pro ověření. I když je to nejlepší možnost z hlediska zabezpečení, nabízí nejhorší použitelnost. To může také vést k tomu, že bude zvolena slabá přístupová fráze, aby se snížila zátěž při jejím opakovaném zadávání.
klíč ssh s přístupovou frází, s ssh-agent
Přidání následujícího do ~/.bash_profile
automaticky spustí ssh-agent
a načtěte ssh-klíč(e) při přihlášení:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Nyní musí být heslo zadáno při každém přihlášení. I když je to z hlediska použitelnosti o něco lepší, má to nevýhodu ssh-agent
vyzve k zadání přístupové fráze bez ohledu na to, zda má být klíč během relace přihlášení použit nebo ne. Každé nové přihlášení také vytvoří odlišného ssh-agent
instance, která zůstane spuštěná s přidanými klíči v paměti i po odhlášení, pokud není výslovně zabita.
Chcete-li zabít ssh_agent
při odhlášení přidejte do ~/.bash_logout
následující
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
nebo následující do ~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
Vytvoření více ssh-agent
Instancím se lze vyhnout vytvořením trvalého komunikačního soketu pro agenta na pevném místě v systému souborů, jako je tomu v odpovědi Collina Andersona. Toto je zlepšení oproti vytváření instancí více agentů, ale pokud není dešifrovaný klíč explicitně zabit, zůstává po odhlášení v paměti.
Na počítačích mohou být ssh-agenti zahrnutí do desktopového prostředí, jako je Gnome Keyring SSH Agent, lepším přístupem, protože obvykle mohou být vyzváni k zadání přístupové fráze při prvním použití klíče ssh během relace přihlášení a uložte dešifrovaný soukromý klíč do paměti až do konce relace.
klíč ssh s přístupovou frází, s ssh-ident
ssh-ident
je nástroj, který dokáže spravovat ssh-agent
vaším jménem a podle potřeby načtěte identity. Přidává klíče pouze jednou, když jsou potřeba, bez ohledu na to, kolik terminálů, ssh nebo přihlašovacích relací vyžaduje přístup k ssh-agent
. Může také přidat a použít jiného agenta a jinou sadu klíčů v závislosti na hostiteli, ke kterému se připojujete, nebo na adresáři ssh, ze kterého je voláno. To umožňuje izolovat klíče při použití předávání agentů s různými hostiteli. Umožňuje také používat více účtů na webech, jako je GitHub.
Chcete-li povolit ssh-ident
, nainstalujte jej a přidejte následující alias do svého ~/bash_profile
:
alias ssh='/path/to/ssh-ident'
klíč ssh s přístupovou frází, s keychain
keychain
je malý nástroj, který spravuje ssh-agent
vaším jménem a
umožňuje ssh-agent
aby zůstal spuštěný, když relace přihlášení skončí. Při dalších přihlášeních keychain
se připojí ke stávajícímu ssh-agent
instance. V praxi to znamená, že heslo musí být zadáno pouze při prvním přihlášení po restartu. Při následných přihlášeních nešifrovaný klíč ze stávajícího ssh-agent
instance se používá. To může být také užitečné pro povolení RSA/DSA autentizace bez hesla v cron
úlohy bez ssh klíčů bez hesla.
Chcete-li povolit keychain
, nainstalujte jej a přidejte něco jako následující do ~/.bash_profile
:
eval `keychain --agents ssh --eval id_rsa`
Z bezpečnostního hlediska ssh-ident
a keychain
jsou horší než ssh-agent
instance jsou omezeny na dobu trvání konkrétní relace, ale nabízejí vysokou úroveň pohodlí. Pro zlepšení zabezpečení keychain
, někteří lidé přidávají --clear
možnost do jejich ~/.bash_profile
vyvolání klíčenky. Tímto způsobem musí být hesla znovu zadána při přihlášení, jak je uvedeno výše, ale cron
úlohy budou mít i po odhlášení uživatele stále přístup k nešifrovaným klíčům. keychain
wiki stránka obsahuje více informací a příkladů.
klíč ssh bez přístupové fráze
Z hlediska zabezpečení je to nejhorší možnost, protože soukromý klíč je v případě odhalení zcela nechráněný. Toto je však jediný způsob, jak zajistit, že po restartu nebude nutné znovu zadávat přístupové heslo.
klíč ssh s přístupovou frází, s ssh-agent
, předávání přístupové fráze do ssh-add
ze skriptu
I když se může zdát jako jednoduchý nápad předat přístupovou frázi ssh-add
ze skriptu, např. echo "passphrase\n" | ssh-add
, není to tak přímočaré, jak se zdá jako ssh-add
nečte přístupovou frázi z stdin
, ale otevře /dev/tty
přímo ke čtení.
To lze obejít pomocí expect
, nástroj pro automatizaci interaktivních aplikací. Níže je uveden příklad skriptu, který přidává klíč ssh pomocí přístupové fráze uložené ve skriptu:
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
Všimněte si, že jelikož je přístupová fráze ve skriptu uložena v prostém textu, z hlediska zabezpečení je to stěží lepší než mít ssh klíč bez hesla. Pokud má být použit tento přístup, je důležité se ujistit, že expect
skript obsahující přístupovou frázi má nastavena správná oprávnění, takže je čitelný, zapisovatelný a spustitelný pouze vlastníkem klíče.