Erkunden der Softwarekompositionsanalyse

Abgeschlossen

Software Composition Analysis (SCA) ist ein automatisierter Prozess zum Identifizieren von Open Source- und Drittanbieterkomponenten in Anwendungen, analysieren ihre Sicherheitsrisiken, Lizenzcompliance und Codequalität. Da moderne Anwendungen zunehmend auf externe Abhängigkeiten angewiesen sind, ist SCA für die Verwaltung der Risiken im Zusammenhang mit Software-Lieferketten unerlässlich geworden.

Was ist Software Composition Analysis?

Software Composition Analysis ist die Praxis, alle in einer Anwendung verwendeten Open Source- und Drittanbieterkomponenten automatisch zu ermitteln, zu katalogisieren und zu analysieren. SCA-Tools untersuchen Paketmanifeste, Abhängigkeitssperrdateien, Quellcode und kompilierte Binärdateien, um eine umfassende Softwareliste (SBOM) zu erstellen.

Kernfunktionen von SCA

Abhängigkeitsermittlung:

  • Manifestanalyse: SCA-Tools lesen Paketmanifestdateien (package.json, requirements.txt, pom.xml, *.csproj), um deklarierte Abhängigkeiten zu identifizieren.
  • Sperrdateianalyse: Analysieren Sie Sperrdateien (package-lock.json, Pipfile.lock, Gemfile.lock), die die exakt installierten Versionen einschließlich transitiver Abhängigkeiten zeigen.
  • Binäre Überprüfung: Erweiterte Tools scannen kompilierte Artefakte, Containerimages und bereitgestellte Anwendungen, um eingebettete Abhängigkeiten zu ermitteln, die nicht in Manifesten deklariert sind.
  • Unterstützung für mehrere Sprachen: Umfassende Tools unterstützen Dutzende von Programmiersprachen und Paketökosystemen (npm, PyPI, Maven, NuGet, RubyGems, Go Module).

Sicherheitsrisikoanalyse:

  • CVE-Abgleich: Vergleiche ermittelte Abhängigkeiten mit den Common Vulnerabilities and Exposures (CVE)-Datenbanken.
  • Schweregradbewertung: Berechnen allgemeiner Bewertungsergebnisse des Sicherheitslückenbewertungssystems (CVSS), die den Schweregrad der Sicherheitsanfälligkeit zwischen 0 (none) und 10 (kritisch) angeben.
  • Exploit-Intelligenz: Ermitteln Sie, welche Schwachstellen bekannte Exploits haben, die von Angreifern aktiv genutzt werden.
  • Patchempfehlungen: Schlagen Sie bestimmte Versionsupgrades vor, mit denen Sicherheitsrisiken behoben werden, während die Kompatibilität beibehalten wird.

Lizenzcompliance:

  • Lizenzerkennung: Identifizieren Sie Lizenzen für alle Abhängigkeiten, indem Sie Lizenzdateien, Paketmetadaten und Quellcodeheader analysieren.
  • Richtlinienerzwingung: Automatische Kennzeichnung von Abhängigkeiten, die gegen Organisationslizenzrichtlinien verstoßen.
  • Kompatibilitätsanalyse: Erkennen Sie widersprüchliche Lizenzen, die nicht legal in derselben Anwendung kombiniert werden können.
  • Nachverfolgung von Verpflichtungen: Dokumentlizenzanforderungen wie Attributionshinweise, Offenlegung von Quellcode oder abgeleitete Arbeitseinschränkungen.

Qualitätsbewertung:

  • Wartungsstatus: Bewerten Sie, ob Abhängigkeiten aktiv verwaltet oder abgebrochen werden.
  • Gesundheit der Gemeinschaft: Bewerten von Mitwirkendenaktivitäten, Communitygröße und Projektverträglichkeit.
  • Sicherheitspraktiken: Überprüfen Sie, ob Projekte über verantwortungsvolle Offenlegungsprozesse und Sicherheitsempfehlungen verfügen.
  • Updateempfehlungen: Identifizieren Sie veraltete Abhängigkeiten, und schlagen Sie sicherere, aktuellere Alternativen vor.

Warum SCA für DevOps kritisch ist

Moderne Softwareentwicklungspraktiken machen SCA unverzichtbar:

Die Abhängigkeitsexplosion

Anwendungen enthalten Hunderte von Abhängigkeiten:

  • Direkte Abhängigkeiten: Typische Anwendung verweist direkt auf 20-50 externe Pakete.
  • Transitive Abhängigkeiten: Jede direkte Abhängigkeit bringt eigene Abhängigkeiten mit sich, wodurch Abhängigkeitsstrukturen mit insgesamt 200-500 Paketen erstellt werden.
  • Mehrere Ökosysteme: Anwendungen kombinieren häufig Abhängigkeiten aus mehreren Sprachökosystemen (JavaScript-Frontend, Python-Back-End, Java-Microservices).
  • Containerabhängigkeiten: Containerisierte Anwendungen umfassen Basisimageabhängigkeiten sowie Anwendungsabhängigkeiten.

Manuelle Nachverfolgung ist unmöglich:

  • Maßstab: Das manuelle Nachverfolgen von Hunderten von Abhängigkeiten über Dutzende von Anwendungen ist unpraktisch.
  • Geschwindigkeit: Neue Sicherheitsrisiken werden täglich offengelegt und machen alle manuellen Bestände sofort veraltet.
  • Kompliziertheit: Das Verständnis transitiver Abhängigkeitsketten und deren Interaktionen erfordert eine automatisierte Analyse.
  • Verteilter Besitz: Abhängigkeiten, die von Tausenden unabhängiger Open Source-Projekte weltweit verwaltet werden.

Der Sicherheitsimperativ

Schwachstellen in Abhängigkeiten werden aktiv ausgenutzt:

  • Profilverletzungen: Wichtige Sicherheitsvorfälle umfassen regelmäßig die Nutzung bekannter Sicherheitsrisiken in beliebten Open-Source-Paketen.
  • Lieferkettenangriffe: Angreifer kompromittieren legitime Pakete, um Schadsoftware an nachgeschaltete Verbraucher zu verteilen.
  • Zero-Day-Sicherheitsanfälligkeiten: Bisher unbekannte Sicherheitsrisiken in weit verbreiteten Paketen können sich gleichzeitig auf Tausende von Organisationen auswirken.
  • Patch-Dringlichkeit: Kritische Sicherheitsrisiken erfordern eine schnelle Identifizierung und Behebung in allen betroffenen Anwendungen.

Herkömmliche Sicherheitstools verpassen Abhängigkeitsrisiken:

  • Statische Analyse: Tools zum Scannen von Quellcode analysieren Ihren Code, aber keinen Abhängigkeitscode.
  • Dynamische Tests: Penetrationstests können möglicherweise Schwachstellen in Abhängigkeiten, die während der Tests nicht ausgelöst werden, übersehen.
  • Manuelle Überprüfung: Sicherheitsteams können den Quellcode von Hunderten von Drittanbieterpaketen nicht überprüfen.
  • Spezialisierte Erkennung: SCA-Tools, die speziell zur Identifizierung von Abhängigkeitsrisiken entwickelt wurden, sind erforderlich.

Die Complianceanforderung

Lizenzverletzungen tragen erhebliche Risiken:

  • Rechtliche Haftung: Die Verwendung von Abhängigkeiten ohne Einhaltung der Lizenzbedingungen kann zu Rechtsstreitigkeiten und Schäden führen.
  • Erzwungenes Open-Sourcing: Starke Copyleft-Lizenzen (GPL, AGPL) können vorschreiben, dass die gesamte Anwendung offen gelegt wird.
  • Verteilungseinschränkungen: Einige Lizenzen verbieten die kommerzielle Verteilung oder erzwingen Nutzungseinschränkungen.
  • Überwachungsanforderungen: Regulatorische Rahmenbedingungen erfordern zunehmend, dass Organisationen genaue Softwareabrechnungen beibehalten.

Lizenzkomplexität:

  • Hunderte von Lizenztypen: Das Open-Source-Ökosystem umfasst Hunderte von unterschiedlichen Lizenzen mit unterschiedlichen Verpflichtungen.
  • Kompatibilitätsprobleme: Unterschiedliche Lizenzen weisen widersprüchliche Bedingungen auf, die ihre Verwendung gemeinsam verbieten.
  • Transitive Lizenzierung: Lizenzverpflichtungen aus transitiven Abhängigkeiten müssen nachverfolgt und erfüllt werden.
  • Lizenzänderungen: Projekte ändern manchmal Lizenzen zwischen Versionen, die eine kontinuierliche Überwachung erfordern.

Funktionsweise von SCA-Tools

SCA-Tools verwenden mehrere Techniken zum Ermitteln und Analysieren von Abhängigkeiten:

Ermittlungsmechanismen

Analyse der Manifestdatei:

  • Sprachspezifische Formate: Tools verstehen Paketmanifestformate für jede Sprache (package.json für npm, requirements.txt für Python, pom.xml für Maven).
  • Abhängigkeitsauflösung: Analysieren Sie Abhängigkeitsversionsspezifikationen, einschließlich von Bereichen, Beschränkungen und Auflösungsregeln.
  • Arbeitsbereichsüberprüfung: Durchsuchen Sie Projektverzeichnisse rekursiv, um alle Manifestdateien in Monorepos- und Multiprojektarbeitsbereichen zu finden.
  • Konfigurationsbewusstsein: Berücksichtigen Sie umgebungsspezifische Abhängigkeiten (Entwicklung, Test, Produktion) separat.

Analyse der Abhängigkeitssperrdatei:

  • Exakte Versionen: Sperrdateien verzeichnen genaue Versionen aller Abhängigkeiten, einschließlich der transitiven Abhängigkeiten.
  • Installationsstatus: Stellen Sie tatsächliche installierte Abhängigkeiten anstelle abstrakter Anforderungen dar.
  • Deterministische Auflösung: Sperren von Dateien stellen konsistente Abhängigkeitsversionen in allen Umgebungen sicher.
  • Vollständige Abhängigkeitsdiagramme: Schließen Sie die vollständige transitive Abhängigkeitsstruktur mit Versionsauflösungen ein.

Binär- und Artefakt-Scannen:

  • Kompilierte Artefakte: Scannen Sie JAR-Dateien, Raddateien, DLLs und ausführbare Dateien, um eingebettete Abhängigkeiten zu identifizieren.
  • Container-Image-Ebenen: Analysieren Sie Container-Image-Ebenen, um Basis-Image-Komponenten und Anwendungsabhängigkeiten zu ermitteln.
  • Dateisystemüberprüfung: Untersuchen Sie bereitgestellte Anwendungsdateisysteme, um Abhängigkeiten zu finden, die nicht in Manifesten deklariert sind.
  • Fingerabdruck: Verwenden Sie kryptografische Hashing, um bestimmte Paketversionen auch ohne Metadaten zu identifizieren.

Buildintegration:

  • Erstellen von Tool-Plug-Ins: Integration in Buildsysteme (Maven, Gradle, webpack, pip), um Abhängigkeitsinformationen während der Builds zu erfassen.
  • Lösungshooks: Binden Sie sich in Abhängigkeitsauflösungsprozesse ein, um die genauen installierten Versionen aufzuzeichnen.
  • Artefaktgenerierung: Generieren Sie Software-Stücklisten (SBOM)-Artefakte während des Builds zur nachgelagerten Verwendung.
  • Pipelineintegration: Als automatisierte Schritte in CI/CD-Pipelines ausführen, um jeden Build zu analysieren.

Analysefunktionen

Verwundbarkeitsabgleich:

  • Datenbankabfrage: Query National Vulnerability Database (NVD), GitHub Advisory Database und proprietäre Sicherheitsrisikodatenbanken.
  • Versionsbereichsabgleich: Ermitteln Sie, ob bestimmte Paketversionen in anfällige Versionsbereiche fallen.
  • Patchüberprüfung: Überprüfen Sie, ob angewendete Patches gemeldete Sicherheitsrisiken tatsächlich beheben.
  • Priorisierung: Bewerten Sie Sicherheitsrisiken nach Schweregrad, Exploitability und geschäftlichen Auswirkungen.

Lizenzidentifikation:

  • Mehrere Quellen: Extrahieren Sie Lizenzinformationen aus Paketmetadaten, Lizenzdateien, Quellheadern und Readme-Dokumenten.
  • Lizenznormalisierung: Ordnen Sie verschiedene Lizenznamen und Bezeichner (SPDX, OSI) standardisierten Lizenztypen zu.
  • Duale Lizenzierung: Behandeln Sie Pakete, die unter mehreren alternativen Lizenzen veröffentlicht wurden.
  • Benutzerdefinierte Lizenzen: Identifizieren Sie nicht standardmäßige Lizenzen, die eine rechtliche Überprüfung erfordern.

Reichweitenanalyse:

  • Call graph construction: Erstellen Sie Aufrufdiagramme, die zeigen, welcher Abhängigkeitscode tatsächlich von Ihrer Anwendung ausgeführt wird.
  • Totcode-Erkennung: Identifizieren Sie Abhängigkeiten, die gebündelt, aber nie tatsächlich verwendet werden.
  • Exploit-Pfadanalyse: Ermitteln Sie, ob anfällige Codepfade über Anwendungseinstiegspunkte erreichbar sind.
  • Risikoverfeinerung: Reduzieren Sie das Rauschen, indem Sie sich auf verwundbare Stellen im tatsächlich genutzten Code konzentrieren.

Kontinuierliche Überwachung:

  • Echtzeitwarnung: Erhalten Sie sofortige Benachrichtigungen, wenn neue Sicherheitsrisiken, die Ihre Abhängigkeiten betreffen, offengelegt werden.
  • Geplante Überprüfung: Rescannieren Sie regelmäßig Anwendungen, um neu entdeckte Sicherheitsrisiken in unveränderten Abhängigkeiten zu erkennen.
  • Basisvergleich: Nachverfolgen von Änderungen im Sicherheitsrisiko- und Compliancestatus im Laufe der Zeit.
  • Regressionsprävention: Warnung, wenn neue Abhängigkeiten Sicherheitsrisiken oder Lizenzverletzungen darstellen.

SCA-Integrationsmuster

Eine effektive SCA-Implementierung umfasst die Integration an mehreren Punkten im Entwicklungslebenszyklus:

Entwicklerarbeitsstation

IDE-Integration:

  • Echtzeitfeedback: Scannen Sie Abhängigkeiten, wenn Entwickler sie zu Projekten hinzufügen.
  • Inlinewarnungen: Zeigen Sie Sicherheitsrisiken und Lizenzwarnungen direkt in der IDE an.
  • Korrekturvorschläge: Alternative Paketversionen oder Ersatzpakete vorschlagen.
  • Richtlinienerzwingung: Verhindern Sie das Hinzufügen von Abhängigkeiten, die gegen Organisationsrichtlinien verstoßen.

Überprüfung vor Committen:

  • Git-Hooks: Führen Sie SCA-Prüfungen aus, bevor Sie commits ausführen, um die Einführung anfälliger Abhängigkeiten zu verhindern.
  • Lokales Scannen: Analysieren Sie Änderungen lokal, bevor Sie an Remoterepositorys übertragen.
  • Schnelles Feedback: Geben Sie Entwicklern während der aktiven Entwicklung sofortiges Feedback.
  • Früherkennung: Erkennen Sie Probleme, bevor sie in gemeinsame Branches und CI/CD-Pipelines gelangen.

Quellcodeverwaltung

Prüfung des Pull Requests:

  • Automatisierte Prüfungen: Führen Sie die SCA-Analyse für alle Pullanforderungen aus, um Abhängigkeitsänderungen zu erkennen.
  • Kommentare überprüfen: Veröffentlichen Sie Ergebnisse als Pull Request-Kommentare für die Sichtbarkeit der prüfenden Person.
  • Zusammenführen blockieren: Verhindern Sie das Zusammenführen von Pullanforderungen, die wichtige Sicherheitsrisiken oder Lizenzverletzungen darstellen.
  • Nachverfolgung von Abhängigkeitsänderungen: Dokumentieren Sie eindeutig, welche Abhängigkeitsänderungen bei jeder Pullanforderung vorgenommen werden.

GitHub Dependabot-Integration:

  • Automatisierte Updates: Automatisches Erstellen von Pullanforderungen, wenn Abhängigkeitssicherheitsupdates verfügbar sind.
  • Warnungen zu Sicherheitsrisiken: Erhalten Sie GitHub-Sicherheitswarnungen für anfällige Abhängigkeiten.
  • Abhängigkeitsdiagramm: Visualisieren Sie Abhängigkeitsbeziehungen im Abhängigkeitsdiagramm-Feature von GitHub.
  • Workflows überprüfen: Nutzen Sie die Überprüfungs- und Genehmigungsprozesse von GitHub für Abhängigkeitsupdates.

CI/CD-Pipelines

Buildzeitüberprüfung:

  • Pipelineschritte: Integrieren Sie die SCA-Überprüfung als automatisierte Build-Schritte in CI/CD-Pipelines.
  • Qualitätsgates: Fehlerbuilds, die keine Sicherheits- und Complianceanforderungen erfüllen.
  • SBOM-Generation: Erstellen Sie neben Buildausgaben Artefakte für Softwarestücklisten.
  • Überwachungspfade: Aufzeichnen von Scanergebnissen für Compliance- und Forensikzwecke.

Bereitstellungsgates:

  • Überprüfung vor der Bereitstellung: Scannen Sie Artefakte vor der Bereitstellung in Produktionsumgebungen.
  • Umgebungsspezifische Richtlinien: Wenden Sie strengere Richtlinien für Produktionsbereitstellungen als Entwicklungsbereitstellungen an.
  • Rollbacktrigger: Automatisches Zurücksetzen von Bereitstellungen mit kritischen Schwachstellen, die ermittelt wurden.
  • Bereitstellungsgenehmigungen: Manuelle Genehmigung für Bereitstellungen mit bekannten, aber akzeptierten Risiken erforderlich.

Laufzeitüberwachung

Produktionsscan:

  • Bereitgestellte Anwendungsanalyse: Überprüfen Sie tatsächlich bereitgestellte Anwendungen, um Laufzeitabhängigkeiten zu erkennen.
  • Container-Registry-Überprüfung: Container-Images, die in Registries gespeichert sind, werden kontinuierlich gescannt.
  • Serverlose Funktionsanalyse: Überprüfen Sie bereitgestellte serverlose Funktionen und deren Abhängigkeiten.
  • Drifterkennung: Ermitteln Sie Unterschiede zwischen beabsichtigten und tatsächlich bereitgestellten Abhängigkeiten.

Kontinuierliche Sicherheitsrisikoüberwachung:

  • Laufende Überwachung: Überwachen Sie bereitgestellte Anwendungen auf neu offengelegte Sicherheitsrisiken, die sich auf aktuelle Abhängigkeiten auswirken.
  • Reaktion auf Vorfälle: Auslösen von Workflows zur Reaktion auf Vorfälle, wenn kritische Sicherheitsrisiken in der Produktion erkannt werden.
  • Patchplanung: Generieren Sie Patchbereitstellungspläne für die Behandlung von Sicherheitsrisiken in bereitgestellten Anwendungen.
  • SLA-Compliance: Verfolgen Sie Zeitrahmen zur Korrektur nach, um die Einhaltung von Sicherheits-SLAs sicherzustellen.

Bewährte Methoden für SCA-Workflow

Erfolgreiche SCA-Implementierung folgt bewährten Workflows:

Basisplan einrichten

Anfangsbestand:

  • Umfassende Entdeckung: Führen Sie SCA-Tools für alle Anwendungen aus, um einen vollständigen Abhängigkeitsbestand zu erstellen.
  • Risikobewertung: Verstehen Sie die aktuelle Gefährdung durch Schwachstellen und Probleme mit der Einhaltung von Lizenzen.
  • Priorisierung: Identifizieren Sie, welche Anwendungen und Sicherheitsrisiken sofortige Aufmerksamkeit erfordern.
  • Basisdokumentation: Dokumentieren Sie den aktuellen Zustand als Basis für die Verbesserungsmessung.

Definieren von Richtlinien

Sicherheitsrichtlinien:

  • Schwellenwerte für den Schweregrad der Sicherheitsanfälligkeit: Definieren Sie, welche Schweregrade akzeptabel sind (z. B. keine kritische, begrenztes Hoch).
  • Zeitrahmen für Korrekturen: Richten Sie SLAs für das Patchen verschiedener Schweregrade der Sicherheitsanfälligkeit ein (kritisch innerhalb von 7 Tagen, hoch innerhalb von 30 Tagen).
  • Ausnahmeprozesse: Erstellen Sie Workflows zum Akzeptieren von Risiken, wenn sofortige Korrekturen nicht möglich sind.
  • Ausnahmeverfolgung: Führen Sie den Audit-Trail der akzeptierten Risiken mit geschäftlichen Begründungen.

Compliancerichtlinien:

  • Lizenz-Zulassungslisten: Geben Sie an, welche Lizenzen immer akzeptabel sind (MIT, Apache 2.0, BSD).
  • Lizenzverweigerungen: Verbieten Sie bestimmte Lizenzen, die nicht mit dem Geschäftsmodell (GPL für proprietäre Software) kompatibel sind.
  • Genehmigungsworkflows: Anfordern einer rechtlichen Überprüfung für Abhängigkeiten mit bestimmten Lizenzen (LGPL, MPL, benutzerdefinierte Lizenzen).
  • Attributionsanforderungen: Definieren Sie, wie Lizenzzuordnungen in verteilter Software bereitgestellt werden müssen.

Automatisieren der Erzwingung

Pipelineintegration:

  • Automatisiertes Scannen: Führen Sie SCA-Prüfungen automatisch für jede Build- und Pullanforderung aus.
  • Qualitätsgates: Konfigurieren Sie Pipelinegates, die Builds oder Bereitstellungen blockieren, die Richtlinien verletzen.
  • Automatisierte Wartung: Verwenden Sie Tools wie GitHub Dependabot, um Pullanforderungen für Sicherheitsupdates automatisch zu erstellen.
  • Berichterstellung: Generieren Sie Complianceberichte, um Prüfungs- und Managementsichtbarkeit zu gewährleisten.

Kontinuierliche Verbesserung

Metrikverfolgung:

  • Mean time to remediate (MTTR): Messen Sie, wie schnell Sicherheitsrisiken nach der Ermittlung gepatcht werden.
  • Verringerung der Sicherheitsanfälligkeit: Verfolgen Sie die abnehmende Anzahl von Sicherheitsanfälligkeiten im Laufe der Zeit.
  • Compliance-Quote: Überwachen Sie den Prozentsatz der Abhängigkeiten, die Lizenzrichtlinien erfüllen.
  • Abdeckung: Stellen Sie sicher, dass SCA-Tools alle Anwendungen und Abhängigkeiten scannen.

Prozessverfeinerung:

  • Verwaltung falsch positiver Ergebnisse: Optimieren Sie Tools, um falsch positive Ergebnisse durch Konfiguration und Ausnahmen zu reduzieren.
  • Entwicklerschulung: Informieren Sie Entwickler über sichere Abhängigkeitsauswahl und -verwaltung.
  • Richtlinienentwicklung: Aktualisieren Sie Richtlinien basierend auf neuen Bedrohungen und geschäftlichen Anforderungen.
  • Toolauswertung: Bewerten Sie regelmäßig neue SCA-Tools und -Features.

Die Softwarekompositionsanalyse bietet die automatisierten Funktionen, die für die Verwaltung von Sicherheits- und Compliancerisiken in modernen Anwendungen erforderlich sind, die stark von Open-Source-Komponenten abhängen. In der nächsten Lektion wird erläutert, wie GitHub Dependabot implementiert wird, ein spezifisches SCA-Tool, das in GitHub integriert ist.