GitHub SSH Deployment Keys für private Repos
Du brauchst einen Deployment Key für GitHub um auf private Repositories zuzugreifen? Eventuell um automatisiert vom Build Server aus zu clonen bzw. zu deployen?
Das bedeutet Du willst wahrscheinlich, ohne ein Kennwort eingeben zu müssen, auf einem oder mehreren Servern sowas wie git clone https://github.com/user/repo.git
oder git pull origin master
ausführen.
Vielleicht hast Du gerade entdeckt, dass man mit ~/.ssh/config
dem SSH-Client automatisch mitteilen kann welchen privaten Schlüssel er je Host- und Benutzername verwenden soll?
Super, dann kennst Du ja solche Einträge:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/beispiel.github_id_rsa
IdentitiesOnly yes
Also lass uns loslegen: Du brauchst zunächst für Dein Repo „foo“ des GitHub Users „acme“ einen Deployment Key.
- Den SSH Key generierst Du via
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- Vergib als Dateinamen
~/.ssh/acme_foo_github_id_rsa
- Jetzt hinterlegst Du den Inhalt der Datei
~/.ssh/acme_foo_github_id_rsa.pub
in GitHub auf der Seitehttps://github.com/acme/foo/settings/keys
- Fast fertig 🙂 aber nochmal zurück zum Server!
- Hier editierst Du die Datei
~/.ssh/config
(denk dran vorher den Benutzer zu wechseln, zu demjenigen der den Build nachher ausführen soll!) und fügst hinzu:
Host acme_foo.github.com
HostName github.com
User git
IdentityFile ~/.ssh/acme_foo_github_id_rsa
IdentitiesOnly yes
Wenn Du jetzt das Repo clonest, dann nicht mehr wie gewohnt über git clone https://github.com/acme/foo.git
, sondern via git clone ssh://git@acme_foo.github.com/acme/foo.git
.
Solltest Du das Repo bereits vorliegen haben, dann kannst Du alternativ auch die Datei .git/config
im ausgecheckten Repo manuell editieren und dort Dein origin
anpassen:
[remote "origin"]
url = "ssh://git@acme_foo.github.com/acme/foo.git"
Und jetzt kommen wir zum eigentlichen Nutzen dieses HowTos:
GitHub lässt es nicht zu, einen Deployment Key in mehreren privaten Repositiories zu hinterlegen. Benötigst Du also mehrere Deployment Keys musst Du dem SSH Agent auch mitteilen, dass er trotz des identischen Hosts github.com
unterschiedliche SSH Keys verwenden soll. Dies machen wir mit Hilfe des HostAlias, den wir im obigen Beispiel auf acme_foo.github.com
gesetzt haben.
Willst Du nun ein zweites Repo hinfügen, würde Deine ~/.ssh/config
so aussehen:
Host acme_foo.github.com
HostName github.com
User git
IdentityFile ~/.ssh/acme_foo_github_id_rsa
IdentitiesOnly yes
Host acme_bar.github.com
HostName github.com
User git
IdentityFile ~/.ssh/acme_bar_github_id_rsa
IdentitiesOnly yes
Natürlich hast Du den zweiten SSH Key vorher erzeugt und clonest diesmal mit git clone ssh://git@acme_bar.github.com/acme/bar.git
.
Glückwunsch, Du bist nun in der Lage beliebig viele private Repositories in der ~/.ssh/config
zu hinterlegen und dafür jeweils unterschiedliche Deployment Keys zu verwenden 🙂
Happy cloning!