Im Entwicklungsprozess des Linux-Kernels spielen sichere und nachvollziehbare Code-Übertragungen eine zentrale Rolle. Während viele Entwickler mit der PGP-Signatur von Git-Objekten vertraut sind - wie beispielsweise Tags und Commits - ist die Funktion der signierten Git-Pushes noch relativ unbekannt. Dabei bietet dieses Feature eine zusätzliche Sicherheitsebene und verhindert, dass Code ohne klare Absicht in bestimmte Zweige eingespielt wird. Konstantin Ryabitsev, ein Experte auf diesem Gebiet, hat im November 2020 die Vorzüge signierter Git-Pushes für den Linux-Kernel-Entwicklungsserver herausgestellt und damit eine wichtige Diskussion über Authentizität und Vertrauenswürdigkeit in der Entwicklung angestoßen. Die Motivation hinter signierten Pushes liegt im grundsätzlichen Unterschied zu den bekannten signierten Commits.
Während diese die Echtheit einzelner Änderungen bestätigen können, geben sie keine eindeutige Auskunft über die Absicht, diese Änderungen in einen bestimmten Branch und auf einen bestimmten Server zu übertragen. Ohne die Push-Signatur könnte zum Beispiel gefährlicher oder experimenteller Code in unpassenden Zweigen landen, ohne dass klar ist, ob dies beabsichtigt war. Selbst wenn der Commit signiert ist, lässt sich nicht sicherstellen, dass der originale Entwickler seine Zustimmung zur Übertragung gegeben hat. Dies birgt Risiken, etwa dass unsicherer Code versehentlich in produktiven Bereichen landet oder Verantwortlichkeiten unklar bleiben. Die signierten Pushes hingegen bieten eine eindeutige Erklärung: Der Entwickler beabsichtigt tatsächlich, bestimmte Änderungen in einen bestimmten Branch auf einem bestimmten Server zu übertragen.
Hierfür wird eine PGP-Signatur erstellt, die nicht nur die Authentizität bestätigt, sondern zusätzlich anhand eines sogenannten „Push-Zertifikats“ festhält, dass der Push beabsichtigt und geprüft wurde. Dieses Zertifikat kann anschließend in Transparenzlogs eingetragen werden, was eine nachvollziehbare und überprüfbare Historie von Push-Vorgängen ermöglicht. Gerade bei großen Open-Source-Projekten wie dem Linux-Kernel, bei denen viele Mitwirkende aus unterschiedlichen Ländern Code beitragen, ist eine solche Nachvollziehbarkeit von enormem Wert. Technisch gesehen setzt die Implementierung signierter Pushes auf einer serverseitigen Unterstützung voraus. Das Feature ist nicht automatisch bei allen öffentlichen Git-Hosting-Diensten aktiviert, da die meisten großen Anbieter dieses Verfahren derzeit nicht unterstützen.
Aus diesem Grund bietet Git eine Einstellung namens „if-asked“, die clientseitig überprüft, ob der Server signierte Pushes unterstützt, und erst dann ein Push-Zertifikat generiert und mitsendet. Um diese Funktion auf der Entwicklerseite zu aktivieren, genügt es, die Git-Konfigurationsdatei zu bearbeiten und dort im Abschnitt „push“ den Parameter „gpgSign“ auf „if-asked“ zu setzen. Dieser Schritt sorgt dafür, dass Git automatisch prüft, ob der entfernte Server signierte Pushes akzeptiert, und nur dann ein Zertifikat erstellt. Somit bleibt der Workflow flexibel und kompatibel mit verschiedenen Serverkonfigurationen. Auf der Serverseite wiederum ist es notwendig, die Funktion explizit zu aktivieren.
Dies geschieht durch die Konfiguration verschiedener Parameter innerhalb der jeweiligen Repositories oder global in der Git-Server-Konfiguration. Von besonderer Bedeutung ist hierbei die Einstellung „advertisePushOptions“, die auf „true“ gesetzt wird, damit der Server die Unterstützung für signierte Pushes aktiv bewirbt. Zudem muss ein zufällig generierter, geheimer Schlüssel in Form eines Strings unter der Einstellung „certNonceSeed“ hinterlegt werden. Dieser Seed wird gemeinsam mit einem Zeitstempel genutzt, um eine einmalige Nonce zu generieren. Diese Nonce ist ein Einmalwert, der vom Client signiert wird und verhindert so Replay-Angriffe.
Zusätzlich gibt die Nonce eine Beweislage, dass das Zertifikat für diesen speziellen Server erzeugt wurde. Die Einbindung signierter Push-Zertifikate eröffnet darüber hinaus vielfältige Möglichkeiten für Serveradministratoren. Manche setzen die ausgestellten Zertifikate lediglich zu Protokollzwecken ein, indem sie sie in entsprechenden Transparenzlogs sammeln und öffentlich zugänglich machen. Dies ermöglicht eine nachträgliche Prüfung, ob tatsächlich autorisierte Push-Vorgänge stattgefunden haben und schafft Vertrauen in den Entwicklungsprozess. Alternativ können Server auch so konfiguriert werden, dass sie Pushes ablehnen, die nicht mit einem gültigen Zertifikat versehen sind.
Damit lässt sich ein zusätzlicher Mechanismus zur Qualitätssicherung einführen, der verhindern kann, dass unautorisierte oder unbeabsichtigte Änderungen in den Codefluss gelangen. Im Linux-Kernel-Projekt kommt dieses Verfahren das erste Mal in relevanter Weise zum Einsatz, um den sehr hohen Ansprüchen an Sicherheit und Verantwortlichkeit gerecht zu werden. Gerade in einem so kritischen und weltweit verteilten Projekt ist es essenziell, den Ursprung und die Berechtigung sämtlicher Code-Übertragungen sicher nachweisen zu können. Durch signierte Pushes entsteht eine weitere Schutzschicht, die neben den bekannten Signaturen von Commits und Tags existiert und explizit die Absicht des Push-Vorgangs belegt. Entwickler, die mit Git arbeiten, profitieren zudem von einer einfachen Aktivierung auf ihrer Seite, da das Feature clientseitig ohne großen Aufwand in der Git-Konfiguration aktiviert werden kann.
Die eigentliche Serverunterstützung wiederum ist eine Entscheidung der Serveradministratoren, die je nach Sicherheitsbedürfnis und Infrastruktur das Feature ein- oder ausschalten können. Abschließend lässt sich sagen, dass signierte Git-Pushes eine sinnvolle Ergänzung im Sicherheits- und Vertrauensmanagement der Softwareentwicklung darstellen. Sie verhindern mögliche Missverständnisse über die Absicht von Code-Änderungen, verbessern die Nachvollziehbarkeit von Änderungen und schützen vor böswilligen oder versehentlichen Pushes in falsche Entwicklungslinien. Gerade für große Open-Source-Projekte mit vielen Beteiligten, wie den Linux-Kernel, sind sie ein wichtiger Schritt hin zu mehr Transparenz und Sicherheit. Die technische Umsetzung ist vergleichsweise unkompliziert und bietet dennoch einen signifikanten Mehrwert bei der Pflege von hohen Qualitätsstandards.
Die Nutzung signierter Pushes ist somit nicht nur eine technische Neuerung, sondern eine notwendige Weiterentwicklung in der verantwortungsvollen Softwareentwicklung, die Vertrauen zwischen Entwicklern und Nutzern festigt und die Integrität eines Projekts nachhaltig sichert.