Was sind Geheimnisse?
In der Softwareentwicklung sind Geheimnisse vertrauliche Informationen, mit denen der Zugriff auf Systeme, Dienste, Daten und APIs authentifiziert oder autorisiert wird. Beispiele:
- API-Schlüssel und Zugriffstoken, über die du mit externen Diensten wie der GitHub-REST-API interagieren kannst. Mithilfe von Zugriffstoken können Dienste wie GitHub Actions zudem Tasks ausführen, die eine Authentifizierung erfordern. Dies wird später in diesem Artikel noch genauer erläutert.
- Datenbankanmeldeinformationen, die Zugriff auf lokale und externe Datenbanken und Speicher gewähren.
- Private Schlüssel wie private SSH- und PGP-Schlüssel, über die der Zugriff auf andere Server und die Datenverschlüsselung erfolgt.
Der umfassende Zugriff, den Geheimnisse auch auf kritische Systeme ermöglichen, ist der Grund dafür, dass die sichere Speicherung von Geheimnissen eine so große Bedeutung hat.
Was kann passieren, wenn ein Geheimnis offengelegt wird?
- Bei einem Angriff können Unbefugte nicht autorisierten Zugriff auf alle Ressourcen erhalten, auf die ein Geheimnis den Zugriff ermöglicht.
- Bei Hacks können Daten gestohlen werden, darunter auch vertrauliche Benutzerdaten. Dies kann Auswirkungen datenschutzbezogene und rechtliche Auswirkungen haben und das Vertrauen in dich und deine Anwendung beschädigen.
- Offengelegte Geheimnisse können dich Geld kosten, wenn bei einem Hack nicht autorisierte Workloads auf deinen Cloudanbieterkonten ausgeführt werden.
- Offengelegte Geheimnisse können böswillig verwendet werden, um Server zu löschen, zu ändern und ihren Betrieb zu stören. Dies kann wiederum Downtime und Datenverluste nach sich ziehen.
Überlege genau, welche Zugriffsmöglichkeiten und Fähigkeiten dir ein Geheimnis verschafft und was böswillige Personen damit tun könnten. Wenn durch einen Hack beispielsweise ein personal access token für dein GitHub-Konto offengelegt werden würde, könnten andere anschließend auf GitHub in deinem Namen posten und Änderungen vornehmen.
Best Practices für die Verwaltung von Geheimnissen
Um solche Probleme zu vermeiden, solltest du einige Best Practices befolgen, um Leaks zu verhindern und den Schaden zu begrenzen, falls ein Geheimnis doch einmal offengelegt wird.
Befolge das Prinzip der geringsten Rechte
Beschränke die Berechtigungen und den Zugriff eines Geheimnisses nach Möglichkeit immer nur auf das Nötigste. Zum Beispiel:
- Wenn ein Geheimnis nur zum Lesen von Daten und nicht zum Bearbeiten verwendet wird, solltest du ihm nur Lesezugriff erteilen.
- Wenn du ein Geheimnis mit der API, die du verwendest, nur auf bestimmte Bereiche oder Berechtigungen beschränken kannst, wähle nur die wirklich notwendigen aus. Wenn du mit einem GitHub-Geheimnis z. B. nur Issues erstellen musst, gibt es keinen Grund, dem Geheimnis Zugriff auf Repositoryinhalte oder andere Inhalte zu geben.
- Wenn ein Geheimnis Angreifenden Vollzugriff auf das Benutzerkonto geben würde, das das Geheimnis besitzt, solltest du unter Umständen Dienstkonten erstellen, die den Besitz des Geheimnisses übernehmen können.
Schützen der Geheimnisse in deiner Anwendung
- Geheimnisse sollten nie hartcodiert werden. Verwende immer Umgebungsvariablen oder die Geheimnisverwaltungstools deiner Plattform (z. B. Repositorygeheimnisse von GitHub).
- Wenn du ein Geheimnis für bestimmte Personen freigeben musst, verwende ein dediziertes Tool wie einen Kennwort-Manager. Versende Geheimnisse niemals als E-Mail oder Chatnachricht.
- Nach Möglichkeit solltest du Ablaufdaten festlegen und Geheimnisse regelmäßig rotieren. Dadurch wird das Risiko gesenkt, dass alte Geheimnisse durch einen Exploit missbraucht werden können.
- Wenn deine Anwendung ein Protokoll erstellt, solltest du sicherstellen, dass Geheimnisse vor der Protokollierung redigiert werden. Andernfalls können aktive Geheimnisse in Klartextdateien gespeichert werden.
Begrenze den Schaden, wenn ein Geheimnis offengelegt wird
- Prüfe das kompromittierte Geheimnis, selbst wenn es nur für eine Sekunde öffentlich verfügbar war, und widerrufe es umgehend. Generiere dann ein neues Geheimnis, und speichere es sicher.
- Überprüfe alle Aktivitätsprotokolle, in denen unter Umständen verdächtige Aktivitäten erfasst wurden, die mit dem kompromittierten Geheimnis ausgeführt wurden.
- Überlege, wie das Geheimnis offengelegt wurde, und nimm Änderungen an deinen Prozessen vor, damit dies nicht mehr geschehen kann.
Wie GitHub hilft, Geheimnisse zu schützen
Du kannst vieles zur Sicherheit von Geheimnissen beitragen. Aber auch GitHub leistet viel für den Schutz von Geheimnissen. Alle Menschen machen Fehler. Deshalb möchten wir Features entwickeln, die alle versehentlich offengelegten Geheimnisse abfangen:
- Der Pushschutz, der später noch in der Praxis vorgeführt wird, verhindert, dass Geheimnisse an deine GitHub-Repositorys gepusht werden.
- Die Geheimnisüberprüfung scannt Repositorys und sendet Warnungen, wenn ein Geheimnis entdeckt wird. Bei bestimmten Geheimnissen benachrichtigen wir Anbietende auch, damit diese Maßnahmen wie das automatische Widerrufen des Geheimnisses ergreifen können.
Übung zum sicheren Speichern von Geheimnissen
In dieser Übung erstellen wir ein personal access token und speichern es sicher, damit wir es mit GitHub Actions verwenden können. Die Aktion, die wir erstellen, ist ein einfacher Workflow, der auf ein Problem reagiert.
1. Erstellen eines Übungsrepositorys
Zunächst erstellen wir das Repository, mit dem wir arbeiten werden. Das new2code
-Konto enthält ein Vorlagenrepository, mit dem wir schnell loslegen können.
- Navigiere zur Seite des neuen Repositorys. Wenn du auf diesen Link klickst, wird die Vorlage im
new2code
-Konto vorab ausgewählt. - Vergewissere dich, dass dein Benutzerkonto unter „Owner“ ausgewählt ist.
- Gib
secret-action
in das Feld „Repository name“ ein. - Wähle unter dem Beschreibungsfeld Public als Repositorysichtbarkeit aus.
- Klicke auf Repository erstellen.
2. Committen eines Dummytokens
Alle Menschen machen Fehler. Deshalb kann es sein, dass du irgendwann in deiner beruflichen Laufbahn versehentlich ein Geheimnis committest. In dieser Übung committen wir absichtlich ein erfundenes Token, um den Umgang mit der Warnung zu üben, die ausgelöst wird.
-
Navigiere zu dem Repository, das du gerade erstellt hast.
-
Navigiere zur Datei des YAML-Workflows, indem du in der Liste der Dateien auf
.github/workflows
klickst. -
Öffne die Workflowdatei, indem du in der Liste der Dateien auf
comment.yml
klickst. -
Um die Workflowdatei zu bearbeiten, klicke oben rechts auf .
-
Füge in Zeile 13 (
GH_TOKEN: ""
) das folgende Dummytoken in die Anführungszeichen ein:secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
Das Endergebnis sollte wie folgt aussehen:
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
-
Um die Änderung zu committen, klicke oben rechts auf Commit changes... und dann im Dialogfeld erneut auf Commit changes.
-
Nun sollte die Pushschutzwarnung mit dem Hinweis „Secret scanning found a GitHub Secret Scanning secret on line 13“ angezeigt werden.
Würden wir nicht mit einem Dummytoken experimentieren, hätte uns diese Warnung darauf hingewiesen, dass wir beinahe ein Token offengelegt hätten. Lies dir die Optionen durch, die du in der Warnung auswählen kannst.
-
Um den Commit zu stoppen und zu verhindern, dass das Geheimnis offengelegt wird, klicke auf Cancel. Klicke oben rechts auf Cancel changes, und verwirf die nicht gespeicherten Änderungen, wenn du dazu aufgefordert wirst.
3. Erstellen eines echten Tokens
Jetzt versuchen wir, unsere Best Practices zu befolgen. Zunächst erstellen wir ein personal access token, mit dem die Aktion in deinem Namen handeln kann (der vom Token erstellte Kommentar wird scheinbar deinem Benutzerkonto stammen).
Note
Dabei befolgen wir in jedem Konfigurationsschritt das Prinzip der geringsten Rechte. Dein Token hat die kürzeste erforderliche Ablaufdauer, nur Zugriff auf das erforderliche Repository und die geringsten Berechtigungen, die für die Arbeit erforderlich sind.
- Navigiere zur Seite des neuen personal access token.
- Benenne dein neues Token unter „Token name“. Du kannst einen Namen wie „Aktionstoken“ verwenden.
- Wähle unter „Expiration“ die Dauer „7 days“ aus.
- Wähle unter „Repository access“ die Option Only select repositories aus.
- Wähle in der Dropdownliste „Select repositories“ ausschließlich das Übungsrepository aus, das du zuvor erstellt hast.
- Klicke im Abschnitt „Permissions“ rechts neben „Repository permissions“ auf , um alle möglichen Berechtigungen anzuzeigen.
- Scrolle nach unten zu „Issues“, und wähle in der Dropdownliste rechts „Read and write“ aus.
- Wähle unten auf der Seite Generate token aus. Wenn du dazu aufgefordert wirst, bestätige deine Auswahl, indem du erneut auf Generate token klickst.
Ab jetzt ist es unerlässlich, das neu erstellte Token immer zu schützen. Da wir das Token bald verwenden, kannst du es kurz in die Zwischenablage kopieren.
4. Sicheres Speichern des Tokens
Das neue Token kann jetzt sicher in unserem Repository gespeichert werden.
-
Navigiere zu dem Repository, das du zu Beginn der Übung erstellt hast.
-
Wähle unter dem Namen deines Repositorys die Option Einstellungen aus. Wenn die Registerkarte „Einstellungen“ nicht angezeigt wird, wähle im Dropdownmenü die Option Einstellungen aus.
-
Wählen Sie im Abschnitt „Sicherheit“ in der Randleiste Geheimnisse und Variablen und klicken Sie dann auf Aktionen.
-
Klicke unter „Repository secrets“ auf New repository secret.
-
Gib in das Feld Name den Namen für dein Geheimnis ein. In dieser Übung verwenden wir
MY_TOKEN
. -
Füge in das Feld Secret das zuvor generierte personal access token ein.
-
Klicke auf Geheimnis hinzufügen.
Das Geheimnis ist jetzt sicher verschlüsselt und einsatzbereit!
5. Verweisen auf das Token in einer Aktion
Wir können die YAML-Workflowdatei jetzt aktualisieren, um das Token zu verwenden und zu testen.
-
Navigiere zurück zu deinem Repository. Wenn du dich in den Einstellungen deines Repositorys befindest, kannst du unter dem Repositorynamen auf Code klicken.
-
Navigiere zur Datei des YAML-Workflows, indem du in der Liste der Dateien auf
.github/workflows
klickst. -
Öffne die Workflowdatei, indem du in der Liste der Dateien auf
comment.yml
klickst. -
Um die Workflowdatei zu bearbeiten, klicke oben rechts auf .
-
Ersetze die leeren Anführungszeichen in Zeile 13 (
GH_TOKEN: ""
) durch${{ secrets.MY_TOKEN }}
. Dadurch wird ein Verweis auf das zuvor hinzugefügte Repositorygeheimnis erstellt.GH_TOKEN: ${{ secrets.MY_TOKEN }}
-
Um die Änderung zu übernehmen, klicke oben rechts auf Commit changes....
-
Beschreibe im Dialogfeld „Commit changes“ im Feld „Commit message“, die von uns vorgenommene Änderung. Du kannst beispielsweise „Workflow aktualisiert, sodass er das Repositorygeheimnis verwendet“ eingeben.
-
Achte darauf, dass „Commit directly to the
main
branch“ ausgewählt ist. -
Klicke auf Änderungen committen.
6. Testen des Tokens und des Workflows
Jetzt ist alles bereit! Nun werden wir den Workflow testen.
-
Klicke unter dem Namen deines Repositorys auf -Issues.
-
Klicke auf Neues Issue.
-
Du kannst unter „Add a title“ einen beliebigen Titel eingeben.
-
Gib im Textbereich unter „Add a description“
Hello
ein. -
Klicke unter dem Textbereich auf Create.
Nach Abschluss des Workflows sollte ein neuer Kommentar angezeigt werden. Der Kommentar wurde von dir selbst erstellt, da wir dein Token verwenden, und enthält eine Grußformel.
Nächste Schritte
Wenn du ausführlichere Einblicke in die Geheimnisüberprüfung und den Pushschutz erhalten möchtest, kannst du den Kurs Einführung in die Geheimnisüberprüfung in GitHub Skills absolvieren.