adblog

Oddělené SSH klíče pro více identit

Vytvořeno:
Kategorie: Blog
Tagy: blog ssh

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ář

  1. Potřebujeme přistupovat na Github pod soukromou identitou a na Azure DevOps pod pracovní identitou.
  2. 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.