In this article
DevSecOps-Technologie
Technologien ermöglichen es Ihren Teams, DevSecOps-Prozesse effektiv umzusetzen. Wenn die meisten an DevSecOps und CI/CD denken, stehen oft die Tools im Vordergrund. Die Fähigkeit, verschiedene Entwicklungs-, Sicherheits- und Betriebsprozesse zu integrieren und zu automatisieren, ist entscheidend für eine erfolgreiche DevSecOps-Implementierung. Im Folgenden finden Sie eine Sammlung von Technologien, die Unternehmen bei der Einführung einer erfolgreichen DevSecOps-Methodik berücksichtigen sollten.
Quellcode-Repository
Das Quellcode-Repository ist das Herzstück nahezu jeder Entwicklungsumgebung weltweit. Bei der Umsetzung eines DevSecOps-Ansatzes ist das Repository die zentrale Technologie, in die die meisten anderen Technologien der Pipeline integriert werden. Wenn ein Unternehmen seine Bereitschaft zur Einführung des DevSecOps-Paradigmas prüft, muss es die Fähigkeit des Repositorys berücksichtigen, sich in andere kritische Technologien zu integrieren.
Da immer mehr Aspekte der Anwendungsumgebung im Code definiert werden, gewinnt die Sicherheit des Repositorys entscheidende Bedeutung. Best Practices für Benutzerzugriff, Repository-Konfigurationen und mehr müssen umgesetzt werden. Wenn Unbefugte oder unnötige Parteien Zugriff auf das Repository erhalten, kann dies zu erheblichen Sicherheitsrisiken führen.
Technologie im Fokus: Best Practices für Bitbucket-Repositorys
Eines der beliebtesten Repositorys in DevSecOps-Unternehmen ist Bitbucket. Die praktische webbasierte Benutzeroberfläche und die Integration mit einer Vielzahl anderer Technologien machen es zu einer idealen Lösung für die Automatisierungs- und Orchestrierungsanforderungen von DevSecOps. Mit der Beliebtheit steigt jedoch auch die Häufigkeit von Sicherheitslücken, die meist auf unsichere Konfigurationen oder die unsachgemäße Nutzung der Repositorys zurückzuführen sind. Zum Schutz vor diesen Problemen sollten Sie folgende Best Practices anwenden:
Speichern Sie niemals Zugangsdaten als Code oder Konfiguration in Bitbucket
Für alle in Bitbucket gespeicherten Repositorys sollten stets Secrets-Management-Praktiken gelten. Dazu zählen beispielsweise der Einsatz von git-secrets, regelmäßige Secrets-Prüfungen und die Verwendung eines vertrauenswürdigen Secrets-Managers.Entfernen Sie vertrauliche Daten
Wenn vertrauliche Daten in ein Repository gelangen, machen Sie alle offengelegten Tokens und Passwörter ungültig, entfernen Sie die Informationen und bereinigen Sie den Git-Verlauf. Bewerten Sie außerdem die Auswirkungen der offengelegten privaten Informationen.Kontrollieren Sie den Zugriff streng
Sicherheitsprobleme bei Repositorys sind oft auf menschliche Fehler zurückzuführen. Um dieses Risiko zu verringern, sollten Sie eine strenge Benutzerverwaltung und Zugriffskontrollen einsetzen.Fügen Sie eine SECURITY.md-Datei hinzu
Sie sollten eine SECURITY.md-Datei einfügen, die sicherheitsrelevante Informationen zu Ihrem Projekt enthält. Die Datei sollte eine Richtlinie zur Offenlegung von Sicherheitslücken, eine Richtlinie für Sicherheitsupdates, sicherheitsrelevante Konfigurationen, bekannte Sicherheitslücken und geplante Verbesserungen aufführen.Prüfen Sie Bitbucket-Apps
Prüfen Sie bei diesen von Drittanbietern entwickelten Apps die Zugriffsrechte, die Vertrauenswürdigkeit der Autoren und Organisationen sowie die allgemeine Sicherheitslage.Erhalten Sie Sicherheitshinweise direkt im Workflow mit Code Insights
Führen Sie mit Bitbucket Code Insights Scans für alle offenen Pull Requests durch. So lassen sich neue Sicherheitslücken erkennen, die durch den PR eingeführt werden könnten.Ergänzen Sie Sicherheitsprüfungen für PRs
Verwenden Sie Bitbucket-Hooks, um zu prüfen, ob PRs neue Sicherheitslücken einführen.Ergänzen Sie Sicherheitsprüfungen in Bitbucket-Pipes
Integrieren Sie Security-Scanning-Pipes in den CI/CD-Workflow, um sicherzustellen, dass automatisierte Pipelines keine Sicherheitsregressionen enthalten.Ziehen Sie Bitbucket Server in Betracht
Mit Bitbucket Server können Sie das Repository On-Premises hosten und so die Angriffsfläche erheblich reduzieren.Rotieren Sie SSH-Schlüssel und persönliche Zugriffstokens
Der Zugriff auf Bitbucket erfolgt üblicherweise über SSH-Schlüssel oder persönliche Benutzertokens. Durch regelmäßiges Rotieren dieser Schlüssel lässt sich das Risiko verringern, dass offengelegte Schlüssel Ihr Repository gefährden.
Weitere Informationen finden Sie in unserem Blog und im Spickzettel unter https://snyk.io/blog/cheat-sheet-10-bitbucket-security-best-practices/
Konfigurationsmanagement
Die Aufgaben, die mit der Definition und Aufrechterhaltung konsistenter Konfigurationen für Infrastruktur, Systemsoftware und unterstützende Anwendungen verbunden sind, waren traditionell sehr ressourcenintensiv. Für ein echtes DevSecOps-Modell muss dieses Konfigurationsmanagement automatisiert und in den gesamten Entwicklungszyklus integriert werden. Dank der zunehmenden Zahl von Komponenten, die als Code definiert sind, lässt sich dies heute einfacher umsetzen.
Die Integration und Automatisierung des Konfigurationsmanagements bietet mehrere entscheidende Vorteile. Erstens lassen sich Änderungen an der Umgebung einfach visualisieren und dokumentieren. Sie ersetzen zwar keine Change-Management-Praktiken, können aber eine lückenlose Nachverfolgung gewährleisten. Darüber hinaus ermöglicht die Automatisierung eine detaillierte Versionierung, durch die Änderungen an der Infrastruktur und unterstützender Software mit den Codeversionen verknüpft werden können, für die sie bestimmt sind. So lassen sich Probleme vermeiden, die entstehen, wenn nicht übereinstimmende Konfigurationen Softwarefehler verursachen. Schließlich sorgt die Automatisierung des Konfigurationsmanagements für konsistente Konfigurationen in der gesamten Umgebung. Dadurch lassen sich Bedrohungen leichter erkennen und auf Sicherheitsvorfälle reagieren.
Wenn sich ein Unternehmen auf die automatisierte Verwaltung von Konfigurationen vorbereitet, sollte es einige wichtige Aspekte berücksichtigen.
Orchestrierung
Ein großer Vorteil der automatisierten Konfigurationsverwaltung in Verbindung mit Infrastructure as Code ist die Möglichkeit, Infrastruktur nach Bedarf automatisch bereitzustellen. Ob virtuelle Maschinen, Cloud-Umgebungen oder Container zum Einsatz kommen: Es gibt Lösungen, die die Infrastruktur dynamisch orchestrieren. Unternehmen, die auf ein DevSecOps-Modell umsteigen, müssen den Umfang dieser Bereitstellungen verstehen und die passenden Tools für ihre Anwendung einsetzen.

Absicherung von Hosts
Die Absicherung von Hosts ist keine neue Praxis. Würde sie jedoch häufiger angewendet, wären weniger Dienste und Anwendungen unnötig öffentlich zugänglich. Mit der Einführung hochdynamischer, orchestrierter Infrastruktur wird diese Praxis noch wichtiger. Zahlreiche Sicherheitsvorfälle lassen sich direkt darauf zurückführen, dass eine allgemeine Angriffsfläche bestehen blieb, über die automatisierte Angriffstools selbst bei einfachsten Angriffen erfolgreich waren. Best Practices und Methoden zur Absicherung der meisten Technologien sind inzwischen so ausgereift, dass sie sich problemlos in Vorlagen integrieren lassen, um die Angriffsfläche zu reduzieren und ein Vertrauensmodell zu stärken. Dieses kann als Metadaten codiert und von der CI-Pipeline weiterverarbeitet werden, etwa für Patches.
Technologie im Fokus: Docker-Images absichern
Da immer mehr Unternehmen auf Cloud-native Umgebungen umsteigen, ist die Nutzung von Containern exponentiell gestiegen. Docker-Images sind weit verbreitet – ebenso wie Sicherheitsvorfälle aufgrund unsicherer Container-Images. Die folgenden Best Practices helfen Ihnen, die Sicherheit Ihrer Docker-Images zu gewährleisten:
Halten Sie Container-Images schlank
Wählen Sie Images mit weniger Betriebssystembibliotheken und Tools, um die Angriffsfläche insgesamt zu reduzieren. Verwenden Sie nach Möglichkeit Alpine-basierte Images anstelle vollständiger Betriebssystem-Images.Beschränken Sie Benutzerrechte
Erstellen Sie im Image einen eigenen Benutzer und eine eigene Gruppe mit den minimal erforderlichen Berechtigungen zum Ausführen der Anwendung. Führen Sie den Prozess mit diesem Benutzer aus.Signieren und überprüfen Sie Container-Images
Signieren Sie Images bei der Erstellung digital und prüfen Sie beim Abruf von einem Herausgeber die Vertrauenswürdigkeit und Authentizität der Images.Überwachen Sie Images regelmäßig auf Open-Source-Sicherheitslücken
Scannen Sie Docker-Images auf bekannte Sicherheitslücken und integrieren Sie diese Scans in die Continuous-Integration-Umgebung.Schützen Sie Images vor dem Verlust vertraulicher Informationen
Beim Erstellen von Images bleiben häufig Tokens, Schlüssel und andere Secrets ungeschützt zurück. Verwenden Sie mehrstufige Builds und die Docker-Secrets-Funktion, um vertrauliche Dateien einzubinden, ohne sie zwischenzuspeichern. Außerdem hilft eine .dockerignore-Datei dabei, COPY-Anweisungen zu vermeiden, die vertrauliche Dateien aus dem Build-Kontext einbeziehen.Verwenden Sie feste Tags für unveränderliche Images
Neue Image-Versionen können unter denselben Tags veröffentlicht werden, was zu uneinheitlichen Images während des Builds führen kann. Verhindern Sie dies, indem Sie aussagekräftige Image-Tags verwenden, die sowohl Version als auch Betriebssystem enthalten, oder das Image mit einem Hash des Inhalts taggen.Verwenden Sie COPY statt ADD
Die ADD-Anweisung kann mehrere Angriffsvektoren eröffnen, darunter Man-in-the-Middle- und Zip-Slip-Angriffe. Verwenden Sie daher nach Möglichkeit COPY.Verwenden Sie Labels für Metadaten
Zusätzliche Metadaten in Image-Labels können Benutzern hilfreiche Informationen liefern. Außerdem empfiehlt es sich, Informationen zur Responsible-Disclosure-Richtlinie in die Image-Labels aufzunehmen.Verwenden Sie mehrstufige Builds, um die Image-Größe zu minimieren
Erstellen Sie mit mehrstufigen Builds kleinere und übersichtlichere Images und minimieren Sie so die Angriffsfläche durch gebündelte Docker-Image-Abhängigkeiten.Verwenden Sie einen Linter
Ein statisches Code-Analysetool kann Best Practices für Dockerfiles durchsetzen und potenzielle Probleme erkennen.
Weitere Informationen finden Sie in unserem Blog und im Spickzettel unter https://snyk.io/blog/10-docker-image-security-best-practices/
Da diese Metadaten im Code definiert und üblicherweise zusammen mit dem übrigen Anwendungscode in einem Repository gespeichert werden, sollten auch automatisierte Tools eingesetzt werden, die Sicherheitslücken in Konfigurationen oder Abweichungen von Best Practices zur Absicherung erkennen. So wird Sicherheit nicht nur von Anfang an in das Design und die Bereitstellung der Infrastruktur integriert, sondern auch auf unaufdringliche Weise, die die Entwicklung nicht behindert.
CI/CD für Patches
Sobald die Metadaten den einzelnen Assets zugeordnet sind, kann das Unternehmen sie nutzen, um Patches auf CI/CD-Ebene umzusetzen. Feeds aus Threat Intelligence und Schwachstellenmanagement lassen sich mit dem bereitgestellten Software-Stack abgleichen, um passende Vorlagen zu ermitteln, die anschließend für die Bereitstellung eingeplant werden. Patches für laufende Systeme gehören damit der Vergangenheit an, wodurch Ausfallzeiten begrenzt werden. Außerdem lässt sich die Risikoexposition nahezu in Echtzeit bestimmen.
Sichere Programmierpraktiken
Alle Standards für sicheres Programmieren müssen kontinuierlich anhand neuer Sicherheitsempfehlungen überprüft werden. Sämtliche Codeänderungen müssen diesen Empfehlungen entsprechend geprüft und getestet werden – auch noch so kleine Änderungen. Das ist keine einfache Aufgabe. Die Vorteile solcher Praktiken sollten jedoch nicht unterschätzt werden, denn sie beschränken sich nicht auf die Anzahl der Änderungen im Entwicklungszyklus.
Die OWASP Top 10 sind ein guter Ausgangspunkt für diese Überprüfung. Integrieren Sie die Codeänderungen in Ihre QA-Tests und nutzen Sie automatisierte Tests, um den Entwicklungsteams zeitnah Feedback zu geben. Auch der OWASP ASVS mit seinen 19 Prüfbereichen eignet sich hervorragend für die Entwicklung sicherer Software.
Angesichts des immer höheren Tempos bei neuen Softwareentwicklungsmethoden und Frameworks bietet Attack-driven Development einen Prozess, mit dem Entwickler parallel lernen können, welche Tools, Techniken und Verfahren für Softwareentwicklung und Anwendungssicherheit wichtig sind.
Bewertung auf Anwendungsebene
Die automatisierte Prüfung von Anwendungen auf Sicherheitslücken ist ein entscheidender Bestandteil von DevSecOps. Sie ermöglicht es Unternehmen, ihre Risikolage umfassend zu verstehen und Sicherheitslücken zu beheben, bevor Angreifer sie ausnutzen. Die folgenden Lösungen können dazu beitragen, die Sicherheitslage einer DevSecOps-Umgebung zu verbessern:
Quellcode-Scanning
Quellcode-Scanning sollte durch den Einsatz von Tools für Static Application Security Testing (SAST) abgedeckt werden. SAST wird verwendet, um das Quellcode-Repository – meist den Master-Branch – zu scannen, Sicherheitslücken zu identifizieren und eine Software-Composition-Analyse durchzuführen. SAST-Tools sollten in Post-Commit-Prozesse integriert werden, damit neu hinzugefügter Code proaktiv auf Sicherheitslücken geprüft wird. Durch die Integration eines SAST-Tools lassen sich Sicherheitslücken früher im Softwareentwicklungszyklus beheben und das Risiko sowie die Angriffsfläche von Anwendungen verringern.
Dynamic Application Scanning Tool (DAST)
Tools für Dynamic Application Scanning dienen dazu, die Staging- und Produktionswebsite im laufenden Betrieb zu scannen und Eingabefelder, Formulare sowie zahlreiche weitere Aspekte der Webanwendung auf Sicherheitslücken zu prüfen. Diese Tools sollten in die Pipeline integriert werden, während Releases in nachfolgende Umgebungen eingespielt werden.
SAST-IDE-Integration
Durch die Integration von Plugins zur statischen Codeanalyse in IDEs erhalten Entwickler nahezu in Echtzeit Hinweise auf unsichere Programmierpraktiken in ihrer Entwicklungsumgebung. So lassen sich Sicherheitslücken effektiv beheben und vermeiden, ohne die Entwicklungsumgebung verlassen zu müssen.
Binärdatei-Scanning
Alle Binärdateien müssen anhand der Vorgaben der Sicherheits-Checkliste auf Sicherheitsprobleme geprüft und anschließend digital signiert werden. Die digitale Signatur wird wie Metadaten behandelt. In der CI dürfen beispielsweise nur signierte Binärdateien verwendet und implementiert werden. So wird die erforderliche Sicherheitsfreigabe sichergestellt, ohne auf freie Kapazitäten des Sicherheitsteams warten zu müssen.
Audits vor der Bereitstellung
Eine vordefinierte Vorlage für die Erstellung von Assets ist entscheidend, um das gewünschte Sicherheitsniveau zu gewährleisten. Sie sollte jedoch durch hostbasierte Scans ergänzt werden. Die meisten Sicherheitsscanner bieten inzwischen ein Compliance-Modul, in das sich Ihre Vorlage importieren lässt.
Audits nach der Bereitstellung
Nach der Bereitstellung lassen sich diese vordefinierten Vorlagen mit den Scans vor der Bereitstellung vergleichen, um Abweichungen zu erkennen, die Sicherheitsrisiken mit sich bringen könnten. Für eine möglichst weitgehende Automatisierung sollte dies über eine API-Integration erfolgen.
Automatisiertes Schwachstellenmanagement
Lösungen für das Schwachstellenmanagement sollten über APIs in Plattformen für Infrastruktur- und Webanwendungs-Scans integriert werden. So wird sichergestellt, dass alle erkannten Sicherheitslücken nachverfolgt werden. In ausgereiften DevSecOps-Umgebungen ermöglicht die Integration außerdem, aktive Bedrohungen in Echtzeit mit bekannten Sicherheitslücken abzugleichen. So lassen sich folgende Erkenntnisse gewinnen:
Welche Assets von bekannten Exploits betroffen sind.
Welche neuen Bedrohungen ein unmittelbares Risiko für das Unternehmen darstellen könnten.
Die Prozesse für das Schwachstellenmanagement sollten außerdem in das Fehlerverfolgungssystem der Entwickler integriert werden. So können Fehlerdatensätze sofort angelegt werden, sobald Sicherheitslücken erkannt werden, und schneller behoben werden.
Automatisierte Compliance-Prüfung
Durch automatisierte Bewertungen von Sicherheitskonfigurationen lässt sich Compliance erreichen, Risiken lassen sich reduzieren und kontinuierliche Compliance gewährleisten. Das senkt die Compliance-Kosten, da weniger Zeit und Aufwand für die Prüfung der Systeme erforderlich sind. Außerdem können Compliance-Daten mit dem GRC-Tool und den Helpdesk-Anwendungen des Unternehmens geteilt werden, um den Compliance-Status transparent zu machen.
Secrets-Management
„Secrets“ umfassen im Bereich Informationssicherheit alle vertraulichen Informationen, die ein Team kennen muss, beispielsweise Zugangsdaten für eine Datenbank oder eine API eines Drittanbieters. Für eine vertrauenswürdige Verbindung sind Zugangsdaten, ein Zertifikat oder ein API-Token erforderlich. Doch selbst mit diesen Vorkehrungen kann der Umgang mit Secrets schwierig sein und häufig zu Fehlern oder sogar Sicherheitsverletzungen führen.
Zu den Methoden, die den Umgang mit Secrets vereinfachen, gehören Konstanten im Quellcode oder das Speichern von Secrets in einer Konfigurationsdatei, die nicht in die Versionsverwaltung eingecheckt wird. Diese Methoden lösen einige Probleme, bringen aber eigene Herausforderungen mit sich – insbesondere bei der Schlüsselrotation.
Der ideale Ansatz ist ein synchronisierter, verschlüsselter Passwortspeicher, den alle Teammitglieder einzeln entschlüsseln können, ohne ein gemeinsames Passwort zu verwenden. Dafür gibt es zwei Tools: GPG (GNU Privacy Guard) und Pass. GPG ermöglicht die Implementierung einer Public-Key-Infrastruktur und wird häufig für die E-Mail-Verschlüsselung verwendet. GPG kann jedoch kompliziert in der Anwendung sein. Pass – von seinen Entwicklern als „standardmäßiger Unix-Passwortmanager“ bezeichnet – bietet eine komfortable Benutzeroberfläche für GPG. Mit Pass können Sie vertrauliche Informationen mit einem oder mehreren privaten Schlüsseln verschlüsseln. Alle verschlüsselten Informationen werden als einfache Dateien in einem Verzeichnis gespeichert, das über eine Versionsverwaltung geteilt werden kann. Diese Tools ermöglichen einen verschlüsselten, gemeinsam nutzbaren Informationsbestand, der dennoch sicher ist.
Ein wirksames Secrets-Management mit Tools wie GPG und Pass ist ein wichtiger Bestandteil von DevSecOps. Es begleitet den gesamten Prozess – von der Anforderung über die Erstellung bis zur Verteilung – und gewährleistet Sicherheit entlang der gesamten Kette.