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 Seite https://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!