Beruflich Dokumente
Kultur Dokumente
von
cand. inform.
Marcel Noe
Betreuer:
Prof. Dr. Martina Zitterbart
Dipl.-Inform. Lars Völker
1 Einleitung 1
1.1 Zielsetzung der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Gliederung der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Grundlagen 5
2.1 SSL/TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Domain Name System . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 ACCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Analyse 9
3.1 Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Einsatz von HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Aufwand von HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.1 Organisatorischer Aufwand von HTTPS . . . . . . . . . . . . 12
3.3.2 Technischer Aufwand von HTTPS . . . . . . . . . . . . . . . . 13
3.3.3 Rechenaufwand von HTTPS . . . . . . . . . . . . . . . . . . . 13
3.4 Gefühlte Sicherheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.5 Einschränkung von HTTPS auf Teile von Websites . . . . . . . . . . 15
3.5.1 Link auf HTTP-Seite . . . . . . . . . . . . . . . . . . . . . . . 15
3.5.2 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5.3 HTTP-Redirect . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5.4 Webserver-Konfiguration . . . . . . . . . . . . . . . . . . . . . 15
3.5.5 Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.6 Problem der Erkennung der Ähnlichkeit von Websites . . . . . . . . . 16
3.6.1 Einfacher Stringvergleich . . . . . . . . . . . . . . . . . . . . . 16
3.6.2 Auswertung des Common-Names im Zertifikat . . . . . . . . . 17
3.6.3 Verwendung eines Mustererkennungs-Algorithmus . . . . . . . 17
3.6.3.1 Der Gestalt-Ansatz . . . . . . . . . . . . . . . . . . . 17
3.6.3.2 Der Ratcliff/Obershelp-Algorithmus . . . . . . . . . 18
3.6.3.3 Umsetzung in dieser Studienarbeit . . . . . . . . . . 20
3.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 Entwurf 23
4.1 Entwurf der Software-Komponenten . . . . . . . . . . . . . . . . . . . 23
4.1.1 Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.1.1 Test-Module . . . . . . . . . . . . . . . . . . . . . . 25
4.1.1.2 Content-Module . . . . . . . . . . . . . . . . . . . . 25
vi Inhaltsverzeichnis
5 Implementierung 37
5.1 Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1.1 Die Test-Modul-Schnittstelle . . . . . . . . . . . . . . . . . . . 38
5.1.2 Die Content-Modul-Schnittstelle . . . . . . . . . . . . . . . . . 38
5.2 Laufzeitoptimierung des Ratcliff/Obershelp Algorithmus . . . . . . . 38
5.3 Python-spezifische Probleme . . . . . . . . . . . . . . . . . . . . . . . 39
5.3.1 Global Interpreter Lock . . . . . . . . . . . . . . . . . . . . . 39
5.3.2 PyDNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.3.3 PyOpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.3.4 Timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4 PHP: Probleme beim Verarbeiten von Intergern . . . . . . . . . . . . 42
5.5 Aufbau des Webinterfaces . . . . . . . . . . . . . . . . . . . . . . . . 43
5.6 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6 Evaluierung 45
6.1 Bestimmung des Ähnlichkeits-Schwellwerts . . . . . . . . . . . . . . . 45
6.1.1 Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.1.2 Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.2 Laufzeitverhalten des Ähnlichkeitstests . . . . . . . . . . . . . . . . . 47
6.2.1 Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.2.2 Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.2.3 Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.3 Laufzeitverhalten unter realistischen Bedingungen . . . . . . . . . . . 51
6.3.1 Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.3.2 Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Inhaltsverzeichnis vii
6.3.3Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.3.3.1 Gesamtleistung . . . . . . . . . . . . . . . . . . . . . 52
6.3.3.2 Dauer des Ähnlichkeitstests . . . . . . . . . . . . . . 52
6.3.3.3 Dauer der Netzwerkübertragung . . . . . . . . . . . 53
6.3.3.4 Verhältnis der Dauer des Ähnlichkeitstest zur Dauer
der Netzwerkübertragung . . . . . . . . . . . . . . . 55
6.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Literatur 59
1. Einleitung
In den letzten Jahren hat die Kommunikation über das Internet einen starken Zu-
wachs erhalten. Immer mehr werden auch sensible Daten wie beispielsweise solche,
die personenbezogen sind, über das Internet übertragen. Zum Schutze derartiger In-
formationen wurden diverse Verschlüsselungverfahren entwickelt. Obwohl viele dieser
Verfahren bereits in Standardsoftware wie E-Mail-Clients und Webbrowsern inte-
griert sind, ist der größte Teil des Informationsaustauschs über das Internet immer
noch ungeschützt.
Viele Anwender verzichten aus Unkenntnis oder Bequemlichkeit auf den Einsatz
geschützer Kommunikation, wenn sie über IP-basierte Netze kommunizieren. Aber
auch Diensteanbieter im Internet scheuen den Einsatz dieser Technologie. Die Ursa-
chen hierfür sind oft Kostengründe: So benötigt z.B. das Beantworten einer Anfrage
über eine TLS-geschützte Verbindung ein Vielfaches der Rechnerressourcen einer
unverschlüsselten Anfrage mit dem selben Inhalt [CoDW06]. Aber auch die Pfle-
ge der notwendigen Public-Key-Infrastruktur stellt einen nicht zu unterschätzenden
finanziellen und personellen Aufwand dar.
Aus der ursprünglichen Fragestellung dieser Studienarbeit, wieviele der Dienste, die
von den Nutzern ungeschützt benutzt werden, auch geschützt verfügbar sind, ent-
wickelte sich die Fragestellung, ob es möglich ist, automatisch zu testen, welche Si-
cherheitsverfahren von einer Gegenstelle unterstützt werden. Sehr schnell stellte sich
heraus, dass dies zwar für einige Protokolle wie z.B. SMTPS sehr einfach möglich,
für HTTPS jedoch mit sehr großen Schwierigkeiten verbunden ist. Da das World-
Wide-Web mittlerweile einer der am weitesten verbreitetsten Dienste im Internet
ist, wäre daher jedoch gerade der Test auf die Unterstützung von HTTPS einer der
aufschlussreichsten Tests.
Interessant ist die Tatsache, dass ein signifikanter Anteil der Webseiten durchaus
verschlüsselt verfügbar ist, dem Benutzer dies jedoch oft nicht angeboten wird. So
kommt es z.B. oft vor, dass die Eingabe eines Passwortes über eine geschützte Verbin-
dung abgewickelt, der Nutzer danach allerdings direkt wieder auf eine ungeschützte
Verbindung umgelenkt wird. Hierdurch wird die durch die Verschlüsselung gewon-
nene Sicherheit wieder gefährdet. Kapitel 3 wird sich dieser Problematik im Detail
widmen.
2 1. Einleitung
Wäre eine Software verfügbar, die diese Umleitungen verhindert, und wo möglich,
ungesicherte Verbindungen auf gesicherte Verbindungen umschreibt, könnte das Si-
cherheitsniveau im Internet signifikant erhöht werden, ohne dass weitere Änderungen
an der Software auf Server- oder Benutzerseite notwendig wäre. Dieses Ziel verfolgt
das parallel zu dieser Studienarbeit entwickelte ACCS-System. Eine genauere Be-
schreibung dieses System findet sich in Abschnitt 2.5.
Damit dieses System sinnvoll eingesetzt werden kann, ist es notwendig, zu erkennen,
welche Sicherheitsverfahren von der Gegenseite unterstützt werden.
In diesem Kapitel werden die für das weitere Verständnis der vorliegenden Studien-
arbeit vorausgesetzten Grundlagen erörtert. Außerdem wird die verwendete Termi-
nologie eingeführt.
2.1 SSL/TLS
Bei SSL (Secure Socket Layer) handelt es sich um ein Verfahren, bei dem zwischen
Transport- und Anwendungsschicht eine Verschlüsselungsschicht eingeführt wird.
Bis 1998 veröffentlichte Netscape die Versionen SSLv1, SSLv2 [Hick95] und SSLv3
[FrKK96, Secr08]. 1999 wurde das Verfahren von der IETF (Internet Engineering
Task Force) standardisiert und als RFC 2246 veröffentlicht [DiAl99]. Hierbei erfolg-
te die Umbenennung in TLS (Transport Layer Security). Mittlerweile existieren die
TLS Versionen TLSv1.0 [DiAl99] und TLSv1.1 [DiRe06].
Es herrscht immer noch eine große Begriffsverwirrung zwischen TLS und SSL. Dies
liegt zum einen daran, dass es sich technisch gesehen um das gleiche Protokoll in
lediglich unterschiedlichen Versionen handelt. Zum anderen hat sich der Begriff SSL
mittlerweile als eine Art Prädikat für Sicherheit durchgesetzt und wird daher von
Herstellern und Providern aus Marketinggründen öfter verwendet als der Begriff
TLS, selbst dann, wenn eigentlich TLS gemeint ist.
Wird in dieser Studienarbeit eine Aussage getroffen, die sowohl auf SSL als auch
auf TLS zutrifft, wird der Begriff SSL/TLS oder TLS/SSL verwendet. Wird hin-
gegen nur der Begriff SSL oder TLS verwendet, dann ist auch nur diese spezielle
Protokollversion gemeint.
2.2 HTTPS
HTTPS (Hyper Text Transfer Protocol Secure) ist ein Verfahren zur Sicherung der
Datenübertragung über HTTP.
Ursprünglich wurde HTTPS von der Firma Netscape entwickelt und 1994 zusammen
mit dem SSLv1.0-Standard veröffentlicht. Von der IETF wurde HTTPS später als
RFC 2818 spezifiziert [Resc00].
6 2. Grundlagen
In aktuellen Browsern wird HTTPS entweder mit SSLv3, TLSv1.0 oder TLSv1.1
eingesetzt. Versionen vor SSLv3 sollten aufgrund von Sicherheitsschwächen nicht
mehr eingesetzt werden [MBLB+ 02].
Bei HTTPS wird standardmäßig der TCP-Port 443 verwendet. Möchte ein Browser
HTTPS verwenden, so muss er zuerst eine SSL/TLS-Verbindung mit einem Webser-
ver aufbauen. Diese SSL/TLS-Verbindung wird nun als Tunnel für eine normale
HTTP-Anfrage verwendet. HTTPS ist also technisch gesehen transparent für Brow-
ser und Webserver, es sind keinerlei Änderungen an der HTTP-Komponente not-
wendig1 [Resc00]. Durch den Einsatz von SSL/TLS-Proxies wie stunnel ist es sogar
möglich, HTTPS mit Web-Browsern und Web-Servern zu realisieren, die SSL/TLS
nicht unterstützen [Hatc08].
Zur Auflösung werden sogenannte Nameserver verwendet, also Server die den DNS
Dienst anbieten.
Das DNS arbeitet hierarchisch. An oberster Stelle stehen die sogenannten Top-Level-
Domains. Hierbei handelt es sich entweder um Länderkennungen wie z.B. .de, .uk
oder .ch oder um generische Top-Level-Domains wie .org, .com, .net.
Eine Zone bezeichnet einen Teilhirarchie innerhalb des DNS. Dies könnte z.B. ei-
ne Second-Level-Domain sein. Nameserver können innerhalb einer Zone kann die
Zuständigkeit für eine Unterzone an andere Nameserver delegieren.
Innerhalb einer Zone können mehrere Arten von Einträgen erzeugt werden. Am
wichtigsten für die vorliegende Studienarbeit sind A-, AAAA- und MX-Records.
Bei einem A-Record handelt es sich um eine IPv4 und bei einem AAAA-Record
um eine IPv6 Adresse, die innerhalb eines Zonefiles an einen symbolischen Rechner-
namen vergeben werden kann. Der symbolische Rechnername tm innerhalb der Zone
uka.de hat z.B. den A-Record 141.3.70.4“ und den AAAA-Record 2001:638:204::42“.
” ”
Den vollständigen Rechnernamen mit Domain, im Beispiel also tm.uka.de bezeichnet
man auch als Fully-Qualified-Host-Name (FQDN ).
Mit Hilfe eines MX-Records können Mailserver benannt werden, die für die Zone
zuständich sind. Die MX-Records für tm.uka.de sind beispielsweise iramx1.ira.uni-
karlsruhe.de und iramx2.ira.uni-karlsruhe.de, welche wiederrum Rechnernamen in-
nerhalb der Zone ira.uka.de sind.
1
Natürlich behandeln Browser HTTPS nicht vollkommen transparent, da dem Benutzer durchaus
signalisiert wird, dass eine sichere Verbindung aufgebaut wurde. Ausserdem hat der Benutzer
oft die Möglichkeit, die Zertifikate der Gegenstelle zu betrachten.
2.4. Terminologie 7
2.4 Terminologie
Laut des Deutschen Universal-Wörterbuchs des Duden-Verlags [Dude07] handelt es
sich bei einer Website um die Gesamtheit der hinter einer Adresse stehenden Seiten
”
im World Wide Web“.
Der Begriff Website bezeichnet also ein zusammenhängendes Informationsangebot
im World Wide Web. Eine Website besteht aus mehreren Webseiten. Eine Webseite
ist ein einzelnes Dokument innerhalb einer Website.
Die Adresse kann hierbei als die Schnittmenge aller URLs aller Unterseiten einer
Website angesehen werden, in der Regel also um die Kombination aus dem Proto-
koll http oder https und einem Fully-Qualified-Domain-Name (FQDN) [BLFM05].
Wichtig ist, dass Adresse hier nicht synonym zu dem Begriff URL steht, da unter
einer URL immer nur eine Datei, Seite oder Dienst angeboten wird.
Zu bemerken ist hierbei, dass die Begriffe FQDN und Domain oft durcheinander
geworfen werden. Insbesondere bei Hosting-Providern scheint hier einige Verwirrung
zu herrschen. Rechnernamen innerhalb einer Domain und Subdomain werden oft
verwechselt. Dies rührt daher, dass es im DNS (Domain-Name-System) möglich ist,
innerhalb einer Domain für eine Subdomain sowohl eine Delegation als auch einen
A-Record zu definieren. So ist beispielsweise innerhalb des Zonefiles der Zone .org
der Eintrag wikipedia.org sowohl eine Delegation an die Nameserver von Wikipedia
als auch selbst wieder ein A-Record innerhalb der Domain .org, der auf eine IPv4-
Adresse auflöst.
Daher gilt für diese Studienarbeit folgende Definition:
Der vollständige Name eines Rechners inklusive Domain Name wird als FQDN und
die Domain ohne Angabe eines Rechners als Domain bezeichnet. Ist also ein A-
Record (IPv4) oder AAAA-Record (IPv6) innerhalb einer Domain gemeint, der auf
eine IP-Adresse gemeint, wird von einem FQDN gesprochen. Ist hingegen die Dele-
gation an einen Nameserver gemeint, wird von einer (Sub-)Domain gesprochen2 .
Weiterhin ist zu beachten, dass bei der Voranstellung von http:// ein anderer Na-
mensraum verwendet wird als bei der Voranstellung von https://. Details siehe Ab-
schnitt 3.6.
Der Vollständigkeit halber sei hier noch auf den Sonderfall einer, auf mehrere FQDNs
verteilten Website hingewiesen. Anscheinend wurde diese Vorgehensweise als eine
Art der Suchmaschinenoptimierung propagiert3 [Brad07, Bake08]. Die Schnittmenge
wäre hier natürlich leer, die Website hätte nach obider Definition also keine Adres-
se. In diesem Falle sei die Adresse einer solchen Website als die Kombination aus
Protokoll und FQDN der Einstiegsseite definiert.
Beispielsweise könnte sich der Betreiber des Wintersportportals http://www.winter.
invalid dazu entschließen, für jede Region einen eigenen FQDN innerhalb der Domain
2
Streng genommen ist auch diese Definition nicht vollkommen korrekt, da Subdomains auch ohne
Delegation realisiert werden können, bzw. auch die Subdomain wieder auf dem selben Name-
server liegen kann. Zur Vereinfachung soll hier jedoch von dem einfachen Fall, bei dem eine
(Sub-)Domain an einen anderen Nameserver delegiert wird, ausgegangen werden.
3
Hierbei gibt es seit einiger Zeit einen neuen Wirtschaftszweig so genannter SEOs (Search Engine
Optimizer), die versprechen, das Rating bei den großen Suchmaschinen wie Google und Yahoo
zu verbessern. Ironischerweise wird mit solchen Maßnahmen oftmals eher der gegenteilige Effekt
erreicht.
8 2. Grundlagen
2.5 ACCS
ACCS steht für Auto-Configuration of Communication Security. Es handelt sich
hierbei um ein am Institut für Telematik der Universität Karlsruhe (TH) entwickel-
tes System zur Erhöhung der Sicherheit von IP-basierter Kommunikation. Hierzu
klinkt sich das ACCS -System in das Betriebssystems ein und erkennt automatisch
alle Versuche, eine unsichere Verbindung aufzubauen. Das System versucht nun, mit
Hilfe verschiedener Tests festzustellen, ob die angesprochene Gegenstelle die Mög-
lichkeit besitzt, die Kommunikation über eine geschützte Verbindung abzuwickeln.
Hierzu unterstützt das ACCS System nicht nur TLS/SSL-basierte Verbindungen,
sondern auch die Möglichkeit eine mittels IPSec geschützte Verbindung aufzubauen
und hierüber die angeforderte Kommunikation abzuwickeln.
Die vorliegende Studienarbeit ist Teil des ACCS -Forschungsprojekts und soll proto-
typisch einige der Testverfahren entwickeln und testen, die später in diesem System
zum Einsatz kommen werden.
3. Analyse
In diesem Kapitel wird die Problemstellung, zu erkennen, ob eine Website auch per
HTTPS verfügbar ist, analysiert. Es wird sich zeigen, dass es zwar relativ einfach
ist, festzustellen, ob ein bestimmter Webserver HTTPS anbietet; allerdings ist es
notwendig, die über HTTPS abgerufenen Inhalte mit der ursprünglichen Site zu
vergleichen, um festzustellen, ob es sich um die selbe Website handelt.
Zum besseren Verständnis der Problemstellung werden zunächst Gründe untersucht,
die Website-Betreiber dazu bewegen, HTTPS-Verbindungen nicht zuzulassen. Es
folgt ein kurzer Abschnitt, in dem verschiedene Techniken vorgestellt werden, mit
denen Website-Betreiber versuchen, HTTPS-Verbindungen zu verhindern.
Im zweiten Teil dieses Kapitels wird ausführlich auf verschiedene Verfahren und Al-
gorithmen eingegangen, mit denen Websites miteinander verglichen werden können.
Die Algorithmen werden auf Vor- und Nachteile untersucht. Besonderes Augenmerk
wird hierbei auf die Tauglichkeit zum Vergleich von sich dynamisch ändernden Web-
sites gelegt. Einer der vorgestellten Algorithmen stellt sich als besonders geeignet
heraus und wird in den folgenden Kapiteln in einer verbesserten Form zur Lösung
der Aufgabenstellung verwendet.
3.1 Anforderungen
Eines der Ziele dieser Studienarbeit ist es, ein Verfahren zu entwickeln, mit dem
festgestellt werden kann, ob eine Website per HTTPS verfügbar ist. Die Anwendung
dieses Verfahrens wird im folgenden Test genannt.
Hierbei gilt in dieser Studienarbeit folgende Definition:
Eine Website ist per HTTPS verfügbar, genau dann wenn:
• über die HTTPS-Verbindung die gleiche Website angeboten wird wie über eine
HTTP-Verbindung.
Der zu entwickelnde Test soll genau dann ein positives Ergebnis zu einer Website
liefern, wenn diese per HTTPS verfügbar ist, sonst ein negatives.
Der erste Punkt obiger Definition ist relativ leicht zu überprüfen, indem man ver-
sucht, eine HTTPS-Verbindung mit den Webservern, auf denen die Ziel-Website ge-
hostet wird, aufzubauen. Kommt diese Verbindung zustande, und wird ein SSL/TLS-
Zertifikat zurückgeliefert, so ist die erste Forderung an den Test erfüllt.
Die Umsetzung des zweiten Punkt erweist sich jedoch als ungleich schwieriger (vgl.
Abschnitt 3.6). Das Problem ist, dass sich viele Websites aufgrund der Verwendung
von dynamischen Inhalten bei jedem Abruf verändern.
Bei einer statischen Website ist durch einfachen Stringvergleich der über HTTPS
angeforderten mit der unverschlüsselt angeforderten Website noch relativ einfach
möglich, herauszufinden, ob es sich um die gleiche Website handelt. Im Gegensatz
hierzu verändern sich viele dynamische Websites jedoch mit jedem Abruf. Dies kann
von simplen Änderungen wie der Anzeige des aktuellen Datums, bis zu einer voll-
ständigen Änderung oder Umsortierung der Inhalte reichen. Ein extremes Beispiel
hierfür ist die Website des Online-Buchhändlers Amazon. Hier werden bei jeder An-
frage sogar Teile des Layouts ausgetauscht, um verschiedene Produktempfehlungen
zu präsentieren. Ein einfacher Stringvergleich würde in diesem Falle fälschlicherweise
davon ausgehen, dass es sich um unterschiedliche Websites handelt.
Der zu entwickelnde Test muss in der Lage sein, auch mit diesen sich ändernden In-
halten umgehen zu können, und auch solche Websites möglichst akkurat vergleichen
können.
Verschiedene Möglichkeiten, einen solchen Test zu implementieren werden in den
Abschnitten 3.6ff vorgestellt.
Datentransfers. Es ist zwar nicht möglich, an das Passwort des Benutzers zu gelan-
gen, es kann allerdings nachvollzogen werden, welche Daten sich der Benutzer nach
seinem Login anschaut. So kann es möglich sein, dass ein mitlauschender Angreifer
in den Besitz von sensiblen Informationen gelangt, auf die er sonst keinen Zugriff
hätte. Denkbar wäre hier z.B., dass der Angreifer nach einem Login des Nutzers zu
einem Webmailer die E-Mails mitlesen kann, die der User sich gerade mit seinem
Rechner betrachtet. Im Falle eines Online-Shops könnte der Angreifer nachvollzie-
hen, für welche Produkte sich der User interessiert oder welche er kauft. Handelt es
sich hier beispielsweise um eine Online-Apotheke, kann dies für den User eine erhebli-
che Beeinträchtigung seiner Privatsphäre bedeuten, da aus gekauften Medikamenten
Rückschlüsse auf vorhandene Krankheiten gezogen werden könnte.
Unter Umständen kann es dem Angreifer sogar gelingen, die Identität des Benut-
zers zumindest zeitweise zu übernehmen. Da das HTTP-Protokoll ist zustandslos
ist, müssen mit jeder Anfrage vom Benutzer genügend Informationen mitgesendet
werden, um diesen zu identifizieren. Die einfachste Methode ist, jedes mal den Be-
nutzernamen und das Passwort mit der Anfrage zu übermitteln2 [FHBHL+ 99].
Viele Anbieter versuchen jedoch, zumindest das Passwort des Benutzers zu schüt-
zen, und beschreiten einen anderen Weg: Alle Daten einer Sitzung werden auf dem
Webserver in einer so genannten Session gespeichert. Der Benutzer bekommt nun
eine so genannte Session-Id übergeben, die ihn für die Benutzung dieser Session
legitimiert. Die Session-Id kann als eine Art Token gesehen werden, den der Benut-
zer mit jeder Anfrage mitschickt. Die eigentlichen Authentifizierungsdaten bleiben
so auf dem Webserver und sind vor einem mithörenden Angreifer geschützt. Aller-
dings handelt es sich hier nur um eine Problemverschiebung: Ist der Benutzer einmal
authentifiziert, ist die Session-Id äquivalent zu einem Passwort. Gelingt es dem An-
greifer, diese Session-Id zu extrahieren, kann er – zumindest für die Dauer einer
Sitzung – die Identität des Benutzers annehmen. Das Passwort des Benutzers bleibt
so zwar geschützt, nicht jedoch die vertraulichen Daten, für die er sich durch die
Verwendung seines Passwortes legitimiert hat. Auch eine zusätzliche Überprüfung
der IP-Adresse kann hier nur wenig Schutz bieten, da ein Angreifer, der in der Lage
ist, Pakete zwischen Sender und Empfänger abzufangen, die Überprüfung der IP-
Adresse durch IP-Spoofing, also dem Vortäuschen einer falschen Absenderadresse,
umgehen kann.
Ist der Angreifer neben dem reinen Mitlesen dazu noch in der Lage, den Daten-
transfer zwischen Webserver und Benutzer zu manipulieren, dann ist es ihm sogar
möglich, in den Besitz des Passwortes des Benutzers zu gelangen. Hierzu muss er
lediglich den Hyper-Link, der den Benutzer zur Passworteingabe ( Login“) führt, um-
”
lenken, so dass dieser auf eine vom Angreifer kontrollierte Website führt. Dort kann
der Angreifer das Passwort des Benutzers abfangen und diesen danach zur richtigen
Website zurücklenken. Da der Link zur Passworteingabe meistens nicht per HTTPS
geschützt wird, bleibt eine solche Manipulation in den meisten Fällen unbemerkt.
Beispiele für solche Angriffe finden sich in [deVi06], [Lawr05] und [Mill05].
Insgesamt muss also festgestellt werden, dass ein wirkungsvoller Schutz i.a. nicht
gegeben ist, wenn lediglich ein Teil einer Website mittels HTTPS geschützt wird.
2
Auf diese Weise funktioniert z.B. die in RFC-2617 spezifizierte Basic Authentifizierung.
12 3. Analyse
Daraus ergibt sich direkt die Frage, warum die meisten Website-Anbieter immer
noch auf den Einsatz von HTTPS verzichten bzw. diesen nur für einen geringen Teil
ihrer Inhalte anbieten. Die Ursachen hierfür werden im folgenden Abschnitt genauer
diskutiert.
• Organisatorischer Aufwand
• Technischer Aufwand
• Rechnerischer Aufwand
3.5.5 Bewertung
Auch wenn mit dem in den Abschnitten 3.5.3 und 3.5.4 beschriebenen Techniken
der Einsatz von HTTPS effektiv verhindert werden kann, zeigt die Praxis, dass
viele prominente Websites bevorzugt auf die die den Abschnitten 3.5.1 und 3.5.2
beschriebenen Techniken zurückgreifen oder sogar ganz auf den Einsatz dieser Tech-
niken verzichten. HTTPS kann also durchaus verfügbar sein, obwohl es nicht aktiv
angeboten wird.
Daher ist die, in der vorliegenden Studienarbeit vorgeschlagene, automatische Erken-
nung der HTTPS-Unterstützung durchaus erfolgversprechend, und in Kombination
mit dem aktiven Eingreifen durch das ACCS -System ist eine deutliche Verbesserung
der Übertragungssicherheit zu erwarten.
Problematisch ist jedoch, dass mittlerweile viele Webseiten zur Abrufzeit dynamisch
von Skripten generiert werden. Hierbei unterscheiden sich die Seiten von Abruf zu
Abruf teils erheblich, weil sich z.B. die angezeigte Werbung oder Produktvorschläge
bei jedem Aufruf ändern oder an einer anderen Stelle in der Seite angezeigt werden.
Benutzt man diesen Stringvergleich, um mehrere Versionen einer solchen Seite zu
vergleichen, indem man sie zweimal hintereinander abruft, würde dieser nur eine
geringe Übereinstimmung zurückliefern, was offensichtlich ein falsches Ergebnis ist.
Der Stringvergleich ist also nur für einfache, statisch generierten Seiten geeignet und
kommt daher als Lösung für diese Studienarbeit nicht in Frage.
von Eigenschaften zu erkennen, die diese gar nicht besitzen. Als Beispiel wird ein
Verbinde-die-Punkte Rätsel genannt, bei dem Punkte in der richtigen Reihenfolge
verbunden werden müssen, um ein Bild zu erhalten. Manche Personen sind in der
Lage, bereits das Bild oder Teile desselbigen zu erkennen, obwohl die Punkte noch
nicht (vollständig) verbunden wurden. Ein weiteres Beispiel wäre der unterbewußte
Vergleich einer neu kennengelernten Person mit einer, die man bereits kennt ( Person
”
A erinnert mich an Person B“).
Die algorithmische Umsetzung dieser Vorgehensweise wird im Artikel Ratcliff/
”
Obershelp-Mustererkennungs-Algorithmus“ genannt. Dieser Algorithmus nimmt zwei
eindimensionale Objekte als Eingabe und gibt den Prozentwert der Ähnlichkeit der
beiden Objekte zueinander aus. Da Strings eindimensionale Objekte sind, eignet sich
dieser Algorithmus insbesondere zum Stringvergleich.
In dem Artikel werden mehrere Beispielanwendungen für den Algorithmus genannt.
Die erste Anwendung ist ein Compiler, der in der Lage ist, Programme trotz Tipp-
fehlern korrekt zu übersetzen. Hierzu wird aus den Namen aller im Namensraum der
Stelle des Fehlers befindlichen Entitäten wie Variablen, Funktionen und Schlüssel-
wörter ein Wörterbuch erstellt. Das fehlerhafte Wort wird nun mit Hilfe des Ratcliff/-
Obershelp-Algorithmus mit allen Wörtern des Wörterbuchs verglichen und durch den
besten Treffer ersetzt. Dem Benutzer wird nun eine Warnung ausgegeben.
Als weiteres Beispiel wird Lernsoftware genannt. Bei damaliger Software wird von
den Autoren kritisiert, dass diese sich auf Multiple-Choice beschränke, da es kei-
ne zuverlässige Methode gebe, die Richtigkeit einer vom Benutzer als Freitext ein-
gegebenen Antwort zu erkennen – denn bereits ein einziger Tippfehler führte zur
Bewertung als Fehler. Mit dem Ratcliff/Obershelp-Algorithmus sei es möglich, die
eingegebene Lösung mit einem Katalog von richtigen Lösungen zu vergleichen und ab
einem bestimmten Schwellenwert der Ählichkeit das Ergebnis als richtig zu werten.
Darüber hinaus denkbar wäre die Anwendung in der Rechtschreibprüfung von Text-
verarbeitungssystemen oder zur Suche von Namen in Datenbanken, wenn die Schreib-
weise nicht eindeutig ist (z.B. Mayer, Maier, Meyer).
Jedes Element auf dem Stack ist ein Array, in dem zwei Strings gespeichert werden.
Als erste Operation in der While-Schleife werden diese Strings in den Variablen a
und b gepeichert. Nun wird der größte gemeinsame Substring von a und b bestimmt
und in der Variable match gespeichert. Zur Variablen match, die initial den Wert 0
hat, wird nun die Länge von match addiert.
Als nächster Schritt werden die beiden Substrings von a und b bestimmt, die Links
von match liegen. Diese Substrings werden wieder in einem Array mit dem Namen
left gespeichert. Auf die selbe Weise werden die beiden Substrings von a und b, die
sich Rechts von match befinden, bestimmt und in der Variable right gespeichert.
Es folgt eine Überprüfung, ob es rechte oder linke Substrings gibt. Falls dies der Fall
ist, wird die entsprechende Variable (also left oder right) auf den Stack gelegt.
Sobald die While-Schleife verlassen wird, wird der Wert score zurückgegeben und
das Programm kehrt zur Funktion simil() zurück.
Zu Letzt wird der von calculateSimilarity() errechnete Wert verdoppelt (da es zwei
Eingabestrings gab) und durch die Gesamtlänge der beiden Strings geteilt.
1 f l o a t c a l c u l a t e S i m i l a r i t y ( s t a c k ){
2 Array e l e m e n t s ; // Auf dem S t a c k wird j e w e i l s
3 // e i n Array aus z w e i zu v e r g l e i c h e n d e n
4 // S t r i n g s g e s p e i c h e r t .
5
6 String a ; // Der e r s t e S t r i n g
7 String b ; // Der z w e i t e S t r i n g
8 S t r i n g match ; // Die l a e n g s t e Uebereinstimmung der
9 // beiden Strings
10 f l o a t s c o r e = 0 ; // Der a k t u e l l e Score
11
14 // Array a u f t e i l e n
15 a = elements [ 0 ] ;
16 b = elements [ 1 ] ;
17
18 // Bestimmen d e s l a e n g s t e n s Matchs
19 // der b e i d e n S t r i n g s ;
20 match = getLongestMatch ( a , b ) ;
21
22 // Score um d i e Laenge d e s
23 // Matches erhoehen
24 s c o r e += match . l e n g t h ;
25
33 // bestimmen
34 r i g h t = g e t R i g h t S u b s t r i n g ( a , b , match ) ;
35
36 // Wir schauen , ob e s u e b e r h a u p t
37 // l i n k e S u b s t r i n g s g i b t . Das i s t nur
38 // dann der F a l l , wenn b e i d e S t r i n g s
39 // m i n d e s t e n s e i n Z e i c h e n haben .
40 // Wenn ja , dann l e g e n wir b e i d e
41 // a l s Array a u f den S t a c k .
42 if ( left )
43 s t a c k . push ( l e f t ) ;
44
51 // Summe z u r u e c k g e b e n
52 return s c o r e ;
53 }
54
55 f l o a t s i m i l ( S t r i n g inputA , S t r i n g inputB ){
56
57 // Laenge b e i d e r S t r i n g s bestimmen
58 float length = ( f l o a t ) inputA . l e n g t h + ( f l o a t ) inputB . l e n g t h ;
59
64 // I n i t i a l l e g e n wir d i e E i n g a b e s t r i n g s
65 // a u f den S t a c k .
66 s t a c k . push ( new Array ( inputA , inputB ) ) ;
67
72 // Der A e h n l i c h k e i t s w e r t i s t zweimal d i e
73 // Anzahl der u e b e re i n s t i m m e n d e Z e i c h e n
74 // g e t e i l t durch d i e Summe der Laenge
75 // der b e i d e n S t r i n g s .
76 return 2 ∗ s i m i l a r i t y / l e n g t h ;
77 }
von O(n) besitzt. Der ursprüngliche Algorithmus hat eine Worst-Case-Laufzeit von
O(n3 ) und eine Best-Case-Laufzeit von O(n2 ). Hierbei bezeichnet n die Anzahl der
angegebenen Zeichen.
Die Bestimmung der Ähnlichkeit zweier Webseiten A und B geschieht in mehreren
Schritten:
3.7 Zusammenfassung
Es wurden verschiedene Algorithmen analysiert, mit denen einzelne Webseiten auf
Ähnlichkeit untersucht werden können. Während sich herausstellte, dass ein ein-
facher Stringvergleich für die Lösung dieses Problems ungeeignet ist, erwies sich
Patternmatching auf Basis einer modifizierte Form des Algorithmus von Ratcliff/-
Obershelp als effektive Lösung.
Darüber hinaus wurden verschiedenen Methoden, mit denen Website-Betreiber ver-
suchen, eine HTTPS-Verbindung auf einen Teil ihrer Website einzuschränken, aufge-
zählt, und es wurde gezeigt, dass sich zumindest ein Teil dieser Verfahren umgehen
lässt.
Insgesamt erwies sich das Konzept dieser Studienarbeit als realisierbar, so dass nun
in den folgenden Kapiteln eine konkrete Lösung entwickelt werden kann. Die Ent-
wicklung einer Methode, um HTTP-Verbindungen durch HTTPS-Verbindungen zu
ersetzen, stellte sich als realisierbar heraus.
7
In einigen Testläufen der Beispiel-Implementierung wurden mit einem Schwellenwert von 95%
die besten Ergebnisse erzielt
22 3. Analyse
4. Entwurf
In diesem Kapitel wird der Entwurf eines Systems vorgestellt, das die in der Analyse
in Kapitel 3 gewonnenen Erkenntnisse umsetzt.
Hierbei wird ein modularer Ansatz gewählt, wobei eine Rahmenarchitektur, zur
Durchführung von Tests auf unterstützte Sicherheitsverfahren, entworfen wird, die
später mit Hilfe von Modulen einfach erweitert werden kann. Der eigentliche Test
auf die Verfügbarkeit einer Website mittels HTTPS wird als Modul entworfen. Hier-
durch wird zum einen die Vorgehensweise beim Entwerfen eines Moduls gezeigt, zum
anderen wird damit die eigentliche Aufgabenstellung dieser Studienarbeit gelöst.
Die Speicherung der Testergebnisse erfolgt innerhalb einer relationalen Datenbank,
deren Schema in diesem Kapitel erörtert wird.
Das zu entwerfende System wird als NSC (Network Security Checks) bezeichnet. Das
Präfix NSC wird zur Kennzeichnung allen zu NSC gehörigen Klassen vorangestellt.
4.1.1 Module
Funktionen werden im NSC-Framework mit Hilfe von Modulen implementiert. Es
wird zwischen zwei Arten von Modulen unterschieden:
24 4. Entwurf
4.1.1.1 Test-Module
Das Testen der unterstützten Sicherheitsverfahren wird mit Hilfe von Modulen rea-
lisiert. Ein Modul kann einen oder mehrere Tests implementieren. Implementiert ein
Modul mehrere Tests, so sollen diese in einem logischen Zusammenhang stehen. So
könnte z.B. die Überprüfung von SMTPS auf TCP-Port 465, SMTP mit STARTTLS
auf Port 25 sowie SUBMISSION auf TCP-Port 587 in einem Modul mit Namen mail ’
sinnvoll zusammengefasst werden1 .
Eine Zusammenfassung von unterschiedlichen Protokollen wie z.B. IMAPS und HTT-
PS in einem Modul wäre hingegen weniger sinnvoll, da diese Protokolle ganz unter-
schliche Anwendungsgebiete haben, und sollte daher nicht vorgenommen werden.
Einem Modul wird beim Initialisieren eine Liste der zu testenden Rechner (entweder
als DNS-Namen oder als IP-Adressen) übergeben. Alle weiteren Informationen wie
z.B. TCP-Ports, auf denen die zu testenden Dienste laufen, sind entweder fest im
Modul konfiguriert oder werden von diesem zur Laufzeit bestimmt.
Test-Module müssen eine Methode test() anbieten. Mit dieser Methode wird das Mo-
dul dazu veranlasst, alle in ihm implementierten Tests für die bei der Initialisierung
übergebenen Ziel-Rechner zu starten. Diese Methode ist synchron. Von der Methode
wird entweder eine Liste mit allen Testresultaten oder im Falle eines Fehlers eine
Exception geworfen.
Ein Ergebnisdatensatz besteht jeweils mindestens aus IP-Adresse des getesteten
Rechners, die Ports der getesteten Protokolle, sowie dem Resultat des Tests (sie-
he Abschnitt 4.1.2).
4.1.1.2 Content-Module
Content-Module dienen dazu, Inhalte einer Übertragung zu analysieren.
Einem Content-Modul werden bei der Initialisierung alle Informationen übergeben,
die das Modul benötigt, um die angeforderten Inhalte zu finden. Hierbei kann es
sich z.B. um die URL einer Webseite handeln. Es gibt allerdings auch Module, wie
beispielsweise Suchmaschinen-Crawler, bei denen die Zielseite bereits feststehen und
lediglich noch Anfrageparameter übergeben werden.
Content-Module bieten eine Methode crawl() an, die Analyse startet. Analog zur
test()-Methode arbeitet diese Methode synchron. Als Rückgabewerte liefert diese
Methode entweder die extrahierten Informationen oder, im Falle eines Fehlers, eine
Exception.
Insbesondere das Modul SIMILARITYContent, das die Unterstützung von HTTPS
überprüft, ist als Content-Modul implementiert. Zwar handelt es sich eigentlich um
den Test auf die Unterstützung eines Sicherheitsprotokolls – ein typischer Anwen-
dungsfall von Test-Modulen –, allerdings müssen für diesen Test die Inhalte der zu
testenden Webseiten, wie in Abschnitt 3.6.3.3 beschrieben, untersucht werden.
1
Diese Zusammenfassung ist auch aus technischer Sicht sinnvoll, da diese Protokolle praktisch
identisch sind.
26 4. Entwurf
• Not Connected : Eine Verbindung zum zu testenden Rechner war nicht möglich.
Entweder wurde der Verbindungsaufbau abgelehnt ( Connection refused“) oder
”
eine Verbindung kam innerhalb des zulässigen Zeitrahmens nicht zu stande und
es ist ein Timeout aufgetreten.
• TLS failed : SSL/TLS wurde angeboten, beim Handshake ist allerdings ein
Fehler aufgetreten, so dass keine SSL/TLS Verbindung zustande kam.
• TLS worked : SSL/TLS wurde angeboten, der Aufbau einer SSL/TLS Verbin-
dung war möglich und es wurde ein Zertifikat von der Gegenstelle empfangen.
In diesem Falle wird das Zertifikat dem Testergebnis für die Gegenstelle hin-
zugefügt.
4.1.3.1 Vorgehensweise
In Abschnitt 3.6.3.3 wurde eine modifizierte Form des Algorithmus von Ratcliff/-
Obershelp zur Bestimmung der Ähnlichkeit von Webseiten ausgewählt.
Diese Ähnlichkeitsberechnung wird in der Methode crawl() implementiert. Hierbei
wird die von SIMILARITYContent angebotene Methode download(url) zum Her-
unterladen verwendet. Drei Versionen der unter url angegebenen Webseite werden
in den Variablen A1 bis A3 , drei Versionen der unter httpsurl angegebenen Seite in
den Variablen B1 bis B3 gespeichert und dann der in Abschnitt 3.6.3.3 dargestellte
Algorithmus angewendet.
4.1.3.2 Entwurf
Das Modul wird als Klasse mit dem Namen SIMILARITYContent implementiert.
Diese Klasse ist von der Klasse Content abgeleitet.
Im Konstruktor wird der Klasse der notwendige Parameter url und der optionale
Parameter httpsurl übergeben. Wird httpsurl nicht übergeben, so wird hierin die
HTTPS-Entsprechung der in url übergebenen URL gespeichert.
Die Klasse enthält die privaten Methoden compare(a, b) und download(url), und
bietet die öffentliche Methode crawl() an.
4.2. Entwurf der Sicherheitsdatenbank 27
• proaktives Testen.
• Anfrage eines Clients nach einer Gegenstelle, die sich noch nicht in der Daten-
bank befindet, wodurch das durchführen von Tests veranlast wird.
• Rückmeldung eines Clients darüber, ob ein Verbindungsversuch mit dem aus-
gewählten Sicherheitsverfahren erfolgreich war oder fehlgeschlagen ist. ( Rück-
”
kopplung“).
4.2.1 Überblick
Um die spätere Auswertung der Testergebnisse zu vereinfachen, wurde die Entschei-
dung getroffen, alle Daten in einer relationalen Datenbank zu speichern. Das ER-
Diagramm der Datenbank ist in Abbildung 4.2 dargestellt.
Zentrales Element der Datenbank ist die Relation Domains. In dieser Relation wer-
den die Domainnamen der zu testenden Websites gespeichert.
In der Relation Ipaddresses werden die IP-Adressen aller zu testenden Rechner ge-
speichert.
Über die Relation domains has ipaddresses werden die IP-Adressen zu Domains und
der Funktion der IP-Adresse innerhalb einer Domain (z.B. Webserver, MX-Server,
DNS-Server) zugeordnet. Hat eine IP-Adresse mehrere Funktionen innerhalb einer
Domain, erfolgen auch mehrere Einträge in die Relation domains has ipaddresses.
Für jeden durchgeführten Test wird in der Relation Tests ein Eintrag erzeugt. In die-
sem Eintrag ist unter anderem die IP-Adresse des getesteten Rechners, das getestete
Protokoll sowie das Ergebnis des Tests vermerkt.
Die wichtigsten Relationen werden in den folgenden Abschnitten im Detail beschrie-
ben.
28 4. Entwurf
HI
G
HI
23 4 53
G
,K <!@
J
HI
G
23 4 53 BCC
!" #$%& #& !" #$%& % ,- .
'( ' ' )*+
H 7 483 9
;
! " #$%&
!" #$%& #& !" #$%& % ,- /
'( ' ' )*+
HI
G
HI
G
! " #$%& #& ,K <!@ & % ,- .
'( 'J ' )*+
01
! " #$%& #& ,K <!@ & % ,- /
'( 'J ' )*+
7 483 9: HI
01 ; G
< ,=&$>,& #& $? # @,&&,& % ,- .
'( ' ' )*+
23 4 53 6
<,=&$>,& #& $? # @,&&,& % ,- A
'( ' ' )*+
01
<,=&$>,& #& $? # @,&&,& % ,- A
'( ' ' )*+
7 483 9:
;
U
V 8 W6 W W W
;
23 4 53
? @! >! D !M
? @! >! D !M& $% ,- .SA T
'
7 483 9:
;
1
8 N 3 8 O
0 P
1
Q 10
1
73 8
>,& >& % ,- /
' )*+
1 23 4 53
1
@,& LM>
>,& >& % ,- A
1 ' )*+
>,& >& % ,- R
' )*+
>,& >& % ,- R
' )*+
23 4 53 BCC
23 4 53 C
D # $% ,- / E/ F
'
4.2.2 Keywords
In der Relation Keywords werden von Hand Schlüsselwörter eingetragen, die als Ein-
gabe für die Content-Module dienen. Die Content-Module (vgl. Abschnitt 4.1.1.2)
liefern eine Liste mit Domains zurück2 , welche in die Relation Domains eingefügt
und danach mit den entsprechenden Schlüsselwörtern verknüpft werden.
4.2.3 Domains
4.2.4 Ipaddresses
Die Rechnernamen innerhalb einer Domain werden bereits zur Testzeit in IP-Adres-
sen aufgelöst, und die Testresultate werden mit den entsprechenden IP-Adressen
verknüpft. Hierdurch ergibt sich zwar der Nachteil, dass spätere Änderungen im
DNS zur Zeitpunkt des Tests nicht mehr berücksichtigt werden. Würde hingegen der
symbolische Hostname gespeichert, ergäben sich allerdings große Probleme bei der
2
Zu beachten ist hier, dass es sich nicht zwangsläufig um Second-Level-Domains handeln muss,
sondern durchaus auch Domains tieferer Ebene zurückgeliefert werden können.
30 4. Entwurf
Zusammenarbeit mit dem ACCS-System. Die Ursache hierfür liegt darin, dass das
ACCS-System sich an der Socketschnittstelle des Kernels in den Verbindungsaufbau
einklingt. An dieser Schnittstelle ist die Angabe des Zielhosts bereits in eine IP-
Adresse aufgelöst worden. Da die Zuordnung von symbolischem Hostnamen auf IP-
Adressen nicht injektiv ist, gäbe es keine einfache Möglichkeit, die Testergebnisse in
der Datenbank zu lokalisieren.
IPv4-Adressen werden üblicherweise durch einen String repräsentiert. Dieser String
besteht aus vier dezimalen Zahlengruppen, die jeweils durch einen Punkt getrennt
sind, also z.B. 192.168.255.1“. Jede dieser Zahlengruppen kann einen Wert zwischen
”
0 und 255 annehmen.
Analog dazu werden IPv6-Adressen durch einen String mit 8 hexadezimalen Zah-
lengruppen repräsentiert, die jeweils durch einen Doppelpunkt getrennt sind. Jede
dieser Zahlengruppen kann einen Wert zwischen 0x0000 und 0xFFFF, also zwischen
0 und 65535, annehmen.
Für die Speicherung in einer Datenbank ist die Darstellung als String jedoch ungeeig-
net. Zwar bieten einige Datenbank-Management-Systeme (DBMS) wie z.B. Oracle
und PostgreSQL eigene Datentypen für IPv4-Adressen an, IPv6 wird allerdings bis-
her von keinem dieser Produkte unterstützt. Der Entwurf dieser Studienarbeit soll
sich nicht auf die Eigenschaften eines bestimmten Datenbanksystems stützen. Um
den Entwurf weitestgehend produktneutral zu gestalten, ist der Entwurf eines ande-
ren Formats zur Speicherung von IP-Adressen erforderlich.
Würde eine IPv4-Adresse als String gespeichert, wäre hierzu ein Feld notwendig, das
15 Byte lang ist. Da eine IPv4-Adresse allerdings nur 2564 unterschiedliche Werte
darstellen kann, was einer Länge von 32 Bit – oder 4 Byte – entspricht, würden bei
der Speicherung als String 11 Bytes verschenkt werden.
Darüber hinaus wären Datenbankanfragen, die sich nicht auf eine bestimmte IP-
Adresse, sondern z.B. auf ein bestimmtes Subnetz3 beziehen, nur mit Hilfe von Strin-
goperationen möglich. Dies würde eine sehr große Last für die Datenbank bedeuten.
Die Ursache hierfür ist, dass die verwendete Stringoperation für jeden Datensatz in-
nerhalb der Relation durchgeführt werden muss. Üblicherweise werden zum schnel-
leren Auffinden von Datensätzen innerhalb einer Relation spezielle Indexstrukturen
verwendet. Beim Verwenden von Stringoperationen können diese Indexstrukturen
allerdings nicht, oder nur teilweise benutzt werden, was einen deutlich höheren Auf-
wand für das BDMS bedeutet.
3
Im vorliegenden Entwurf werden solche Suchoperationen nicht durchgeführt. Im Rahmen zu-
künftiger Erweiterungen sind jedoch durchaus Anwendungen solcher Anfragen denkbar (z.B.
zur Suche aller Webserver, die von einem Provider betrieben werden).
4.2. Entwurf der Sicherheitsdatenbank 31
Aufgrund dieser Nachteile wurde für diese Studienarbeit eine andere Darstellung ver-
wendet. Für die Speicherung in der Datenbank wird eine Umwandlung des Strings
in eine Ganzzahl vorgenommen. Eine IPv4-Adresse wird hierzu an den Punkten in
4 Teile zerlegt. Jeder dieser Teile repräsentiert eine Zahl zwischen 0 und 255, kann
also mit Hilfe von 8 Bit dargestellt werden. Nun wird der erste der so erhaltenen
4 Teile mit 224 , der zweite mit 216 und der dritte mit 28 multipliziert. Nun wird
die Summe dieser drei so erhaltenen Produkte gebildet, und der vierte, unverän-
derte Teil dazuaddiert. Insgesamt entsteht so eine 32 Bit lange Ganzzahl, der die
ursprüngliche IPv4-Adresse repräsentiert. Die IPv4-Adresse 192.168.255.1“ würde
”
mit diesem Verfahren in 3232300801“ umgewandelt werden.
”
Die Umwandlung einer IPv6-Adresse in eine 128 Bit lange Ganzzahl geschieht analog,
wobei hier jedoch nicht 8 Bit, sondern gleich 16 Bit auf einmal kodiert werden: Die
IPv6-Adresse wird an den Doppelpunkten in 8 Teile zerlegt, von denen jeder 16 Bit
lang ist. Der erste Teil wird nun mit 2112 , der zweite mit 296 (da 112 - 16 = 96) usw.
multipliziert. Auch hier werden nun wieder die Summen der so erhaltenen 7 Produk-
te und des letzten, unmodifizierten Teil der IPv6-Adresse gebildet, wodurch eine 128
Bit lange Ganzzahl entsteht. Die IPv6-Adresse 2001:638:204:10:214:85ff:fe31:19a1“
”
würde mit diesem Verfahren in 42540614293834371487594751202908248481“ umge-
”
wandelt werden.
Ein Problem bei der Speicherung von IPv6-Adressen als Ganzzahl stellt jedoch die
Tatsache dar, dass die meisten Datenbank-Systeme keine 128 Bit langen Ganzzahlty-
pen anbieten. Da jedoch die Verbreitung von IPv6 immer mehr fortschreitet, besteht
die Hoffnung, dass viele Datenbanksysteme in absehbarer Zukunft einen eigenen Da-
tentyp zur Speicherung von IPv6 anbieten werden. Dies hätte außerdem den Vorteil,
dass die IP-Adressen nichtmehr im Programmcode umgerechnet werden müssen.
Hierdurch wäre der Entwurf allerdings nichtmehr produktneutral.
Bis diese Datentypen verfügbar sind, wurde für diese Studienarbeit eine andere Zwi-
schenlösung gewählt: Der SQL-99-Standard definiert den Datentyp DECIMAL. Mit-
hilfe dieses Datentyps können Gleitkommazahlen präzise gespeichert werden: Üb-
licherweise werden Gleitkommazahlen mit Hilfe der IEEE-754-Darstellung gespei-
chert. Diese Darstellung hat jedoch den Nachteil, dass Operationen mit IEEE-754-
Zahlen nicht immer genau sind, was zum Auftreten von Rundungsfehlern führen
kann. Im Gegensatz dazu kann bei der Darstellung einer Zahl als DECIMAL die
Genauigkeit mit Hilfe der Angaben der Gesamtlänge der Zahl sowie der Nachkom-
mastellen genau festgelegt werden. Die maximale Länge einer DECIMAL-kodierten
Zahl beträgt 65 Stellen. Da die größte mögliche IPv6-Adresse den Wert 2128 und
damit 39 Stellen hat, ist eine Spalte vom Typ DECIMAL(39,0) hinreichend lang,
um alle möglichen IPv4- sowie IPv6-Adressen zu speichern.
Zur Unterscheidung zwischen einer IPv4- und eine IPv6-Adresse wurde in der Rela-
tion ipaddresses zusätzlich noch ein ENUM-Feld mit den beiden möglichen Werten
4“ und 6“ hinzugefügt, dass angibt, um welche Art von Adresse es sich handelt.
” ”
4.2.5 Protocols
In der Relation Protocols ist für jedes Protokoll, das getestet werden kann (d.h.
für das ein Testmodul vorhanden ist) ein Eintrag vorhanden. Dieser wird mit dem
Testergebnis verknüpft.
32 4. Entwurf
Da in dieser Studienarbeit die Annahme gilt, dass jedem Protokoll fest eine TCP-
Port-Nummer zugeordnet ist, wird in dieser Relation diese Nummer als Primär-
schlüssel verwendet.
4.2.6 Results
In der Relation Results sind alle möglichen Testergebnisse gespeichert. Dies dient
zum einen dazu, festzustellen, ob ein Test erfolgreich war, oder fehlgeschlagen ist,
zum anderen wird bereits die Art des Fehlers (z.B. Verbindungsaufbau fehlgeschla-
”
gen“ oder TLS-Handshake nicht möglich“) gespeichert. Diese Ergebnissen werden
”
bereits beim Erstellen der Datenbank in die Relationen eingetragen und werden zur
Laufzeit des Programms nichtmehr verändert.
Die Bedeutungen der einzelnen Resultate werden in Abschnitt 4.1.2 erläutert.
4.2.7 Tests
In der Relation Tests werden die Resultate der einzelnen Testläufe gespeichert. Hier-
zu gibt es zu jedem Testlauf jeder IP-Adresse für jeden Eintrag in der Relation
Protocols genau einen Eintrag in der Relation Tests. Durch die Verknüpfung mit
4.3. Befüllen der Sicherheitsdatenbank 33
Ipaddresses wird die Zieladresse und mit der Verknüpfung mit Protocols das getes-
tete Protokoll gespeichert. Mit der Verknüpfung zu Results wird das Resultat des
Tests, also im wesentlichen ob der Test erfolgreich war oder welche Art von Fehler
aufgeteten ist, gespeichert.
Jeder Test ist mit einem Datum versehen und beinhaltet außerdem ein Text-Feld,
in dem das Zertifikat gespeichert werden kann, das beim Test von der Gegenstelle
zurückgegeben wurde. Hierdurch sollen später detailiertere Analysen ermöglicht wer-
den, z.B. wäre die Bestimmung der häufigsten CAs (Certificate Authorities) denkbar.
wird eine Reihe von Suchmaschinen (z.B. Google, Yahoo, MSN Search) nach den n
besten Suchergebnissen befragt4 .
Diese Suchergebnisse bestehen aus einer Menge von URLs. Aus jeder dieser URLs
wird der FQDN extrahiert. Dieser FQDN wird nochmal in Rechnername und Domain
zerlegt. Diese Domain wird nun in die Datenbank eingetragen (vgl. Abschnitt 4.3.4).
Nun wird der FQDN in eine oder mehrere IP-Adressen aufgelöst5 . Außerdem werden
für die Domain noch alle MX-Records6 angefragt und in IP-Adressen aufgelöst. Die
so erhaltenen IP-Adressen werden mit ihren jeweiligen Funktionen (MX- und/oder
Webserver) in die Testdatenbank eingetragen (vgl. Abschnitt 4.3.5).
Sind alle Keywords abgearbeitet, kann der Administrator den Start der Tests ansto-
ßen. Hierbei wird für jede IP-Adresse jedes installierte Testmodul einmal abgearbei-
tet und die Ergebnisse in die Testdatenbank eingetragen (Vgl. Abschnitt 4.3.5).
Der proaktive Betrieb ist vor allem dafür vorgesehen, eine initiale Testdatenbank
aufzubauen. Hierbei wählt der Administrator die Keywords so, dass er glaubt, damit
die Themen abzudecken, die seine Benutzers besonders häufig abrufen werden.
Außerdem wurde der proaktive Betrieb dazu verwendet, die Effektivität der hier vor-
gestellten Lösung zu testen. Dieses Thema wird ausführlich in Kapitel 6 behandelt.
4.3.2 On-Demand-Betrieb
Im Gegensatz zum proaktiven Betrieb wird der On-Demand-Betrieb erst dann gest-
artet, wenn der Verbindungsaufbau entweder bereits im Gange (ACCS-Mode) oder
in Kürze zu erwarten ist (Discovery-Mode).
4.3.2.1 ACCS-Mode
Beim ACCS-Mode wird der Test direkt vom ACCS-System angestoßen. Entdeckt
das ACCS-System einen Verbindungsaufbau, dann stellt es eine Verbindung mit der
Testdatenbank her und überprüft zunächst, ob es für die Ziel-IP-Adresse bereits
einen Eintrag gibt. Wenn ja, dann werden die aktuellsten Testresultate als Grundla-
ge für eine Entscheidung verwendet. Falls keine Testresultate vorhanden sind, (oder
sich die Ziel-IP-Adresse noch nicht in der Datenbank befindet) wird in der Testda-
tenbank ein neuer Eintrag für die Ziel-IP-Adresse erzeugt und ein neuer Test wird
durchgeführt. Sobald die Ergebnisse dieses Tests vorliegen, setzt das ACCS-System
seine Arbeit fort. Sollte es hierbei zu einem Fehler kommen (z.B. weil ein Sicherheits-
verfahren trotz positiven Testergebnisses nicht verfügbar war oder das Zielsystem in
nicht mehr erreichbar ist), dann wird dieser als neues Test-Resultat in die Testda-
tenbank eingetragen (Rückkopplung). Dies vereinfacht eine spätere Fehlersuche im
Test-System.
4
Der Parameter n ist vom Administrator konfigurierbar
5
Aufgrund eines Bugs in der Python-DNS-Library wird im Moment nur IPv4 unterstützt (Siehe
Abschnitt 5.3.2). Das Framework ist allerdings für den Umgang mit IPv6 vorbereitet und die
Datenfelder in der Datenbank entsprechend dimensioniert.
6
Ein MX-Record spezifiziert einen Mailserver, der E-Mails für diese Domain annimmt.
4.3. Befüllen der Sicherheitsdatenbank 35
4.3.2.2 Discovery-Mode
Beim Discovery-Mode kommt eine DNS-Proxy-Komponente ins Spiel. Diese Kom-
ponente wird zwischen Client und DNS-Server positioniert. Alle DNS-Abfragen ge-
hen nun über diese Proxy-Komponente. Für jede DNS-Abfrage wird in der Test-
Datenbank nachgeschaut, ob sich die Domain des angefragten FQDN bereits in der
Test-Datenbank befindet. Falls nichtm wird diese eingetragen und ein neuer Test
angestoßen. Um die DNS-Abfrage nicht zu verzögern, läuft die gesamte Operation
asynchron ab.
4.3.3 Keywords eintragen
Die Keywords werden, wie oben bereits angedeutet, vom Administrator mittels eines
Pflegetools von Hand eingetragen. Das Datenbank-Management-System (DBMS)
stellt hierbei sicher, dass ein Keyword nicht mehrfach eingetragen werden kann. In
diesem Fall wird ein Fehler ausgegeben.
4.3.4 Domains eintragen
Wird die Datenbank proaktiv befüllt, dann werden die Domains von der Administra-
tionsanwendung in die Datenbank eingetragen und mit allen Keywords verknüpft,
für die eine zurückgelieferte URL diese Domain beinhaltet. Außerdem ist es mit
Hilfe der Administrationsanwendung möglich, eine Domain ohne die Angabe von
Keywords in die Datenbank einzufügen.
Im ACCS- bzw. Discovery-Mode geschieht die Eintragung mittels RPC-Aufruf.
Das DBMS stellt sicher, dass eine Domain nicht mehrfach in die Datenbank ein-
getragen werden kann. In diese Fall wird die Ausführung ohne die Ausgabe eines
Fehlers fortgesetzt.
4.3.5 IP-Adressen eintragen
Im proaktiven Betrieb werden die zu einer Domain gehörigen IP-Adressen (z.B. für
MX- und Webserver) bereits während der Ausführung des Content-Moduls mittels
DNS-Anfrage bestimmt.
Wird eine Domain mittels Administrationsanwendung eingetragen, wird zum Zeit-
punkt der Eintragung die DNS-Anfrage durchgeführt.
In beiden Fällen wird eine eingetragene IP-Adresse mit der Domain verknüpft. Es
ist möglich, dass eine IP-Adresse mehreren Domains zugeordnet ist (z.B. bei Name-
Based-Virtual-Hosting). Innerhalb dieser Verknüpfung wird vermerkt, welche Rollen
die IP-Adresse in dieser Domain übernimmt. Werden mehrere Rollen übernommen,
so werden auch mehrere Verknüpfungen angelegt. Mögliche Rollen sind z.B. Webser-
ver, MX-Server oder DNS-Server.
Beim ACCS-Mode ist die IP-Adresse bereits bekannt und kann direkt in die Test-
datenbank eingetragen werden.
Beim DNS-Proxy-Mode wird bereits eine DNS-Anfrage durchgeführt. Das Ergebnis
dieser Anfrage wird, sobald es vorliegt, für die angefragte Domain in die Datenbank
eingetragen. Wird anstelle der IP-Adresse ein Fehler zurückgegeben, so wird die
eingetragene Domain wieder aus der Datenbank entfernt.
In jedem Fall wird bei der IP-Adresse spezifiziert, ob es sich um eine IPv4- oder eine
IPv6-Adresse handelt.
36 4. Entwurf
4.4 Zusammenfassung
Im zweiten Teil des Kapitels wurde eine modulare Architektur entworfen, die als
Grundlage für das zu entwickelnde System dient. Hierbei wurde zwischen Test- und
Content-Modulen unterschieden, mit denen jeweils verschiedene Aspekte des Sys-
tems implementiert werden.
Weiterhin wurde die Vorgehensweise zum Bestimmen der Ähnlichkeit zwischen zwei-
er Webseiten A und B erläutert und der Test hierauf als Modul entworfen.
Im zweiten Teil dieses Kapitels wurde relationales Datenbankschema entworfen, in
dem die Informationen über die getesteten Rechner sowie die Resultate der durch-
geführten Tests gespeichert werden.
Es wurden verschiedene Methoden vorgestellt, mit denen diese Datenbank befüllt
werden kann, von denen der proaktive Modus der für diese Studienarbeit wichtigste
ist.
5. Implementierung
In diesem Kapitel wird die Implementierung der für die Zwecke dieser Studienarbeit
geschriebenen Software erörtert. Darüber hinaus wird auf die Probleme, die es bei
der praktischen Umsetzung gab, eingegangen, und die gefundenen Lösungen werden
beschrieben.
Die für die Zwecke dieser Studienarbeit geschriebene Software besteht im wesentli-
chen aus zwei Teilen:
5.1 Module
Wie in Abschnitt 4.1.1 bereits erwähnt, wird die Test- und Inhalts-Analyse-Funktionalität
mit Hilfe von Modulen realisiert. Hierzu bietet das NSC-Framework zwei verschie-
dene Modulschnittstellen, jeweils eine für Test-Module und Content-Module.
38 5. Implementierung
KLT unterbrochen und ein anderer KLT wird gestartet. Sobald die Ergebnisse der
blockierenden Eingabe-/Ausgabe-Operation vorliegen, wird die Ausführung des un-
terbrochenen KLTs fortgesetzt. Auf einem Betriebssystem, auf dem lediglich PULTs
verfügbar sind, würde der blockierte Thread so lange weiterlaufen – und somit wert-
volle Ausführungszeit mit Nichtstun verschwenden – bis die Zeitscheibe der Appli-
kation, zu dem der Thread gehört, abgelaufen ist, und eine neue Applikation vom
Betriebssystem aufgerufen wird.
Bei der Verwendung der Threading-Unterstützung von Python ist die Verwendung
von KLTs und PULTs für den Benutzer transparent. Sobald ein Betriebssystem
KLTs anbietet, und Python die Implementierung des jeweiligen Betriebssystems un-
terstützt, werden KLTs verwendet. Ist dies nicht der Fall, bildet Python die Funk-
tionalität von KLTs mit Hilfe von PULTs nach. Der Programmierer muss hierzu
nichts an seinem Programm ändern.
Hiebei stellt sich nun allerdings ein Problem: PULTs können prinzipbedingt nicht
parallel ausgeführt werden, bei KLTs ist dies jedoch durchaus möglich. Bei der
parallelen Ausführung von Threads stellen sich jedoch ganz neue Anforderungen an
den Programmierer, der verhindern muss, dass durch das parallele Ausführen von
Threads sogenannte Race Conditions, also Fehler, die durch ungüngstiges Timing
ausgelöst werden, auftreten. Hierzu werden Sperren, auch Locks genannt, verwendet,
die verhindern, dass mehrere parallel laufende Threads zur selben Zeit in kritische
Codestellen eintreten.
Entwickelt nun ein Programmierer ein Programm, das auf Threads basiert, und
verwendet zum Testen eine Plattform, die keine KLTs unterstützt, dann ist die
Wahrscheinlichkeit recht hoch, dass auf einer KLT -fähigen Plattform die korrekte
Ausführung dieses Programms nicht möglich ist. Dieses Verhalten stünde also im
Wiederspruch zur Forderung der Portierbarkeit.
Zur Lösung dieses Problems gibt es in Python das sogenannte Global-Interpreter-
Lock (GIL). Hierbei handelt es sich um eine globale Sperre, die alle Datenstukturen
in Python schützt [Pyth08]. Das GIL wird zu einer bestimmten Zeit jeweils nur von
einem einzigen Thread gehalten. Nur der Thread, der das GIL hält, darf auf Python-
Objekten operieren oder Betriebssystemaufrufe ausführen. Effektiv führt dies dazu,
dass zu einer bestimmten Zeit immer nur ein bestimmter KLT laufen kann; alle
anderen Threads sind blockiert, da sie auf das GIL warten. Ein Thread, der das GIL
hält, gibt dieses nach einer bestimmten Anzahl von Instruktionen wieder frei, so dass
ein anderer KLT die Möglichkeit bekommt, das GIL zu erwerben. Außerdem wird das
GIL freigegeben, sobald eine blockierende Eingabe-/Ausgabeoperation aufgerufen
wird.
Die Verwendung des GIL ist unter Python-Programmierern heftig umstritten, da es
das simultane Ausführen mehrerer Threads verhindert, was bei Prozessor-lastigen
Anwendungen ein Nachteil sein kann. Das GIL bietet jedoch einige Vorteile, die
diese Nachteile wieder aufwiegen. Zunächst einmal ist der schon angesprochene Vor-
teil der Portierbarkeit, da Anwendungen, die Threads verwenden ohne Änderungen
als Quellcode auf vielen verschiedenen Plattformen laufen. Der wichtigste Vorteil
dürfte jedoch die Arbeitserleichterung für den Entwickler sein: Der Entwickler kann,
ohne sich große Gedanken über die Verwendung von komplexen Datenstrukturen
wie sogenannte SpinlocksHierbei handelt es sich um eine spezielle Sperre, die dazu
5.3. Python-spezifische Probleme 41
5.3.2 PyDNS
PyDNS ist ein Python-Modul, das es ermöglicht, aus einem Python Programm her-
aus DNS-Abfragen zu stellen. Normalerweise ist dies nicht notwendig, da beim Öff-
nen eines Sockets der DNS-Resolver des Betriebssystems diese Aufgabe übernimmt.
Für die Zwecke dieser Studienarbeit ist dies jedoch nicht immer ausreichend, da hier-
mit kompliziertere DNS-Anfragen – wie z.B. die Bestimmung eines MX-Eintrages –
nicht möglich sind. An diser Stelle kommt PyDNS ins Spiel. PyDNS implementiert
selbst einen Resolver, mit dem jede beliebige DNS-Anfrage gestellt werden kann.
Leider wurde IPv6 bei der Entwicklung von PyDNS nicht berücksichtigt, so dass
Antworten auf Anfragen von AAAA-Records von PyDNS falsch interpretiert wer-
den. Aus diesem Grund wurde in dieser Studienarbeit die Unterstützung von IPv6
vorübergehend deaktiviert. Sobald eine neue Version von PyDNS verfügbar ist, die
IPv6 unterstützt, kann diese wieder aktiviert werden.
5.3.3 PyOpenSSL
PyOpenSSList die Python-Schnittstelle zur OpenSSL-Bibliothek. Es handelt sich
hierbei um eine Abbildung der OpenSSL-C-API auf Python-Funktionen. Dement-
sprechend ähnlich ist auch die Vorgehensweise beim Schreiben von Programmen auf
Basis von PyOpenSSL. Leider ist die Dokumentation von PyOpenSSL sehr spärlich,
so dass die Funktionsweise von vielen Methoden oft nur aus der Dokumentation der
OpenSSL C-API erschlossen werden kann.
Eine häufige Fehlerquelle war das Verwenden von Timeouts bei Sockets, die mit
PyOpenSSL nicht gut zusammenarbeiten. Diese Problematik wird im folgenden Ab-
schnitt genauer erläutert.
5
Die Ausführung eines Programms auf mehreren Prozessoren gleichzeitig bietet nicht immer nur
Vorteile und kann in Extremfällen sogar zu einer deutlichen Verlangsamung führen. Dies ist
vor allem dann der Fall, wenn entwender eine Nutzung von Caches durch die Parallelisierung
nicht möglich ist, oder aber auf Non-Uniform-Memory-Access-Systemen, in denen die Kosten
des Speicherzugriffs von der Entfernung zwischen Prozessor und Speicher abhängt.
6
Unter Unix startet fork() einen neuen Prozess (Task).
42 5. Implementierung
5.3.4 Timeouts
Die Socket-Schnittstelle in Python hat standardmäßig keinen Timeout-Wert gesetzt.
Das bedeutet, dass bei einer Socket Operation, auf die keine Antwort erfolgt, un-
endlich lange versucht wird, die Operation zu wiederholen, bis eine Antwort der
Gegenstelle erfolgt. Da bei einem Test von vielen tausend Gegenstellen – wie es
bei dieser Studienarbeit der Fall ist – die Wahrscheinlichkeit sehr hoch ist, dass ei-
ne oder mehrere Gegenstellen nicht antworten, ist dieses Verhalten natürlich nicht
wünschenswert.
Um Abhilfe zu schaffen bietet die Socket-Schnittstelle in Python die Methode setti-
meout() an, mit der die maximale Zeit spezifiziert werden kann, die auf eine Gegen-
stelle gewartet werden soll.
Die Methode settimeout() hat jedoch leider einen unerwünschten Seiteneffekt: Beim
Setzen eines Timeouts wird der Socket vom blockierenden in den nicht blockierenden
Zustand versetzt. Dies fällt zunächst nicht auf, da die Methoden des Socket-Moduls
in Python das blockierende Verhalten simulieren, so dass alle Python-Programme,
die auf das Socket-Modul aufsetzen, von der Veränderung nichts mitbekommen.
PyOpenSSL operiert jedoch nicht auf dem Socket-Modul von Python, sondern eine
Ebene tiefer, nämlich direkt auf dem Socket der C -Standardbibliothek. Da auf dieser
Ebene die durch das Python-Socket-Modul implementierte Abstraktion nicht zur
Verfügung steht, führt dies dazu, dass PyOpenSSL mit der Meldung abbricht, dass
die empfangenen Daten falsch formatiert seien.
Die Lösung für dieses Problem fand sich in dem Modul timeoutsocket von Timo-
thy O’Malley. Dieses Modul arbeitet als Dekorierer (Decorator ) [GHJV95] für das
Socket-Modul von Python und fügt diesem die Unterstützung von Timeouts hin-
zu. timeoutsocket arbeitet hierbei so, dass es alle Methoden, bei denen ein Timeout
auftreten kann, wie z.B. accept(), recv(), connect() etc. kapselt. Wird die gekapselte
Methode aufgerufen, wird der socket zunächst von blockierend auf nicht blockierend
umgestellt. Dann wird in einer Schleife mit Hilfe von select() so lange versucht, von
dem Socket zu lesen, bis entweder ein Timeout auftritt oder aber die angeforderte
Operation erfolgreich durchgeführt wurde. Dannach wird der Socket zurück in den
blockierenden Modus geschaltet und das Ergebniss der Operation wird zurückgege-
ben.
Hierdurch ist zum einen gewährleistet, dass Socket-Operationen nicht unendlich lan-
ge dauern können; zum anderen funktioniert aber auch die Zusammenarbeit mit
PyOpenSSL, da sich der Socket im blockierenden Modus befindet, sobald er an Py-
OpenSSL übergeben wird.
hinaus sind PHP -Integer immer vorzeichenbehaftet, d.h. der größtmögliche Wert
eines Integers auf einer 32-Bit Plattform beträgt 231 − 1 [Grou08].
In Abschnitt 4.2.4 wurde beschrieben, dass in dieser Studienarbeit IP-Adressen
als Integerwerte in der Sicherheitsdatenbank gespeichert sind. Eine IPv4-Adresse
wird hierbei durch einen 32-Bit langen Integer repräsentiert. PHP interpretiert das
höchstwertige Bit eines solchen Integers immer als Vorzeichen. Da es in PHP keine
Möglichkeit gibt, Integer in einen vorzeichenlosen Typ zu konvertieren, sind Rechen-
operationen und insbesondere das Umwandeln einer IP-Adresse in Integerdarstellung
in die Stringdarstellung in PHP praktisch unmöglich.
Glücklicherweise bietet MySQL bereits eine Reihe von Funktionen an, mit denen IP-
Adressen bereits auf Datenbankebene manipuliert und umgewandelt werden können.
Im Webinterface dieser Studienarbeit wird die MySQL-Funktion inet ntoa() verwen-
det, um eine IP-Adresse beim Auslesen in die Stringdarstellung zu konvertieren. Da
das Statistikinterface lediglich zur Darstellung der Ergebnisse verwendet wird, alle
Suchoperationen bereits von dem DBMS vorgenommen werden können und das Ein-
fügen und Ändern der Daten von Python vorgenommen wird, das im Gegensatz zu
PHP keinen solchen Beschränkungen bei der Länge von Integern aufweist, konnten
diese PHP -spezifischen Probleme jedoch umgangen werden.
5.6 Zusammenfassung
In diesem Kapitel wurden die implementierungsspezifischen Details dieser Studien-
arbeit beschrieben.
Zunächst wurde beschrieben, wie sich die in Abschnitt 4.1.1 entworfene Modul-
schnittstelle auf die Implementierung in Python abbilden lässt.
Dannach wurde eine Optimierung der Laufzeit des verbesserten Ratcliff/Obershelp
Algorithmus vorgeschlagen, da der Algorithmus sehr langsam wird, wenn sehr große
44 5. Implementierung
Webseiten verglichen werden sollen. Hierbei wird anstelle eines genauen Ähnlichkeits-
wertes lediglich eine obere Schranke für die Ähnlichkeit berechnet und der Schwel-
lenwert, ab dem das System davon ausgeht, dass es sich um die selbe Seite handelt
auf einen höheren Wert gesetzt. Diese Lösung erwies sich als signifikant schneller
und lieferte nur unwesentlich schlechtere Ergebnisse.
Im folgenden Abschnitt wurden Python-spezifische Probleme erläutert, die zum einen
das Multi-Threading-Modell von Python betrafen, das auf Grund des sogenannten
Global Interpreter Locks“ keine simultane Ausführung mehrere Threads auf mehre-
”
ren Prozessoren eines Mehrprozessor-Systems erlaubt. Es wurde jedoch gezeigt, dass
sich hieraus für Eingabe-/Ausgabe-lastige Threads keine Nachteile ergeben, und dass
für Prozessor-lastige Threads auf die Verwendung von mehreren Prozessen ausgewi-
chen werden kann. Zum anderen wurden einige Probleme beschrieben, die nicht
auf Python direkt, sondern auf die Schnittstellenmodule zum Domain-Name-System
(DNS) und OpenSSL zurückgehen. Die OpenSSL betreffenden Probleme konnten
zwar gelöst werden, für die DNS-spezifischen Probleme muss jedoch auf eine IPv6-
fähige Version von PyDNS gewartet werden, so dass die IPv6-Unterstützung in dieser
Studienarbeit nicht getestet werden konnte.
Es folgt ein Abschnitt, der PHP spezifische Probleme bei Operationen mit Integern
mit Werten größer 231 betrafen. Hierfür konnte eine Lösung gefunden werden, indem
diese Operationen in die Datenbank verlagert wurden.
Zuletzt wurde kurz die Implementierung des Webinterfaces vorgestellt, mit Hilfe
dessen sich der Inhalt der Sicherheitsdatenbank in einem Webbrowser darstellen
lässt.
6. Evaluierung
6.1.1 Vorgehensweise
Zur Bestimmung des Schwellwerts wird eine möglichst große Eingabemenge an zu
testenden Websites aufgebaut. Hierzu werden genau 100 Keywords aus verschiedenen
Lebensbereichen von Hand in die Datenbank eingegeben.
Nun wird der GOOGLECrawler ausgeführt, der für jedes dieser Keywords eine An-
frage an die Suchmaschine Google startet, und die besten 100 Suchergebnisse, wie
in Abschnitt 4.3.4 beschrieben, in die Relation Domains einfügt.
46 6. Evaluierung
Auf diese Weise kommt eine Datenmenge von 8507 Einträge in der Relation Domains
zu Stande. Für jeden dieser Einträge wird nun ein Schnelltest durchgeführt, bei dem
versucht wird, eine SSL/TLS Verbindung mit dem HTTPS-Port (443) des jeweiligen
Zielrechners aufzubauen. Hirbei wird das Testresultat wie gewohnt in die Relation
Tests eingefügt.
Im nächsten Schritt werden mit Hilfe der Relation Tests alle Websites bestimmt,
bei denen der Test für das Protokoll HTTPS das Ergebnis TLS-Worked lieferte.
Hierdurch kommt es zu einer Liste von 3991 Websites. Für jede der so bestimm-
ten Websites wird ein das Test-Modul SIMILARITYContent ausgeführt und der so
erhaltene Ähnlichkeitswert in den Datensatz der Website in Domains eingefügt.
Sobald die Daten des Testdurchlaufs vorliegen, wird händisch, vom höchsten Ähn-
lichkeitswert beginnnen, überprüft, ab welchem Wert keine Gleichheit der Seiten
mehr vorliegt.
Beim Testdurchlauf stellten sich zwei Probleme, nämlich die Behandlung von HTTP-
Redirect-Anweisungen, also Umleitungen auf eine andere Webseite und das Vorhan-
densein einer Übergangszone bei den Ähnlichkeitswerten.
Tritt beim Abruf einer Webseite eine HTTP -Redirect-Anweisungen auf, so liefert das
SIMILARITYContent-Modul sofort der Ähnlichkeitswert -1 zurück, da es davon
ausgeht, dass es sich um einen Redirect von HTTPS auf HTTP handelt. Hierbei
kann es jedoch vorkommen, dass fälschlicherweise eine Umleitung von HTTP auf
HTTPS auch mit dem Ähnlichkeitswert -1 bewertet wird, was zu falsch-negativen
Ergebnissen führen kann.
Darüber hinaus stellt sich das Problem, dass der Zusammenhang zwischen Ähnlich-
keitswert und der Verfügbarkeit von HTTPS nicht stetig ist. Dies bedeutet, dass
sich keine eindeutige Grenzen finden lässt, die die abgerufenen Webseiten eindeutig
in solche, die HTTPS anbieten und solche die es nicht tun, trennt. Viel mehr ist
es so, dass es immer einen Übergangsbereich finden lässt, indem sich sowohl solche
Seiten befinden, die HTTPS anbieten als auch solche, die es nicht tun. Dies liegt
daran, dass es Seiten gibt, die sich zwischen zwei Abrufen stärker unterscheiden als
zwei unterschiedliche Seiten mit ähnlichem Inhalt. Die Wahl eines Schwellenwerts
ist daher garnicht eindeutig möglich.
6.1.2 Ergebnisse
Unter der Annahme, dass ein falsch-negatives Ergebnis weniger schädlich ist, als
ein falsch-positives, wurde in der vorliegenden Studienarbeit daher die Entscheidung
getroffen, den Schwellwert so zu wählen, dass der Anteil der falsch-positiven Ergeb-
nisse unter eine Schwelle von 3% sinkt. Zur Bestimmung dieses Schwellwertes wurde
Stichprobenartig von Hand überprüft, ab welchem Schwellwert der Anteil der kor-
rekt eingeordneten Seiten größer ist als der der falsch eingeordneten Seiten. Dies ist
ab einem Wert von ca. 85 der Fall.
Im nächsten Schritt wurden alle Seite über 85 betrachtet und alle Seiten, bei denen
die Übereinstimmung der über HTTP mit den über HTTPS abgerufenen Versionen
gegeben war. Diese Seiten wurden als korrekt eingestuft markiert. Nun wurde iterativ
der Schwellwert so lange erhöht, bis der Anteil der korrekt markierten Seiten mit
einem Ähnlickeitswert über dem Schwellwert, 97% erreichte.
6.2. Laufzeitverhalten des Ähnlichkeitstests 47
Dies war ab einem Schwellwert 94,36 der Fall. Insgesamt wird hieraus gefolgert,
dass eine Seite mit einem Ähnlichkeitswert von mindestens 95% als über HTTPS
verfügbar zu werten ist.
6.2.1 Vorgehensweise
Zur Vereinfachung des Testens des Laufzeitverhaltens wird davon ausgegangen, dass
sich die beiden Webseiten A und B bei mehreren aufeinanderfolgenden Abrufen nicht
verändern.
Hierbei sind drei Fälle zu unterscheiden:
Zum Testen wurde eine Test-Datei mit einer 300 MB langen zufälligen Zeichenfolge
generiert. Mit Hilfe einer Python-Funktion wird für jeden Durchlauf des Tests von
einer zufälligen Position eine Zeichenfolge bestimmter Länge gelesen. Die Länge des
so gewonnen Auszug wird als Parameter an die Python-Funktion gegeben.
Diese Funktion wird in ein Skript eingebettet, in dem sich auch der in Abschnitt 3.6.3.3
beschriebene Algorithmus befindet, so wie er auch vom SIMILARITYContent-Modul
implementiert wird.
Dieses Skript arbeitet nun die drei beschriebenen Fälle ab. Für den ersten Fall wird
mit der oben beschriebenen Python-Funktion ein Auszug der Größe 20 kB als Stell-
vertreter für Webseite B ausgelesen. Der Stellvertreter für Webseite A wird initial
mit einem Auszug von 40 kB Größe belegt und ein Vergleichstest zwischen A und
B wird durchgeführt; die Laufzeit dieses Tests wird gespeichert. Nun werden itera-
tiv weitere Auszüge für A erstellt – wobei dieses jeweils 5 kB größer sind, als der
vorhergebende Auszug – und der Test wird wiederholt. Wieder wird das Laufzeit-
verhalten aufgezeichnet. Dies wird so lange wiederholt, bis A eine Größe von 280 kB
überschreitet.
Der zweite Fall wird analog dazu ausgeführt, allerdings wird nun A festgehalten und
B wächst. Dieser Fall muss deshalb untersucht werden, da der in Abschnitt 3.6.3.3
beschriebene Algorithmus nicht symmetrisch ist.
Im dritten Fall werden A und B mit zwei unterschiedlichen, gleich großen Auszügen
aus der Zufallsdatei befüllt, wobei die initiale Größe auf jeweils 20 kB gestgelegt
wird. Analog zum ersten und zweiten Fall wird nun iterativ in einer Schleife die
Dateigröße beider Dateien um jeweils 5 kB erhöht, ein Test durchgeführt und das
Zeitverhalten des Tests aufgezeichnet. Dieser Test wird so lange wiederholt, bis A
und B insgesamt eine Größe von 300 kB erreicht haben.
48 6. Evaluierung
6.2.2 Probleme
Bei der oben beschriebenen Vorgehensweise könnten zwei Probleme auftreten:
• Der Algorithmus verhält sich bei Zufallszeichen anders als bei Fließtext oder
HTML-Text.
Zur Untersuchung des ersten Falls wurden mehrere Versionen von diversen Webseiten
aus dem World Wide Web heruntergeladen. Der Test wurde nun zunächst mit diesen
Webseiten durchgeführt. Danach wurde der Test mit Zufallsdateien mit den selben
größen der Webseiten durchgeführt. Eine Laufzeitanalyse zeigte, dass die Dauer des
Algorithmus nicht von der Art der eingegebenen Datei abhängt. Daraus kann gefol-
gert werden, dass das Laufzeitverhalten einer Webseite dem Laufzeitverhalten auf
einer Zufallsdatei mit der selben Größe entspricht, der Test also realistische Werte
misst.
Zur Untersuchung des zweiten Falls wurden zwei identische Dateien, zwei komplett
unterschiedliche und zwei zufällige Dateien miteinenander verglichen. Jeder dieser
Dateien hatte die selbe Größe. Bei jedem Durchlauf wurde die selbe Laufzeit ge-
messen, woraus gefolgert werden kann, dass die Laufzeit des Algorithmus nicht vom
Grad der Übereinstimmung abhängt.
6.2.3 Ergebnisse
In Abbildung 6.1, 6.2 und 6.3 sind die Ergebnisse des in Abschnitt 6.2.1 beschriebe-
nen Tests dargestellt. Zunächst ist festzustellen, dass die Laufzeit in allen drei Fällen
linear ist. Dies deckt sich mit der in Abschnitt 5.2 geäußerten Feststellung, dass die
Methode quick ratio() einen linearen Aufwand hat, also sich in der Effizienzklasse
O(n) befindet (n bezeichnet die Anzahl der Eingegebenen Zeichen). Hieraus kann
gefolgert werden, dass das entwickelte Verfahren sehr gut mit der Länge er Eingabe
skaliert.
Beim Vergleich der Abbildung 6.2 mit den Abbildungen 6.1 und 6.3 kommt die Frage
auf, weshalb der Vergleich bei gleicher Laufzeit deutlich schneller abgeschlossen ist.
Dies liegt daran, dass die Methode quick ratio() in einer Schleife über den ersten
Parameter iteriert. Da im 2. Fall der erste Parameter immer eine feste Länge hat
und zudem noch deutlich kürzer ist, als der zweite Parameter, eine obere Schranke ist
also schneller gefunden. Bei einem genauen Test würde die Reihenfolge der Parameter
keine Rolle spielen. In einer zukünftigen Version wäre eine Optimierung denkbar, bei
der zuerst die Länge der beiden Webseiten betrachtet wird, und jeweils immer die
kleinere als ersten Parameter an quick ratio() übergeben wird.
Unter der Annahme, dass viele große Websites auf eine bestimmte Maximalgröße
optimiert muss allerdings davon ausgegangen werden, dass der 3. Fall der Fall ist,
der am häufigsten anzutreffende ist.
Zum Vergleich ist in Abbildung 6.4 das Zeitverhalten des Testes für den 3. Fall aufge-
zeigt, wenn anstelle von quick ratio() die Methode ratio() verwendet wird. Aufgrund
6.2. Laufzeitverhalten des Ähnlichkeitstests 49
6
Laufzeit in s
0
50 100 150 200 250 300
Gesamtgroesse in kB
6
Laufzeit in s
0
50 100 150 200 250 300
Gesamtgroesse in kB
der hohen Laufzeitverhaltens wurde hier jedoch ein Startwert von 2 kB für die Größe
50 6. Evaluierung
6
Laufzeit in s
0
50 100 150 200 250 300
Gesamtgroesse in kB
6
Laufzeit in s
0
0 10 20 30 40 50 60
Gesamtgroesse in kB
Abbildung 6.4: 3. Fall mit der Verwendung von ratio(). Sehr deutlich zu sehen ist
das quadratische Laufzeitverhalten.
6.3. Laufzeitverhalten unter realistischen Bedingungen 51
von A und B gewählt; die Erhöhung von Schritt zu Schritt betrug jeweils 1 kB pro
Auszug; die Ausführung wurde beim Überschreiten von 40 kB abgebrochen.
Sehr deutlich zu Erkennen ist die quadratische Laufzeit von ratio(). Vergleicht man
Abbildung 6.3 mit Abbildung 6.4, wird sehr schnell klar, weshalb die Verwendung
von quick ratio() eine deutliche Beschleunigung bedeutet.
6.3.1 Vorgehensweise
Grundsätzlich wird auf die in Abschnitt 6.1.1 beschriebene Art und Weise getestet.
Jedoch wurde das Modul CONTENTSimilarity dahingehend ergänzt, dass es an
bestimmten Stellen im Programmcode Zeitstempels setzt, um das Zeitverhalten der
einzelnen Operationen erfassen zu können.
Es werden hierbei – abhängig von der durchschnittlichen Seitengröße – folgende
Werte aufgezeichnet:
6.3.2 Probleme
Das größte Problem bei der Auswertung der Testergebnisse war das große Rauschen
innerhalb der Statistiken zur Dauer der Netzwerkübertragung, wie es in der Abbil-
dungen 6.5, sowie in den Abbildungen ?? bis ?? zu sehen ist.
Dies liegt vor allem daran, dass neben der Dateigröße unter anderem die Entfer-
nung zum Ziel und die Qualität der Netzanbindung des Ziels sowie die Auslastung
des Zielsystems eine Rolle spielen. Es gestaltet sich daher nicht immer einfach, die
richtigen Rückschlüße aus den Ergebnissen zu ziehen. Dieser Fehler relativiert sich
jedoch, sobald die übertragenen Daten eine gewisse Größe erreichen und der Transfer
daher hinreichend lange dauert.
Darüber hinaus ist der Vergleich der Ergebnisse aus Abschnitt 6.3.3 mit den aus
Abschnitt 6.2.3 mit Vorsicht zu genießen, da sich bei den Tests in Abschnitt 6.2.3
52 6. Evaluierung
die Größe einer Datei während mehreren Abrufen innerhalb eines Schleifendurchlaufs
nicht verändert haben. Bei den Ergebnissen in Abschnitt 6.3.3 ist dies hingegen
durchaus möglich, daher wurde bei der Auswertung jeweils die mittlere Dateigröße
verwendet.
6.3.3 Ergebnisse
In diesem Abschnitt werden die Ergebnisse des Gesamtleistungstest vorgestellt und
bewertet.
6.3.3.1 Gesamtleistung
TOTAL-Profile
60
'total_profile.txt'
f(x)
g(x)
50
40
Laufzeit in s
30
20
10
0
0 100 200 300 400 500
Durchschnittliche Seitengroesse HTTP + HTTPS in kB
Abbildung 6.5: Laufzeitverhalten des Gesamtsystems abhängig von der Größe der
Eingabe.
In Abbildung 6.5 ist das Laufzeitverhalten des Gesamtsystems zu sehen. Bei der
gesammtgröße handelt es sich um die mittlere Größe der Summe der über HTTP-
und HTTPS übertragenen Daten. Deutlich zu sehen ist das in 6.3.2 angesprochene
Rauschen, dass durch die Zeit der Übertragung über das Internet verursacht wird.
Bei genauerem hinesehen lassen sich die beiden Geraden f und g identifizieren,
die das Laufzeitverhalten annähern. Betrachtet man die Daten genauer lassen sich
sogar noch mehr Geraden identifizieren. Bei den Geraden handelt es sich um die
Laufzeitverhalten der einzelnen Prozessoren des Testsystems. Dieser Effekt wird im
folgenden Abschnitt genauer untersucht.
6.3.3.2 Dauer des Ähnlichkeitstests
In Abbildung 6.6 wird die Laufzeit des Ähnlichkeitsvergleiches abhängig von der
Größe der Eingabe dargestellt. Bei der auf der X-Achse aufgetragenen Gesamtgröße
handelt es sich um die selbe Größe wie im vorhergehenden Abschnitt.
6.3. Laufzeitverhalten unter realistischen Bedingungen 53
CPU-Profile
7
'cpu_profile.txt'
a(x)
b(x)
6 c(x)
d(x)
e(x)
5 f(x)
Laufzeit in s
0
0 100 200 300 400 500
Durchschnittliche Seitengroesse HTTP + HTTPS in kB
Deutlich zu sehen ist, dass sich das Diagramm in 6 verschiedene Gerade aufteilen
lässt. Hierbei handelt es sich um die einzelnen Prozessorkernel des Systems, de-
ren Bearbeitungsgeschwindigkeit sich aufgrund von Cache-Lokalitäts-Effekten leicht
voneinander unterscheiden. Bei den Punkten auf der Geraden a handelt es sich um
die Laufzeit der Prozesse, die vom selben Prozessor-Kern bearbeitet wurden, auf dem
auch das Hauptprogramm gestartet wurde. Bei den Geraden b, c und d handelt es
sich um Prozesse, die im physikalischen Prozessor, jedoch auf ander Prozessorkernen
als der Hauptprozess ausgeführt wurden. Auf der Geraden e und f befindet sich die
Laufzeit der Prozesse, die von den vier Prozessor-Kernen bearbeitet wurden, die sich
nicht im selben Prozessor befanden wie der Prozessor-Kern, der den Hauptprozess
bearbeitet hat.
In Abbildung 6.7 ist die Dauer des HTTP-Abrufs abhängig von der Dateigröße dar-
gestellt. In Abbildung 6.7 ist der selbe Sachverhalt für HTTPS-Abrufe dargestellt.
In diesen Abbildungen ist wieder sehr deutlich das bereits angesprochene Rauschen
zu sehen.
In Abbildung 6.9 ist das Verhältnis der Dauer des Abrufs einer Datei über HTTPS-
zur Dauer des Abrufs über HTTP aufgetragen. Zu Erkennen ist, dass bei kleinen
Dateien der Abruf über HTTPS um ca. Faktor 5 länger dauert als der Abruf über
HTTP. Bei größeren Dateien Dateien relativiert sich dieser Effekt jedoch, ab einer
Größe von ca. 400 kB dauert der Abruf einer Datei über HTTP fast genau so lange
wie der Abruf über HTTPS. Die Ursache hierfür ist, dass bei HTTPS vor allem
der initiale Aufbau einer Verbindung ins Gewicht fällt. Bei größeren Datentransfers
54 6. Evaluierung
HTTP-Profile
60
'http_profile.txt'
f(x)
50
40
Laufzeit in s
30
20
10
0
0 100 200 300 400 500
Durchschnittliche Seitengroesse in kB
HTTPS-Profile
40
'https_profile.txt'
f(x)
35
30
25
Laufzeit in s
20
15
10
0
0 100 200 300 400 500
Durchschnittliche Seitengroesse in kB
spielt – wie aus der Abbildung 6.9 zu entnehmen – die Dauer des Aufbaus einer
Verbindung kaum noch eine Rolle.
6.4. Zusammenfassung 55
HTTPSvsHTTP-Profile
40
'https2http_profile.txt'
f(x)
35
30
25
Laufzeit in s
20
15
10
0
0 100 200 300 400 500
Durchschnittliche Seitengroesse HTTP + HTTPS in kB
6.3.3.4 Verhältnis der Dauer des Ähnlichkeitstest zur Dauer der Netz-
werkübertragung
In Abbildung 6.10 ist die Dauer des Ähnlichkeitstest im Verhältnis zur Dauer der
Netzwerkübertragung. Sehr deutlich zu sehen ist, dass sich dieses Verhältnis in den
meisten Fällen kleiner als 1 ist. Dies bedeutet, dass die Übertragung der Daten über
das Netzwerk fast immer länger dauert als der eigentliche Test auf Ähnlichkeit.
Zunächst überraschend ist, dass dieses Verhältnis sogar noch kleiner wird, je größer
die getestete Seite ist. Konkret bedeutet dies, dass die Übertragungszeit der Websei-
ten stärker zunimmt, als der Zeit, die benötigt wird, den Vergleich durchzuführen.
6.4 Zusammenfassung
In diesem Kapitel wurde zunächst untersucht, ab welchem Schwellwert zwei Websei-
ten als ähnlich anzusehen sind. Hierbei liessen sich mit einem Schwellwert von 95%
die besten Ergebnisse erzielen.
Daraufhin wurde die Laufzeit des Ähnlichkeitstests unter idealen Bedingungen un-
tersucht und es zeigte sich, dass das entwickelte System linear mit der Größe der
Eingabe skaliert.
Schliesslich fand ein Test unter realistischen Bedingungen statt. Dieser Test be-
stätigte das idealisierte Ergebnis, und es zeigte sich, dass das Gesamtsystem auch
unter realistischen Bedingungen linear skaliert. Darüber hinaus konnte gezeigt wer-
den, dass die Dauer der Datenübertragung stärker ins Gewicht fällt, als die Dauer
56 6. Evaluierung
CPUvsIO-Profile
4
'cpu2io_profile.txt'
f(x)
3.5
3
Rechenzeit / Uebertragungszeit
2.5
1.5
0.5
0
0 100 200 300 400 500 600
Gesamtgroesse in kB
Abbildung 6.10: Verhältnis zwischen Dauer der Übertragung und benötigten Zeit
zum Ähnlichkeitsvergleich.
des eigentlichen Ähnlichkeitstests. Hieraus kann geschlossen werden, dass sich das
entwickelte Verfahren für den praktischen Einsatz eignet.
7. Zusammenfassung und Ausblick
Bla fasel. . .
(Keine Untergliederung mehr!)
58 7. Zusammenfassung und Ausblick
Literatur
[Brad07] Mike Bradbury. Subdomains or Subfolders: The Age Old Search En-
gine Optimization Question., März 2007. http://www.objectwareinc.
com/subdomains-subfolders.aspx, abgerufen am 30. Mai 2008.
[DiAl99] T. Dierks und C. Allen. The TLS Protocol Version 1.0. RFC 2246
(Proposed Standard), Januar 1999. Obsoleted by RFC 4346, updated
by RFC 3546.
[FrKK96] Alan O. Freier, Philip Karlton und Paul C. Kocher. The SSL Pro-
tocol Version 3.0. Memo, November 1996. http://wp.netscape.com/
eng/ssl3/draft302.txt.
[GHJV95] Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides.
Design Patterns, Band 1. Addison-Wesley. ISBN-978-0-201-63361-0,
1995.
[Hick95] Kipp E.B. Hickman. The SSL Protocol. Memo, Februar 1995. http:
//wp.netscape.com/eng/security/SSL 2.html.
[Lawr05] Eric Lawrence. TLS and SSL in the Real World, April 2005. http://
blogs.msdn.com/ie/archive/2005/04/20/410240.aspx, abgerufen am
30. Mai 2008.
[Pyth08] Python.org. Thread State and the Global Interpreter Lock, Mai
2008. http://docs.python.org/api/threads.html, abgerufen am 30.
Mai 2008.
[Resc00] E. Rescorla. HTTP Over TLS. RFC 2818 (Informational), Mai 2000.