Cieľom tohto čĺánku je nakonfigurovať ssh tak, aby príkaz
ssh user@myserver.hostname.sk
použil SSH kľúč a prípadne po zadaní hesla ku kľúču ho automaticky uložil do ssh agenta. Žiaľ, v aktuálnej verzii SSH sa kľúče nenahrávajú do ssh-agenta automaticky.
Krok 1 – vytvorenie kľúča
Kľúč vygenerujeme podľa dokumentácie ssh-keygen, konkrétne teda
mkdir ~/.ssh/ && cd ~/.ssh/ ssh-keygen -b 4096 -t rsa -C "myserver-key" -f ~/.ssh/id_rsa_myserver
Krok 2 – Konfigurácia SSH klienta
Po úspešnom vygenerovaní SSH kľúca vysvetlíme SSH klientovi, ktorý kľúč má použiť pre náš server. Upravíme teda konfiguračný súbor ~/.ssh/config, kde napíšeme toto:
Host myserver* IdentityFile ~/.ssh/id_rsa_myserver
Krok 3 – Nastavenie na serveri
Aby nás server s vygenerovaným kľúčom úspešne autentifikoval, musíme verejnú časť kľúča na server nakopírovať. To spravíme jednoducho:
ssh-copy-id -i ~/.ssh/id_rsa_myserver user@myserver.hostname.sk
a na serveri by sa nám náš kľúč mal objaviť v súbore ~/.ssh/authorized_keys. Môžeme teda vyskúšať u seba spustiť ssh klienta a ten by si mal vypýtať heslo k SSH kľúču. Predpokladám, že ste nejaké zvolili. 🙂
Krok 4 – Keychain
Ďalším krokom je nastavenie automatického spúštania ssh-agenta. Na webe nájdete kopec návodov, ako ho spúšťať manuálne. Ale my ho nechceme spúšťať manuálne, manuálne nastavovať premené SSH_AGENT_PID a SSH_AUTH_SOCK atď. . My to chceme čo najjednoduchšie. Aby sme si používanie kľúčov a štart ssh-agenta uľahčili, nainštalujeme si keychain
apt-get install keychain ssh-askpass gnupg-agent
V tomto bode teda môžeme viackrát za sebou spustiť toto a sledovať, koľko krát si od nás ssh vypýta heslo:
keychain ~/.ssh/id_rsa_myserver && ssh user@myserver.hostname.sk keychain ~/.ssh/id_rsa_myserver && ssh user@myserver.hostname.sk keychain ~/.ssh/id_rsa_myserver && ssh user@myserver.hostname.sk keychain ~/.ssh/id_rsa_myserver && ssh user@myserver.hostname.sk keychain ~/.ssh/id_rsa_myserver && ssh user@myserver.hostname.sk
Ak sme doteraz dobre postupovali, bude to iba raz. 🙂
Krok 5 – zjednodušenie
Uznávam, že napriek tomu, že si od nás ssh vypýta heslo už iba raz, ešte stále je nepohodlné písať do shellu ‚keychain ~/.ssh/nejaky_kluc && ssh niekto@niekam.sk‘. Takže ideme to spraviť tak, aby stačilo napísať ‚ssh myserver‘.
mkdir ~/bin cd ~/bin wget -O ~/bin/ssh-auto-add-key https://blog.hostname.sk/uploads/scripts/ssh-auto-add-key.txt chmod +x ~/bin/ssh-auto-add-key ln -s ssh-auto-add-key ssh mkdir -p ~/.ssh/keys-by-host/ && cd ~/.ssh/keys-by-host/ ln -s ~/.ssh/id_rsa_myserver myserver
Čiže ssh nebude alias, ale symlinka na náš skript ssh-auto-add-key, ktorý zariadi všetko ostatné. V adresári ~/.ssh/keys-by-host/ budeme vytvárať symlinky na jednotlivé kľúče, aby ich vedel keychain nájsť. Áno, cestu ku kľúču sme už nastavovali v ssh configu, ale žial, neexistuje momentálne žiadna cesta, ako jednoducho zistiť cestu k ssh kľúču priamo z configu ssh. Preto tie symlinky budeme musieť robiť manuálne.
A mám ešte jedno zjednodušenia. Aby ste namiesto ‚ssh myserver‘ mohli písať iba ‚myserver‘, stačí využiť utilitku ssh-argv0 a spraviť symlinku:
cd ~/bin ln -s `which ssh-argv0` myserver
Odteraz teda stačí písať iba myserver a prihlási vás to cez SSH na server. Vyskúšajte: 🙂
myserver ssh myserver myserver ssh myserver myserver ssh myserver myserver ssh myserver
Krok 6 – keychain patch
Ostalo nám ešte upraviť keychain, aby sme sa nemuseli pozerať na tento warning, kedže sme vytvorili symlinku iba na privátnu časť kľúča, ale na verejnú časť (iný súbor) nie.
Takže si patchneme keychain a malo by to byť všetko. Ak ste postupovali podľa môjho návodu, tieto príkazy by malo stačiť copy&paste do shellu a malo by byť hotovo:
cd ~/bin/ wget -O ~/bin/keychain-key-symlink.patch https://blog.hostname.sk/uploads/scripts/keychain-key-symlink.patch cp -p `which keychain` ~/bin/ cp -p keychain keychain.orig patch -p0 < keychain-key-symlink.patch
Krok 7 – záver
A úplne na záver si pridáme štart keychain do každého login shellu, aby sme mali automaticky nastavené premenné pre ssh-agenta. Nasledujúce riadky si pridáme do ~/.profile príp. do ~/.zlogin, ak pouźívame ako shell zsh.
keychain --clear --agents 'gpg,ssh' [ -z "$HOSTNAME" ] && HOSTNAME=`uname -n` [ -f $HOME/.keychain/$HOSTNAME-sh ] && \ . $HOME/.keychain/$HOSTNAME-sh [ -f $HOME/.keychain/$HOSTNAME-sh-gpg ] && \ . $HOME/.keychain/$HOSTNAME-sh-gpg