Blog
Erhöhen Sie Ihre Git-Sicherheit: Signieren von GitHub Commits mit 1Password in Windows WSL und Containern

Heute habe ich mir etwas Zeit genommen, um ssh und Signierschlüssel auf meinem lokalen Entwicklerrechner zu beseitigen und meine Arbeitsabläufe mit 1Password zu sichern. Dies ist ein cloudbasierter, plattformübergreifender Passwortmanager, den ich schon seit Jahren verwende. Er verfügt über großartige Funktionen und eine Vielzahl von Integrationen - perfekt für Sicherheits- und Automatisierungsenthusiasten wie mich :)
Wenn Sie sich fragen, warum Sie Git Commits signieren sollten, empfehle ich Ihnen einen Artikel meines Kollegen .
Ich verwende WSL und VSCode DevContainers intensiv in meiner täglichen Arbeit. Seit der Umstellung von Docker Desktop auf ein kostenpflichtiges Abonnement für Profis verwende ich Docker jedoch innerhalb der WSL. Da die WSL jetzt systemd-Unterstützung bietet, ist dies leicht realisierbar.
Meine Anforderung war eine reibungslose Integration mit Containern und der WSL, um mit git unter Verwendung von ssh zu arbeiten und meine Commits zu signieren.

Voraussetzungen
- 1Password Abonnement
- 1Passwort für Windows
- Microsoft OpenSSH
- Windows Hello muss zum Entsperren von 1Password konfiguriert sein
- Die 1Password-Erweiterung für Chrome, Firefox, Edge oder Brave, um SSH-Schlüssel in Ihrem Browser zu erzeugen und zu füllen
- Ubuntu WSL mit aktiviertem systemd und installiertem Docker (sollte auch mit anderen Distributionen funktionieren)
- Visual Studio Code
SSH-Schlüssel bereitstellen
Wenn Sie Ihre vorhandenen SSH-Schlüssel verwenden möchten, importieren Sie sie einfach wie hier beschrieben.
Sie können auch neue Schlüssel mit 1Password erstellen.
Wenn Sie Github verwenden und die 1Password-Browsererweiterung installiert haben, kann dies vereinfacht und direkt im Browser durchgeführt werden. Navigieren Sie einfach zu https://github.com/settings/keys und klicken Sie auf

Klicken Sie auf SSH-Schlüssel erstellen, füllen Sie das Formular aus und klicken Sie auf Erstellen & Ausfüllen.

Fügen Sie schließlich Ihren SSH-Schlüssel zu github hinzu.

Vergewissern Sie sich, dass Sie einen Authentifizierungsschlüssel und einen Signierschlüssel erstellt haben.

Der gleiche Prozess kann auf viele Online-Dienste angewendet werden und ist nicht auf GitHub beschränkt. Ich habe auf die gleiche Weise SSH-Schlüssel für Azure DevOps erstellt.
1Password SSH Agent einrichten
Um SSH-Schlüssel von 1Password abrufen zu können, müssen Sie den 1Password SSH Agent aktivieren. Es gibt eine gute Dokumentation darüber, wie Sie das unter Windows tun können.
Beachten Sie, dass dazu der Windows SSH-Agent deaktiviert werden muss!!!
Standardmäßig stellt 1Password alle Schlüssel in Ihrem privaten Tresor über den SSH-Agenten bereit. Wenn Sie einschränken möchten, welche Schlüssel bereitgestellt werden, folgen Sie der Anleitung zur Konfiguration des 1Password SSH-Agenten.
Testen Sie Ihre Einrichtung, indem Sie die Windows-Befehlszeile aufrufen und ssh-add -l eingeben. Wenn Ihre Schlüssel angezeigt werden, ist alles in Ordnung, andernfalls versuchen Sie einen Neustart.

SSH-Agent in der WSL konfigurieren
Die 1Password-Dokumente bieten Ihnen eine Möglichkeit, den ssh-Agenten in Windows einzurichten, aber es gibt keine Option, den Agenten innerhalb der WSL zu verwenden. Es gibt jedoch eine Abhilfe namens npiperelay. Damit kann die WSL mit Windows-Pipes kommunizieren. Folgen Sie entweder der Installationsanleitung oder laden Sie die Version herunter und entpacken Sie sie in einen beliebigen Ordner, der in Ihrer Windows PATH-Variable konfiguriert ist (oder fügen Sie Ihr eigenes Ziel zum PATH hinzu).
Jetzt sind Sie mit der Windows-Seite fertig. Wechseln wir nun zur WSL.
Installieren Sie zunächst socat, um mit npiperelay Daten zwischen Pipes übertragen zu können.
Erstellen Sie dann eine systemd-Benutzereinheit, die den Stream zum 1Password SSH-Agenten in Windows herstellt. Starten und aktivieren Sie die Einheit, damit sie bei jeder Benutzeranmeldung gestartet wird.
# install socat
sudo apt install socat
# set location of the socket to create
export SSH_AUTH_SOCK=/tmp/1password-agent.sock
# create a systemd unit that is started when the user logs in
sudo tee /etc/systemd/user/1password-ssh-agent.service <<EOT
[Unit]
Description=Connect 1Password SSH Agent from Windows
[Service]
Type=simple
ExecStart=/usr/bin/socat -d -d UNIX-LISTEN:"${SSH_AUTH_SOCK}",fork EXEC:"$(which npiperelay.exe) -ei -s //./pipe/openssh-ssh-agent",nofork
ExecStop=rm -f ${SSH_AUTH_SOCK}
Restart=Always
[Install]
WantedBy=default.target
EOT
# reload systemd
systemctl --user daemon-reload
# start service
systemctl --user start 1password-ssh-agent.service
# set service enabled (start automatic)
systemctl --user enable 1password-ssh-agent.service
# add SSH_AUTH_SOCK to profile so it is set in WSL and devcontainer
cat >> $HOME/.profile <<EOT
# ssh agent bridge
export SSH_AUTH_SOCK=${SSH_AUTH_SOCK}
EOT
Starten Sie Ihre WSL neu und testen Sie Ihre Einrichtung mit ssh-add -l.

Konfigurieren Sie die Git-Signierung in der WSL
Auch hier finden Sie in den 1Password-Dokumenten eine Anleitung für die Konfiguration der Git-Signatur mit der 1Password-App. Die resultierende Konfiguration für meinen Schlüssel sieht wie folgt aus:
[user]
signingkey = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDkemjkTk6/JXBQQcfVKh4pGi8+RPX7LYS0+jmfsIMRY
[gpg]
format = ssh
[gpg "ssh"]
program = "C:/Users/MariusBoden/AppData/Local/1Password/app/8/op-ssh-sign.exe"
[commit]
gpgsign = true
Dies funktioniert perfekt bei der Verwendung von Windows, aber nicht bei WSL.

Der Grund dafür ist der Pfad zu op-ssh-sign.exe. Ein erster Ansatz könnte sein, den Pfad für die WSL-Verwendung festzulegen.
[gpg "ssh"]
program = "/mnt/c/Users/MariusBoden/AppData/Local/1Password/app/8/op-ssh-sign.exe"
Das funktioniert zwar, schlägt aber innerhalb eines Containers fehl, da der erforderliche Programmpfad nicht eingebunden ist.

Das Einbinden des Pfads ist keine Option, da devcontainer.json möglicherweise eingecheckt ist und daher auf keinem System mehr funktionieren würde. Die Lösung besteht darin, die Programmspezifikation aus der git-Konfiguration zu entfernen und einige Zeilen in der WSL ssh-Konfiguration hinzuzufügen.
[user]
signingkey = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDkemjkTk6/JXBQQcfVKh4pGi8+RPX7LYS0+jmfsIMRY
[gpg]
format = ssh
# remove or comment out these lines
#[gpg "ssh"]
# program = "C:/Users/MariusBoden/AppData/Local/1Password/app/8/op-ssh-sign.exe"
[commit]
gpgsign = true
Öffnen Sie nun $HOME/.ssh/config und stellen Sie die folgende Konfiguration ein:
Host *
ForwardAgent yes
IdentityAgent /tmp/1password-agent.sock
Speichern Sie die Datei und starten Sie Ihren Entwicklungscontainer neu bzw. bauen Sie ihn neu auf. Wenn Sie jetzt versuchen, die Datei zu übertragen, öffnet sich ein Fenster, in dem Sie um die Erlaubnis zur Verwendung von 1Password gebeten werden.

Klicken Sie auf Autorisieren und identifizieren Sie sich mit Windows Hello.

Sie können jetzt signierte Commits in Ihren WSL- und VSCode DevContainern erstellen.

Schauen Sie sich Ihren Commit in GitHub an, um Details über den Committer und den verwendeten Schlüssel zu sehen.

Verfasst von

Marius Boden
Marius Boden is passionate about technology and software development. Being a hybrid of developer, architect and DevOps consultant, he can keep track of the big picture and help teams at any point in the development lifecycle to get to the next level.
Contact