Bundesamt für Sicherheit in der Informationstechnik

M 3.97 Schulung des Projektteams für die Software-Entwicklung

Verantwortlich für Initiierung: IT-Sicherheitsbeauftragter, Leiter Entwicklung

Verantwortlich für Umsetzung: Leiter Entwicklung, IT-Sicherheitsbeauftragter

Ein geschärftes Sicherheitsbewusstsein des Entwicklungsteams spielt eine entscheidende Rolle bei der Erstellung von sicheren IT -Systemen. Dabei muss dieses Sicherheitsbewusstsein nicht nur bei der Implementierungsphase sondern beim gesamten Lebenszyklus der Software-Entwicklung vorhanden sein.

Allgemeine Inhalte für die Schulung des Projekt-Teams zur sicheren Software-Entwicklung

Anforderungsanalyse:
Die Anforderungsanalyse und -Spezifikation ist ein sehr entscheidender Schritt für den Erfolg einer Software-Entwicklung. Dabei muss sichergestellt werden, dass die Anforderungen des Kunden bzw. der Fachabteilung vollständig, eindeutig, konsistent und verständlich definiert und dokumentiert werden. Die Anforderungsanalyse bildet die Basis für die spätere Abnahme des Systems, daher müssen die Anforderungen nachprüfbar sein.

Projektmanagement allgemein sowie speziell bei der Systementwicklung:
Das Projektmanagement bestimmt den Erfolg oder Misserfolg eines Entwicklungsprojektes. Der Projektmanager muss deswegen die notwendige Kenntnisse und Fertigkeiten besitzen, um z. B. Projektmitarbeiter zu motivieren, die Zusammenarbeit im Team zu fördern und Planung und Kontrolle richtig einzusetzen.

Risikomanagement in der Software-Entwicklung:
Relevante Themen aus diesem Gebiet sind Grundlagen zum Risikomanagement von Software-Entwicklungsprojekten, Risiken in der Software-Entwicklung, Methoden zur Risiko-Identifizierung, -Analyse, -Bewertung und Behandlung. Insbesondere ist es hier wichtig, die typischen Risiken in der Software-Entwicklung und ihre möglichen Auswirkungen sowie Maßnahmen zur Behandlung und Überwachung von Risiken in der Software-Entwicklung zu kennen.

Qualitätsmanagement:
Zu den relevanten Themen gehören Methoden und Normen zum Qualitätsmanagement (u. A. die ISO Normen aus der Familie 9000ff) und praxisnahe Erkenntnisse für die Anwendung von Qualitätsplanung, -Sicherung und -Steuerung.

Qualitätssicherung:Aufgrund ihrer Bedeutung bei der Systementwicklung und der großen Auswahl an Methoden sollte dieser Punkt zumindest für das Test-Team vertieft werden. Zu den möglichen Inhalten hier gehören allgemeine Verfahren zur Qualitätssicherung, Planung und Bewertung, Methoden zur integrierten Software- und Testentwicklung und Methoden zur Aufwandschätzung beim Testen. Das Test-Team sollte mit folgenden Qualitätssicherungs-Verfahren vertraut sein:
  • Statische Prüfverfahren (z. B. Code Review)
  • Dynamische Prüfverfahren (z. B. Blackbox-Testverfahren wie Äquivalenzklassenbildung, Grenzwertanalyse, Zustandsbezogener Test und Whitebox-Testverfahren, z. B. Anweisungs-, Zweig-, Pfadüberdeckung, Test von Bedingungen)

Modelle und Methoden für die Software-Entwicklung:
Das Entwicklungsteam sollte mit den bekannten Methoden, Normen und dem aktuellen Stand der Technik bzw. "Best Practices" für die Software-Entwicklung vertraut sein.

Änderungsmanagement:
Sowohl der Projektleiter der Software-Entwicklung als auch die Mitglieder des Entwicklungsteams müssen Bedeutung des Änderungsmanagements verstehen und die Basiskonzepte und Werkzeuge des Änderungsmanagements kennen und verwenden können. Die Schnittstellen von Änderungsmanagement zu anderen Aktivitäten der Software-Entwicklung müssen richtig definiert werden (z. B. zur Qualitätssicherung und zum Konfigurationsmanagement), gegebenenfalls müssen hier Anforderungen verschiedener Standards an das Änderungsmanagement berücksichtigt werden.

Informationssicherheit:Ein Sicherheitsbewusstsein ist für die Entwicklung sicherer Produkte unabdingbar. So sollte das Projekt-Team zu allgemeinen Sicherheitsthemen sensibilisiert werden, wie z. B.
  • Typische Sicherheitsgefährdungen für ähnliche Systeme (Typische Angriffsszenarien, typische Schwachstellen, typische Systemversagen und damit verbundene Schäden),
  • Standard-Sicherheitsmaßnahmen zur sicheren Software-Entwicklung,
  • Allgemeine Kenntnisse zur Informationssicherheit.

Sicherheitsvorgaben in der Institution:
Die Sicherheitsleitlinie und weitere Sicherheitsrichtlinien der Institution sollten bei der Software-Entwicklung mit berücksichtigt werden. Dies setzt natürlich voraus, dass das Projekt-Team alle hierfür relevante Vorgaben kennt.

Sicherheitsaspekte in speziellen Bereichen:
Je nach dem Anwendungsbereich der zu entwickelnden Software sollten die Entwickler zu spefischen Aspekten geschult werden. Dazu gehören beispielsweise Netz- und Kommunikationsprotokolle und -Dienste, Authentisierung und Zugriffskontrolle, Datenbanken, kryptographischen Verfahren, Verwaltung von kryptographischen Schlüsseln und Zertifikaten usw.

Inhalte für die Schulung der Entwickler zur sicheren Programmierung

Als erstes ist es wichtig, dass das Entwicklungsteam die verwendeten Methoden, Programmiersprachen, Entwicklungsumgebung, Konfigurationsmanagement-Tools und aller weitere Werkzeuge, die in der Software-Entwicklung eingesetzt werden gut kennt. Darüber hinaus sollte auch auf folgende weitere Bereiche eingegangen werden.

Vermeidung von Schwachstellen im System:
Ein Großteil aller Sicherheitslücken in Programmen werden durch dieselben Fehlerarten verursacht. Bei den akuten Sicherheitsproblemen, die bei den CERT s gemeldet werden, steht beispielsweise als Ursache immer wieder Buffer Overflow. Durch eine systematische Fehlerbehandlung (Exception handling) im Code können viele Schwachstellen vermieden werden indem die Korrektheit der verwendeten Daten (Datenbereich, Datenstruktur) vom System überprüft wird und falsche Daten abgefangen werden.

Durch die Verwendung von Code-Konventionen und von Programmiertechniken kann die Qualität des Programmcodes erheblich verbessert werden. Code-Konventionen sind Vorschriften, die eine einheitliche und übersichtliche Gestaltung des Programmcodes ermöglichen, z.B. durch Regeln für den Dateiaufbau und Verzeichnisaufbau, die Code-Kommentierung, die Namensgebung, usw. und somit die Analyse, Wartbarkeit und Wiederverwendung von Programmcode erleichtern.

Ebenfalls wichtig ist hierfür der Einsatz von Programmierrichtlinien, wie beispielsweise die Behandlung von Ausnahmefällen, die Definition von Vorschriften für die Verwendung von Konstanten und für die Referenzierung usw. In der Regel existieren für alle gängige Programmiersprachen Software-Werkzeuge, die die Kontrolle der Einhaltung von Code-Konventionen und Programmierrichtlinien weitgehend unterstützen.

Die Gültigkeitsüberprüfung der Eingabe (Eingabevalidierung) ist unabdingbar um viele Arten von Angriffen abzufangen. Dies muss in allen relevanten Schnittstellen des Systems geschehen. In einer Client-Server Umgebung beispielsweise sollte die Eingabe nicht nur auf der Client-Seite des Systems überprüft werden, sondern auch auf der Server-Seite. Anderenfalls ist das System gegenüber "Man-in-the-middle"-Angriffen anfällig: Wenn ein Angreifer den Datenstrom vom Client zum Server abfängt und verändert, ist keine Abwehr mehr möglich. Daher ist eine Prüfung der Eingaben hinsichtlich Länge, Wertebereich und Format unbedingt erforderlich.

Standard-Einstellungen sollten die möglichst maximale Sicherheit für das System bieten. Auch im Hinblick auf die angebotenen Schnittstellen, Dienste oder die offenen Ports sollte darauf geachtet werden, dass das System eine möglichst geringe Angriffsfläche bietet.

Das Prinzip der minimalen Rechtevergabe muss sowohl für die Entwickler als auch für die Administratoren und Benutzer des Systems beachtet werden. Ein Authentisierungs- und Berechtigungskonzept ist dafür erforderlich, und muss schon in der Design-Phase erstellt werden. Es empfiehlt sich, Rollen für die verschiedenen Zugriffe zu definieren und die Zugriffe auf Systemebene so weit wie möglich einzuschränken. Wichtig dabei ist auch, angemessene Authentisierungs- und Berechtigungsverfahren zu verwenden. Vorgehensweisen, die in Betracht gezogen werden können, sind Zwei-Faktoren-Authentisierung, Sperrfunktionen für Benutzerkonten, Erzwingung von starken Passwörtern, Ablauffristen für Passwörter usw.

Systemabstürze, Ausfälle und Fehler können nicht immer verhindert werden. Daher muss darauf geachtet werden, dass
  • jeder Ausfall zu einem sicheren Zustand des Systems führt,
  • die Konsistenz des Systems und der Daten nach einem Ausfall oder Fehler erhalten bleibt,
  • die Fehlermeldungen beziehungsweise das Verhalten des Systems in solchen Fällen keine sensiblen Informationen verraten oder Angriffsmöglichkeiten bieten,
  • die notwendigen Informationen zur Nachverfolgung der Fehlerursachen protokolliert werden.
Die Ausgabe von programminternen Informationen auf der Benutzeroberfläche sollte immer vermieden werden. Dazu gehört beispielsweise, dass Fehlermeldungen an den Benutzer keine internen Informationen über das Programm, das System oder das Netz verraten dürfen,

Insbesondere bei Web-Anwendungen muss darauf geachtet werden, dass keine sensitiven Informationen über die Internetadresse ( URL ) preisgegeben werden können und dass URL -Manipulationen nicht stattfinden können.

Vertrauliche Informationen müssen bei einer Übertragung und bei der Speicherung ausreichend geschützt werden. Dazu sind bewährte und angemessene Kryptographie-Verfahren einzusetzen. Beispielsweise sollten Passwörter nicht im Klartext übertragen werden und geschützt gespeichert werden.

Um Sicherheitslücken bei neuen Produkten möglichst zu vermeiden, sollten daher alle Entwickler zur Vorbeugung mit den Grundlagen von Informationssicherheit und sicherer Entwicklung vertraut sein. Insbesondere sollten die Entwickler zu Vorgehensweisen zur Vermeidung von typischen Fehlern und Schwachstellen für die verwendete Programmiersprache und das zu entwickelnde System geschult werden (beispielsweise zur Vermeidung von Buffer Overflows).

Allen Entwicklern sollte ihre Verantwortung für die Sicherheit neuer Systeme bewusst gemacht werden.

Prüffragen:

  • Sind die Entwickler zu Sicherheitsaspekten geschult?

Stand: 15. EL Stand 2016