Pokud pracujete na počítači s vícero identitami, například pracovní a soukromou, a v rámci obou potřebujete přistupovat ke zdrojům přes ssh, jako je typicky nahrávání kódu do repozitářů, je třeba o něco pokročilejší nastavení ssh a více práce s generováním klíčů.
Scénář
- Potřebujeme přistupovat na Github pod soukromou identitou a na Azure DevOps pod pracovní identitou.
- Seznam autorizovaných serverů chceme raději evidovat odděleně.
Jak na to
Generování klíčů
Klíče se standardně ukládaní do složky ~/.ssh. Pokud je zde umístěn soubor s názvem id_rsa a také id_rsa.pub, zřejmě jste již klíče generovali. Soubor s přílohou obsahuje veřejný klíč, soubor bez přílohy soukromý klíč.
Nyní si vygenerujeme dva nové klíče pomocí RSA -t rsa, které jsou 4096 bitové -b 4096, určíme název souboru, do kterého se má uložit -f id_rsa_personal a do komentáře přidáme email naší identity jmeno@server.cz (komentář ve formě emailu je důležitý např. pro Github). Během generování klíčů jsme požádání o heslo.
$ ssh-keygen -t rsa -b 4096 -f id_rsa_personal -C "jmeno@server.cz"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_personal.
Your public key has been saved in id_rsa_personal.pub.
The key fingerprint is:
SHA256:REo+OITNoZGydVm0p05xZVdcPJDuNMg7JbYshsH/hs0 jmeno@server.cz
The key's randomart image is:
+---[RSA 4096]----+
| .=o=+ . o .++o.|
|. ++=+ + o . ....|
| +..o B + . o .|
|. . X = = |
| o S o B . |
| o . + = . |
| . . * . |
| . E |
| . |
+----[SHA256]-----+
$ ssh-keygen -t rsa -b 4096 -f id_rsa_work -C "identita2@pracovni.cz"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved id_rsa_work.
Your public key has been saved in id_rsa_work.pub.
The key fingerprint is:
SHA256:oyIzYH8r0l1L5CBhO5vZDwEXnOPU4U8Tgs75ug2qDK0 identita2@pracovni.cz
The key's randomart image is:
+---[RSA 4096]----+
| ..=o.. |
| + B... . |
| . X o. o |
| + B .o . |
|.. B * S. |
|.o.+ o * . |
|. *.ooB . |
|oo *o++o |
|Eoo..o.. |
+----[SHA256]-----+
Pro uložení hesel doporučuji nástroj pro ukládání hesel, jako je KeePass, MacPass apod.
Konfigurace ssh
Nyní vytvoříme soubory, do kterým bude ssh ukládat zkontaktované servery a jejich veřejné klíče.
$ touch known_hosts_personal
$ touch known_hosts_work
Následně vytvoříme konfigurační soubor config a nastavíme odpovídající privátní klíč pro adekvátní servery.
$ touch config
Obsah konfiguračního souboru nastavíme takto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
UserKnownHostsFile ~/.ssh/known_hosts_personal
IdentitiesOnly yes
UseKeychain yes
AddKeysToAgent yes
Host ssh.dev.azure.com
HostName ssh.dev.azure.com
User git
IdentityFile ~/.ssh/id_rsa_work
UserKnownHostsFile ~/.ssh/known_hosts_work
IdentitiesOnly yes
UseKeychain yes
AddKeysToAgent yes
Host vs-ssh.visualstudio.com
HostName vs-ssh.visualstudio.com
User worskpace-name
IdentityFile ~/.ssh/id_rsa_work
UserKnownHostsFile ~/.ssh/known_hosts_work
IdentitiesOnly yes
UseKeychain yes
AddKeysToAgent yes
|
První odstavec slouží pro nastavení soukromé identity, která potřebuje zapsat kód na Github. HostName se musí shodovat s adresou vzdáleného repozitáře gitu, pokud chceme přistupovat přes ssh do vzdáleného repozitáře (což je nejčastější použití u vývojáře). IdentityFile definuje, který klíč se má použít, UserKnownHostsFile označuje soubor, kam se ukládají známé servery. IdentitiesOnly označuje příznak, aby byla použita pouze identita označená klíčem IdentityFile a nebyly zkoušeny žádné jiné klíče. UseKeychain je rozšíření pro macOS a definuje využít klíčenku v systému, AddKeysToAgent automatické přidání klíčů do ssh agenta.
Druhý a třetí odstavec definuje totéž, jen pro pracovní identitu. Protože k Azure DevOps je možné (v závislosti na nastavení workspace) přistupovat jak přes adresu dev.azure.com, tak postaru přes visualstudio.com, uvádím obě možnosti. V případě staré adresy je nutné ještě upravit název uživatele gitu, který odpovídá názvu Vašeho pracovního workspacu (User workspace-name) na řádku 21.
Práva k souborům
Ověříme, že máme správná práva k souborům, tzn. k privátním klíčům se dostaneme jen my, k veřejným všichni (rw-r--r-- pro veřejné klíče a rw------- pro soukromé klíče):
$ ls -l
total 88
-rw-r--r--@ 1 ales staff 894 21 črv 17:07 config
-rw------- 1 ales staff 3434 15 črv 15:09 id_rsa_personal
-rw-r--r-- 1 ales staff 746 15 črv 15:09 id_rsa_personal.pub
-rw------- 1 ales staff 3434 15 črv 15:11 id_rsa_work
-rw-r--r-- 1 ales staff 748 15 črv 15:11 id_rsa_work.pub
-rw-r--r--@ 1 ales staff 2173 21 črv 16:44 known_hosts_personal
-rw-r--r-- 1 ales staff 808 16 črv 09:43 known_hosts_work
Uložení klíčů do klíčenky
Klíče ještě přidáne do klíčenky, aby je systém dokázal použít.
$ ssh-add -K id_rsa_personal
$ ssh-add -K id_rsa_work
a ověříme, že jsou vložené:
$ ssh-add -l
Nyní zbývá dle dokumentace konkrétní služby vložit veřejné klíče do dané služby (Github, Azure DevOps). Vložení klíče do schránky provedeme jednoduše
$ pbcopy < ~/.ssh/id_rsa_personal.pub
a stejně pro pracovní klíč.
Shrnutí
Pokud potřebujeme nakonfigurovat ssh pro více identit, je vhodné zvolit více klíčů a k nim příslušné soubory. Následně upravit konfiguraci ssh a vložit nové klíče do klíčenky. Následně můžeme použít.
Poznámka
Pokud potřebujeme více identit pro stejnou službu, např. Github, musíme upravit adresy v konfiguraci ssh, které pak vypadá například následovně:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
UserKnownHostsFile ~/.ssh/known_hosts_personal
IdentitiesOnly yes
UseKeychain yes
AddKeysToAgent yes
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
UserKnownHostsFile ~/.ssh/known_hosts_work
IdentitiesOnly yes
UseKeychain yes
AddKeysToAgent yes
|
Následně musíme podle Host upravit adresy remote repozitáře, kde z:
git@github.com:workgroup/project.git
musíme udělat
git@github.com-work:workgroup/project.git
A stejně tak, pokud máme nějaké závislosti, i tam musíme upravit adresu dle schématu viz výše.