Sicherer Quellcode

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

  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.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

  • 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_ID angegeben). 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
  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 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:

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

8560cc8d45e8c112.png

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

9e504cb98a6a8005.png

  1. Der Editor wird mit einem Explorer auf der rechten Seite und dem Editor im mittleren Bereich geöffnet.
  2. Unten auf dem Bildschirm sollte auch ein Terminalbereich verfügbar sein.
  3. 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 1 in der Methode main() aus, indem Sie Schrägstriche(//) voranstellen.
  • Entfernen Sie die Kommentarzeichen für die 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 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