Sicherer Quellcode

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

  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. Unten auf dem Bildschirm sollte außerdem ein Terminalbereich verfügbar sein.
  3. 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 Methode main() 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 Methode main() 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