1. Übersicht
Sichere Quellcodetechniken umfassen eine Reihe von Verfahren, mit denen die Sicherheit von Quellcode verbessert werden kann. Diese Techniken können dazu beitragen, Sicherheitslücken im Quellcode zu identifizieren und zu beheben, unbefugten Zugriff auf Quellcode zu verhindern und zu verhindern, dass der Quellcode modifiziert wird.
Zu den gängigen Verfahren für sicheren Quellcode gehören:
- Linting:Linting ist der Vorgang, bei dem Quellcode auf Fehler und stilistische Probleme geprüft wird. Dazu wird ein Lint-Tool verwendet, ein Programm, das Quellcode analysiert und potenzielle Probleme identifiziert. Lint-Tools können verwendet werden, um nach einer Vielzahl von Fehlern zu suchen, darunter Syntaxfehler, semantische Fehler, Stilfehler und Sicherheitslücken.
- Statische Anwendungssicherheitstests (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 verschiedenen Programmiersprachen wie Go, Java, Python, C++ und C# zu finden.
- Lizenzscans: Das Scannen von Lizenzen ist ein Vorgang, bei dem Lizenzen von Softwarekomponenten von Drittanbietern identifiziert werden, die in einer Softwareanwendung verwendet werden. Dies ist wichtig, weil dadurch sichergestellt wird, dass die Anwendung den Nutzungsbedingungen der Lizenzen entspricht. Dadurch können rechtliche Probleme vermieden werden.
Diese Techniken können verwendet werden, um die Sicherheit von Quellcode in allen Phasen des Lebenszyklus der Softwareentwicklung zu verbessern. Linting kann verwendet werden, um Fehler zu Beginn des Entwicklungsprozesses zu identifizieren, mit SAST können Sicherheitslücken gefunden werden, bevor der Code kompiliert oder bereitgestellt wird. Außerdem kann mithilfe von Lizenzscans sichergestellt werden, dass die Anwendung den Nutzungsbedingungen der Lizenzen entspricht.
Die Verwendung dieser Techniken kann dazu beitragen, die Sicherheit des Quellcodes zu verbessern und das Risiko von Sicherheitslücken zu verringern.
Lerninhalte
In diesem Lab konzentrieren wir uns auf die Tools und Techniken zum Sichern von Softwarequellcode.
- Linting
- Sicherheitstests für statische Anwendungen
- Lizenzscans
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 Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.
- Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
- Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf die Projekt-ID verweisen, die üblicherweise als
PROJECT_ID
gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen. - Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte möglichst wenig kosten. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben.
Cloud Shell-Editor starten
Dieses Lab wurde für die Verwendung mit dem 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 rechts oben auf das Symbol für den Cloud Shell-Editor
- Unten im Fenster wird ein neuer Bereich geöffnet.
- Klicken Sie auf die Schaltfläche „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 außerdem ein Terminalbereich verfügbar sein.
- Wenn das Terminal NICHT geöffnet ist, verwende die Tastenkombination „Strg +“, um ein neues Terminalfenster zu öffnen
Umgebung einrichten
Legen Sie für GOPATH ein einzelnes Verzeichnis fest, um die in diesem Lab verwendeten Befehle zu vereinfachen.
export GOPATH=$HOME/gopath
Erstellen Sie ein Verzeichnis, in dem unsere Arbeit gespeichert wird
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
Linting wird verwendet, um häufige stilbasierte Fehler oder Mängel im Zusammenhang mit der Syntax zu prüfen. Linting verbessert die Sicherheit, indem es ein gemeinsames Syntaxmuster für mehrere Teams bereitstellt. Dies führt zu schnelleren Codeüberprüfungen, dem Wissensaustausch und der Klarheit des Codes.
Darüber hinaus erkennt Linting häufige Syntaxfehler, die zu häufigen Sicherheitslücken wie einer unsachgemäßen oder weniger effizienten Nutzung von Bibliotheken oder Kern-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
Ausgabe prüfen
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
Sie erhalten diesen Fehler, weil http.ListenAndServe()
einen String akzeptiert und der aktuelle Code Sprintf
verwendet, ohne Variablen an den String zu übergeben.
Prüfen Sie den Exit-Status des Befehls.
echo $?
Da der Befehl zu einem Fehler geführt hat, ist der Exit-Status in diesem Fall 1 oder höher. Dies ist eine Methode, die in einer CI/CD-Pipeline verwendet werden kann, um Erfolg/Misserfolg des Tools zu ermitteln.
Bearbeiten Sie die Datei main.go
und korrigieren Sie den Code:
- Kommentieren Sie die Zeile unter
LINTING - Step 1
innerhalb der Methodemain()
aus, indem Sie Schrägstriche(//
) hinzufügen. - Entfernen Sie die vorangestellten Schrägstriche, um die Kommentarzeichen der beiden Zeilen direkt unter
LINTING - Step 2
in der Methodemain()
zu entfernen.
staticcheck
noch einmal im Stammverzeichnis des Projekts ausführen
staticcheck
Der Befehl sollte keine Ergebnisse zurückgeben (d.h. eine leere Zeile).
Prüfen Sie den Exit-Status des Befehls.
echo $?
In diesem Fall ist der Exit-Status null, da der Befehl nicht zu einem Fehler geführt hat.
4. Sicherheitstests für statische Anwendungen
AST/statische Sicherheitstests: ermöglichen eine statische Codeanalyse zur Suche nach gängigen Schwachstellen und Schwachstellen ( CWEs).
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}
Führen Sie gosec
mit der Richtliniendatei für den Quellcode aus
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. Lizenzscans
Lizenzen sind wichtig für die Sicherheit, da Sie rechtlich dazu verpflichtet werden können, Quellcode offenzulegen, den Sie vielleicht nicht veröffentlichen möchten. Das Konzept heißt „ copyleft" Lizenzen, für die Sie Quellcode freigeben 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 „BSD-3-Clause“ nicht zulässt Lizenzen
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“ zu verschieben von der Liste deny
in die Liste allow
.
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
Glückwunsch, du hast das Codelab abgeschlossen.
Was Sie gelernt haben
- Tools und Techniken zum Sichern von Quellcode
–
Letzte Aktualisierung: 23.03.2023