1. Übersicht
Sichere Quellcodetechniken sind eine Reihe von Verfahren, mit denen die Sicherheit von Quellcode verbessert werden kann. Mit diesen Techniken können Sie Sicherheitslücken im Quellcode identifizieren und beheben, unbefugten Zugriff auf Quellcode verhindern und Quellcode vor Änderungen schützen.
Einige gängige Techniken für sicheren Quellcode sind:
- Linting:Beim Linting wird Quellcode auf Fehler und stilistische Probleme geprüft. Dazu wird ein Lint-Tool verwendet, ein Programm, das Quellcode analysiert und potenzielle Probleme identifiziert. Mit Lint-Tools lassen sich verschiedene Fehler prüfen, darunter Syntaxfehler, semantische Fehler, Stilfehler und Sicherheitslücken.
- Statische Anwendungssicherheitstests (Static Application Security Testing, SAST): SAST ist eine Art von Sicherheitstests, bei denen Quellcode, Binärcode oder Bytecode analysiert werden, um Sicherheitslücken zu identifizieren. SAST-Tools können verwendet werden, um Sicherheitslücken in einer Vielzahl von Programmiersprachen zu finden, darunter Go, Java, Python, C++ und C#.
- Lizenzscan:Beim Lizenzscan werden die Lizenzen von Drittanbieter-Softwarekomponenten ermittelt, die in einer Softwareanwendung verwendet werden. Das ist wichtig, um sicherzustellen, dass die Anwendung den Lizenzbedingungen entspricht und rechtliche Probleme vermieden werden.
Diese Techniken können verwendet werden, um die Sicherheit von Quellcode in allen Phasen des Softwareentwicklungszyklus zu verbessern. Linting kann verwendet werden, um Fehler frühzeitig im Entwicklungsprozess zu erkennen. SAST kann verwendet werden, um Sicherheitslücken zu finden, bevor der Code kompiliert oder bereitgestellt wird. Mit dem Lizenzscan kann sichergestellt werden, dass die Anwendung den Lizenzbedingungen entspricht.
Durch die Anwendung dieser Techniken kann die Sicherheit von Quellcode verbessert und das Risiko von Sicherheitsverletzungen verringert werden.
Lerninhalte
In diesem Lab geht es um die Tools und Techniken, mit denen Sie Softwarequellcode schützen können.
- Linting
- Statische Anwendungssicherheitstests
- Lizenzscan
Alle in diesem Lab verwendeten Tools und Befehle werden in Cloud Shell ausgeführt.
2. Einrichtung und Anforderungen
Umgebung zum selbstbestimmten Lernen einrichten
- Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.



- Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können ihn jederzeit aktualisieren.
- Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich (kann nach dem Festlegen nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (sie wird in der Regel als
PROJECT_IDangegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen versuchen. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen. - Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
- Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit Ihnen nach Abschluss dieser Anleitung keine Kosten mehr in Rechnung gestellt werden, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Nutzer von Google Cloud kommen für das kostenlose Testprogramm mit einem Guthaben von 300 $ infrage.
Cloud Shell-Editor starten
Dieses Lab wurde für die Verwendung mit Google Cloud Shell Editor entwickelt und getestet. So greifen Sie auf den Editor zu:
- Rufen Sie Ihr Google-Projekt unter https://console.cloud.google.com auf.
- Klicken Sie oben rechts auf das Cloud Shell Editor-Symbol.

- Unten im Fenster wird ein neuer Bereich geöffnet.
- Klicken Sie auf den Button „Editor öffnen“.

- Der Editor wird mit einem Explorer auf der rechten Seite und dem Editor im mittleren Bereich geöffnet.
- Unten auf dem Bildschirm sollte auch ein Terminalbereich verfügbar sein.
- Wenn das Terminal NICHT geöffnet ist, verwenden Sie die Tastenkombination „Strg + `“, um ein neues Terminalfenster zu öffnen.
Umgebung einrichten
Legen Sie den GOPATH auf ein einzelnes Verzeichnis fest, um die in diesem Lab verwendeten Befehle zu vereinfachen.
export GOPATH=$HOME/gopath
Verzeichnis für unsere Arbeit erstellen
mkdir -p workspace
cd workspace
Quellcode-Repository klonen
git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)
3. Linting
Beim Linting werden häufige stilbezogene Fehler oder Syntaxfehler geprüft. Linting unterstützt die Sicherheit, indem es ein gemeinsames Syntaxmuster für mehrere Teams bereitstellt, was zu schnelleren Code-Reviews, Wissensaustausch und Klarheit des Codes führt.
Außerdem werden mit Linting häufige Syntaxfehler erkannt, die zu häufigen Sicherheitslücken wie der unsachgemäßen oder weniger effizienten Verwendung von Bibliotheken oder Core-APIs führen können.
staticcheck-Verknüpfungstool installieren
go get honnef.co/go/tools/cmd/staticcheck@latest
Go-Linter (staticcheck) im Stammverzeichnis des Projekts ausführen
staticcheck
Die Ausgabe ansehen
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
Sie erhalten den Fehler, weil http.ListenAndServe() einen String akzeptiert und im aktuellen Code Sprintf verwendet wird, ohne Variablen an den String zu übergeben.
Prüfen Sie den Exit-Status des Befehls.
echo $?
Da der Befehl in diesem Fall zu einem Fehler geführt hat, ist der Exit-Status 1 oder höher. Dies ist eine Methode, die in einer CI/CD-Pipeline verwendet werden kann, um den Erfolg oder Misserfolg des Tools zu ermitteln.
Bearbeiten Sie die Datei main.go und korrigieren Sie den Code:
- Kommentieren Sie die Zeile unter
LINTING - Step 1in der Methodemain()aus, indem Sie Schrägstriche(//) voranstellen. - Entfernen Sie die Kommentarzeichen für die beiden Zeilen direkt unter
LINTING - Step 2in der Methodemain(), indem Sie die führenden Schrägstriche entfernen.
Führen Sie staticcheck noch einmal im Projektstammverzeichnis aus.
staticcheck
Der Befehl sollte keine Ergebnisse zurückgeben (d.h. eine leere Zeile).
Prüfen Sie den Exit-Status des Befehls.
echo $?
Da der Befehl in diesem Fall nicht zu einem Fehler geführt hat, ist der Exit-Status Null.
4. Statische Anwendungssicherheitstests
AST/Static security testing: Bietet eine statische Codeanalyse, bei der nach häufigen Schwachstellen und Sicherheitsrisiken ( CWEs) gesucht wird.
AST-Tool installieren (gosec)
export GOSEC_VERSION="2.15.0"
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}
gosec mit der Richtliniendatei für den Quellcode ausführen
gosec -conf policies/gosec-policy.json -fmt=json ./...
Die Ausgabe sollte in etwa so aussehen:
{
"Golang errors": {},
"Issues": [
{
"severity": "HIGH",
"confidence": "LOW",
"cwe": {
"ID": "798",
"URL": "https://cwe.mitre.org/data/definitions/798.html"
},
"rule_id": "G101",
"details": "Potential hardcoded credentials",
"file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go",
"code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n",
"line": "32",
"column": "6"
}
],
"Stats": {
"files": 1,
"lines": 89,
"nosec": 0,
"found": 1
}
}
Das Tool hat ein potenzielles Problem erkannt: Potential hardcoded credentials
5. Lizenzscan
Lizenzen sind wichtig für die Sicherheit, da sie Sie rechtlich dazu verpflichten können, Quellcode offenzulegen, den Sie möglicherweise nicht offenlegen möchten. Das Konzept wird als Copyleft-Lizenzen bezeichnet, die vorschreiben, dass Sie den Quellcode offenlegen müssen, wenn Sie Abhängigkeiten mit diesen Lizenzen verwenden.
golicense installieren
mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd
Binärdatei erstellen
go build
Führen Sie die Lizenzprüfung mit der aktuellen Richtliniendatei aus, die keine „BSD-3-Clause“-Lizenzen zulässt.
golicense policies/license-policy.hcl hello-world
HINWEIS: Dies sollte mit einer ähnlichen Ausgabe fehlschlagen:
🚫 rsc.io/sampler BSD 3-Clause "New" or "Revised" License 🚫 rsc.io/quote BSD 3-Clause "New" or "Revised" License 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License
Ändern Sie die Richtliniendatei policies/license-policy.hcl, um „BSD-3-Clause“ aus der Liste deny in die Liste allow zu verschieben.
Lizenzprüfung noch einmal ausführen
golicense policies/license-policy.hcl hello-world
HINWEIS: Dies sollte mit einer ähnlichen Ausgabe erfolgreich sein:
✅ rsc.io/quote BSD 3-Clause "New" or "Revised" License
✅ rsc.io/sampler BSD 3-Clause "New" or "Revised" License
✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License
6. Glückwunsch
Herzlichen Glückwunsch! Sie haben das Codelab abgeschlossen.
Das haben Sie gelernt
- Tools und Techniken zum Sichern von Quellcode
–
Letzte Aktualisierung: 23.03.2023