Sicheres Programmieren

Werbung
Sicheres
Programmieren
Einführung in die sichere
Anwendungsentwicklung
SAP Pocketseminar
Fü
De
rE
rs
nt
ch
w
ick
Pr zur nell
le
og s e
r:
ra ich Üb
m er er
m en bl
ie
ick
ru
ng
Herausgegeben für die Sicherheitsinitiative
„Deutschland sicher im Netz“
Sicheres Programmieren · Einführung in die sichere
Anwendungsentwicklung
SAP Pocketseminar
Eine Schriftenreihe der SAP AG
Sicheres
Programmieren
Einführung in die sichere
Anwendungsentwicklung
Bei der Zusammenstellung der Texte, Verweise und Abbildungen wurde mit größter Sorgfalt vorgegangen;
trotzdem ist ein vollständiger Fehlerausschluß nicht möglich. Die nachfolgende Dokumentation erfolgt
daher ohne Gewähr für Richtigkeit und Vollständigkeit der gemachten Angaben, für deren Verifizierung
allein der Anwender die Verantwortung trägt.
SAP übernimmt für aus der Verwendung dieser Dokumentation entstehende Schäden, gleich aus welchem
Rechtsgrund, eine Haftung nur im Falle vorsätzlichen oder grob fahrlässigen Handelns; im übrigen ist die
Haftung von SAP ausgeschlossen. SAP übernimmt keine Verantwortung für die Inhalte von Seiten oder
Veröffentlichungen Dritter, auf welche wir durch Links verweisen.
Copyright by SAP AG 2005
Inhalt
1
2
2.1
2.2
2.3
2.4
2.5
3
3.1
3.2
3.2.1
3.2.2
3.2.3
4
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ziel dieses Leitfadens . . . . . . . . . . . . . . . . . . . . . . . . . .
Sicherheit in der Informationstechnologie . . . . . . . . . .
Angreifer wachsen mit ihren Herausforderungen . . . . .
Softwareentwickler mit Sicherheits-Knowhow . . . . . . .
Anwendungssicherheit als Prozess . . . . . . . . . . . . . . . .
Sicherheitsanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sicherheitsanforderungen . . . . . . . . . . . . . . . . . . . . . .
Datenklassifizierung . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sicherheitsgrad „normal” . . . . . . . . . . . . . . . . . . . . . . .
Sicherheitsgrad „hoch" . . . . . . . . . . . . . . . . . . . . . . . .
Sicherheitsgrad „sehr hoch" . . . . . . . . . . . . . . . . . . . . .
Sicheres Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Grundlegende Anforderungen an das Design . . . . . . . .
Sichere Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Eingabeprüfung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parametermanipulation . . . . . . . . . . . . . . . . . . . . . . . . .
Authentisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Berechtigungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anwendungskonfiguration . . . . . . . . . . . . . . . . . . . . . .
Vertrauliche Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Einsatz von Kryptographie . . . . . . . . . . . . . . . . . . . . . .
Session-Management . . . . . . . . . . . . . . . . . . . . . . . . . .
Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Prinzip der minimalen Rechtevergabe . . . . . . . . . . . . .
Revision und Logging . . . . . . . . . . . . . . . . . . . . . . . . . .
Design Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
7
9
9
9
10
11
11
14
14
15
15
16
16
18
18
20
22
24
25
27
30
32
33
35
36
37
38
40
5
5.1
5.1.1
5.1.2
5.1.3
5.1.4
5.2
5.3
5.4
5.5
5.6
5.7
5.8
6
6.1
6.2
6.3
7
7.1
7.2
7.3
8
9
10
11
12
Sichere Kodierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
„Bewährte” Angriffsvarianten . . . . . . . . . . . . . . . . . . .
Manipulation von Parametern . . . . . . . . . . . . . . . . . . .
Cross-Site Scripting (CSS/XSS) . . . . . . . . . . . . . . . . . . . .
SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Buffer Overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Eingabeprüfung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . .
URI/URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Eingaben über Gerätedateien . . . . . . . . . . . . . . . . . . . .
Einsatz von Kryptographie . . . . . . . . . . . . . . . . . . . . . .
Session-Management . . . . . . . . . . . . . . . . . . . . . . . . . .
Code Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sicheres Testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
White Box Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Black Box Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Zertifizierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Auslieferung und Wartung . . . . . . . . . . . . . . . . . . . . . .
Sichere Standardkonfiguration . . . . . . . . . . . . . . . . . . .
Wartungsplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Patch-Management und Bug-Fixing . . . . . . . . . . . . . . .
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Abkürzungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Abbildungsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . .
Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
41
41
41
41
42
43
43
46
46
47
48
50
52
54
54
56
56
57
57
58
58
60
61
63
64
65
1
Vorwort
IT-Sicherheit hat sich lange Zeit vorwiegend mit InfrastrukturThemen wie Netzwerkarchitektur und Firewalls, verschlüsselten
Datenleitungen und dem Schutz vor Viren und Würmern beschäftigt. Der Hauptgrund dafür ist, dass die Angreifer sich fast ausschließlich in diesen Techniken auskannten. Doch zunehmend
rücken die Anwendungen selbst in das Interesse der Hacker, und
zusätzliche Schutzmechanismen sind entweder noch nicht ausgereift – wenngleich auch schon hilfreich, wie etwa Application
Level Firewalls – oder einfach nicht in der Lage, alle Angriffe abzuwehren. Dementsprechend kommt der Sicherheit der Applikation
immer mehr Bedeutung zu. Dabei stehen nicht die vorhandenen
Sicherheitsfunktionen, sondern vielmehr die Qualität der Software
im Hinblick auf Robustheit gegen Angriffe, meist vereinfacht
„Sicheres Programmieren“ genannt, im Mittelpunkt des Interesses.
Dieser Leitfaden soll eine erste Hilfestellung zum Thema sichere
Entwicklung für Software-Bauer jeder Art, etwa Architekten, Programmierer oder Tester, darstellen. Er ist anlässlich der Initiative
„Deutschland sicher im Netz“ im Jahr 2005 entstanden und hat
den Anspruch, die internen Richtlinien von Microsoft und SAP auf
wenigen Seiten verständlich und in allgemeiner Form wiederzugeben.
7
2
Einleitung
2.1
Ziel dieses Leitfadens
Ziel dieses Leitfadens ist es, Softwareentwicklern eine Informationssammlung für das Programmieren sicherer Anwendungen an
die Hand zu geben. Er soll Entwickler während der Design- und
Implementierungsphase unterstützen, gleichzeitig aber auch ihren
Auftraggebern als Kontrollwerkzeug dienen: Anhand der hier
beschriebenen Prinzipien lässt sich überprüfen, ob das Produkt
allen aktuellen Sicherheitsanforderungen genügt.
Entwickler sollten
I festlegen, welche der hier beschriebenen Sicherheitsaspekte
für ihre Anwendung relevant sind. So ist zum Beispiel eine
Web-basierte Anwendung, der keine Datenbank zugrunde liegt,
nicht anfällig für SQL Injections.
I ihr Vorgehen mit ihrem Auftraggeber besprechen und gemeinsam ein Sicherheitskonzept für die zu erstellende Software
erarbeiten.
Die hier beschriebenen Regeln gelten für jede Art von Anwendung.
Web-Anwendungen bieten jedoch aufgrund ihrer Architektur und
Exponiertheit im Internet eine breitere Angriffsfläche als andere
Software. Viele Beispiele und Beschreibungen sind daher speziell
auf Web-basierte Applikationen zugeschnitten.
2.2
Sicherheit in der Informationstechnologie
Unter Sicherheit versteht man in der Informationstechnologie die
Gewährleistung folgender Aspekte, die im Englischen als „CIA“Prinzip (Confidentiality, Integrity, Availability), im Deutschen als
„VIV-Dreieck“ bezeichnet werden:
9
Vertraulichkeit: Das System stellt seine Daten ausschließlich einer
zuvor definierten Gruppe von Benutzern zur Verfügung und
gewährleistet so ihre Vertraulichkeit. Nur Personen mit entsprechender Berechtigung dürfen in der Lage sein, kritische Daten
einzusehen. Die Vertraulichkeit von Daten hat rechtliche und wirtschaftliche Implikationen: In den meisten Ländern wird der Schutz
von Personendaten durch die nationale Gesetzgebung geregelt.
Wenn jedoch beispielsweise vertrauliche Finanzinformationen oder
Forschungsergebnisse eines Unternehmens der Konkurrenz in die
Hände fallen, kann dies auch weit reichende wirtschaftliche Konsequenzen nach sich ziehen.
Integrität: Das System kann die unberechtigte Manipulation von
Daten erkennen und/oder verhindern.
Verfügbarkeit: Das zentrale Sicherheitsziel jedes IT-Systems ist die
Verfügbarkeit. Anwendungen müssen funktionieren, auch wenn ein
unerwarteter Vorfall Probleme bereitet. Da Geschäftsprozesse in
verstärktem Maß computergesteuert ablaufen, werden Systemausfallzeiten immer teurer. Die Verfügbarkeit eines Systems erhöht
sich, wenn eine Störung des Systembetriebs durch unberechtigten
Datenzugriff bzw. die böswillige Manipulation von Daten weitestgehend verhindert werden kann.
2.3
Angreifer wachsen mit ihren
Herausforderungen
Noch vor wenigen Jahren richteten sich die meisten Hacker-Angriffe
gegen Systeminfrastrukturen. Denial-of-Service-Angriffe, die darauf
abzielen, Server von der Bearbeitung eingehender Anfragen abzuhalten, gehörten zu den am häufigsten eingesetzten Taktiken.
Heutzutage haben Hacker auch andere Komponenten im Visier. Mit
Methoden wie Code Injections oder Cross-Site Scripting zielen sie
verstärkt auf die Software und die dahinter liegenden Daten ab.
10
Bisher gebräuchliche Infrastruktur-Sicherheitsmechanismen wie
Firewalls, Virenscanner und Intrusion-Detection-Systeme sind nach
wie vor wichtig, reichen aber längst nicht mehr aus, um alle Gefahren abzuwenden. Sie sind machtlos bei Angriffen auf die WebAnwendungen selbst. Hier sind neue Strategien gefragt, die in alle
Phasen des Software-Entwicklungsprozesses – Analyse, Design,
Programmierung, Test, Auslieferung und Wartung – hineinreichen.
2.4
Softwareentwickler mit Sicherheits-Knowhow
Vor diesem Hintergrund sehen sich Softwareentwickler mit neuen
Herausforderungen konfrontiert. Mit „Sicheres Programmieren“
möchten wir Ihnen eine Anleitung zur sicheren Softwareerstellung
während des gesamten Entwicklungsprozesses, angefangen bei der
Analyse bis hin zu Tests und Integration, an die Hand geben.
Web-Applikationen sind am stärksten gefährdet; jeder Softwareentwickler sollte die wichtigsten Gefahrenfaktoren solcher Anwendungen kennen. Die Ziele der Produktentwicklung, Funktion und
Qualität, müssen durch das ebenso wichtige Ziel Sicherheit ergänzt
werden.
Der Erfolg eines Hackers liegt meist nicht nur an ausgetüftelten
Angriffsmethoden, sondern basiert zu großen Teilen auf dem
geschickten Ausnutzen von Programmierschwachstellen. Ein
geschärftes Sicherheitsbewusstsein bei der Softwareentwicklung ist
daher meist effektiver als teure Technologie zum Schutz gegen
Hacker.
2.5
Anwendungssicherheit als Prozess
Anwendungssicherheit umfasst den gesamten Lebenszyklus einer
Software. Neben den bereits erwähnten Phasen der Softwareentwicklung spielen auch die Wartung, Änderungsanträge, Rechteverwaltung, Backup und die Systemwiederherstellung im Versagensfall eine wichtige Rolle.
11
Hacker lernen täglich dazu. Sie verfeinern ihre Angriffsmethoden und
suchen neue, lohnenswerte Ziele. Sicherheitsverfahren müssen daher
ebenfalls ständig aktualisiert und weiterentwickelt werden – nur so
können Sie das Rennen gegen die Angreifer gewinnen.
Anwendungssicherheit ergibt sich aus einem Zusammenspiel
verschiedener Faktoren:
1. Bei allen am Projekt beteiligten Personen muss ein Bewusstsein
für die Risiken der Anwendung geschaffen werden.
2. Sicherheit muss in allen Phasen der Softwareentwicklung und
-wartung berücksichtigt werden.
3. Sicherheit muss als unverzichtbares Qualitätsmerkmal einer Software angesehen werden.
4. Der Sicherheitsprozess sollte regelmäßig auf Aktualität und Funktion überprüft werden.
5. Sicherheitsrelevante Vorfälle und Angriffe sollten als Chance zur
Verbesserung des Sicherheitsprozesses begriffen werden.
Um eine sichere Anwendung zu entwickeln, muss das Thema
Sicherheit in allen Abschnitten des Projekts berücksichtigt werden.
Scheuen Sie sich nicht, einen Experten zu Rate zu ziehen. Die
Sicherheit der gesamten Anwendung ist gefährdet, wenn in nur einer
Phase Sicherheitslücken entstehen.
Definieren Sie Sicherheit als Teil der funktionalen und technischen Anforderungen Ihrer Anwendung. Legen Sie zuerst die Anforderungen
fest, und integrieren Sie die Sicherheitsaspekte bereits in die Analyseund Design-Phase. Die meisten konzeptionellen Probleme können zu
diesem Zeitpunkt noch verhindert werden; eine spätere Behebung von
Sicherheitslücken kann im Gegensatz dazu sehr kostspielig werden.
Behalten Sie Ihre Sicherheitsmechanismen im Auge, wenn Ihre
Software produktiv genutzt wird. So können Sie rasch auf neue
Gefahren und Angriffsmethoden reagieren.
12
SicherheitsReview des
Designs
Testfälle
festlegen
ThreadAnalyse
Analyse
Design
Kodierung
Sicherheitsschulungen
für Teammitglieder
Sicherheits
richtlinie
Technische
Revision
Kontinuierliche
Verbesserung
Testen
Auslieferung
und Wartung
Sicherheitskonzept
Hosting-Konzept
Code Review
Sichere Entwicklungsverfahren
und Best Practices
Richtlinien für den Produktivbetrieb
Signieren von Code
Entfernen von Debugging-Informationen
Integration bei Hosting-Anbieter
Abbildung 1: Sicherheit bei der Softwareentwicklung
I
I
I
I
I
Folgeprojekte
Sicherheitsbewusstsein
schaffen
Analyse
– Definieren Sie die Sicherheitsziele ihres Produkts
Design
– Sichere Anwendungsarchitektur
– Design Review
Kodierung
– Sicheres Kodieren
– Code Review
Testphase
– Angriffssimulationen
Auslieferung und Wartung
– Sichere Standardkonfiguration
– Wartungsplan
– Zeiträume für das Patch-Management
– Kriterien für die Fehlerbehebung (Bug-Fixing), besonders bei
sicherheitsrelevanten Fehlern
Jede Entwicklungsmethode, wie z. B. das Wasserfallmodell oder
„Extreme Programming”, umfasst Aufgaben, die auf diese Phasen
abgebildet werden können.
13
3
Sicherheitsanalyse
Wie in anderen kritischen betriebswirtschaftlichen Vorgängen,
spielen auch bei Sicherheitsprozessen Risikoanalyse und Risikomanagement eine wichtige Rolle. Unter Risikoanalyse versteht man
das Identifizieren der wichtigsten Informationswerte eines Unternehmens sowie die Untersuchung ihrer Verwendung und Funktion.
3.1
Sicherheitsanforderungen
Wenn Sie sichere Software entwickeln wollen, müssen Sie zunächst
definieren, WAS sie schützen möchten, vor WEM Sie es schützen
müssen und WIE dieser Schutz aussehen soll.
Die Zielgruppe und die sich daraus ergebenden Sicherheitsanforderungen müssen bereits zu Beginn des Prozesses festgelegt
werden. Beim Sammeln der Entwicklungsanforderungen können
sicherheitsbezogene Fragen während der Gespräche mit dem
Auftraggeber helfen, die Benutzerrollen, Rechte und Anforderungen
im Detail zu verstehen.
Definieren Sie die Sicherheitsziele für Ihr Produkt:
I Wer ist die Zielgruppe des Produkts?
I Welche Bedeutung hat Sicherheit für diese Zielgruppe?
I Können mehrere Benutzergruppen unterschieden werden?
Müssen alle Benutzer Zugriff auf alle Daten haben? Sollten alle
Benutzer die Berechtigung haben, alle Funktionen der Anwendung auszuführen?
I Was muss geschützt werden?
I Wer wird die Anwendung verwalten? Wer wird dafür verantwortlich sein und wer die Zugriffsrechte vergeben?
I Was würde passieren, wenn in der Anwendung genutzte Daten
in falsche Hände gelangen?
I Wie lang darf die Ausfallzeit der Anwendung maximal sein?
14
Anwendungsszenarien werden üblicherweise in Zusammenarbeit
mit Experten für den Funktionsbereich der Anwendung erstellt, um
Anforderungen zu sammeln. Sicherheit sollte als Geschäftsprozess
betrachtet und entsprechend in die Modellierung einbezogen werden. Jedes Szenario sollte Informationen darüber enthalten, wie der
Prozess Sicherheit gewährleistet.
Bestimmte Regeln können jedoch nicht als Prozess abgebildet
werden, z. B. die Passwortrichtlinie. Solche Themen sollten bei der
Sammlung der Anforderungen nicht außer Acht gelassen werden;
sie können separat oder als eigenes Szenario dokumentiert werden.
Auch bei der Auswahl von Entwicklungswerkzeugen, Bibliotheken
oder Entwicklungsumgebungen sollten Sie Sicherheitsaspekte in
Ihre Auswahlkriterien einfließen lassen.
3.2
Datenklassifizierung
Entsprechend der jeweiligen Sicherheitsanforderungen können
Daten unterschiedlich klassifiziert werden. In diesem Kapitel finden
Sie Vorschläge, die Sie beim Festlegen des erforderlichen Sicherheitsgrads unterstützen sollen. Die zentrale Fragestellung ist: Was
sind die Konsequenzen, wenn Daten manipuliert werden oder in
falsche Hände gelangen?
3.2.1 Sicherheitsgrad „normal”
I
I
I
Verstöße gegen Gesetze, Verträge oder andere Regelwerke würden keine schwerwiegende Konsequenzen und lediglich geringe Strafen nach sich ziehen.
Ein Datenmissbrauch hätte minimale soziale bzw. finanzielle
Auswirkungen auf die betroffenen Personen.
Es kann praktisch ausgeschlossen werden, dass Menschen verletzt werden.
15
I
I
I
Die Auswirkungen eines sicherheitsrelevanten Vorfalls auf Ihre
Arbeit werden von den betroffenen Personen als gering eingeschätzt.
Bei einem Sicherheitsproblem ist nur eine geringfügige rufschädigende Wirkung für das Unternehmen zu erwarten.
Die finanziellen Verluste für das Unternehmen im Fall eines
Sicherheitsverstoßes wären gering.
3.2.2 Sicherheitsgrad „hoch"
I
I
I
I
I
I
Verstöße gegen Gesetze, Verträge oder andere Regelwerke würden schwerwiegende Konsequenzen und hohe Strafen nach
sich ziehen.
Ein Datenmissbrauch hätte schwerwiegende Folgen für den
Schutz von Personendaten.
Es kann nicht ausgeschlossen werden, dass Menschen verletzt
werden.
Die Auswirkungen eines sicherheitsrelevanten Vorfalls auf Ihre
Arbeit werden von einigen betroffenen Personen als unzumutbar eingeschätzt.
Bei einem Sicherheitsproblem ist eine rufschädigende Wirkung
für das Unternehmen zu erwarten.
Die finanziellen Verluste für das Unternehmen im Fall eines
Sicherheitsverstoßes wären hoch, aber nicht existenzbedrohend.
3.2.3 Sicherheitsgrad „sehr hoch"
I
I
I
Verstöße gegen Gesetze, Verträge oder andere Regelwerke würden existenzbedrohende Konsequenzen nach sich ziehen.
Datenmissbrauch hätte extrem schwerwiegende Folgen für den
Schutz von Personendaten.
Ein Sicherheitsvorfall würde den sozialen oder finanziellen Ruin
für die betroffenen Personen bedeuten.
16
I
I
I
I
Es besteht die Gefahr schwerer Verletzungen bzw. lebensbedrohlicher Situationen.
Die Auswirkungen eines sicherheitsrelevanten Vorfalls auf Ihre
Arbeit werden von allen betroffenen Personen als unzumutbar
eingeschätzt.
Bei einem Sicherheitsproblem ist eine gravierende, möglicherweise existenzbedrohende Rufschädigung für das Unternehmen
zu erwarten.
Die finanziellen Verluste für das Unternehmen im Fall eines
Sicherheitsverstoßes wären existenzbedrohend.
Die höchste Klassifizierung, die Sie für einen Teilbereich Ihres Projekts wählen, bestimmt den Schutzbedarf der gesamten Anwendung. Dementsprechend sind auch die Schutzmechanismen auszuwählen.
17
4
Sicheres Design
4.1
Grundlegende Anforderungen an das Design
Die folgenden Grundregeln sollten Sie unabhängig von Implementierungstechnologie und Anwendungsszenario befolgen.
Sorgen Sie für Sicherheit im Versagensfall
Wenn Ihre Anwendung abstürzt, dürfen keine vertraulichen Daten
preisgegeben werden. Verfassen Sie eine aussagekräftige, aber allgemein formulierte Fehlermeldung. Sie darf keine internen Systeminformationen enthalten, die einem Angreifer eventuelle Schwachstellen in Ihrer Anwendung aufzeigen würden.
Vertrauen Sie nicht auf „Security by Obscurity“
Der Versuch, durch Vertuschen von Schwachstellen die Sicherheit
Ihrer Anwendung zu verbessern, kann langfristig nicht funktionieren – und auch die kurzfristige Wirkung ist keinesfalls garantiert.
In der Vergangenheit wurden viele, solcher vermeintlich geschützten
Systeme erfolgreich angegriffen.
Handeln Sie nach dem Prinzip der minimalen Rechtevergabe
Verfahren Sie nach dem Prinzip der minimalen Rechtevergabe: Verwenden Sie Benutzerkonten mit den geringstmöglichen Privilegien
und Zugriffsrechten.
Bauen Sie mehrere Verteidigungsmechanismen ein
Verwenden Sie mehr als einen Sicherheitsmechanismus. Bedenken
Sie, dass eines Ihrer Verfahren geknackt werden könnte.
18
Vertrauen Sie keiner Benutzereingabe
Seien Sie misstrauisch. Gehen Sie davon aus, dass jede Dateneingabe böswillig ist bis das Gegenteil bewiesen ist. Implementieren
Sie eine Validierung der Eingaben, sobald ein Übergang zwischen
Vertrauensbereichen Ihrer Anwendung vorliegt (beispielsweise zwischen Client- und Serverseite).
Prüfen Sie beim ersten Zugang
Führen Sie bei der ersten Zugangsmöglichkeit zur Anwendung
Authentisierung und Berechtigungsprüfung durch.
Stärken Sie das schwächste Glied
Sie müssen wissen, welches das schwächste Glied in Ihrer Kette ist
und wie Sie es stärken können. Arbeiten Sie sich Schritt für Schritt
vor, indem Sie nach dem jeweils neuen schwächsten Glied suchen.
Betreiben Sie Schadensbegrenzung
Wie kann eine Schadensbegrenzung aussehen? Wenn ein Angreifer
Zugang zu Ihrer Anwendung bekommt, auf welche Ressourcen
kann er dann zugreifen? Das Prinzip der minimalen Rechtevergabe
für Benutzer und Prozesse kann bei der Verhinderung weiteren
Schadens helfen.
Implementieren Sie sichere Standardeinstellungen
Werden vertrauliche Informationen an den Client gemeldet, wenn
Ihre Anwendung versagt? Folgt das Standardbenutzerkonto dem
Prinzip der minimalen Rechtevergabe? Ist es initial abgeschaltet
und muss bei Bedarf explizit aktiviert werden?
Bieten Sie eine möglichst geringe Angriffsfläche
Hat Ihr System Services oder Ports, die nicht benutzt werden? Bietet
Ihre Anwendung Funktionen, die nicht benötigt werden? Entfernen
oder deaktivieren Sie diese und verkleinern Sie so die Angriffsfläche
Ihrer Applikation.
19
Vermeiden Sie eine Überlastung Ihrer Anwendung
Stellen Sie den Betrieb Ihrer Anwendung auch dann sicher, wenn
eine große Anzahl von Anfragen, Transaktionen und/oder ein hohes
Aufkommen an Netzwerkverkehr bewältigt werden muss. Ziehen
Sie eine defensive Umverteilung der Ressourcen in Betracht:
I Verwenden Sie Thread Pooling, um die maximale Anzahl von
Threads, die einer Benutzer-Session zugeordnet werden können, zu limitieren.
I Beschränken Sie die Anzahl von Datenbankverbindungen, die
für Benutzer-Sessions zur Verfügung stehen.
I Beschränken Sie die Anzahl gleichzeitiger Sessions für einen
Benutzer. Dies gilt besonders für Gastkonten.
I Legen Sie Quoten für den Gebrauch von Ressourcen fest,
wie z. B. Verzeichniszugriff, Speicherzuordnung oder Prozessorgebrauch.
4.2
Sichere Architektur
Neuere Anwendungen, im Folgenden als Web-Anwendungen
bezeichnet, basieren meist auf dem zustandslosen („stateless“)
HTTP-Protokoll. Daher muss eine Anwendung in der Lage sein, mit
Hilfe eines Session-Managements nachfolgende Anfragen einem
einmal authentisierten Benutzer zuzuordnen. Alle Berechtigungsentscheidungen, die nach der initialen Authentisierung erfolgen,
basieren auf der Identität des Benutzers und somit der Session-ID.
Daher ist es besonders wichtig, dass der Authentisierungsprozess
selbst sicher ist; auch der Mechanismus für die Verwaltung der
Benutzer-Session, der den authentisierten Benutzer überwacht,
muss gut geschützt sein. Daneben kommt auch der Verhinderung
von Parametermanipulationen und der Offenlegung vertraulicher
Daten besondere Bedeutung zu.
20
Verhindern von
SessionManipulationen
Authentisierung
Sichere
Konfiguration
Verhindern von
Parametermanipulation
Revision und Protokollierung
von Aktivitäten und
Transaktionen
Eingabeprüfung
AppServer
Schutz von
vertraulichen
Daten
Fehlerhandhabung
WebServer
Benutzerauthentisierung
Verbindungstrennung nach
vorgegebener
Zeit
DB-Server
Verschlüsselung
vertraulicher
Daten
Abbildung 2: Sichere Softwarearchitektur
So genannte „Service-oriented Architectures (SOA)” basieren auf
dem Prinzip des „Distributed Computing”, bei dem Anwendungsfunktionen als konfigurierbares Bündel von geschäftsprozessorientierten Services zur Verfügung gestellt werden, um eine möglichst
hohe Anpassungsfähigkeit zu gewährleisten.
Hier sichert das Session-Management ausschließlich den Kontakt
zwischen Benutzer und Web-Oberfläche, etwa einem Portal.
Darüber hinaus kommt dem Berechtigungsverfahren besondere
Bedeutung zu, denn die angebotenen Services können auf unterschiedlichen Plattformen mit eigenen Benutzerverwaltungs- und
Sicherheitsrichtlinien liegen; bei streng serviceorientierten Applikationen ist sogar häufig keine lokale Benutzerverwaltung mehr vorhanden.
21
Aus diesem Grund muss das Unternehmen eine zentrale Benutzerverwaltung bereitstellen, die den Zugriff auf alle Komponenten
regelt und die Sicherheit der Anwendungen gewährleistet. Es
müssen Sicherheitsrichtlinien erstellt werden, die auch externe
Benutzer umfassen. Sicherheit muss sich an Schichten und Hierarchien orientieren und zentral verwaltet werden.
Im Hinblick auf die Verfügbarkeit ist ein verteiltes System generell
angreifbarer. Funktioniert eine zentrale Verwaltungskomponente
nicht, liegt das gesamte System still. Ein Redundanzkonzept kann
sinnvoll sein, ist jedoch aufwendig.
Auch in Bezug auf die Datenintegrität bieten verteilte Systeme
mehr Angriffsmöglichkeiten.
4.3
Eingabeprüfung
Cross-Site Scripting (XSS), SQL Injections, Buffer Overflows und
andere Angriffe, die auf Benutzereingaben basieren, können durch
die Überprüfung aller eingegebenen Daten verhindert werden.
Beachten Sie die folgenden Regeln:
Vertrauen Sie keiner Benutzereingabe
Gehen Sie immer davon aus, dass eine Dateneingabe böswillig ist
bis das Gegenteil bewiesen ist. Unabhängig davon, ob die Eingaben
von einem Benutzer, einem Service, einem File Share oder einer
Datenbank kommen; prüfen Sie die Eingaben, wenn die Eingabequelle außerhalb des jeweiligen Vertrauensbereichs liegt.
Zentralisieren Sie die Prüfung
Die Strategie zur Validierung von Benutzereingaben ist ein grundlegender Bestandteil Ihres Anwendungsdesigns. Implementieren Sie
zentrale Funktionen für die Prüfung von Eingaben. So können Sie
22
sicherstellen, dass die Validierungsregeln konsistent umgesetzt
werden; zudem reduzieren Sie den Entwicklungsaufwand und vereinfachen die Wartung.
Validieren Sie unbedingt auf Serverseite
Der Client kann einfach umgangen werden; auch der Client-seitige
Script-Code kann schnell manipuliert oder abgeschaltet werden.
Verlassen Sie sich nicht auf eine Prüfung am Client. Der Server sollte eine eigene Validierung aller Eingaben vornehmen.
Validierung von Dateipfad und URL
Konvertieren Sie Parameter in eine kanonische Form, bevor sie
validiert und gefiltert werden.
Beispiel: Der folgende String enthält Datei- und Pfadnamen in ihrer
Grundform:
c:\data\anyfile.htm
Auch der folgende String könnte auf diese Datei, anyfile.htm, verweisen:
I c:\data\sub\..\anyfile.htm
I c:\ data\ anyfile.htm
I ..\anyfile.htm
I c%3A%5Cdata%5Csub%5C%
I 2E%2E%5-Canyfile.htm
Konzipieren Sie Ihre Anwendungen so, dass diese keine Dateinamen
und ähnliche Eingaben von Benutzern benötigen. Sollte dies unumgänglich sein, müssen sie in kanonischer Form vorliegen, bevor
sicherheitsrelevante Entscheidungen wie beispielsweise das
Gewähren eines Zugriffs auf bestimmte Ressourcen, getroffen werden.
23
Validieren, ablehnen, säubern
Eine effektive Strategie zur Prüfung von Eingaben sollte den folgenden Prinzipien unterliegen:
I Prüfen Sie alle Daten auf Art, Länge, Format und Auswahlbereich.
I Akzeptieren Sie nur Eingaben, die diese Prüfung bestanden
haben.
I Entfernen Sie schädliche Daten aus den Eingaben.
4.4
Parametermanipulation
Mit Hilfe eines (Client-seitigen) Proxy zwischen Client (Browser)
und (Web-) Anwendung ist es für einen Angreifer einfach, Anfragedaten wie Query-Strings, Formularfelder, Cookies oder HTTPHeader zu manipulieren, bevor sie zum Server geschickt werden.
Die folgenden Verfahren schützen Ihre Anwendung vor Angriffen
durch Parametermanipulation:
Prüfen Sie alle Daten, die vom Client kommen
Schränken Sie die Anzahl der Felder ein, die der Benutzer ändern
kann. Prüfen Sie alle Werte, die der Client übermittelt. Vordefinierte
Werte, beispielsweise in Form von Listen, können geändert werden;
lassen Sie nur Werte zu, die Sie zuvor definiert haben.
Verschlüsseln und signieren Sie vertrauliche Daten
Vertrauliche Daten, etwa zum Identifizieren einer Session, zur
Berechtigungsprüfung auf Serverseite oder vertrauliche Benutzerdaten in Client-seitigen Cookies bzw. dynamisch generierten
Webseiten sollten verschlüsselt und digital signiert werden, damit
sie nicht gelesen oder manipuliert werden können.
Prüfen Sie Informationen aus dem HTTP-Header
HTTP-Header werden in HTTP-Anfragen und -Antworten mitgeschickt. Header-Informationen sind für einen Angreifer einfach zu
24
manipulieren; stellen Sie sicher, dass keine ungeprüften HeaderInformationen weiterverarbeitet werden, insbesondere keine
Benutzernamen oder gar Passwörter.
4.5
Authentisierung
Ein Authentisierungsverfahren garantiert, dass ein Benutzer oder
Prozess derjenige ist, für den er sich ausgibt.
Üblicherweise authentisiert sich ein Benutzer mit Hilfe von
Benutzername und Passwort. Für Anwendungen mit hohen Sicherheitsanforderungen reicht diese Art der Authentisierung jedoch
nicht aus. Die Kombination von Wissen (Passwort) und Besitz
(z. B. Beiner Smartcard) bietet stärkeren Schutz. Andere Verfahren
sind Einmalpasswörter oder digitale Zertifikate auf Smartcards bzw.
anderen Tokens. Auch biometrische Verfahren wie Fingerabdruck
oder Iris-Scan sind bereits verbreitet.
Die zusätzlichen Ausgaben für solche Hardware-gestützten
Lösungen können im Notfall hohe Kosten vermeiden.
Verwenden Sie Sperrfunktionen für Benutzerkonten
Ziehen Sie in Erwägung, eine Sperrfunktion einzubauen, die das
Konto eines Benutzers automatisch nach einer vorgegebenen
Anzahl fehlgeschlagener Anmeldeversuche sperrt. Das Sperren von
Benutzerkonten ist die grundlegende Verteidigung gegen sogenannte Brute-Force-Angriffe.
Sperren Sie Benutzerkonten für kurze Zeit und protokollieren Sie die
Ereignisse in einer Log-Datei, wenn die Anmeldung mehrere Male
fehlgeschlagen ist. Beachten Sie jedoch, dass eine solche Kontensperrungsstrategie auch ausgenutzt werden kann, um Denial-ofService-Angriffe zu starten.
25
Setzen Sie eine Ablauffrist für Passwörter
Passwörter sollten regelmäßig geändert werden; richten Sie zu
diesem Zweck einen Ablaufmechanismus ein.
Implementieren Sie ein Verfahren zur Sperrung
von Benutzerkonten
Hat ein Angreifer Ihr System erfolgreich gehackt, müssen Sie zur
Schadensbegrenzung in der Lage sein, schnell zu reagieren und
Benutzerkonten zu sperren.
Speichern Sie keine Passwörter bei den Benutzerdaten
Zum Verifizieren von Passwörtern reicht es aus, diese in Form eines
Einweg-Hash-Werts zu speichern.
Akzeptieren Sie nur starke Passwörter
Implementieren Sie eine Passwortrichtlinie. Generelle Regeln sind:
Passwörter sollten mindestens 8 Zeichen lang sein und sowohl
Klein- als auch Großbuchstaben, Zahlen und Sonderzeichen enthalten. Bieten Sie ein Verfahren zum Testen von Passwörtern an.
Übermitteln Sie Passwörter nicht im Klartext
Schicken Sie Passwörter nicht im Klartext über das Netz. Sichern Sie
Ihre Kommunikationskanäle, z. B. durch die Verwendung von SSL
zur Verschlüsselung von HTTP-Verbindungen.
Schützen Sie Cookies, die der Authentisierung dienen
Ein gestohlenes Authentisierungs-Cookie ist gleichbedeutend mit
einer gestohlenen Identität. Schützen Sie Cookies mit Hilfe von
verschlüsselten Datenkanälen. Beschränken Sie außerdem die
Gültigkeitsdauer eines Authentisierungstickets. So können Sie die
Gefahr des Spoofing verringern: Dem Angreifer bleibt weniger Zeit,
ein gestohlenes Cookie böswillig einzusetzen.
26
Trennen Sie öffentliche und geschlossene Bereiche
Ein öffentlicher Bereich Ihrer Website kann anonym von jedem
beliebigen Benutzer besucht werden. Geschlossene Bereiche können nur von bekannten Benutzern nach vorheriger Authentisierung
aufgerufen werden. Durch das Aufteilen einer Einzelhandelsseite
in einen öffentlichen und einen geschlossen Bereich können Sie
beispielsweise unterschiedliche Authentisierungs- und Berechtigungsregeln anwenden und die Nutzung von SSL einschränken.
4.6
Berechtigungen
Berechtigungen legen fest, was ein authentisierter Benutzer tun
kann und auf welche Ressourcen er zugreifen darf. Ein schwaches
Berechtigungsverfahren ist gefährlich, weil ein Angreifer vertrauliche Daten problemlos einsehen und manipulieren kann. Legen Sie
daher besonderen Wert auf Ihre Berechtigungsstrategie.
Bauen Sie mehrere Verteidigungsmechanismen ein
Wenn Sie nur einen Sicherheitsmechanismus implementieren,
gehen Sie ein hohes Risiko ein. Entdeckt ein Angreifer diesen
Schwachpunkt, ist das gesamte System in Gefahr. Daher verstärkt
jeder zusätzliche Mechanismus, der an einem anderen Punkt
ansetzt, die Sicherheit des gesamten Systems.
Ein Beispiel: Die Web-Permissions des Web-Servers gelten unabhängig vom Benutzer für alle Ressourcen, die über das HTTPProtokoll angefordert werden. Sie bieten keinen Schutz, wenn ein
Angreifer es geschafft hat, sich am Server anzumelden. Nutzen Sie
zusätzlich Berechtigungen auf Dateiebene, um den Zugriff des
Webservers auf die notwendigen Dateien zu begrenzen.
27
Schränken Sie den Ressourcenzugriff auf Systemebene ein
Verwenden Sie Access Control Lists (ACLs), um den Ressourcenzugriff auf Systemebene einzuschränken. Dazu gehören beispielsweise Dateien, Ordner, Geräte im Netz, Datenbankobjekte oder
Ereignisprotokolle. Legen Sie fest, welche Benutzer welche Ressourcen nutzen können und welche Art von Nutzung vorgesehen ist.
Dies gilt besonders für anonyme Internet-Benutzerkonten; sichern
Sie diese mit ACLs, die den Zugriff speziell für anonyme Benutzer
einschränken.
Legen Sie die Granularität der Berechtigungen für den
Ressourcenzugriff fest – Zugriff über Rollen
Die Entscheidung über das Zugriffsrecht basiert auf der Rolle des
Aufrufenden, der ein Benutzer oder ein System sein kann. Die
Aufrufer werden auf Anwendungsebene (Middle-Tier) auf Rollen
abgebildet; der Zugriff auf Programm-Module hängt von der
Zugehörigkeit zu bestimmten Rollen ab. Der nachfolgende Zugriff
auf Ressourcen erfolgt mit Hilfe einer vorgegebenen Anzahl von
Identitäten, die in Verbindung mit der Rollenzugehörigkeit des Aufrufers stehen. Der Vorteil dieser Methode liegt darin, dass die
Berechtigungen, die jeder Rolle zugeordnet sind, einer festen Anzahl von Datenbankkonten zugeordnet werden können. Connection
Pooling kann nach wie vor genutzt werden.
Weitere Informationen finden Sie im Kapitel Revision und Logging.
28
☺
Web- / App-Server
1
☺
2
☺
3
Vertrauensbereich
Rolle A
ID des
vertrauenswürdigen
Service A
Rolle B
ID des
vertrauenswürdigen
Service B
☺
DB-Server
ID 1 & 2 mit
unterschiedlichen
Rechten
4
Abbildung 3: Rollenbasierter Zugriff
Zugriff über „Impersonation“
Ein feingranularer Ansatz kann über das Prinzip der „Impersonation” erzielt werden. Ressourcen werden mit Hilfe des Sicherheitskontexts einem Betriebssystembenutzer zugeordnet. Dieser
Ansatz kann sinnvoll sein, wenn Ihre Anwendung Zugriffsrechte
primär auf benutzerspezifische Ressourcen vergibt. Der Vorteil des
Verfahrens besteht darin, dass (abhängig vom Host-Betriebssystem
und der Entwicklungsumgebung) eine Revision auf Betriebssystemebene möglich ist, weil der Sicherheitskontext hier bekannt
ist. Ein Nachteil liegt in der geringen Skalierbarkeit, weil ein effektives Connection Pooling für den Datenbankzugriff nicht möglich
ist. Impersonation wird daher meist in Intranet-basierten Anwendungen, die in ihrer Reichweite begrenzt sind, eingesetzt.
Web- / App-Server
☺
Vertrauensbereich
1
1
☺
2
☺
2
Impersonation/
Delegation
3
3
☺
4
4
Abbildung 4: Zugriff über Impersonations
29
DB-Server
Zugriff über eine Pool-Identität
Die am wenigsten granulare, aber am besten skalierbare Methode
ist die Steuerung des Ressourcenzugriffs über eine Pool-Identität.
Unabhängig vom tatsächlichen Benutzer sind der Pool-Identität
immer dieselben Berechtigungen zugewiesen. Das primäre Berechtigungsverfahren läuft im Middle-Tier des Systems auf der Basis von
Rollen ab: Hier werden Benutzer mit gleichen Privilegien in einer
Sammelrolle zusammengefasst. Dieses Verfahren unterstützt
Datenbank-Connection-Pooling.
Web- / App-Server
☺
Vertrauensbereich
☺
2
☺
Rollenbasierte
Berechtigungen
DB-Server
Datenbank
vertraut dem
Web/App-Server
1
ID des
vertrauenswürdigen
Service
3
☺
4
Abbildung 5: Zugriff über eine Pool-Identität
4.7
Anwendungskonfiguration
Bei der Konfiguration Ihrer Anwendung sollten Sie besondere
Vorsicht walten lassen, denn im schlimmsten Fall eines erfolgreichen Angriffs verschafft sich der Angreifer Administratorrechte
für das System. Die meisten Anwendungen benötigen spezielle
Schnittstellen für Administratoren und Entwickler, die Benutzerkonten und -profile sowie die Inhalte von Webseiten verwalten.
Im Fall einer Remote-Administration müssen diese Schnittstellen
besonders gesichert werden. Beachten Sie einige grundlegende
Aspekte für die sichere Konfiguration Ihrer Anwendung:
30
Sichern Sie die Konfigurationsschnittstellen
Stellen Sie sicher, dass die Funktionen zur Konfiguration Ihrer
Anwendung nur berechtigten Benutzern zur Verfügung gestellt
werden. Setzen Sie hier eine starke Authentisierung ein, beispielsweise über Zertifikate. Wenn möglich, verlangen Sie eine lokale
Anmeldung am System. Vermeiden Sie eine Remote-Administration, oder schränken Sie die hierbei verfügbaren Möglichkeiten ein;
wenn nötig, verschlüsseln Sie die Datenkanäle mit Hilfe von SSL.
Beschränken Sie die Remote-Administration auf Computer im internen Netzwerk unter Verwendung von IPSec.
Sichern Sie den Speicherort der Konfigurationsdaten
Konfigurationsdaten werden üblicherweise in Textdateien, Datenbanken oder der Registry abgelegt. Speichern Sie die Daten nie
im Klartext, sondern schützen Sie sie durch Verschlüsselung und
beschränken und sichern Sie den Zugriff auf den Speicherort.
Verwenden Sie unterschiedliche Konfigurationsprivilegien
Beschränken Sie den Zugriff auf Konfigurationsdaten. Die Entscheidung über Zugriffsberechtigungen sollte auf den unterschiedlichen
Aufgaben der jeweiligen Administratoren basieren: So sollte der
Entwickler, der für die Aktualisierung von Inhalten verantwortlich
ist, andere Rechte haben als der Administrator, der die Kreditlimits
von Kunden ändert.
Folgen Sie dem Prinzip der minimalen Rechtevergabe
Richten Sie die Prozesskonten, die für den Betrieb des Web-ServerProzesses genutzt werden, mit minimalen Rechten ein. Dies gilt
auch für Servicekonten, die für den Zugriff auf nachfolgende
Ressourcen und Systeme verwendet werden. Wenn ein Angreifer
die Kontrolle über einen Prozess erlangt, der nur eingeschränkten
Zugriff auf ein Dateisystem ermöglicht, ist der anzurichtende
Schaden begrenzt.
31
4.8
Vertrauliche Daten
Werden in Ihrer Anwendung vertrauliche Daten, etwa Passwörter,
Anmeldeinformationen, Datenbankverbindungsstrings oder andere
Konfigurationsdaten, Bankkontennummern, Kreditkartennummern,
Adressen oder medizinische Unterlagen verarbeitet, müssen Sie
besondere Schutzmaßnahmen treffen. Neben dem zu erwartenden
finanziellen Schaden müssen auch rechtliche Folgen bedacht werden, die ein erfolgreicher Angriff auf eine solche Anwendung nach
sich ziehen kann. Folgende Verfahren können zum Schutz der Daten
angewandt werden:
Vermeiden Sie die Speicherung von vertraulichen Daten
Vermeiden Sie die Speicherung vertraulicher Daten soweit wie
möglich. Jeder, der Zugriff auf den Server hat, z. B. ein Administrator, kann die Informationen lesen. Um zu prüfen, ob ein Benutzer
vertrauliche Daten, beispielsweise sein Passwort, kennt, können Sie
den Hash-Wert des Passworts speichern, den Hash-Wert aus der
Benutzereingabe des Passworts berechnen und die Werte vergleichen.
Speichern Sie keine geheimen Daten im Code
Speichern Sie keine Geheimnisse in hartkodierter Form im Code.
Ein Angreifer, der Zugriff auf die ausführbaren Dateien hat, kann
String-Konstanten aus den kompilierten Dateien extrahieren, auch
wenn der Quellcode nicht auf dem Anwendungsserver sichtbar ist.
Verschlüsseln Sie vertrauliche Daten oder sichern Sie den
Kommunikationskanal
Wenn Sie vertrauliche Daten über das Netz zum Client schicken,
verschlüsseln Sie die Daten oder den Übertragungsweg. Ein verbreitetes Verfahren ist die Verwendung von SSL zwischen Client und
Web-Server. Zwischen Servern wird mittlerweile häufig IPSec verwendet. Zum Schutz von Informationen, die mehrere Zwischen-
32
stationen durchlaufen, beispielsweise SOAP-Nachrichten (=Simple
Object Access Protocol) in Web-Services, können Sie Verschlüsselungsverfahren auf Nachrichtenebene einsetzen.
Speichern Sie keine vertraulichen Informationen
in persistenten Cookies
Vermeiden Sie es, vertrauliche Daten in persistenten Cookies zu
speichern. Wenn die Daten im Klartext abgespeichert werden, kann
der Benutzer sie sehen und modifizieren. Werden die Daten verschlüsselt, ist eine sichere Verwaltung der zugehörigen Schlüssel
wichtig. Ist beispielsweise der Schlüssel, der zur Verschlüsselung
der Daten im Cookie verwendet wurde, abgelaufen, während das
Cookie noch gültig ist, kann der neue Schlüssel die Daten bei der
Übergabe vom Browser an den Server nicht mehr entschlüsseln.
Übermitteln Sie keine vertraulichen Daten über das
HTTP-GET-Protokoll
Vermeiden Sie es, vertrauliche Daten vom Client an den Server mit
Hilfe des HTTP-GET-Protokolls zu übermitteln. Das Protokoll verwendet URL-Query-Strings für die Datenübertragung. Diese bieten
keinen Schutz für die übermittelten Informationen und werden
häufig vom Server protokolliert.
4.9
Einsatz von Kryptographie
Die folgenden Vorgehensweisen verbessern den Schutz Ihrer Anwendung, wenn kryptographische Verfahren eingesetzt werden:
Verwenden Sie bewährte Kryptographieverfahren
Entwickeln Sie keine eigenen Verfahren, sondern nutzen Sie die
bewährten Kryptographieservices oder Bibliotheken, die in Ihrem
Betriebssystem oder Ihrer Entwicklungsumgebung enthalten sind.
33
Lassen Sie Ihre Daten so lange wie möglich verschlüsselt
Greifen Sie erst auf die Klartextdaten zu, wenn dies nötig ist und
speichern Sie sie in so wenig Variablen wie möglich ab.
Wählen Sie den passenden Algorithmus und
angemessene Schlüssellängen
Wählen Sie einen passenden Algorithmus und die erforderliche
Schlüssellänge für Ihre Sicherheitsanforderungen. Der Grad der
Sicherheit steigt mit der Schlüssellänge. Im folgenden sind die
bekanntesten Algorithmen aufgeführt.
Algorithmus
Schlüssellänge
Einsatz
TripleDES
128-Bit oder 192-Bit
(16 oder 24 Bytes)
Verschlüsselung großer
Datensätze
AES
128-256 Bit (16-32 Bytes)
Langsame, aber starke Verschlüsselung großer Datensätze
DES
64-Bit (8 Bytes)
Verschlüsselung ist nicht sicher
Rivest, Shamir and Adleman (RSA)
oder Digital Signature Algorithm
(DSA)
384-16, 384 Bit (48-2,048 Bytes)
Digitale Signaturen
Secure Hash Algorithm (SHA)1.0
Hashing
Hash-based Message Authentication
Code (HMAC) SHA1.0
Keyed Hashing
Schützen Sie die Schlüssel
Um die Sicherheit der verschlüsselten Daten zu gewährleisten,
muss der zugehörige Schlüssel geschützt werden:
I Wechseln Sie den Speicherort der Schlüssel in regelmäßigen
Abständen
I Speichern Sie Schlüssel wenn möglich auf gesonderter Hardware
Das deutsche „Bundesamt für Sicherheit in der Informationstechnik“ (BSI) stellt einen Katalog mit Verschlüsselungsstandards zur
Verfügung. Sie können den Katalog unter
http://www.bsi.bund.de/esig/basics/techbas/krypto/
herunterladen. Hier finden Sie weitere Informationen sowie einen
Vergleich der Verfahren.
34
4.10 Session-Management
Das HTTP-Protokoll, das die meisten Web-Anwendungen nutzen, ist
ein zustandsloses Protokoll. Damit hier Benutzer-Sessions verwaltet werden können, wurden für Anwendungsserver Verfahren entwickelt, die Session-Management auf Anwendungsebene betreiben. Die Session selbst wird mit Hilfe einer Session-ID überwacht,
die beispielsweise in einem Cookie oder den Parametern eines
Formularfeldes gespeichert ist. Der Schutz dieser ID ist von großer
Bedeutung für die Gesamtsicherheit des Systems. Für die sichere
Verwaltung von Benutzer-Sessions sollten die folgenden Grundsätze gelten:
Verwenden Sie SSL, um die Session-ID zu schützen
Vermeiden Sie es, Session-IDs über unverschlüsselte Datenkanäle
zu übertragen. Dies gilt unabhängig davon, ob die ID in einem
Cookie oder einem versteckten Feld gespeichert ist. Verwenden Sie
stattdessen eine HTTPS-Verbindung.
Verschlüsseln und signieren Sie Cookies
Verschlüsseln und signieren Sie Cookies, auch wenn Sie SSL einsetzen. Diese Vorgehensweise schützt das Cookie vor unbefugtem
Zugriff, auch wenn ein Angreifer es – z. B. durch einen XSS-Angriff –
entwenden kann.
Beschränken Sie die zeitliche Dauer einer Session
Reduzieren Sie die zeitliche Dauer einer Session auf den kleinstmöglichen Wert, idealerweise ist das Session-Cookie genau für eine
weitere Anfrage gültig. So schränken Sie das Risiko des „Session
Hijacking“ und sogenannter Replay-Angriffe ein.
35
Schützen Sie den Session-Status vor unbefugtem Zugriff
Wenn der Session-Status eines Benutzers nicht im Prozess der WebAnwendung selbst, sondern beispielsweise in einer Datenbank
gespeichert ist, müssen Sie diese Daten sowohl bei der Übertragung
als auch bei der Speicherung schützen. Die Verbindung zwischen
Web-Anwendungsserver und Speicherort der Session-Daten sollte
durch IPSec oder SSL gesichert werden.
4.11 Fehlerbehandlung
Wenn eine Anwendung versagt, kann mit Hilfe sicherer Fehlerbehandlungsverfahren weiterer Schaden vermieden werden, der
beispielsweise durch Denial-of-Service-Angriffe auf Anwendungsebene oder unbefugten Zugriff auf interne Systeminformationen
wie Datenbankstrukturen bzw. Produkt- und Betriebssysteminformationen, entstehen könnte. Nachdem ein Fehler aufgetreten ist,
befinden sich Systeme oft in einem undefinierten Zustand;
Benutzerberechtigungen sind möglicherweise geändert.
Zudem erzeugen viele Laufzeitumgebungen Debugging-Informationen und Stack Traces, die im Falle eines Fehlers auf Anwendungsebene an den Client zurückgemeldet werden. Dies kann in
der Entwicklungsphase sinnvoll sein, wird aber zum ernstzunehmenden Sicherheitsproblem, wenn das System in den Produktivbetrieb übergeht.
Säubern Sie Ihre Fehlermeldungen
Prüfen Sie alle Informationen, die im Fehlerfall an den Client gemeldet werden. Entfernen Sie gegebenenfalls interne Informationen
wie Stack Traces, Datenbankstrukturen, Funktionsnamen, Zeilennummern oder Versionsnummern aus den Fehlermeldungen. Stattdessen sollte eine generische Meldung erscheinen, die eine Fehlerprotokoll-ID enthält und so auf den entsprechenden Eintrag im Log
File des Servers verweist.
36
Protokollieren Sie alle Fehler
Während der Benutzer nur die absolut notwendigen technischen
Informationen in der Fehlermeldung erhalten sollte, ist es sinnvoll,
ausführliche Fehlermeldungen im Fehlerprotokoll festzuhalten.
Fehlermeldungen sollten eine Fehler-ID enthalten, die auf einen Eintrag im Protokoll verweist. Vertrauliche Daten, wie z. B. Passwörter,
sollten jedoch nicht protokolliert werden.
Decken Sie alle Ausnahmefälle ab
Decken Sie alle Ausnahmen ab, die in Ihrer Anwendung bzw. dem
Framework und den APIs (Application Programming Interfaces) vorkommen können. So vermeiden Sie Inkonsistenzen, die zur unbeabsichtigten Offenlegung von Informationen führen oder Denial-ofService-Angriffe begünstigen könnten.
Die Behandlung und Verbreitung von Fehlern und Ausnahmen
innerhalb Ihrer Anwendung muss sorgfältig geplant werden.
4.12 Prinzip der minimalen Rechtevergabe
Systeme sollten nach dem Prinzip der minimalen Rechtevergabe
aufgebaut sein. Statten Sie Benutzerkonten nur mit den tatsächlich
benötigten Rechten aus.
Betriebssystem
Deaktivieren Sie alle nicht benötigten Services.
Applikationsserver/Web-Server
Ein vergessener Share kann eine bequeme Hintertür für einen
Hacker darstellen, ein übersehener Port gar einen komfortablen
Haupteingang. Vernachlässigte Benutzerkonten erlauben es einem
Angreifer, Ihre Sicherheitsmechanismen ungesehen zu passieren.
37
Legen Sie separate anonyme Konten mit den minimal erforderlichen
Privilegien an, die für den Zugriff über das Web eingesetzt werden
können. Verwenden Sie ein solches Konto pro Anwendung, damit
Sie den Betrieb jeder Anwendung einzeln absichern und prüfen
können.
Servicekonten sollten ebenfalls nur mit den unbedingt erforderlichen Rechten ausgestattet sein.
Datenbankserver
Halten Sie sich auch hier an das Prinzip der minimalen Rechtevergabe.
Remote-Administration
Schränken Sie ein, welche Tools einem Remote-Administrator zur
Verfügung stehen. Geben Sie auch vor, welche Rechner den WebServer administrieren dürfen. Legen Sie mit Hilfe von IPSec fest,
welche Rechner den Web-Server administrieren dürfen.
4.13 Revision und Logging
Jedes System sollte sicherheitsrelevante Aktivitäten über alle
Schichten hinweg protokollieren. Nur so kann Missbrauch festgestellt werden, denn ein typischer Angriff auf Anwendungsebene
erscheint zunächst häufig wie eine ganz normale Systemnutzung.
Verwenden Sie Revisions- und Protokollierungsverfahren
Protokollieren Sie alle sicherheitsrelevanten Aktivitäten und
Transaktionen über das gesamte System hinweg. Verwenden Sie
Protokollierungsmechanismen auf Systemebene für Ihren eigenen
Code und aktivieren Sie die entsprechenden Funktionen der Produkte, die Sie einsetzen (Web-Server, Anwendungsserver, Datenbank, Betriebssystem usw.). Aktivitäten der folgenden Kategorien
sollten in jedem Fall protokolliert werden:
38
I
I
I
I
I
I
Anmeldeversuche
Dateizugriff
Datenbankzugriff
Netzwerkzugang
Systemzugriff
Verwendung administrativer Funktionen
Versehen Sie alle Protokolle mit genauen Zeitstempeln, um die spätere Analyse zu vereinfachen und die Synchronisation mehrerer
Protokolle, z. B. für Datenbank und Anwendung oder Zeiterfassung,
zu ermöglichen.
Zudem sollten Protokolleinträge die folgenden Informationen enthalten:
I ID des aktuellen Benutzers
I ID der Ressource, auf die zugegriffen wurde
I ID des aktuellen Prozesses / Threads
Berücksichtigen Sie die Weitergabe von IDs
Legen Sie fest, wie Ihre Anwendung Benutzer-IDs über die Anwendungsschichten hinweg weiterleitet. Es gibt zwei Möglichkeiten:
Die IDs können (z. B. mit Hilfe der Kerberos-Protokolldelegation) auf
Betriebssystemebene weitergeleitet werden. Dies ermöglicht die
Nutzung der Prüffunktionen auf Betriebssystemebene. Ein Nachteil
dieses Ansatzes liegt in der Einschränkung der Skalierbarkeit: In der
Middle-Tier kann kein effektives Datenbank-Connection-Pooling
stattfinden. Eine andere Möglichkeit ist die Weiterleitung der ID auf
Anwendungsebene und die Verwendung vertrauenswürdiger IDs
für den Zugriff auf Back-End-Ressourcen. Bei diesem Ansatz müssen Sie dem Middle-Tier vertrauen und es besteht das Risiko der
Abstreitbarkeit (Repudiation). Sie müssen im Middle-Tier Revisionsbelege erzeugen, die mit solchen im Back-End korrelieren können.
Dazu muss sichergestellt sein, dass die Server-Uhren synchron sind.
39
Beschränken Sie den Zugriff auf Protokolldateien
Beschränken Sie den Zugriff auf Protokolldateien auf einen kleinen
Personenkreis, um die Integrität der Dateien zu gewährleisten.
Speichern Sie Protokolle nicht auf dem Web-Server.
Rotation, Backup und Analyse von Protokollen
Rotieren Sie die Protokolldateien regelmäßig, beispielsweise täglich. Verschieben Sie geschlossene Protokolldateien vom Produktivsystem auf Offline-Server.
4.14 Design Review
Nach Abschluss der Design-Phase sollten Sie durch unabhängige
Experten ein Review vornehmen lassen. So können Sie Schwachstellen in der Konzeption bereits vor Beginn der eigentlichen Implementierungsphase erkennen und beseitigen.
40
5
Sichere Kodierung
Nachdem das sichere Design für Ihre Anwendung erstellt ist, sollten
Sie auch in der Kodierungsphase einige Regeln befolgen. Die hier
beschriebenen Konzepte sind programmiersprachenübergreifend
und universell auf fast jede Entwicklungsumgebung anwendbar.
Das folgende Kapitel bietet einen Überblick über die am stärksten
verbreiteten Angriffe und mögliche Abwehrmechanismen.
5.1
„Bewährte” Angriffsvarianten
5.1.1 Manipulation von Parametern
In Anwendungen kommen verschiedene Arten von Parametern vor,
darunter
I URI/URLs
I Cookie-Werte
I Formularfeldparameter
I HTTP-Header
Angreifer manipulieren diese Parameter, um Zugriff auf Daten zu
erhalten (z. B. durch das Verändern von URLs), unerwünschte Vorgänge zu starten (z. B. durch den Aufruf undokumentierter WebFunktionen) oder um die persönlichen Daten eines anderen Benutzers auszuspähen (etwa durch die Manipulation schwacher
Session- oder Dokument-IDs).
5.1.2 Cross-Site Scripting (CSS/XSS)
Anwendungen, bei denen Daten mindestens zwei Benutzern
gemeinsam zugänglich sind, sind anfällig für Cross-Site-ScriptingAngriffe (auch CSS- oder XSS-Angriffe genannt).
41
Eine ähnliche Angriffsvariante, bei der ein scheinbar vertrauenswürdiger „Mittelsmann” gezwungen wird, bösartige Daten weiterzuleiten, bezeichnet man als „Cross-Site Malicious Content“Angriff.
Ein typisches Beispiel für einen XSS-Angriff: Der Hacker einer
Web-Anwendung fügt bösartigen JavaScript-Code in eine Nachricht
ein, die von anderen gelesen wird, etwa in einem elektronischen
„Schwarzen Brett”. Prüft der Server nicht, ob die publizierten Daten
JavaScript enthalten, gelangt der bösartige Code auf die Clients der
anderen Benutzer und wird dort ausgeführt.
Typische XSS-Angriffe zielen auf die Session-ID eines nichts ahnenden Benutzers ab und leiten diese an den Angreifer weiter. Ist der
Angriff erfolgreich, kann die gestohlene Identität dazu benutzt
werden, mit den Rechten des ursprünglichen Besitzers auf den
Server zuzugreifen, Produkte zu bestellen, persönliche Daten zu
lesen oder Informationen zu manipulieren und im Namen des rechtmäßigen Besitzers zu versenden.
Der Browser kann einen XSS-Angriff nicht entdecken, da der ScriptCode von einer vertrauenswürdigen Quelle kommt: dem WebServer, auf dem die Anwendung vorgehalten wird. Aus demselben
Grund schützt auch die alleinige Verwendung von Verschlüsselung
auf Transportebene (SSL-Verbindungen) nicht vor XSS-Angriffen.
5.1.3 SQL Injection
Eine SQL Injection nutzt ein Formularfeld oder andere ClientParameter, mit deren Hilfe die Anwendung ein SQL-Statement generiert. Sie enthält SQL-Metasyntax wie den SQL String Delimiter (‘)
oder den Statement Concatenation Character (;) und fügt so ein
ausführbares SQL-Kommando an Stellen ein, an denen die Anwendung ein String Literal erwartet.
42
5.1.4 Buffer Overflow
Buffer Overflows kommen meist in Anwendungen vor, die mit
Programmiersprachen wie C/C++ entwickelt wurden. Diese
Sprachen unterstützen Datenstrukturen auf der Basis von Zeigern
und Zugriffe auf Datenstrukturen wie z. B. Felder ohne Prüfung des
zulässigen Wertebereichs.
Der Angreifer hat folgende Optionen:
Er kann versuchen, die Länge eines Feldes zu überschreiten, indem er mehr Daten in Textfelder oder Parameter schreibt als die
Anwendung erwartet. So kann der Prozess/Thread zum Absturz
gebracht werden.
Er kann daraufhin versuchen, Maschinencode-Befehle in den
Speicherbereich „hinter” dem Feld einzuschleusen. Diese Art des
Angriffs erfordert einige Kenntnisse und richtet sich typischerweise
gegen weit verbreitete Produkte (bekanntes Beispiel: sendmail),
weniger gegen eine individuelle Software.
In modernen Programmierumgebungen wie J2EE oder Microsoft
.NET werden Buffer Overflows in der Laufzeitumgebung abgefangen und der Anwendung durch eine Ausnahme gemeldet. Trotzdem sollte auch hier die Prüfung der Eingabelängen Teil der routinemäßigen Eingabevalidierung sein.
5.2
Eingabeprüfung
Prüfen Sie Länge, Art, zulässigen Wertebereich und Format
Sämtliche Eingaben am Client sollten auf folgende Punkte geprüft
werden:
Länge: Akzeptieren Sie keine Eingaben, die die vorgegebene Maximallänge überschreiten.
Art: Prüfen Sie die Art der Daten und akzeptieren Sie nur solche
Daten, die die Anwendung benötigt. Ein Datumsfeld beispielsweise
erfordert lediglich Zahlen und Punkte.
43
Wertebereich: Prüfen Sie den zulässigen Wertebereich. Ein sinnvoller Bereich für das Feld „Kalendertag“ besteht beispielsweise
nur aus den Zahlen 1-31.
Format: Prüfen Sie, ob die Eingabe dem erwarteten Format entspricht.
Wenden Sie ein positives Sicherheitsmodell an: Jede Eingabe, die
nicht explizit erlaubt ist, sollte geblockt werden.
Prüfen Sie HTML-Code
HTML-Code in Benutzereingaben stellt ein Risiko für WebAnwendungen dar, wenn die eingegebenen Daten dazu genutzt
werden, dynamisch Web-Seiten für andere Benutzer zu generieren. Eingaben sollten daher sorgfältig auf HTML-Code überprüft
werden.
Wenn Ihre Anwendung die Eingabe von HTML-Code zulässt,
beispielsweise um HTML-Tags in Web-Inhalten zu unterstützen,
die der Benutzer anlegt, sollten Sie den zulässigen Code auf
sichere Tags wie <b>, <i>, <p> und die entsprechenden End-Tags
beschränken.
Erlauben Sie Attribute in HTML-Tags nur dann, wenn sie auf bösartigen JavaScript-Code in den Attributen prüfen. Manche HTMLAttribute erlauben Script-Code, der bei der Weiterverarbeitung des
Tags ausgeführt wird.
Auch bei Hyperlink- (<a>) und Image-Tags (<image>) sollten Sie
besondere Vorsicht walten lassen. Diese Tags veranlassen den
Browser dazu, Daten von der entsprechenden Adresse zu laden.
44
Prüfen Sie auf SQL-Syntax
Eingaben, die zur Erzeugung eines SQL-Statements verwendet werden, müssen sorgfältig auf SQL-Meta-Zeichen wie ‘ oder; geprüft
werden, um SQL Injections zu verhindern. Bei dieser Art von Angriff
kann der Client über Web-Forms bösartige SQL-Statements an die
Back-End-Datenbank schicken.
Die Sicherheit kann durch den Einsatz gespeicherter Verfahren mit
Parametern für die Datenbankabfrage weiter verbessert werden.
LDAP
Alle Daten, die der Client meldet, müssen auf Zeichen oder Strings
geprüft werden, die für einen Angriff genutzt werden könnten. Die
beste Filtermethode ist, Positivlisten zu verwenden.
Alle Anwendungen, die Benutzereingaben direkt an die LDAPSuchmaschine weiterleiten, sind gefährdet.
Betriebssystemkommandos
Command Injections nutzen externe Betriebssystem- oder Anwendungskommandos, um Zugriff auf Systemressourcen zu erlangen.
Sie erlauben es dem Angreifer, durch die Nutzung privilegierter
Kommandos Sicherheitsmaßnahmen auf Anwendungsebene zu
umgehen.
Diese Art von Angriff wird häufig genutzt, um „außerhalb“ der
Anwendung versteckte Informationen und Services aufzuspüren.
Der Angreifer kann dazu Kommandos aus dem Betriebssystem oder
der CGI-Skriptsprache verwenden.
Um Command Injections zu vermeiden, müssen Metazeichen und
Schlüsselwörter, die für Kommandos reserviert sind, aus URLs,
Headers und Formularen gefiltert werden.
45
5.3
Reguläre Ausdrücke
Nutzen Sie reguläre Ausdrücke, um eine Prüfung auf gültige
Zeichen und Formate durchzuführen und die Eingaben von unerwünschten Zeichen zu säubern. Definieren Sie Muster für bestimmte Eingabekategorien:
Prüfen Sie numerische Eingaben
Prüfen Sie die Art der Zeichen, Eingabelänge und Format der numerischen Daten, z. B. [0-9]{1,3}, wenn alle positiven Zahlen zwischen
0 und 99 zugelassen sind.
Prüfen Sie Texteingaben
Schränken Sie die Bandbreite der zugelassenen Zeichenarten ein.
Prüfen Sie die Eingabelängen und String-Felder. Prüfen Sie die
Formatierungsregeln oder Eingabefelder für Zeit/Datum, Postleitzahl, Telefonnummer usw. Seien Sie vorsichtig bei Textfeldern, die
keine Formatvorgaben machen.
Der Anmeldename eines Benutzers kann mit Hilfe dieser Formel
geprüft werden, die nur alphanumerische Zeichen mit einer maximalen Eingabelänge von 20 Zeichen zulässt: [a-zA-Z0-9]{1,20}
5.4
URI/URLs
URIs sollten ebenso wie jede andere Eingabe vor der weiteren Verarbeitung geprüft werden. Ein Angreifer kann URIs benutzen, um
I Zugriff auf Dokumente / Verzeichnisse zu erlangen, die nicht an
die Öffentlichkeit gelangen sollen („Wild Browsing”)
I SQL-Abfragen oder andere unerwünschte Kommandos in eine
Anwendung einzuschleusen
I sich durch ausgetüftelte Verfahren an ihren Sicherheitsprüfungen vorbei in das System einzuschleichen
I einem Benutzer vorzuspielen, er befände sich auf einer bestimmten Site, während er in Wirklichkeit jedoch mit einem anderen
Server verbunden ist.
46
Prüfen Sie URI/URLs
Ein generischer regulärer Ausdruck für die genaue Prüfung von
URI/URLs ist sehr komplex und nicht immer notwendig (außer beispielsweise bei der Programmierung eines Web Servers). Meist
reicht ein vereinfachtes Muster aus. Das nachfolgende Beispiel verdeutlicht, wie für HTTP und HTTPS URLs validiert werden können:
^(http|https)://[-A-Za-z0-9._/]+$
Das zweite Muster lässt komplexere Links zu:
^(http|ftp|https)://[-A-Za-z0-9._]+(\/([A-Za-z0-9\
-\_\.\!\~\*\'\(\)\%\?]+))*/?$
5.5
Eingaben über Gerätedateien
Besondere Vorsicht ist beim Zugriff auf Dateien geboten, deren
Name durch eine Benutzereingabe erzeugt wurde. Dies gilt auch für
den Zugriff auf Gerätedateien.
Verwenden Sie stattdessen feste Dateinamen und Speicherorte,
wenn Daten von einem Gerät gelesen oder darauf gespeichert
werden sollen. So vermeiden Sie den unkontrollierten Zugriff auf
Dateien.
Wenn Sie dennoch vom Benutzer vergebene Dateinamen annehmen müssen, führen Sie die folgenden Prüfungen durch:
Prüfen Sie die Existenz
Bevor sie auf eine Gerätedatei zugreifen, prüfen Sie, ob die Datei
oder das Gerät wirklich existiert.
Prüfen Sie die Zugriffsrechte
Prüfen Sie, ob der Benutzer Zugriff auf die Datei / das Gerät hat.
47
Prüfen Sie den Speicherort
Prüfen Sie, ob der Dateipfad auf einen Speicherort verweist, der von
der Anwendung verwaltet wird.
Prüfen Sie die Eingaben
Prüfen Sie die Eingaben auf Escape-Sequenzen / unzulässige
Zeichen.
Verhindern Sie das Hochladen von ausführbaren Dateien
Erlauben Sie es nicht, dass potentiell gefährliche Dateien wie ausführbare Dateien, Batch-Dateien, Scripts etc. hochgeladen werden.
Verwenden Sie eine White List von Dateitypen, die hochgeladen
werden dürfen, und verbieten Sie alle anderen Dateitypen. Führen
Sie einen Virus-Scan durch.
5.6
Einsatz von Kryptographie
Obwohl in den meisten Anwendungen bewährte Kryptographieverfahren zum Schutz der Daten bei der Übertragung oder
Speicherung eingesetzt werden, gibt es einige Probleme, mit denen
Entwickler beispielsweise bei der Verwendung von Algorithmen und
der Verwaltung von geheimen Schlüsseln konfrontiert werden.
Die folgenden Verfahren unterstützen Sie bei der sicheren Verschlüsselung vertraulicher Daten:
Verwenden Sie bestehende Implementierungen
kryptographischer Algorithmen
Die sichere Implementierung eines kryptographischen Algorithmus ist ein höchst komplexer, zeitintensiver Prozess. Benutzen Sie
daher nur bestehende und bewährte Implementierungen von
Algorithmen für Verschlüsselung, Entschlüsselung, Hashing und die
Generierung von Zufallszahlen.
48
Speichern Sie Schlüssel nicht im Code
Hartkodierte, d.h. im Klartext sichtbare Schlüssel im Programmcode
können einfach dekompiliert werden.
Beschränken Sie den Zugriff auf die gespeicherten Schlüssel
Benötigt ein Prozess zur Laufzeit Zugriff auf die Schlüssel, die in
einem persistenten Speicher abgelegt sind, sollte der Zugriff nur
einem Administrator und dem Prozess erlaubt werden.
Schützen Sie geheime Schlüssel
In Public-Key-Infrastrukturen hängt die Gesamtsicherheit des
Systems vom Schutz der geheimen Schlüssel seiner Benutzer ab.
Geheime Schlüssel müssen verschlüsselt werden, wenn sie aus dem
lokalen Speicher exportiert werden.
Schützen Sie symmetrische Schlüssel
Bei der symmetrischen Verschlüsselung kann jeder, der den
symmetrischen Schlüssel kennt, den verschlüsselten Text entschlüsseln. Nur berechtigte Benutzer dürfen daher Zugriff auf den
Schlüssel haben.
Speichern Sie symmetrische Schlüssel nie im Klartext; ziehen Sie
eine Verschlüsselung der symmetrischen Schlüssel mit Hilfe von
Public-Key-Verfahren in Betracht.
Verwenden Sie Public-Key-Verfahren,
um symmetrische Schlüssel auszutauschen
Verwenden Sie Public-Key-Verfahren, um symmetrische Schlüssel
über ein unsicheres Netz auszutauschen. Symmetrische Schlüssel
werden aus Performance-Gründen häufig eingesetzt, um die vertraulichen Daten selbst zu verschlüsseln. Prüfen Sie das Zertifikat,
das den öffentlichen Schlüssel des Empfängers Ihrer verschlüsselten
Nachricht enthält, auf folgende Aspekte:
49
I
I
I
Gültigkeitsdauer des Zertifikats
Verifizierung aller Signaturen in der Zertifikatskette bis hin zur
vertrauenswürdigen Root-Zertifizierungsstelle
Das Zertifikat findet sich nicht auf der Rückrufliste, der sogenannten Certificate Revocation List (CRL), des Ausstellers
Verwenden Sie starke Zufallszahlengeneratoren
Verwenden Sie nur kryptographisch starke Zufallszahlen, die dem
US-Kryptographiestandard FIPS-140 entsprechen, für die Erzeugung von Schlüsseln und Initialisierungsvektoren.
Verwenden Sie große Schlüssellängen
Um Brute-Force-Angriffe auf verschlüsselte Daten zu erschweren,
sollten Sie die längste für Ihren Algorithmus verfügbare Schlüssellänge nutzen.
Verwenden Sie „salted“ Hash-Werte
Um Brute-Force-Angriffe zu erschweren, sollten Sie eine HashMethode einsetzen, die bei der Erzeugung von symmetrischen
Schlüsseln so genannte „Salt”-Werte unterstützt. Der Salt-Wert
muss gemeinsam mit dem Initialisierungsvektor sicher gespeichert
werden, damit der Schlüssel wieder entschlüsselt werden kann.
5.7
Session-Management
Bei der Implementierung des Session-Managements für Ihre
Anwendung sollten Sie besonderen Wert darauf legen, den Zugriff
auf Ihre Ressourcen in öffentliche und geschlossene Bereiche zu
unterteilen, sowie Tokens für Authentisierung und Sessions einzusetzen.
50
Übermitteln Sie keine vertraulichen Daten an den Client
Vertrauliche Daten sollten den Server nicht verlassen. Mit Hilfe des
Session-Managements können sie dem entsprechenden Benutzer
zugeordnet werden. Speichern Sie keine vertraulichen Informationen in Cookies, Formularfeldern oder URL-Parametern.
Schützen Sie vertrauliche Daten
Schützen Sie alle vertraulichen Daten in einer Session durch
Verschlüsselung. Nähere Informationen hierzu in Kapitel 5.6
„Verwendung von Kryptographie“.
Schützen Sie vertrauliche Seiten
Nutzen Sie Authentisierungsverfahren, um vertrauliche Seiten zu
schützen. Unterteilen Sie ihre Ressourcen in öffentliche und
geschlossene Bereiche und schützen Sie den AuthentisierungsToken, der für den Zugriff auf den geschlossenen Bereich eingesetzt
wird.
Trennen Sie Session-Token und Authentisierungs-Token
Verwenden Sie einen Authentisierungs-Token, um den Zugriff auf
die geschlossenen Seiten / Ressourcen Ihrer Anwendung zu verwalten. Schützen Sie den Token mit Hilfe von SSL und starken
Verschlüsselungsverfahren. Beschränken Sie den Einsatz des Tokens
auf HTTPS-Verbindungen.
Verwenden Sie einen Session-Token, um personalisierte Informationen während der gesamten Benutzer-Session zu verwalten.
Ein gestohlener Session-Token allein kann nicht verwendet werden,
um auf die geschlossenen Seiten zuzugreifen. Ziehen Sie vertrauliche Daten nur dann aus einer Session, wenn ein Authentisierungstoken vorhanden ist.
51
Verwenden Sie eine sichere Länge für den Session-Token
Eine minimale Länge von 128 Bit schützt vor dem Erraten des
Tokens während einer authentisierten Session.
Trennen Sie öffentliche und geschlossene Bereiche
Wenn Ihre Anwendung öffentliche Seiten über HTTP unterstützt,
schützen Sie die geschlossenen Seiten mit SSL (HTTPS). Nehmen Sie
die erforderlichen Einstellungen vor, um zu verhindern, dass ein
Session-Cookie unverschlüsselt übertragen wird, wenn ein Benutzer
vom geschlossenen in den öffentlichen Bereich wechselt. Unterscheiden Sie zwischen Session- und Authentisierungs-Cookie wie
oben beschrieben; ordnen Sie die öffentlichen und geschlossenen
Seiten unterschiedlichen Verzeichnissen zu und konfigurieren Sie
die Zugriffsrechte entsprechend.
5.8
Code Review
Code Reviews sind eine gute Möglichkeit, die Qualität Ihres Codes
im Allgemeinen und die Sicherheit Ihrer Anwendung im Besonderen
zu verbessern. Anwendungssicherheit muss als kontinuierlicher
Prozess und nicht als punktuelle Maßnahme verstanden werden.
Daher sollten Code Reviews als integraler Bestandteil des Entwicklungsprozesses regelmäßig anberaumt werden.
Ein Code Review ist meist effektiver, wenn er von Entwicklern
durchgeführt wird, die bisher nicht an dem Projekt beteiligt waren.
Während des Programmierens konzentrieren sich Entwickler
üblicherweise auf die Funktion der Anwendung; ein externer und
unvorbelasteter Prüfer kann den Fokus hingegen auf Qualität und
Sicherheit legen.
52
Die folgenden Aspekte sollten bei einem sicherheitsbezogenen
Review berücksichtigt werden:
I Einfachheit: Unnötige Komplexität führt zu Problemen in der
Wartung und zu fehleranfälligem Code.
I Modularität: Teilen Sie Ihre Anwendung möglichst in mehrere
Module auf, die klar definierte Schnittstellen haben. So können
die Module einzeln auf Funktion und Sicherheit getestet werden. Testen Sie alle möglichen Benutzereingaben auf ihre
Praxistauglichkeit.
I Fehlerbehandlung: Werden mögliche Fehler und Ausnahmen
korrekt behandelt? Wie fährt eine Methode fort, nachdem ein
Fehler aufgetreten ist?
I Sicherheit: Entspricht die Implementierung den Sicherheitsanforderungen, die in diesem Leitfaden beschrieben werden?
I Dokumentation: Entspricht die Dokumentation dem aktuellen
Stand der Implementierung?
I Tests: Sind die Tests dem aktuellen Stand der Implementierung
angemessen? Genügen die Tests den Anforderungen des Prozesses?
53
6
Sicheres Testen
Wenn Sicherheit als Anforderung im Entwicklungsprozess definiert
wird, wird sie automatisch auch in das Test- und Akzeptanzverfahren aufgenommen.
Ziel der Tests ist es, einerseits die korrekte Implementierung von
Sicherheitsmechanismen in der Anwendung zu überprüfen, andererseits aber auch, mögliche Sicherheitslücken aufzudecken.
6.1
White Box Test
Die Prüfung der korrekten Implementierung von Sicherheitsmechanismen ist den Funktionstests sehr ähnlich. Wie beim
Erstellen von Modultests für betriebswirtschaftliche Funktionen
muss auch hier geprüft werden, ob eine Funktion/Methode/
Schnittstelle eine bestimmte Menge von Eingabewerten (und nur
diese) annimmt, die korrekten Ergebnisse liefert und sich erwartungsgemäß verhält.
Der zweite Teil, das Testen auf Sicherheitslücken, ist komplexer. Hier
soll die Qualität von Sicherheitsmaßnahmen beurteilt werden, man
kann jedoch nur annehmen, welchen Bedrohungen die Anwendung
wirklich ausgesetzt sein wird. Solche Tests können niemals den endgültigen Beweis für die Sicherheit einer Anwendung liefern.
Die folgenden Bereiche sollten getestet werden, um die größtmögliche Anzahl von Bedrohungen abzudecken:
Authentisierung
Testen Sie, ob Ihr Anmeldeverfahren
I schwache Passwörter ablehnt.
I die Passwortrichtlinie umsetzt.
I Brute-Force-Angriffe erkennt.
54
I
I
I
I
die Anzahl von Anmeldeversuchen in einem bestimmten
Zeitrahmen limitiert.
die Gefahr von Denial-of-Service-Angriffen minimiert.
das lokale Cachen von Passwörtern verhindert.
Fehlermeldungen ausgibt, die Angreifern interne Informationen
in die Hände spielen.
Session-Management
Testen Sie, ob
I Time-Out-Zeiten für Ihre Sessions sinnvoll gewählt sind und
funktionieren.
I eine abgelaufene Session eine definierte Abmeldung zur Folge
hat.
I ein Speicher auf Client-Seite (z. B. ein Cookie) verwendet wird,
um unverschlüsselte vertrauliche Daten zu speichern.
I Benutzernamen und Passwörter im Klartext an den Server
übermittelt werden.
Eingabeprüfung
Testen Sie das Verhalten Ihrer Anwendung durch folgende Eingaben:
I Daten, die die erwartete Eingabelänge überschreiten (Test auf
Buffer Overflows).
I Daten, die HTML-Tags enthalten (auch in verschlüsselter Form).
I Daten, die SQL-Meta-Syntax enthalten (auch in verschlüsselter
Form).
I Daten, die unerwartete Zeichen / Formate enthalten.
Säuberung von Ausgabewerten
Testen Sie, ob
I eine falsche Anzahl von Parametern oder falsche Parametertypen in einem Serviceaufruf, Funktionsaufruf, URL-Aufruf usw.
zu einer Fehlerausgabe führen, die dem Angreifer möglicherweise weitere Hinweise gibt.
55
I
I
HTML-Seiten interne Informationen wie IP-Adressen,
E-Mail-Adressen oder Kommentare enthalten.
der Client unabhängig von internen Fehlern eine
Standardfehlermeldung erhält.
Beim Erstellen eines Testplans für eine komplexe Anwendung sollte
der Schwerpunkt auf die Komponenten gelegt werden, die am
einfachsten angegriffen werden können. Zu diesem Zweck sollten
Sie für jede Komponente eine Rangliste der potentiellen Risiken
anlegen.
6.2
Black Box Test
Als zusätzlicher Test bietet sich ein Angriff auf die Anwendung an.
Dies sollte mindestens einmal vor der Inbetriebnahme des Systems
durchgeführt werden. Ein automatisierter Sicherheits-Scan kann
ebenfalls helfen, Sicherheitslücken zu finden. Zu diesem Zweck
sind eine Reihe von Produkten erhältlich. Sie nutzen bekannte
Angriffsmethoden und Techniken wie SQL Injections oder Cross-Site
Scripting.
Leider können solche Produkte keine logischen Fehler in Anwendungen finden; es ist daher unabdingbar, einen Sicherheitsexperten
zu Rate zu ziehen, um die Tests effektiv durchzuführen.
6.3
Zertifizierung
Für bestimmte Bereiche oder Kunden ist eine Sicherheitszertifizierung notwendig. Ist dies nicht der Fall, sollte man genau abwägen, ob der Nutzen den Aufwand rechtfertigt.
Ähnlich wie beim Qualitätsmanagement gibt es auch im Bereich
der Sicherheit eine große Anzahl von Standards und Organisationen, die sich mit Zertifizierungsfragen beschäftigen. Man kann sie
in zwei Bereiche unterteilen: Die Zertifizierung des Softwareentwicklungsprozesses und die Zertifizierung der Software als Produkt.
56
7
Auslieferung und
Wartung
Auch in der abschließenden Phase des Entwicklungsprozesses finden sich sicherheitsrelevante Aspekte. Hier sollen nur die wichtigsten Themen kurz angesprochen werden; eine umfassende
Behandlung dieses Themas finden Sie in der entsprechenden
Fachliteratur.
Eine der einfachsten Möglichkeiten für Hacker ist das Einschleusen
von bösartigem Code in ein ausgeliefertes Software-Release. Sie
schaffen sich so eine Hintertür für Cross-Site-Scripting-Angriffe
oder das Ausspionieren von Authentisierungsdaten. Mit Hilfe von
Hash-Werten und Zertifikaten können Sie sicherstellen, dass die
Version, die Sie exportiert haben, auch wirklich die Version ist, die
Ihre Kunden am Ende erhalten.
7.1
Sichere Standardkonfiguration
Besondere Vorsicht ist bei der Benutzerverwaltung, externen
Schnittstellen und der Konfiguration des Session-Managements
angebracht. Achten Sie darauf, dass potentielle Sicherheitslücken in
Form von „offenen Türen”, die zu Entwicklungs- und Testzwecken
benötigt wurden (etwa Spezialbenutzerkonten, beschleunigte
Authentisierungsverfahren oder besondere Berechtigungsprofile)
vor Auslieferung geschlossen werden.
Wie die vorhergehenden Kapitel zeigen, können bestimmte
Datenausgaben für Tests und Debugging sinnvoll sein. Sie können
sich auch für einen Angreifer durchaus als hilfreich erweisen –
prüfen Sie daher Fehlermeldungen und andere Ausgaben auf
allzu detaillierte systeminterne Informationen.
57
Software sollte mit einer sicheren Standardkonfiguration ausgeliefert werden. Beschreiben Sie diese Konfiguration in Ihrem Anwendungshandbuch. Weisen Sie auch die Benutzer Ihrer Anwendung
auf spezielle Sicherheitsfunktionen hin. Fragen Sie den Administrator bei der Installation, welche Module Ihrer Software er benötigt, damit er nicht benötigte Teile nicht installieren muss.
7.2
I
I
I
I
I
I
Wartungsplan
Beschreiben Sie die Prozesse für sicherheitsrelevante Wartungsaufgaben im Handbuch.
Prüfen Sie Protokolle regelmäßig auf Sicherheitslücken.
Prüfen Sie in bestimmten Zeitabständen, ob alle Benutzer noch
die ihnen zugeteilten Rechte benötigen.
Stellen Sie fest, ob ausreichend Speicherplatz für Datenbank
und Protokolldateien vorhanden ist. Falls Stoßzeiten festgestellt
werden, prüfen Sie, ob die Gefahr einer Überlastung besteht.
Erarbeiten Sie ein angemessenes Backup-Konzept.
Alle ein bis zwei Jahre sollten Sie einen Black Box Test durchführen. So können Sie feststellen, ob Ihre Anwendung durch
neue Angriffsvarianten gefährdet ist.
7.3
Patch-Management und Bug-Fixing
Vermeiden Sie, dass die Sicherheit Ihrer Anwendung der Funktionalität zum Opfer fällt. Sicherheit muss als Qualität angesehen werden, der die gleiche Bedeutung wie etwa einem korrekten Berechnungsverfahren zukommt.
Ob Ihr Patch-Zyklus bereits im Detail geplant ist oder ob es sinnvoller erscheint, einen Security-Patch erst mit dem nächsten funktionalen Patch auszuliefern: Machen Sie sich bewusst, dass im Rennen
mit den Angreifern Minuten zählen können. Das Bekanntwerden
einer offenen Sicherheitslücke ist unter Umständen schnell erheblich teurer als das Verteilen eines außerplanmäßigen SicherheitsPatches.
58
Andererseits kann ein ungenügend getesteter Patch zu schlechter
Performance führen. Planen Sie daher vor der Auslieferung ausreichend Zeit für einen Funktions- und Sicherheitstest ein.
Für die Zertifizierung des Prozesses müssen die Sicherheitsanforderungen ohne Berücksichtigung anderer entwicklungstechnischer
Gegebenheiten in allen Abschnitten des Software-Lebenszyklus
definiert und umgesetzt werden.
Die Zertifizierung des fertigen Produkts ist weniger komplex.
Die speziellen Sicherheitsanforderungen an ein Produkt werden
geprüft; üblicherweise werden mit Hilfe eines Black Box Tests alle
sicherheitsrelevanten Punkte getestet.
Unabhängig davon, welche Art der Zertifizierung angestrebt wird,
sollten Experten zu Rate gezogen werden.
59
8
Zusammenfassung
Marktanalysen prophezeien dem Bereich der Anwendungssicherheit ein starkes Wachstum. Dieser Leitfaden lässt erkennen, welche
Bedeutung der sicheren Anwendungsentwicklung, besonders vor
dem Hintergrund einer zunehmend Web-basierten Anwendungswelt, heute bereits zukommt. Der Schutz vor Angriffen auf die
Verfügbarkeit, Integrität und Vertraulichkeit von Daten muss in
allen Phasen des Entwicklungsprozesses konsistent berücksichtigt
werden.
Als nächste Schritte nach der Lektüre dieses Pocketseminars könnten etwa das Erstellen Ihrer eigenen Checklisten oder die Definition
anderer organisatorischer Maßnahmen auf dem Programm stehen.
Zweifellos sinnvolle Maßnahmen, doch im Mittelpunkt Ihrer Überlegungen sollten die an Ihrem Entwicklungsprojekt beteiligten
Personen stehen. Mit ihnen steht und fällt jede Sicherheitsmaßnahme; sie müssen erkennen, wie wichtig das Thema Sicherheit bei
der Entwicklung von Software ist. Führen Sie regelmäßig
Workshops durch, besprechen Sie reale Vorfälle mit Ihrem Team –
nicht, um Schuldzuweisungen vorzunehmen, sondern um das
Lernen an praktischen Beispielen zu ermöglichen.
60
9
Abkürzungen
ACL
ARP
CA
CRL
CSS
DBMS
DES
DNS
DoS
DSA
FIPS
FTP
HMAC
HTML
HTTP
HTTPS
ICMP
ID
IDS
IPSec
J2EE
LAN
LDAP
NetBIOS
NNTP
OS
RIP
RSA
SDK
SHA
SMB
Access Control List
Address Resolution Protocol
Certification Authority
Certificate Revocation List
Cross-Site Scripting
Data Base Management System
Data Encryption Standard
Domain Naming System
Denial of Service
Digital Signature Algorithm
Federal Information Processing Standard
File Transfer Protocol
Hash Message Authentication Code
Hyper Text Markup Language
Hyper Text Transfer Protocol
Hyper Text Transfer Protocol Secure
Internet Control Message Protocol
Identifier
Intrusion Detection System
Internet Protocol Security
Java 2 Enterprise Edition
Local Area Network
Lightweight Directory Access Protocol
Network Basic Input/Output System
Network News Transfer Protocol
Operating System
Routing Information Protocol
Rivest, Shamir and Adleman
Software Development Kit
Secure Hash Algorithm
Server Message Block (protocol)
61
SMTP
SOA
SOAP
SQL
SSL
TCP/IP
TFTP
UDP
URI
URL
VLAN
VPN
W3C
WebDAV
XSS
Simple Mail Transfer Protocol
Service-Oriented Architecture
Simple Object Access Protocol
Structured Query Language
Secure Sockets Layer
Transmission Control Protocol / Internet Protocol
Trivial File Transfer Protocol
User Datagram Protocol
Uniform Resource Identifier
Uniform Resource Locator
Virtual Local Area Network
Virtual Private Network
World Wide Web Consortium
Web based Distributed Authoring and Versioning
Cross-Site Scripting
62
10 Abbildungsverzeichnis
Abbildung 1: Sicherheit bei der Softwareentwicklung . . . . . . . . 15
Abbildung 2: Sichere Softwarearchitektur . . . . . . . . . . . . . . . . . 23
Abbildung 3: Rollenbasierter Zugriff . . . . . . . . . . . . . . . . . . . . . 31
Abbildung 4: Zugriff über Impersonation . . . . . . . . . . . . . . . . . . 31
Abbildung 5: Zugriff über eine Pool-Identität . . . . . . . . . . . . . . 32
63
11 Referenzen
I
Microsoft
Microsoft Security Developer Center:
http://msdn.microsoft.com/security
Microsoft Security Developer Center Germany:
http://www.microsoft.com/germany/msdn/security/default.mspx
I
OWASP
The Open Web Application Security Project:
http://www.owasp.org
I
Vulnerabilities
SANs TOP 20 List:
http://www.sans.org/top20
CERT (Computer Emergency Response Team):
http://www.cert.org
SecurityFocus:
http://www.securityfocus.com
I
World Wide Web Security FAQ
http://www.w3.org/Security/faq/www-security-faq.html
64
12 Index
Ablauffrist für Passwörter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Abstreitbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Access Control Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
AES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34,50
Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 12, 13, 39, 40
Angriffsmethode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11, 12, 56
Angriffssimulationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Angriffsvarianten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41, 58
Anmeldeversuche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25, 39
Anwendungsarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Anwendungskonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 20
Ausfallzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Auslieferung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 13, 57, 59
Authentisierung . . . . . . . . . . . . . 19, 20, 21, 25, 26, 27, 31, 50, 54
Availability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 40, 58
Benutzereingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . 19, 22, 32, 47
Benutzergruppe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Benutzerkonto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Benutzerverwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . 21, 22, 57
Berechtigungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27, 28, 30
Betriebssystem-kommandos . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
biometrische Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Black Box Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Brute-Force-Angriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25, 50, 54
Buffer Overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Bug-Fixing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 58
Bundesamt für Sicherheit in der Informationstechnik . . . . . . . . 34
65
Certificate Revocation List . . . . . . . . . . . . . . . . . . . . . . . . . 50, 61
CIA-Prinzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Code Injections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Code Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 52
Command Injections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Confidentiality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28, 29
Cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26, 33, 35, 41, 52, 55
Cross-Site Malicious Content . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Cross-Site Scripting . . . . . . . . . . . . . . . 10, 22, 41, 56, 61, 62, 66
Dateizugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Datenbankzugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29, 39
Dateneingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19, 22
Datenklassifizierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 36, 57
Denial-of-Service . . . . . . . . . . . . . . . . . . . . . . . . 10, 25, 36, 37, 55
DES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34, 61
Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 11, 13, 18, 40, 41
Design Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 40
Digital Signature Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 34, 61
Distributed Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Einfachheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Eingabeprüfung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21, 22, 43, 55
Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36, 53
Fehlermeldung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18, 37, 56
Fehlerprotokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36, 37
Firewall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 11
Formularfeldparameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47, 61
66
Gerätedateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
geschlossene Bereiche . . . . . . . . . . . . . . . . . . . . . . 27, 50, 51, 52
Hash-based Message Authentication Code . . . . . . . . . . . . . . . . 34
Hash-Wert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44, 55, 56, 61, 64
HTTP . . . . . . . . . . . . . 20, 24, 26, 27, 33, 34, 35, 41, 47,52, 61, 64
HTTP-Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24, 41
HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35, 47, 51, 52, 61
ICMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29, 63
Integrität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10, 40, 60
Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Intrusion-Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
IPSec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31, 32, 36, 38, 61
JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42, 44
Kodierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 41
Konto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25, 38
Kryptographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33, 48, 51
LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 61
Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28, 38
Modularität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
NetBIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Netzwerkzugang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
NNTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
öffentlicher Bereich . . . . . . . . . . . . . . . . . . . . . . . . . 27, 50, 51, 52
67
Parametermanipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21, 24
Passwörter . . . . . . . . . . . . . . . . . . . . . . . . . . 25, 26, 32, 37, 54, 55
Passwortrichtlinie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15, 26, 54
Patch-Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 58
Pool-Identität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30, 63
Portal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
positives Sicherheitsmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Prinzip der minimalen Rechtevergabe . . . . . . . . 18, 19, 31, 37, 38
Produktivbetrieb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 36
Public-Key-Infrastrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Quoten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Remote-Administration . . . . . . . . . . . . . . . . . . . . . . . . . 30, 31, 38
Replay-Angriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Repudiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Revision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 21, 28, 29, 38
Revisionsbelege . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Risikoanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Risikomanagement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Rivest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34, 61
Rotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Salted Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Sammelrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Säuberung von Ausgabewerten . . . . . . . . . . . . . . . . . . . . . . . . 55
Schadensbegrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19, 26
Schlüssellänge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34, 50
Secure Hash Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34, 61
Security by Obscurity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Service-oriented Architectures (SOA) . . . . . . . . . . . . . . . . . . . . 21
Session . . . . . . . . . . 20, 21, 24, 35, 36, 41, 42, 50, 51, 52, 55, 57
68
Session Hijacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Session-Management . . . . . . . . . . . . . . . . . . . . . . . 21, 35, 50, 55
Sichere Standardeinstellungen . . . . . . . . . . . . . . . . . . . . . . . . . 19
Sicherheitsanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Sicherheitsanforderungen . . . . . . . . . . . . 9, 14, 15, 25, 34, 53, 59
Sicherheitsbewusstsein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Sicherheitsgrad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15, 16
Sicherheitskonzept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 13
Sicherheitslücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Sicherheitsziele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 14
Smartcard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
SMB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
SMTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33, 62
Spoofing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 22, 42, 45, 46, 55, 56, 62
SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 22, 42, 45, 56
Stack Traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Standardkonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . 13, 57, 58
symmetrische Schlüssel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Systemwiederherstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Systemzugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 13, 54, 55, 56, 58
Thread Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Time-Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51, 52
TripleDES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Überlastung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20, 58
UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
URI/URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41, 46, 47
69
Verfügbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10, 22, 60
Versagensfall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Verschlüsselung . . . . . . . . . . . . . 21, 26, 31, 33, 34, 42, 48, 49, 51
Vertrauensbereich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29, 30
vertrauliche Daten . . . . . . . . . . . . . . . . . 24, 27, 32, 33, 37, 51, 55
Vertraulichkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10, 60
Virenscanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Virus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
VIV-Dreieck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
VLAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Vulnerabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Wartung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 13, 23, 53, 57
Wartungsplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13, 58
Web-Anwendungen . . . . . . . . . . . . . . . . 9, 11, 20, 35, 36, 42, 44
WebDAV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Wertebereich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43, 44
White Box Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Zeitstempeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Zertifikat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25, 31, 49, 50
Zertifizierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56, 59
Zufallszahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48, 50
Zugriff über Rollen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Zugriffsrechte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14, 29, 47, 52
70
Das SAP Pocketseminar
„Sicheres Programmieren“
Die Entwicklung leistungsfähiger und sicherer Software ist eine
anspruchsvolle und zunehmend komplexe Aufgabe. Alle
Softwareentwickler stehen bei der Programmierung von
Software und Webapplikationen vor der Herausforderung, mit
der schnellen Aufdeckung neuer Angriffsmöglichkeiten auf
Software und Systeme Schritt zu halten.
Microsoft und SAP haben sich deshalb verpflichtet, Softwareentwicklern und Studenten an deutschen Hochschulen ihre langjährigen Erfahrungen und die daraus resultierenden Konzepte
zur sicheren Software-Entwicklung und zum Umgang mit
Sicherheitsschwachstellen in Form von Veranstaltungsreihen an
Universitäten und in Form von Entwicklertreffen im Dialog zu
vermitteln und die Ergebnisse zu publizieren.
Dieser Leitfaden soll für Software-Bauer jeder Art (Architekten,
Programmierer, Tester usw.) eine erste, übersichtliche Hilfestellung geben, was beim Bau von sicheren Software-Applikationen zu bedenken ist. Das Werk ist entstanden anlässlich der
Initiative „Deutschland sicher im Netz“ im Jahr 2005, und es hat
den Anspruch, die internen Richtlinien von Microsoft und SAP
auf wenigen Seiten verständlich und allgemein wiederzugeben.
Bestandteil des Handlungsversprechen „Sichere
Programmierung“ in Zusammenarbeit mit
www.sicher-im-netz.de
Herunterladen