Erkunden der Softwarekompositionsanalyse
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.