ssh a automatické používanie kľúčov

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 http://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 http://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