From d8075f77625100f89589fae48c3e656c373e8ba1 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Wed, 1 Mar 2023 09:17:19 +0100 Subject: [PATCH 01/16] add blog post about ssdlc --- ...ichere-Softwareentwicklungslebenszyklus.md | 108 ++++++++++++++++++ .../images/posts/ssdlc/softwaredefectcost.png | Bin 0 -> 56531 bytes 2 files changed, 108 insertions(+) create mode 100644 _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md create mode 100644 assets/images/posts/ssdlc/softwaredefectcost.png diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md new file mode 100644 index 000000000..24ac250ba --- /dev/null +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -0,0 +1,108 @@ +--- +layout: [post, post-xml] +title: "Der sichere Softwareentwicklungslebenszyklus" +date: 2022-11-22 09:00 # Pflichtfeld. Format "YYYY-MM-DD HH:MM". Muss für Veröffentlichung in der Vergangenheit liegen. (Für Preview egal) +author_ids: [komenda] +categories: [Softwareentwicklung] +tags: [Security, SDLC, SSDLC] +--- + +In diesem Blogpost gehen wir auf den sicheren Softwareentwicklungslebenszyklus ein. Dabei sehen wir uns speziell an, was in den verschiedenen Phasen umgesetzt werden kann. + +# Was ist der sichere Softwareentwicklungslebenszyklus? + +Entwicklungsteams arbeiten bereits in einem sehr methodischen, sich wiederholenden Prozess - dem Software Development Lifecycle (SDLC) - und es besteht eine große Chance, durch eine Kombination von Bewusstsein, Aktivitäten und Arbeitsabläufen eine bessere Sicherheit in diesen Prozess einzubringen, so dass das Ergebnis eine weitaus sicherere Software wäre. Das ist der sichere SDLC (SSDLC). + +# Wieso brauchen wir einen sicheren Softwareentwicklungszyklus? +Die Sicherheit spielt in jeder Phase des Softwareentwicklungszyklus (SDLC) eine Rolle und muss bei der Umsetzung einer Software im Vordergrund stehen. In diesem Artikel erfahren wir, wie wir einen sicheren SDLC (SSDLC) erstellen können, der uns hilft, Probleme in den Anforderungen zu erkennen, bevor wir diese in der Implementierung unserer Software wiederfinden. + +Mit entsprechendem Aufwand können Sicherheitsprobleme in der SDLC-Pipeline bereits vor der Produktionsbereitstellung behoben werden. Dies verringert das Risiko, Sicherheitslücken in einer Applikation zu finden, und minimiert die Auswirkungen, wenn sie gefunden werden. + +Der SSDLC zielt nicht darauf ab, herkömmliche Sicherheitsprüfungen wie Penetrationstests vollständig abzuschaffen, sondern die Sicherheit in den Verantwortungsbereich der Entwickler einzubeziehen und sie zu befähigen, von Anfang an sichere Anwendungen zu entwickeln. + +# Warum ist der SSDLC wichtig? + +Er ist wichtig, weil die Anwendungssicherheit wichtig ist. Die Zeiten, in denen man ein Produkt in die Öffentlichkeit brachte und Fehler in späteren Patches behoben wurden, sind vorbei. Die Entwickler müssen jetzt bei jedem Schritt des Prozesses auf potenzielle Sicherheitsbedenken Rücksicht nehmen. Dies erfordert die Integration von Sicherheitsaspekten in den Entwicklungszyklus auf eine Art und Weise, die früher nicht nötig war. Da sich jeder potenziell Zugang zu unserem Quellcode verschaffen kann, müssen wir sicherstellen, dass bei der Programmierung mögliche Schwachstellen berücksichtigt werden. Ein stabiler und sicherer SDLC-Prozess ist daher von entscheidender Bedeutung, um sicherzustellen, dass die Anwendung nicht von böswilligen Benutzern angegriffen werden kann. + +# Was sind die Prozesse innerhalb des SSDLC? + +Der Weg zur Erstellung eines SSDLC beginnt mit einem Modell. Wir werden das in der Branche übliche 5-Stufen-Modell verwenden, das den SSDLC in 5 Phasen unterteilt: +* Anforderung - Erfassen des Umfangs der Funktion(en) oder des Produkts. +* Design - Technischer Entwurf der Anforderungen. +* Entwicklung - Schreiben des Codes, der den Entwurf umsetzt. +* Testen - Überprüfen, ob die Funktionalität wie erwartet funktioniert. +* Bereitstellung und Wartung - Freigabe der Funktionalität und kontinuierliche Unterstützung. + +Traditionelle Sicherheitstests wurden in den Schritten 4 und 5 als Aktivität vor und nach der Produktivsetzung der Software durchgeführt. Für die moderne Softwareentwicklung ist es wichtig, die Sicherheit in jeden dieser 5 Schritte einzubinden. + +# Die Anforderungsphase + +Das Schlüsselkonzept besteht hier darin, den Ton anzugeben und die Sicherheitsaspekte des kommenden Produkts oder Produktmerkmals zu definieren. Dies ist eine wichtige Gelegenheit, eine "Sicherheit zuerst"-Mentalität zu fördern und das Bewusstsein der Entwickler zu schärfen. + +Ein Beispiel: Es wird ein neuer Benachrichtigungsdienst entwickelt, der die Kunden über wichtige Ereignisse informieren soll. Zu den Sicherheitsanforderungen sollte beispielsweise die Trennung von Benutzern gehören, damit eine Benachrichtigung nie den "falschen" Empfänger erreicht. Werden die Benachrichtigungen auch sensible Daten enthalten? Wenn ja, führt dies zu einer Reihe von Bedenken hinsichtlich Sicherheit und Datenschutz, die berücksichtigt werden müssen. + +Das Ziel in dieser Phase sollte sein, ein Bedrohungsmodell (Threat Model) zu erstellen, das während des gesamten Entwicklungszyklus des Produkts oder der Funktion verwendet wird. Dieses Modell sollte auf bewährten Sicherheitspraktiken beruhen, wie z. B. dem von OWASP definierten Modell. + +Das Bedrohungsmodell sollte die Grundlage für eigene Anforderungsbesprechungen sein. Ein empfehlenswerter erster Schritt ist die Planung einer solchen Anforderungsbesprechung unter Verwendung eines generischen Bedrohungsmodells als Vorlage. Definiere in dieser Sitzung die Prinzipien und Leitfäden, die während der Entwicklung und des Testens verwendet werden sollen - was ist wichtig für die Sicherheit? Welches sind die besten Sicherheitsverfahren? Außerdem sollten alle Sicherheitskomponenten festgelegt werden, die im Rahmen des Entwicklungszyklus implementiert werden sollten. + +# Die Designphase + +In der Regel erstellen die Entwicklungsteams den technischen Entwurf einer Funktion. In unserem Beispiel des Benachrichtigungsdienstes könnte es sich um einen neuen Microservice, eine Message Queue, eine Datenbank zur Speicherung nicht zugestellter Benachrichtigungen oder ähnliches handeln. In dieser Phase müssen wir überprüfen, ob der Sicherheitsentwurf das in der Anforderungsphase erstellte Bedrohungsmodell berücksichtigt. + +Hier werden die Sicherheitsmechanismen innerhalb des Entwurfs definiert. Zu den wichtigsten Schritten gehören: +* Überprüfen der Sicherheitsanforderungen. +* Durch Brainstorming Schwachstellen und mögliche Designfehler aufdecken. In die Denkweise eines Angreifers hineinversetzen, um Schwachstellen zu finden. +* Bewerten der verschiedenen Risiken mithilfe von Bedrohungsmodellierungstechniken - geordnet nach dem Gefährdungsgrad und der Wahrscheinlichkeit des Risikos. + +Hier ist wichtig, dass die Priorisierung der jeweiligen Aufgaben an das Entwicklungsteam kommuniziert werden. Es muss ersichtlich sein, welche Aufgaben definitiv umgesetzt werden müssen oder welche auch anhand der Wahrscheinlichkeit erst zu einem späteren Zeitpunkt entwickelt, werden können. + +# Die Entwicklungsphase + +Die Einbindung der Sicherheit in die Programmierung bedeutet, dass Entwickler sicheren Code schreiben, Sicherheitsrisiken während der Programmierung beseitigen und dies tun, bevor sie ihre endgültige Version für weitere Tests und den Einsatz vorlegen. Dazu müssen mehrere Dinge berücksichtigt werden: +* Awareness und Security Mindset - Schulung und Ausbildung würden die Messlatte deutlich höher legen. Es gibt viele Menschen, die mit Codeänderungen interagieren. Eine kontinuierliche Schulung und Aufklärung kann dazu führen, dass Anti-Patterns und Gefahren wie Datenbereinigung, Kommunikationsverschlüsselung und anderes erkannt werden. OWASP stellt viele nützliche Schulungsressourcen zur Verfügung, und als erster Schritt ist das Verständnis der OWASP Top 10(Link) ein Muss. +Eine Schulung, die wir gerne auch ausführen ist eine Secure Coding Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. +* Code-Scanning - es gibt eine Vielzahl von Code-Analyse-Scannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastruktur-Deklarationssprachen gibt es einen speziellen Scanner-Typ namens "Infrastructure-as-Code"-Scanner, kurz IaC, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. +* Aufbau eines wiederholbaren Prozesses - Erstell einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lass die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plan regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. +Eine mögliche Option für die Integration von Scans in den Prozess sind Quellcode-Verwaltungssysteme (wie Git), die "Pull Requests" verwenden. Hier könnte man bei einem Pull Request einen obligatorischen SAST-Scan ausführen, der die neusten Änderungen vor der Zusammenführung des Quellcodes überprüft. Bei einem negativen Ergebnis kann das jedoch durch speziell benannte Personen überschrieben werden, da dies vielleicht im Anwendungsfall benötigt wird. + +# Die Testphase + +Diese Phase ist ein wenig verzwickt. Ein echter agiler SDLC bedeutet, dass es keinen linearen Prozess gibt, bei dem alles stehen bleibt und nur noch getestet wird. Die meisten Teams bauen heute eine Art CI/CD-Pipeline auf, in der kontinuierliche Integration stattfindet und die Software ständig getestet wird. + +Bei diesem Modell gibt es eine Reihe von Tests, die in mehreren Phasen durchgeführt werden. Einige während der Programmierung, einige nach jeder Codeübermittlung, einige nachts und einige in der Live-Produktionsumgebung. + +In der Anforderungsphase muss festgelegt werden, wo die Sicherheitstests durchgeführt werden sollen. Wir haben bereits Tests während der Entwicklungsphase erwähnt. Es ist jedoch möglich, zusätzliche Tests vor der Bereitstellung einzuführen - dies hängt von der Release-Strategie ab. + +Zusammenfassend kann man sagen, dass zwei Bereiche für diese Phase wichtig sind: + +* Entscheide auf Grundlage der Release-Strategie, welche Tests gebraucht werden und wo sie benötigt werden. +* Implementiere diese Tests, vorzugsweise auf automatisierte Weise, damit die Entwickler so schnell wie möglich ein Feedback erhalten. + +# Bereitstellung und Wartung + +In dieser Phase geht es vor allem darum, einen Reaktionsplan zu haben und den Angriffen einen Schritt voraus zu sein. Es müssen Prozesse entwickelt werden, die es ermöglichen, A) bei Bekanntwerden eines neuen externen Risikos alarmiert zu werden und B) über neue Sicherheitsangriffe, Trends und Lösungen auf dem Laufenden zu bleiben. + +* Such nach externen Risiken - Verfahren wie Penetrationstests sind wichtig. Diese decken Risiken auf, die möglicherweise durch alle bisherigen Sicherheitsschleusen geschlüpft sind. Die sollten regelmäßig durchgeführt werden, um die Chance zu erhöhen, sie zu finden. +* Umgang mit Warnmeldungen - einige Tools versorgen uns mit Bedrohungsinformationen, die aus neuen Enthüllungen stammen. Die log4shell-Schwachstelle war beispielsweise bereits in der Produktion vorhanden, aber sobald die Schwachstelle vollständig erkannt wurde, alarmierten die SCA-Tools ihre Benutzer und Sicherheitsteams, um die anfälligen Komponenten schnell zu blockieren und zu entfernen. Wir müssen davon ausgehen, dass auch in unseren Anwendungen "0-Day"-Schwachstellen lauern, die jeden Moment entdeckt werden könnten. +* Bleib auf dem Laufenden über Sicherheitstrends und -technologien - Es ist ein ständiges Wettrüsten zwischen Sicherheitsexperten und Cyber-Kriminellen. Die Sicherheits-Community veröffentlicht neue Bedrohungsmodelle und es gibt ständige Innovationen bei den Sicherheitswerkzeugen und -techniken. + +# Die Vorteile eines SSDLC + +Secure SDLC ist das ultimative Beispiel für eine so genannte "shift-left"-Initiative, die darauf abzielt, Sicherheitsprüfungen so früh wie möglich in den SDLC zu integrieren. + +Darüber hinaus werden bei SSDLC die Sicherheitsmaßnahmen im Kern vom Entwicklungsteam selbst geleitet. So können die Probleme von den Experten behoben werden, die die Software geschrieben haben, und nicht von einem anderen Team, das die Fehler nachträglich behebt. Dies ermöglicht es den Entwicklern, die Verantwortung für die Gesamtqualität ihrer Anwendungen zu übernehmen, was dazu führt, dass sicherere Anwendungen in der Produktion eingesetzt werden. + +Der zusätzliche Aufwand für Sicherheitstests im Rahmen des SDLC-Prozesses mag zwar nach viel Arbeit und hohen Kosten für die Erstellung klingen, doch heute wird der größte Teil davon automatisiert. Dies gilt insbesondere für den Entwicklungsbetrieb oder DevOps. Die sichere SDLC-Umgebung erfordert eine häufige Zusammenarbeit zwischen DevOps und den Entwicklern, die die Funktionalität der Anwendung implementieren, und diese Zusammenarbeit muss in den SDLC selbst integriert werden. + +Durch die Behebung dieser Probleme in einem frühen Stadium des Prozesses können Entwicklungsteams die Gesamtbetriebskosten ihrer Anwendungen senken. Die späte Entdeckung von Problemen im SDLC kann zu einem 100-fachen Anstieg der Entwicklungskosten führen, die für die Behebung dieser Probleme erforderlich sind, wie in der nachstehenden Tabelle dargestellt. + +![image](/assets/images/posts/ssdlc/softwaredefectcost.png) +*IBM System Science Institute: Relative Cost of Fixing Defects, 2010* + +Wie im Bild dargestellt, ermöglicht die Umstellung auf einen sicheren SDLC den Entwicklungsteams eine schnellere Erstellung sicherer Anwendungen und kann daher für Unternehmen eine lohnende Investition sein. + +# Auf dem Weg in eine sicherere Zukunft + +Herkömmliche Verfahren zum Testen auf Schwachstellen in der Produktion reichen nicht mehr aus, um die Anwendungen zu sichern. Mit der Entwicklung der Softwarebranche haben sich auch die Arten von Angriffen weiterentwickelt. Um eine sichere Anwendung bereitzustellen und zu warten, muss jeder Schritt des Anwendungsentwicklungsprozesses gesichert werden. Das bedeutet, dass bereits in der Phase der Anforderungserfassung Fragen zum Sicherheitsverhalten gestellt werden müssen. Die Teamkultur und Projektmethoden an eine sicherheitsorientierte Denkweise anpassen. Automatische Überprüfungen im Deployment-Prozess implementieren und viele andere Methoden, die zusammen einen sicheren SDLC-Prozess ergeben. + +SSDLC ermöglicht es, Sicherheitsrisiken nach links zu verlagern (shift left approach), indem der Ursprung von Sicherheitsproblemen in der Anforderungsphase angegangen werden, anstatt von der Wartungsphase aus zurückgehen zu müssen. Wenn man sich in jeder Phase der Entwicklung auf die Sicherheit konzentrieren, kann man sich sicher sein, dass die Anwendung im Ergebnis viel sicherer ist. diff --git a/assets/images/posts/ssdlc/softwaredefectcost.png b/assets/images/posts/ssdlc/softwaredefectcost.png new file mode 100644 index 0000000000000000000000000000000000000000..8caa7f61a94a9538d559aef4ccc1adeedb1658bf GIT binary patch literal 56531 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%0DT{?cJ9 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 ty~)2fhMO1u<3jy=WBxT||4)6)qJ${x Date: Fri, 8 Sep 2023 17:41:00 +0200 Subject: [PATCH 02/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 24ac250ba..e6539f361 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -16,7 +16,7 @@ Entwicklungsteams arbeiten bereits in einem sehr methodischen, sich wiederholend # Wieso brauchen wir einen sicheren Softwareentwicklungszyklus? Die Sicherheit spielt in jeder Phase des Softwareentwicklungszyklus (SDLC) eine Rolle und muss bei der Umsetzung einer Software im Vordergrund stehen. In diesem Artikel erfahren wir, wie wir einen sicheren SDLC (SSDLC) erstellen können, der uns hilft, Probleme in den Anforderungen zu erkennen, bevor wir diese in der Implementierung unserer Software wiederfinden. -Mit entsprechendem Aufwand können Sicherheitsprobleme in der SDLC-Pipeline bereits vor der Produktionsbereitstellung behoben werden. Dies verringert das Risiko, Sicherheitslücken in einer Applikation zu finden, und minimiert die Auswirkungen, wenn sie gefunden werden. +Mit entsprechendem Aufwand können Sicherheitsprobleme in der SDLC-Pipeline bereits vor der Produktionsbereitstellung behoben werden. Dadurch kann das Risiko von Sicherheitslücken in einer Applikation verringert werden. Außerdem kann der mögliche Schaden im Risikofall reduziert werden. Der SSDLC zielt nicht darauf ab, herkömmliche Sicherheitsprüfungen wie Penetrationstests vollständig abzuschaffen, sondern die Sicherheit in den Verantwortungsbereich der Entwickler einzubeziehen und sie zu befähigen, von Anfang an sichere Anwendungen zu entwickeln. From ca08b8f7b48b13046190baf5ccd4076fd398915e Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:41:13 +0200 Subject: [PATCH 03/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index e6539f361..bf3eb98d0 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -41,7 +41,7 @@ Das Schlüsselkonzept besteht hier darin, den Ton anzugeben und die Sicherheitsa Ein Beispiel: Es wird ein neuer Benachrichtigungsdienst entwickelt, der die Kunden über wichtige Ereignisse informieren soll. Zu den Sicherheitsanforderungen sollte beispielsweise die Trennung von Benutzern gehören, damit eine Benachrichtigung nie den "falschen" Empfänger erreicht. Werden die Benachrichtigungen auch sensible Daten enthalten? Wenn ja, führt dies zu einer Reihe von Bedenken hinsichtlich Sicherheit und Datenschutz, die berücksichtigt werden müssen. -Das Ziel in dieser Phase sollte sein, ein Bedrohungsmodell (Threat Model) zu erstellen, das während des gesamten Entwicklungszyklus des Produkts oder der Funktion verwendet wird. Dieses Modell sollte auf bewährten Sicherheitspraktiken beruhen, wie z. B. dem von OWASP definierten Modell. +Das Ziel in dieser Phase sollte sein, ein Bedrohungsmodell (Threat Model) zu erstellen, das während des gesamten Entwicklungszyklus des Produkts oder der Funktion verwendet wird. Dieses Modell sollte auf bewährten Sicherheitspraktiken beruhen, z. B. dem von OWASP definierten Modell. Das Bedrohungsmodell sollte die Grundlage für eigene Anforderungsbesprechungen sein. Ein empfehlenswerter erster Schritt ist die Planung einer solchen Anforderungsbesprechung unter Verwendung eines generischen Bedrohungsmodells als Vorlage. Definiere in dieser Sitzung die Prinzipien und Leitfäden, die während der Entwicklung und des Testens verwendet werden sollen - was ist wichtig für die Sicherheit? Welches sind die besten Sicherheitsverfahren? Außerdem sollten alle Sicherheitskomponenten festgelegt werden, die im Rahmen des Entwicklungszyklus implementiert werden sollten. From 5518f3d6f302697017f721265599828ee87e713c Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:41:46 +0200 Subject: [PATCH 04/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index bf3eb98d0..579003390 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -54,7 +54,7 @@ Hier werden die Sicherheitsmechanismen innerhalb des Entwurfs definiert. Zu den * Durch Brainstorming Schwachstellen und mögliche Designfehler aufdecken. In die Denkweise eines Angreifers hineinversetzen, um Schwachstellen zu finden. * Bewerten der verschiedenen Risiken mithilfe von Bedrohungsmodellierungstechniken - geordnet nach dem Gefährdungsgrad und der Wahrscheinlichkeit des Risikos. -Hier ist wichtig, dass die Priorisierung der jeweiligen Aufgaben an das Entwicklungsteam kommuniziert werden. Es muss ersichtlich sein, welche Aufgaben definitiv umgesetzt werden müssen oder welche auch anhand der Wahrscheinlichkeit erst zu einem späteren Zeitpunkt entwickelt, werden können. +Hier ist wichtig, dass die Priorisierung der jeweiligen Aufgaben an das Entwicklungsteam kommuniziert werden. Es muss ersichtlich sein, welche Aufgaben definitiv umgesetzt werden müssen oder welche auch anhand der Wahrscheinlichkeit erst zu einem späteren Zeitpunkt entwickelt werden können. # Die Entwicklungsphase From 12751ed503baadce38b1f19145e8ad02ad469104 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:42:01 +0200 Subject: [PATCH 05/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 579003390..99443f16d 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -59,7 +59,7 @@ Hier ist wichtig, dass die Priorisierung der jeweiligen Aufgaben an das Entwickl # Die Entwicklungsphase Die Einbindung der Sicherheit in die Programmierung bedeutet, dass Entwickler sicheren Code schreiben, Sicherheitsrisiken während der Programmierung beseitigen und dies tun, bevor sie ihre endgültige Version für weitere Tests und den Einsatz vorlegen. Dazu müssen mehrere Dinge berücksichtigt werden: -* Awareness und Security Mindset - Schulung und Ausbildung würden die Messlatte deutlich höher legen. Es gibt viele Menschen, die mit Codeänderungen interagieren. Eine kontinuierliche Schulung und Aufklärung kann dazu führen, dass Anti-Patterns und Gefahren wie Datenbereinigung, Kommunikationsverschlüsselung und anderes erkannt werden. OWASP stellt viele nützliche Schulungsressourcen zur Verfügung, und als erster Schritt ist das Verständnis der OWASP Top 10(Link) ein Muss. +* Awareness und Security Mindset - Schulung und Ausbildung würden die Messlatte deutlich höher legen. Es gibt viele Menschen, die mit Codeänderungen interagieren. Eine kontinuierliche Schulung und Aufklärung kann dazu führen, dass Anti-Patterns und Gefahren wie Datenbereinigung, Kommunikationsverschlüsselung und anderes erkannt werden. OWASP stellt viele nützliche Schulungsressourcen zur Verfügung und als erster Schritt ist das Verständnis der OWASP Top 10(Link) ein Muss. Eine Schulung, die wir gerne auch ausführen ist eine Secure Coding Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. * Code-Scanning - es gibt eine Vielzahl von Code-Analyse-Scannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastruktur-Deklarationssprachen gibt es einen speziellen Scanner-Typ namens "Infrastructure-as-Code"-Scanner, kurz IaC, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. * Aufbau eines wiederholbaren Prozesses - Erstell einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lass die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plan regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. From 7183ea7087c7ebee9ff3f9512fc08ea91f420c48 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:42:22 +0200 Subject: [PATCH 06/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 99443f16d..7bfeb1345 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -60,7 +60,7 @@ Hier ist wichtig, dass die Priorisierung der jeweiligen Aufgaben an das Entwickl Die Einbindung der Sicherheit in die Programmierung bedeutet, dass Entwickler sicheren Code schreiben, Sicherheitsrisiken während der Programmierung beseitigen und dies tun, bevor sie ihre endgültige Version für weitere Tests und den Einsatz vorlegen. Dazu müssen mehrere Dinge berücksichtigt werden: * Awareness und Security Mindset - Schulung und Ausbildung würden die Messlatte deutlich höher legen. Es gibt viele Menschen, die mit Codeänderungen interagieren. Eine kontinuierliche Schulung und Aufklärung kann dazu führen, dass Anti-Patterns und Gefahren wie Datenbereinigung, Kommunikationsverschlüsselung und anderes erkannt werden. OWASP stellt viele nützliche Schulungsressourcen zur Verfügung und als erster Schritt ist das Verständnis der OWASP Top 10(Link) ein Muss. -Eine Schulung, die wir gerne auch ausführen ist eine Secure Coding Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. +Eine Schulung, die wir gerne auch ausführen ist eine Secure-Coding-Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. * Code-Scanning - es gibt eine Vielzahl von Code-Analyse-Scannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastruktur-Deklarationssprachen gibt es einen speziellen Scanner-Typ namens "Infrastructure-as-Code"-Scanner, kurz IaC, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. * Aufbau eines wiederholbaren Prozesses - Erstell einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lass die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plan regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. Eine mögliche Option für die Integration von Scans in den Prozess sind Quellcode-Verwaltungssysteme (wie Git), die "Pull Requests" verwenden. Hier könnte man bei einem Pull Request einen obligatorischen SAST-Scan ausführen, der die neusten Änderungen vor der Zusammenführung des Quellcodes überprüft. Bei einem negativen Ergebnis kann das jedoch durch speziell benannte Personen überschrieben werden, da dies vielleicht im Anwendungsfall benötigt wird. From 6ce1f9927aa552af667170efffda3bb764060d66 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:42:41 +0200 Subject: [PATCH 07/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 7bfeb1345..6ea45c0e2 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -94,7 +94,7 @@ Darüber hinaus werden bei SSDLC die Sicherheitsmaßnahmen im Kern vom Entwicklu Der zusätzliche Aufwand für Sicherheitstests im Rahmen des SDLC-Prozesses mag zwar nach viel Arbeit und hohen Kosten für die Erstellung klingen, doch heute wird der größte Teil davon automatisiert. Dies gilt insbesondere für den Entwicklungsbetrieb oder DevOps. Die sichere SDLC-Umgebung erfordert eine häufige Zusammenarbeit zwischen DevOps und den Entwicklern, die die Funktionalität der Anwendung implementieren, und diese Zusammenarbeit muss in den SDLC selbst integriert werden. -Durch die Behebung dieser Probleme in einem frühen Stadium des Prozesses können Entwicklungsteams die Gesamtbetriebskosten ihrer Anwendungen senken. Die späte Entdeckung von Problemen im SDLC kann zu einem 100-fachen Anstieg der Entwicklungskosten führen, die für die Behebung dieser Probleme erforderlich sind, wie in der nachstehenden Tabelle dargestellt. +Durch die Behebung dieser Probleme in einem frühen Stadium des Prozesses können Entwicklungsteams die Gesamtbetriebskosten ihrer Anwendungen senken. Die späte Entdeckung von Problemen im SDLC kann zu einem 100-fachen Anstieg der Entwicklungskosten führen, die für die Behebung dieser Probleme erforderlich sind, wie in der nachstehenden Grafik dargestellt. ![image](/assets/images/posts/ssdlc/softwaredefectcost.png) *IBM System Science Institute: Relative Cost of Fixing Defects, 2010* From 4fc247b11fcd309348231422abc9fe56b1ae452e Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:43:07 +0200 Subject: [PATCH 08/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 6ea45c0e2..0a6549208 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -103,6 +103,6 @@ Wie im Bild dargestellt, ermöglicht die Umstellung auf einen sicheren SDLC den # Auf dem Weg in eine sicherere Zukunft -Herkömmliche Verfahren zum Testen auf Schwachstellen in der Produktion reichen nicht mehr aus, um die Anwendungen zu sichern. Mit der Entwicklung der Softwarebranche haben sich auch die Arten von Angriffen weiterentwickelt. Um eine sichere Anwendung bereitzustellen und zu warten, muss jeder Schritt des Anwendungsentwicklungsprozesses gesichert werden. Das bedeutet, dass bereits in der Phase der Anforderungserfassung Fragen zum Sicherheitsverhalten gestellt werden müssen. Die Teamkultur und Projektmethoden an eine sicherheitsorientierte Denkweise anpassen. Automatische Überprüfungen im Deployment-Prozess implementieren und viele andere Methoden, die zusammen einen sicheren SDLC-Prozess ergeben. +Herkömmliche Verfahren zum Testen auf Schwachstellen in der Produktion reichen nicht mehr aus, um die Anwendungen zu sichern. Mit der Entwicklung der Softwarebranche haben sich auch die Arten von Angriffen weiterentwickelt. Um eine sichere Anwendung bereitzustellen und zu warten, muss jeder Schritt des Anwendungsentwicklungsprozesses gesichert werden. Das bedeutet, dass bereits in der Phase der Anforderungserfassung Fragen zum Sicherheitsverhalten gestellt werden müssen. Außerdem müssen die Teamkultur und die Projektmethoden an eine sicherheitsorientierte Denkweise angepasst werden. Automatische Überprüfungen müssen im Deployment-Prozess implementiert und viele andere Methoden ergänzt werden, die zusammen einen sicheren SDLC-Prozess ergeben. SSDLC ermöglicht es, Sicherheitsrisiken nach links zu verlagern (shift left approach), indem der Ursprung von Sicherheitsproblemen in der Anforderungsphase angegangen werden, anstatt von der Wartungsphase aus zurückgehen zu müssen. Wenn man sich in jeder Phase der Entwicklung auf die Sicherheit konzentrieren, kann man sich sicher sein, dass die Anwendung im Ergebnis viel sicherer ist. From b697a0f873ae08c06e1a52ec709fe66ee5d76d96 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:44:04 +0200 Subject: [PATCH 09/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 0a6549208..70e7bf334 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -61,7 +61,7 @@ Hier ist wichtig, dass die Priorisierung der jeweiligen Aufgaben an das Entwickl Die Einbindung der Sicherheit in die Programmierung bedeutet, dass Entwickler sicheren Code schreiben, Sicherheitsrisiken während der Programmierung beseitigen und dies tun, bevor sie ihre endgültige Version für weitere Tests und den Einsatz vorlegen. Dazu müssen mehrere Dinge berücksichtigt werden: * Awareness und Security Mindset - Schulung und Ausbildung würden die Messlatte deutlich höher legen. Es gibt viele Menschen, die mit Codeänderungen interagieren. Eine kontinuierliche Schulung und Aufklärung kann dazu führen, dass Anti-Patterns und Gefahren wie Datenbereinigung, Kommunikationsverschlüsselung und anderes erkannt werden. OWASP stellt viele nützliche Schulungsressourcen zur Verfügung und als erster Schritt ist das Verständnis der OWASP Top 10(Link) ein Muss. Eine Schulung, die wir gerne auch ausführen ist eine Secure-Coding-Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. -* Code-Scanning - es gibt eine Vielzahl von Code-Analyse-Scannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastruktur-Deklarationssprachen gibt es einen speziellen Scanner-Typ namens "Infrastructure-as-Code"-Scanner, kurz IaC, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. +* Code-Scanning - es gibt eine Vielzahl von Codeanalysescannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastrukturdeklarationssprachen gibt es einen speziellen Scannertyp namens "Infrastructure-as-Code"-Scanner, kurz IaC-Scanner, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. * Aufbau eines wiederholbaren Prozesses - Erstell einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lass die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plan regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. Eine mögliche Option für die Integration von Scans in den Prozess sind Quellcode-Verwaltungssysteme (wie Git), die "Pull Requests" verwenden. Hier könnte man bei einem Pull Request einen obligatorischen SAST-Scan ausführen, der die neusten Änderungen vor der Zusammenführung des Quellcodes überprüft. Bei einem negativen Ergebnis kann das jedoch durch speziell benannte Personen überschrieben werden, da dies vielleicht im Anwendungsfall benötigt wird. From f5153339e8ab27e80eb4bc2f3045343b02189979 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:44:16 +0200 Subject: [PATCH 10/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 70e7bf334..73067c070 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -62,7 +62,7 @@ Die Einbindung der Sicherheit in die Programmierung bedeutet, dass Entwickler si * Awareness und Security Mindset - Schulung und Ausbildung würden die Messlatte deutlich höher legen. Es gibt viele Menschen, die mit Codeänderungen interagieren. Eine kontinuierliche Schulung und Aufklärung kann dazu führen, dass Anti-Patterns und Gefahren wie Datenbereinigung, Kommunikationsverschlüsselung und anderes erkannt werden. OWASP stellt viele nützliche Schulungsressourcen zur Verfügung und als erster Schritt ist das Verständnis der OWASP Top 10(Link) ein Muss. Eine Schulung, die wir gerne auch ausführen ist eine Secure-Coding-Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. * Code-Scanning - es gibt eine Vielzahl von Codeanalysescannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastrukturdeklarationssprachen gibt es einen speziellen Scannertyp namens "Infrastructure-as-Code"-Scanner, kurz IaC-Scanner, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. -* Aufbau eines wiederholbaren Prozesses - Erstell einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lass die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plan regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. +* Aufbau eines wiederholbaren Prozesses - Erstelle einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lasse die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plane regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. Eine mögliche Option für die Integration von Scans in den Prozess sind Quellcode-Verwaltungssysteme (wie Git), die "Pull Requests" verwenden. Hier könnte man bei einem Pull Request einen obligatorischen SAST-Scan ausführen, der die neusten Änderungen vor der Zusammenführung des Quellcodes überprüft. Bei einem negativen Ergebnis kann das jedoch durch speziell benannte Personen überschrieben werden, da dies vielleicht im Anwendungsfall benötigt wird. # Die Testphase From 66564e2e02bc5ec51bf6ce3f684310e82e4bd42e Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:44:31 +0200 Subject: [PATCH 11/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 73067c070..6a3f9d7fa 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -63,7 +63,7 @@ Die Einbindung der Sicherheit in die Programmierung bedeutet, dass Entwickler si Eine Schulung, die wir gerne auch ausführen ist eine Secure-Coding-Schulung, die auf Basis der OWASP Top 10 aufbaut und ein Mix zwischen Theorie, Praxis und Security-Mindset ist. * Code-Scanning - es gibt eine Vielzahl von Codeanalysescannern, die Probleme bereits während des Programmierens aufspüren können. Dazu gehören SAST-Tools und SCA-Tools, diese scannen den eigenen Code oder überprüfen die angebundenen Bibliotheken. Für viele Infrastrukturdeklarationssprachen gibt es einen speziellen Scannertyp namens "Infrastructure-as-Code"-Scanner, kurz IaC-Scanner, der unsichere Konfigurationen aufspüren kann. Es ist wichtig, dass die verwendeten Technologien mit den verfügbaren Scannern abgleichen. * Aufbau eines wiederholbaren Prozesses - Erstelle einen operativen Prozess, der beide oben genannten Punkte umsetzt. Lasse die Entwickler die Sicherheitsscan-Tools ausführen, bevor sie ihren Code einreichen, und plane regelmäßige Auffrischungsschulungen für bewährte Sicherheitsmethoden ein. -Eine mögliche Option für die Integration von Scans in den Prozess sind Quellcode-Verwaltungssysteme (wie Git), die "Pull Requests" verwenden. Hier könnte man bei einem Pull Request einen obligatorischen SAST-Scan ausführen, der die neusten Änderungen vor der Zusammenführung des Quellcodes überprüft. Bei einem negativen Ergebnis kann das jedoch durch speziell benannte Personen überschrieben werden, da dies vielleicht im Anwendungsfall benötigt wird. +Eine mögliche Option für die Integration von Scans in den Prozess sind Quellcodeverwaltungssysteme wie Git, die "Pull Requests" verwenden. Hier könnte man bei einem Pull Request einen obligatorischen SAST-Scan ausführen, der die neusten Änderungen vor der Zusammenführung des Quellcodes überprüft. Bei einem negativen Ergebnis kann das jedoch durch speziell benannte Personen überschrieben werden, da dies vielleicht im Anwendungsfall benötigt wird. # Die Testphase From fd9277c416850269b103503732c5e019ae7ecebc Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:45:02 +0200 Subject: [PATCH 12/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 6a3f9d7fa..55b7cbea0 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -67,7 +67,7 @@ Eine mögliche Option für die Integration von Scans in den Prozess sind Quellco # Die Testphase -Diese Phase ist ein wenig verzwickt. Ein echter agiler SDLC bedeutet, dass es keinen linearen Prozess gibt, bei dem alles stehen bleibt und nur noch getestet wird. Die meisten Teams bauen heute eine Art CI/CD-Pipeline auf, in der kontinuierliche Integration stattfindet und die Software ständig getestet wird. +Diese Phase ist ein wenig verzwickt. Einen echten agilen SDLC kennzeichnet, dass es keinen linearen Prozess gibt, bei dem alles stehen bleibt und nur noch getestet wird. Die meisten Teams bauen heute eine Art CI/CD-Pipeline auf, in der kontinuierliche Integration stattfindet und die Software ständig getestet wird. Bei diesem Modell gibt es eine Reihe von Tests, die in mehreren Phasen durchgeführt werden. Einige während der Programmierung, einige nach jeder Codeübermittlung, einige nachts und einige in der Live-Produktionsumgebung. From 37995120d1c6a057e289a57fa67f16b0074dce07 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:45:18 +0200 Subject: [PATCH 13/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 55b7cbea0..7afbef019 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -69,7 +69,7 @@ Eine mögliche Option für die Integration von Scans in den Prozess sind Quellco Diese Phase ist ein wenig verzwickt. Einen echten agilen SDLC kennzeichnet, dass es keinen linearen Prozess gibt, bei dem alles stehen bleibt und nur noch getestet wird. Die meisten Teams bauen heute eine Art CI/CD-Pipeline auf, in der kontinuierliche Integration stattfindet und die Software ständig getestet wird. -Bei diesem Modell gibt es eine Reihe von Tests, die in mehreren Phasen durchgeführt werden. Einige während der Programmierung, einige nach jeder Codeübermittlung, einige nachts und einige in der Live-Produktionsumgebung. +Bei diesem Modell gibt es eine Reihe von Tests, die in mehreren Phasen durchgeführt werden, einige während der Programmierung, einige nach jeder Codeübermittlung, einige nachts und einige in der Produktionsumgebung. In der Anforderungsphase muss festgelegt werden, wo die Sicherheitstests durchgeführt werden sollen. Wir haben bereits Tests während der Entwicklungsphase erwähnt. Es ist jedoch möglich, zusätzliche Tests vor der Bereitstellung einzuführen - dies hängt von der Release-Strategie ab. From a0518df59d0563f74d4252e4a5cff26b456a1633 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:45:32 +0200 Subject: [PATCH 14/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index 7afbef019..a15fe2075 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -75,7 +75,7 @@ In der Anforderungsphase muss festgelegt werden, wo die Sicherheitstests durchge Zusammenfassend kann man sagen, dass zwei Bereiche für diese Phase wichtig sind: -* Entscheide auf Grundlage der Release-Strategie, welche Tests gebraucht werden und wo sie benötigt werden. +* Entscheide auf Grundlage der Release-Strategie, welche Tests gebraucht und wo sie benötigt werden. * Implementiere diese Tests, vorzugsweise auf automatisierte Weise, damit die Entwickler so schnell wie möglich ein Feedback erhalten. # Bereitstellung und Wartung From 4a5e049a33c7b45a8bf5ce7c30bac87325d659f1 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:45:46 +0200 Subject: [PATCH 15/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index a15fe2075..a10b2b5b3 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -84,7 +84,7 @@ In dieser Phase geht es vor allem darum, einen Reaktionsplan zu haben und den An * Such nach externen Risiken - Verfahren wie Penetrationstests sind wichtig. Diese decken Risiken auf, die möglicherweise durch alle bisherigen Sicherheitsschleusen geschlüpft sind. Die sollten regelmäßig durchgeführt werden, um die Chance zu erhöhen, sie zu finden. * Umgang mit Warnmeldungen - einige Tools versorgen uns mit Bedrohungsinformationen, die aus neuen Enthüllungen stammen. Die log4shell-Schwachstelle war beispielsweise bereits in der Produktion vorhanden, aber sobald die Schwachstelle vollständig erkannt wurde, alarmierten die SCA-Tools ihre Benutzer und Sicherheitsteams, um die anfälligen Komponenten schnell zu blockieren und zu entfernen. Wir müssen davon ausgehen, dass auch in unseren Anwendungen "0-Day"-Schwachstellen lauern, die jeden Moment entdeckt werden könnten. -* Bleib auf dem Laufenden über Sicherheitstrends und -technologien - Es ist ein ständiges Wettrüsten zwischen Sicherheitsexperten und Cyber-Kriminellen. Die Sicherheits-Community veröffentlicht neue Bedrohungsmodelle und es gibt ständige Innovationen bei den Sicherheitswerkzeugen und -techniken. +* Bleibe auf dem Laufenden über Sicherheitstrends und -technologien - Es ist ein ständiges Wettrüsten zwischen Sicherheitsexperten und Cyber-Kriminellen. Die Sicherheits-Community veröffentlicht neue Bedrohungsmodelle und es gibt ständige Innovationen bei den Sicherheitswerkzeugen und -techniken. # Die Vorteile eines SSDLC From 11c40c3ee20c908ea87016ee0f235fc6422d0636 Mon Sep 17 00:00:00 2001 From: Rico Komenda <91131363+RicoKomenda@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:46:02 +0200 Subject: [PATCH 16/16] Update _posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md Co-authored-by: johannesteklote --- .../2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md index a10b2b5b3..25b724629 100644 --- a/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md +++ b/_posts/2023-03-01-Der-sichere-Softwareentwicklungslebenszyklus.md @@ -88,7 +88,7 @@ In dieser Phase geht es vor allem darum, einen Reaktionsplan zu haben und den An # Die Vorteile eines SSDLC -Secure SDLC ist das ultimative Beispiel für eine so genannte "shift-left"-Initiative, die darauf abzielt, Sicherheitsprüfungen so früh wie möglich in den SDLC zu integrieren. +Secure SDLC ist das ultimative Beispiel für eine sogenannte "shift-left"-Initiative, die darauf abzielt, Sicherheitsprüfungen so früh wie möglich in den SDLC zu integrieren. Darüber hinaus werden bei SSDLC die Sicherheitsmaßnahmen im Kern vom Entwicklungsteam selbst geleitet. So können die Probleme von den Experten behoben werden, die die Software geschrieben haben, und nicht von einem anderen Team, das die Fehler nachträglich behebt. Dies ermöglicht es den Entwicklern, die Verantwortung für die Gesamtqualität ihrer Anwendungen zu übernehmen, was dazu führt, dass sicherere Anwendungen in der Produktion eingesetzt werden.