Sicherer Quellcode

1. Übersicht

Sichere Quellcodetechniken sind eine Reihe von Praktiken, mit denen die Sicherheit von Quellcode verbessert werden kann. Diese Techniken können helfen, Sicherheitslücken im Quellcode zu identifizieren und zu beheben, unbefugten Zugriff auf Quellcode zu verhindern und Quellcode vor Änderungen zu schützen.

Einige gängige sichere Quellcodetechniken sind:

  • Linting:Linting ist der Prozess, 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. Mit Lint-Tools lassen sich verschiedene Fehler prüfen, darunter Syntaxfehler, semantische Fehler, Stilfehler und Sicherheitslücken.
  • Static Application Security Testing (SAST) : SAST ist eine Art von Sicherheitstest, bei dem Quellcode, Binärcode oder Bytecode analysiert wird, um Sicherheitslücken zu identifizieren. Mit SAST-Tools lassen sich Sicherheitslücken in einer Vielzahl von Programmiersprachen finden, darunter Go, Java, Python, C++ und C#.
  • Lizenzscanning:Beim Lizenzscanning werden die Lizenzen von Softwarekomponenten von Drittanbietern identifiziert, die in einer Softwareanwendung verwendet werden. Das ist wichtig, um sicherzustellen, dass die Anwendung die Lizenzbedingungen einhält, was rechtliche Probleme vermeiden kann.

Diese Techniken können verwendet werden, um die Sicherheit von Quellcode in allen Phasen des Softwareentwicklungszyklus zu verbessern. Mit Linting lassen sich Fehler frühzeitig im Entwicklungsprozess identifizieren, mit SAST können Sicherheitslücken gefunden werden, bevor der Code kompiliert oder bereitgestellt wird, und mit Lizenzscanning lässt sich sicherstellen, dass die Anwendung die Lizenzbedingungen einhält.

Die Verwendung dieser Techniken kann dazu beitragen, die Sicherheit von Quellcode zu verbessern und das Risiko von Sicherheitsverletzungen zu verringern.

Lerninhalte

In diesem Lab werden die Tools und Techniken zum Schutz von Softwarequellcode behandelt.

  • Linting
  • Static Application Security Testing
  • Lizenzscanning

Alle in diesem Lab verwendeten Tools und Befehle werden in der Cloud Shell ausgeführt.

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Er ist ein 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. Sie kann also nicht mehr geändert werden, nachdem sie festgelegt wurde. Die Cloud Console generiert automatisch einen eindeutigen String. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen. Sie wird in der Regel als PROJECT_ID angegeben. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie eine eigene ID verwenden und prüfen, ob sie verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Außerdem gibt es einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten finden Sie in der Dokumentation.
  1. 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 nicht viel kosten, wenn überhaupt. Wenn Sie Ressourcen herunterfahren möchten, damit Ihnen nach dieser Anleitung keine Kosten in Rechnung gestellt werden, können Sie die erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer können das kostenlose Testprogramm im Wert von 300$ nutzen.

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:

  1. Rufen Sie Ihr Google-Projekt unter https://console.cloud.google.com auf.
  2. Klicken Sie rechts oben auf das Symbol für den Cloud Shell-Editor.

8560cc8d45e8c112.png

  1. Unten im Fenster wird ein neuer Bereich geöffnet.
  2. Klicken Sie auf die Schaltfläche „Editor öffnen“.

9e504cb98a6a8005.png

  1. Der Editor wird mit einem Explorer auf der rechten Seite und dem Editor im mittleren Bereich geöffnet.
  2. Außerdem sollte unten auf dem Bildschirm ein Terminalbereich verfügbar sein.
  3. Wenn das Terminal NICHT geöffnet ist, drücken Sie die Tastenkombination `Strg+``, um ein neues Terminalfenster zu öffnen.

Umgebung einrichten

Legen Sie GOPATH auf ein einzelnes Verzeichnis fest, um die in diesem Lab verwendeten Befehle zu vereinfachen.

export GOPATH=$HOME/gopath

Erstellen Sie ein Verzeichnis für Ihre Arbeit.

mkdir -p workspace
cd workspace

Klonen Sie das Quellcode-Repository.

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 Defekte im Zusammenhang mit der Syntax zu prüfen. Linting trägt zur Sicherheit bei, indem es ein gemeinsames Syntaxmuster für mehrere Teams bereitstellt, was zu schnelleren Codeüberprüfungen, Wissensaustausch und Klarheit des Codes führt.

Außerdem werden mit Linting häufige Syntaxfehler identifiziert, die zu häufigen Sicherheitslücken führen können, z. B. durch unsachgemäße oder weniger effiziente Verwendung von Bibliotheken oder Kern-APIs.

Installieren Sie das Linting-Tool staticcheck.

 go get honnef.co/go/tools/cmd/staticcheck@latest

Führen Sie den Go-Linter (staticcheck) im Stammverzeichnis des Projekts aus.

 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 der aktuelle Code Sprintf verwendet, 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 1 in der Methode main() aus, indem Sie führende Schrägstriche(//) hinzufügen.
  • Entfernen Sie die Kommentarzeichen bei den beiden Zeilen direkt unter LINTING - Step 2 in der Methode main(), indem Sie die führenden Schrägstriche entfernen.

Führen Sie staticcheck noch einmal im Stammverzeichnis des Projekts 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 0.

4. Static Application Security Testing

AST/Statische Sicherheitstests: Bietet statische Codeanalyse zur Suche nach häufigen Schwachstellen und Gefährdungen ( CWEs)

Installieren Sie das AST-Tool (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 identifiziert: Potential hardcoded credentials.

5. Lizenzscanning

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. Dieses Konzept wird als „Copyleft“-Lizenzen bezeichnet. Sie müssen Quellcode offenlegen, wenn Sie Abhängigkeiten mit diesen Lizenzen verwenden.

Installieren Sie golicense.

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

Erstellen Sie die Binärdatei.

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 die „BSD-3-Clause“-Lizenz von der Liste deny in die Liste allow zu verschieben.

Führen Sie die Lizenzprüfung noch einmal aus.

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

Sie haben das Codelab abgeschlossen.

Lerninhalte

  • Tools und Techniken zum Schutz von Quellcode

Letzte Aktualisierung: 23.03.2023