1 Forensisch onderzoeksgereedschap op basis van bestandssignatuur Karel Demeyer Promotor: prof. dr. ir. Koen De Bosschere Begeleiders: Georges Lichten...
Forensisch onderzoeksgereedschap op basis van bestandssignatuur Karel Demeyer
Promotor: prof. dr. ir. Koen De Bosschere Begeleiders: Georges Lichtenstein (RCCU), dr. ir. Michiel Ronsse Masterproef ingediend tot het behalen van de academische graad van Master in de toegepaste informatica
Vakgroep Elektronica en informatiesystemen Voorzitter: prof. dr. ir. Jan Van Campenhout Faculteit Ingenieurswetenschappen Academiejaar 2008-2009
Woord vooraf
1 Woord vooraf Telkens iemand me vroeg welk scriptieonderwerp ik had gekozen, kon ik al naar de volgende vraag raden: hoe ik op dit onderwerp gekomen was. Vergezocht is het echter helemaal niet. Ongeveer een jaar geleden was ik druk bezig met mijn vorige masterproef, in de hoop daarmee een diploma Master in de Criminologie in de wacht te slepen. Omdat ik die opleiding jaren terug begonnen was dankzij mijn interesse voor opsporing en onderzoek, was de criminoloog in mij dan ook bij de eerste keer dat ik de lijst met scriptieonderwerpen zag, op zoek gegaan naar iets dat in de trend van die interesses lag. Geen van de voorgestelde onderwerpen kon mij echter volledig bekoren en tegelijkertijd uitdagen ... Dan maar zelf op zoek naar iets anders. Ik heb in mijn zoektocht onder andere contact opgenomen met mijn promotor van vorig jaar, prof. dr. Marc Cools, met enkele ideeën voor onderwerpen die ik had en de vraag of hij iemand kende die me kon verderhelpen. Ik werd door hem aan de heer Lichtenstein, diensthoofd van de regionale computercriminaliteitseenheid van Antwerpen, voorgesteld en de bal was aan het rollen gebracht. Een heen-en-weer reisje naar Antwerpen later had ik een mogelijk meesterproefonderwerp. Ik kon de dienst van de heer Lichtenstein helpen door het ontwikkelen van een gereedschap dat (snel) zou kunnen zoeken naar – al dan niet verwijderde – bestanden op digitale gegevensdragers. Een uitdaging, leek me dat! Ik wil, voor ik van wal steek met het uiteenzetten van wat ik gedaan heb en hoe ik dat aangepakt heb, nog even wat inkt laten vloeien om de mensen te bedanken die me geholpen hebben bij de totstandkoming van dit werk. In de eerste plaats dank ik prof. dr. ir. Koenraad De Bosschere voor het promotorschap voor deze masterproef. Zijn lessen brachten me in het algemeen enorm veel bij maar zorgden meer specifiek ook voor een solide kennisbasis om dit eindwerk aan te vatten.
i
Woord vooraf
Mijn dank gaat ook zeer specifiek uit naar dr. ir. Michiel Ronsse, bij wie ik dag in dag uit ten rade kon en die me niet alleen met raad maar ook met daden te hulp kwam. Zijn kennis over het interne raderwerk van op Linux gebaseerde systemen, omtrent shellscripten, webontwikkeltechnieken en zo veel meer, deed me uren en dagen tijd winnen die anders in opzoekwerk waren opgegaan. Oprecht bedankt! De heer Georges Lichtenstein wil ik mijn dank betuigen voor het aanreiken van een maatschappelijk relevant onderwerp voor dit eindwerk dat me dan ook nog eens enorm interesseert. Ook prof. dr. Marc Cools ben ik enorm dankbaar voor de hulp in mijn zoektocht naar dit onderwerp. Nen dikke merci gaat ook uit naar al die mensen in mijn omgeving die me gedurende deze studie steunden: mijn ouders, broers en zus, vriendenkring en ook leden van de jeugdbeweging. Bedankt voor de bemoedigende woorden, het vriendelijk weglachen van mijn stressgerelateerde uitlatingen, het nalezen van stukken tekst, het ter dienste stellen van je computer voor demonstratie-onderzoekjes, het geïnteresseerd kijken wanneer ik weer eens over mijn toepassing bezig was enz. Mijn vriendin, Sofie Keppens, verdient bovendien meer dan een erkenning omdat ze me steeds in mezelf blijft laten geloven, het niet erg zegt te vinden dat ik haar wakker hield als ik “nog snel iets wou implementeren”, me af en toe wat afleiding kon verschaffen d.m.v. haar eigen thesisperikelen en zo veel meer. Bedankt!
ii
Toelating tot bruikleen
2 Toelating tot bruikleen Mollem, 20/05/2009
De auteur geeft de toelating deze masterproef voor consultatie beschikbaar te stellen en delen van de masterproef te kopiëren voor persoonlijk gebruik. Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit deze masterproef.
Karel Demeyer
iii
Overzicht
3 Overzicht TITEL: Forensisch onderzoeksgereedschap op basis van bestandssignatuur
AUTEUR: Karel Demeyer
PROMOTOR: Prof. dr. ir. Koenraad De Bosschere
BEGELEIDING: Dr. ir. Michiel Ronsse (UGent) Georges Lichtenstein (Regionale Computer Crime Unit Antwerpen, federale politie)
Masterproef voorgelegd aan de Faculteit Ingenieurswetenschappen (Universiteit Gent), voor het behalen van de academische graad van Master in de Toegepaste Informatica. KORTE
SAMENVATTING:
In kader van deze masterproef werd een systeem ontwikkeld, op vraag van de computer crime unit van de gerechtelijke politie van Antwerpen, om onderzoek te verrichten op in beslag genomen digitale gegevensdragers. Het systeem zoekt op de gegevensdrager bestanden, zowel als restanten van verwijderde bestanden, die voldoen aan een aantal door de onderzoeker opgegeven voorwaarden, waaronder de bestandssignatuur. De bibliotheek met definities
voor
de
verschillende
bestandsformaten
is
hierbij
uitbreidbaar.
Verwijderde
bestanden kunnen vanuit het systeem hersteld worden naar een aparte gegevensdrager en voor alle bestanden worden de oorspronkelijke metagegevens bewaard t.v.v. het forensisch onderzoek.
TREFWOORDEN: forensisch onderzoek, bestandssignatuur, file header, bestandsherstel, data recovery
De (interactie met de) interface van het onderzoek...................................58
vi
Voorstelling van het eindwerk: probleem- en doelstelling
5 Voorstelling van het eindwerk: probleem- en doelstelling Computer Crime Units: zo heten de diensten van de federale politie die zich bezig houden met politionele opsporing en onderzoeken op ICT-gebied. Deze CCU's zijn op twee niveaus uitgebouwd: naast de Federal Computer Crime Unit (FCCU) die op nationaal niveau ICT-criminaliteit bestrijdt, zijn er ook de regionale eenheden (RCCU's). Deze dienen “minimaal de garantie op een kwalitatief goed forensisch ICTonderzoek van PC-apparatuur, andere gegevensdragers en kleine netwerken” te bieden en “de sporen van internetcriminaliteit” te onderzoeken en daders te identificeren.1 De RCCU's doen dus onder andere onderzoeken op PC's die in beslag genomen zijn in het kader van een gerechtelijk onderzoek. Uit mijn gesprek met de heer Lichtenstein heb ik kunnen opmaken dat de hoofdmoot van het werk van zijn dienst (tot ongeveer 80%) onderzoek naar kinderpornografie is. De rest van hun activiteiten draait voornamelijk rond valse facturaties e.d. De meeste commerciële forensische onderzoekspakketten die de RCCU Antwerpen gebruikt of reeds heeft gebruikt, zijn voor beperkte onderzoeksopdrachten – bv. enkel nagaan of er kinderpornografisch materiaal op de gegevensdrager voorhanden is – eerder te log. De meeste programma's indexeren vooreerst al de gegevens die voorhanden zijn (wat zeer tijdsintensief kan zijn) en laten pas nadien onderzoek toe. Of ze zoeken niet naar 'gewiste' bestanden of kijken niet naar de bestandsinhoud – maar enkel naar de bestandsnaam - om het type bestand te bepalen. Voor een forensisch onderzoek kan snelheid soms heel belangrijk zijn. Onze wetteksten i.v.m. politioneel of gerechtelijk onderzoek2 bevatten namelijk – zoals het een
rechtsstaat
betaamt
-
verschillende
beslissende
tijdspannes
waarin
onderzoeksbeslissingen moeten worden genomen. Jammer genoeg kan het 'wissen'3 1
Bv. Wetboek van Strafvordering, Wet op het Politieambt
3
Nota: bij de gangbare bestandssystemen worden de bedoelde gegevens echter niet gewist maar enkel de verwijzing ernaar. Cfr infra.
1
Voorstelling van het eindwerk: probleem- en doelstelling
van digitale gegevens tegenwoordig letterlijk met één druk op een toets en bovendien zeer snel gebeuren. Het zou dan ook niet slim zijn om enkel de door het bestandssysteem zichtbaar gemaakte gegevens in een onderzoek op te nemen. Tenslotte kan de door een gebruiker of een gebruikersprogramma opgegeven bestandsnaam een indicatie zijn voor het type van inhoud van een bepaald bestand, maar biedt dit geen zekerheid hieromtrent. Het zal dus nodig zijn om aan de hand van de bestandsinhoud te bepalen wat voor gegevens er in het spel zijn. Samengevat
kunnen
onderzoeksgereedschap
we
dus
waarbij
stellen de
dat
er
onderzoeker
nood kan
is
aan
bepalen
een in
forensisch wat
soort
(verwijderde) bestanden hij of zij is geïnteresseerd op basis van een aantal kenmerken zoals grootte, naam, type, inhoud, het tijdstip van aanmaak of laatste gebruik e.d. om de afwerktermijnen te beperken. De informatie benodigd voor het herkennen van een type bestand a.d.h.v. de inhoud moet hierbij ook op een uitbreidbare manier worden opgeslagen zodat het mogelijk is in de toekomst nieuwe bestandsformaten te herkennen. Het geheel moet ook nog eens onafhankelijk ten aanzien van het gebruikte bestandssysteem zijn, in die zin dat het zeker veelgebruikte bestandssystemen zoals FAT, NTFS en ext2 of ext3 moet ondersteunen. Het systeem moet de onderzoeker hiernaast in staat stellen de gevonden bestanden te kopiëren (en of reconstrueren) naar een andere gegevensdrager dan diegene die onderzocht werd. Daarenboven moet het de vindplaats van het bestand op het bestandssysteem of de gegevensdrager, net als de oorspronkelijke bestandsgegevens zoals creatiedatum en -tijd, datum en tijd van de laatste wijziging en toegang bijhouden. Dit alles moet aan de onderzoeker geserveerd worden in het jasje van een toegankelijke, overzichtelijke gebruikersinterface. Mijn eindwerk bestaat met andere woorden uit het onderzoek naar de wijze waarop een bestandssysteem gegevens bijhoudt, hoe gegevens kunnen worden opgespoord aan de hand van een aantal criteria, waaronder de bestandssignatuur, hoe verwijderde bestanden kunnen worden opgespoord en hersteld ... en hoe dit alles op een gebruiksvriendelijke manier te presenteren en mogelijk te maken. Ik ga de uitdaging aan!
2
Voorstelling van het eindwerk: probleem- en doelstelling
Ik vat de rest van deze scripte aan met een overzicht van hoe de toepassing ontworpen en uitgewerkt is. Hierna sluit ik het hoofdgedeelte van dit werk af met een hoofdstuk waarin ik enkele bedenkingen maak over de gemaakte keuzes en mogelijke uitbreidingen en verbeteringen overloop. Achteraan dit schrijfsel is nog een hoofdstuk toegevoegd dat als handleiding voor de ontwikkelde toepassing fungeert.
3
Ontwerp en uitwerking
6 Ontwerp en uitwerking 6.1 De fundering: een verwijderbaar medium met aangepast besturingssysteem Ik heb ervoor geopteerd om mijn programma te laten lopen onder een aangepast besturingssysteem dat ingeladen wordt van op een verwijderbaar medium. Dit om enkele redenen die ik nu even schets.
1
Contaminatie van de sporen vermijden
Ten eerste is het van het grootste belang in een forensisch onderzoek om het sporenmateriaal niet (of zo min mogelijk) aan te tasten. De geschiedenis heeft ons namelijk
geleerd
bewijsmateriaal
dat werd
door
roekeloze
vernietigd
of
opsporingshandelingen aangetast
met
wel
mogelijk
al
eens
verkeerde
beschuldigingsbesluiten tot gevolg. Om deze reden kan er niet zonder meer opgestart worden met het besturingssysteem van een 'verdachte computer'. Tijdens het opstarten alleen al van de meeste – zoniet alle – moderne besturingssystemen zullen er nl. reeds bestanden worden beroerd. Bovendien worden er mogelijk bij het opstarten gebruikerstoepassingen opgestart waarvan we vooraf geen weet kunnen hebben. Het zou al te onbezonnen zijn om onbekende (en dus per definitie onbetrouwbare) programmacode uit te voeren aangezien ook deze voor contaminatie zou kunnen zorgen.
2
Een eigen gekozen besturingssysteem
Door een openbronbesturingssysteem te gebruiken kan ik naar wens het volledige opstartproces van het besturingssysteem zo aanpassen dat de gegevensdragers niet worden beroerd. Doordat ik het besturingssysteem zelf installeer op een verwijderbaar medium (bv een USB-stick of een CD-ROM) en daar mijn toepassing onder laat laden, is de omgeving waarin de toepassing loopt steeds dezelfde – onafhankelijk van het besturingssysteem dat op de verdachte computer zelf is geïnstalleerd - en kan ik de benodigde besturingssysteemonderdelen makkelijk tot het minimum beperken. 4
Ontwerp en uitwerking
Mijn keuze voor besturingssysteem is op Ubuntu gevallen, de momenteel meest wijdverspreide GNU/Linux distributie. Het waarom hiervoor is vanzelfsprekend: ik gebruik het zelf al jaren als besturingssysteem en ken - dankzij mijn gezonde informaticainteresse - ook hier en daar wat van de interne werking van dit systeem. Bovendien kon ik mijn programma creëren en testen met dezelfde onderliggende programmatuur die ik gewoon was.
6.2 Het geraamte: installeren
het
besturingssysteem
Mijn oorspronkelijke bedoeling was om het Ubuntu systeem volledig te installeren op een USB-stick net zoals het op een gewone harde schijf kan geïnstalleerd worden, inclusief opstartlader etc. (door in het installatieproces het USB-medium als doel voor de installatie van het besturingssysteem en de opstartlader te kiezen). Het voordeel zou dan zijn dat alle nodige aanpassingen op de normale manier te maken zijn eens het systeem is opgestart en ook worden weggeschreven naar het USB-medium omdat de volledige bestandshuishouding van het besturingssysteem hier is ondergebracht. Het lot heeft er echter anders over beslist. Er blijkt namelijk een fout in verschillende op Debian GNU/Linux gebaseerde besturingssystemen te zitten in die zin dat een installatie op een USB-medium heel snel haar eigen bestandssysteem corrumpeert. Naar mijn intuïtie, en het idee van mijn begeleider, gebeurt dit waarschijnlijk omdat bij het afsluiten de in de cache opgenomen schrijfinstructies niet meer worden uitgevoerd. Deze fout maakt heel het systeem echter onwerkbaar omdat om de haverklap systeembestanden onleesbaar worden en het opstartproces in duigen valt. Op aanraden van mijn begeleider heb ik dan enkele andere GNU/Linux distributies uitgeprobeerd, terwijl ik ondertussen aan de ontwikkeling van de rest van mijn toepassing verder werkte. Ondanks het feit dat deze andere besturingssystemen de hierboven beschreven fout niet maken, konden ze me toch niet echt bekoren. Doordat de omgeving – als in: versies van de verschillende aanwezige gereedschappen en programmabibliotheken – niet overeenstemde met die van de Ubuntu-versie die ik reeds gebruikte, waren er heel wat aanpassingen nodig aan de programmacode en -concepten die ik reeds had geproduceerd. Daarenboven werden enkele eenvoudige operaties (zoals het aanpassen van een configuratie) weer een tijdrovende zoektocht.
5
Ontwerp en uitwerking
Na dagenlang vloeken en met de handen in het haar zitten, kreeg ik een ander idee. De Ubuntu installatie-CD-ROM is tevens een zogenaamde Live CD. Met andere woorden, kan een computer met behulp van die CD-ROM opgestart worden waarbij een volledig werkend Ubuntu systeem wordt ingeladen, met de nodige ondersteuning voor de apparatuur van de computer. Mijn idee was dan om deze “Live CD” aan te passen zodat ook mijn toepassing er op staat en ingeladen wordt bij het opstarten. Bovendien is het mogelijk deze Live CD ook op een ander medium, zoals een USBstick te installeren.
1
De Ubuntu Live CD aanpassen4
De Ubuntu Live CD gebruikt isolinux5, een opstartlader voor gebruik met een CD-ROMbestandssysteem,
en
casper6,
een
systeem
dat
het
mogelijk
maakt
een
bestandssysteem dat gecomprimeerd is opgeslagen op een niet beschrijfbaar medium te gebruiken als basisbestandssysteem (root file system) voor een opstartbaar medium. Het basisbestandssysteem van het Ubuntu-systeem dat door de Live CD wordt ingeladen is squashfs, een gecomprimeerd alleen-lezen bestandssysteem, opgeslagen als bestand op het CD-ROM-bestandssyteem7. Bij het opstarten laadt isolinux
de
Linux
besturingssysteemkern
in
en
wordt
het
bestandssysteem
aangekoppeld in het geheugen van de computer. Verder wordt de normale opstartprocedure van Ubuntu uitgevoerd. Op het einde wordt een gebruiker aangemaakt voor de sessie en automatisch aangemeld bij de bureaubladomgeving. Om de Live CD aan te passen is het nodig eerst de inhoud van de CD (met andere woorden: het CD-ROM-bestandssysteem) uit te pakken. Er kunnen dan aanpassingen aan de (configuratie)bestanden worden gemaakt. Hierna is het slechts een kwestie van de bestanden terug in een CD-ROM-bestandssysteem te verpakken (bv. met mkisofs8) en op een CD te schrijven om een aangepaste Live CD te bekomen. De
inhoud van de CD uitpakken kan op Ubuntu makkelijk door de CD aan te koppelen (d.m.v. het aanklikken in de gebruikersinterface of door gebruik van het mount gereedschap9) en dan de bestanden te kopiëren naar een tijdelijke map. Om veranderingen aan het besturingssysteem zelf te maken dienen we het basisbestandssysteem dat gecomprimeerd staat in het bestand filesystem.squashfs onder de map 'casper' op de Live CD te decomprimeren. Dit bestandssysteem kan op Ubuntu via het mount gereedschap met de “loopback” optie worden aangekoppeld op het bestandssysteem waarna de inhoud van dit bestandssysteem ook naar een tijdelijke map kan worden gekopieerd. Nu kunnen alle mogelijke aanpassingen aan de configuratie en de meegeleverde software worden gemaakt. Hierna dient het bestandssysteem enkel opnieuw m.b.v. mksquashfs gecomprimeerd te worden. Het bestand dat hieruit resulteert moet dan in de plaats komen van het oorspronkelijke filesystem.squashfs. Ik wil hierbij nog even opmerken dat het niet mogelijk is meteen aanpassingen te maken op de aangekoppelde bestandssystemen aangezien deze niet beschrijfbaar zijn. Om het besturingssysteem van de Live CD aan te passen is het dus mogelijk de verschillende configuratiebestanden op het basisbestandssysteem manueel aan te passen en uitvoerbare bestanden (programma's) toe te voegen of te verwijderen. Zonder gebruik te kunnen maken van de programmatuurinstallatie en -deïnstallatieroutines van Ubuntu of programma's om de configuratie aan te passen zou dit niet alleen een werk van lange adem maar ook een onoverzichtelijk kluwen kunnen worden. Gelukkig bestaat er een mogelijkheid om dit alles te vereenvoudigen: het chroot-gereedschap. Kort voor “Change root directory”, staat chroot er voor in om voor
een
bepaald
proces
(en
al
de
dochterprocessen
ervan)
een
ander
basisbestandssysteem te kiezen. Zo kan een commandolijnshell worden opgestart die als basisbestandssysteem de tijdelijke map van het uitgepakte squashfs heeft. Hierna is het mogelijk van op deze commandolijn de standaard Ubuntu-toepassingen te starten om programmatuur te installeren of te verwijderen, configuraties aan te passen etc. die dan inwerken op het bestands- (en dus ook besturings-) systeem van de Live CD in plaats van het gebruikte besturingssysteem.
9
Hier hoeft geen fysieke compact disk gebruikt te worden. Het is ook mogelijk een CD-ROM-afbeeldingsbestand d.m.v. de “loopback” optie aan te koppelen met het mount gereedschap.
7
Ontwerp en uitwerking
Er zijn echter programmaatjes voorhanden die al het voorgaande werk voor hun rekening nemen. Één ervan heb ik voor deze masterproef ook ter hand genomen: Reconstructor10. Deze toepassing geeft de mogelijkheid een CD-ROM of CD-ROMafbeeldingsbestand
te
selecteren
en
zal
dan
automatisch
de
verschillende
bestandssystemen uitpakken in een door de gebruiker gekozen tijdelijke map. De toepassing geeft ook op een eenvoudige manier de mogelijkheid met enkele klikken veelgebruikte aanpassingen te doen (zoals het uiterlijk van het opstartscherm en de bureaubladomgeving, het al dan niet verwijderen of installeren van enkele veel gebruikte programma's, het aanpassen van de gebruikersnaam van het Live systeem
...)
of
een
commandolijn
binnen
een
automatisch
aangemaakte
chrootomgeving te starten en grafische of tekstuele toepassingen uit te voeren. Met een druk op een knop maakt de toepassing een nieuw CD-ROM-afbeeldingsbestand aan dat dan eenvoudig naar een CD-ROM kan geschreven worden.
2 In
CD-ROM ... of USB-stick ... of ? het
voorgaande
sprak
ik
de
hele
tijd
over
CD-ROM's
en
CD-ROM-
afbeeldingsbestanden ... maar was het niet de bedoeling het besturingssysteem op een USB-stick te installeren? Wel, ook hier maakt Ubuntu het ons makkelijk. Ubuntu levert namelijk standaard een programmaatje bij het besturingssysteem om een Live CD op een USB-Stick te installeren (om een zogenaamde “Live USB” - vergezocht hoeft zo'n naam niet te zijn natuurlijk - te maken). De inhoud van het CD-ROMbestandssysteem wordt dan op een partitie van de USB-Stick geschreven op een FAT bestandssysteem en er wordt een opstartlader geïnstalleerd die hetzelfde opstartproces als van de Live CD in gang trekt. Bovendien is deze techniek niet alleen geschikt voor USB-Sticks. Ook andere verwijderbare gegevensdragers, denk maar aan geheugenkaartjes, kunnen op deze wijze gebruikt worden.
“persistente” installatie te maken. Hierbij wordt de beschrijfbaarheid van het medium uitgebuit en zullen aanpassingen aan de configuratie e.d. opgeslagen worden op het medium en de volgende keer weer geladen. Onder de motorkap wordt hiervoor nog een tweede
bestandssysteem
als
bestand
opgeslagen op de USB-stick onder de naam casper-rw.
Het
beschrijfbaar
betreft
dit
keer
een
ext3-bestandssysteem
van
vaste grootte. De grootte kan door de gebruiker
worden
installeren
van
gekozen
de
“Live
bij
het
USB”
(zie
afbeelding). Dit bestandssysteem werkt als een
“laag”
over
het
basisbestandssysteem. bestand
op
het
onbeschrijfbare Wanneer
een
Afbeelding 1: Een 'Live USB' maken met het bijgeleverde programmaatje
basisbestandssysteem
wordt aangepast wordt het aangepaste bestand opgeslagen in het beschrijfbare bestandssysteem. Wanneer een bestand ingelezen dient te worden, wordt er eerst in het beschrijfbare bestandssysteem gekeken. Voor mijn toepassing heb ik ervoor gekozen op deze wijze een klein beschrijfbaar bestandssysteem te laten aanmaken, dat dan kan dienen om bv. de persoonlijke voorkeuren voor het uiterlijk van de gebruikersinterface van de onderzoeker bij te houden. Het is echter niet de bedoeling dat dit een thuis wordt voor de herstelde verwijderde bestanden die door mijn systeem worden gevonden. Hiervoor creëerde ik op de USB-stick een aparte gegevenspartitie met een FAT-bestandssysteem, dat door de meeste gebruikelijke besturingssystemen ondersteund wordt. Deze partitie kreeg een uniek bestandssysteemlabel “ccHERSTEL”, waardoor ze makkelijk door de applicatie kan herkend worden.
9
Ontwerp en uitwerking
6.3 De ruwbouw: een webserver (forensische) gereedschappen
en
enkele
Voor de opbouw van mijn applicatie ben ik manieren beginnen zoeken om zoveel mogelijk bestaande gereedschappen te hergebruiken waar mogelijk. Want na een hoop kennis opgedaan te hebben over bestandssysteem en hun huishouding 11, leek het anders een onmogelijke opdracht om voor verschillende bestandssystemen al deze functionaliteit op te bouwen, beginnend van niets. Zoeken
dan
maar
naar
gereedschappen
om
bestanden
te
zoeken
op
een
bestandssysteem aan de hand van een hoop criteria, om verwijderde bestanden te vinden, om deze te herstellen, om in de slack space12 te gaan zoeken, om bestanden te herkennen aan hun signatuur etc. Na het bestuderen van de voorhanden zijnde gereedschappen (die ik ook onder dit deel bespreek) had ik natuurlijk nog een scala aan keuzes voor de manier waarop ik de toepassing zou opbouwen. In welke toolkit bouw ik een grafische interface? In welke taal schrijf ik de programmacode? In samenspraak met mijn begeleider heb ik gekozen om een webinterface te gebruiken voor mijn programma en achterliggend dus een webserver te draaien waarmee de gebruiker communiceert. Deze aanpak levert meteen een aantal voordelen. De applicatie kan bijvoorbeeld worden aangestuurd van op de computer die onderzocht wordt (door een webbladerprogramma te starten en naar de eigen webserver te bladeren) of kan van op een andere computer op het netwerk worden aangestuurd. In die zin is het niet nodig om een toetsenbord, muis of scherm aan de onderzochte computer te koppelen. Aangezien ik de netwerkfunctionaliteit van Ubuntu niet heb verwijderd van de installatie, is het eenvoudig om de verdachte computer in een netwerk op te nemen. Automatisch zal deze namelijk bij het aansluiten van een bekabeld netwerk proberen via het DHCP-protocol een IP-adres te verkrijgen. Een ander
voordeel
van
de
aanpak
is
dat
het
maken
en
aanpassen
van
de
gebruikersinterface zeer snel kan gebeuren. De webserver zal op basis van de te
11 door in een hoop online bronnen en wat cursusmateriaal te duiken (en af en toe van asfyxie naar adem te happen en terug te duiken) 12 Cfr infra
10
Ontwerp en uitwerking
presenteren gegevens HTML-code aanmaken, die door het webbladerprogramma van de gebruiker automatisch zal aangepast worden aan de grootte van het gebruikte scherm etc.
1
Gebruikte gereedschappen
Om het warm water en het wiel niet opnieuw te moeten uitvinden, ben ik op het internet op zoek gegaan naar gratis bestaande openbrongereedschappen die vrij te gebruiken zijn. Een enorme bron aan informatie was een presentatie 13 die ik vond op een website van de FCCU over forensische gereedschappen voor GNU/Linuxsystemen, waarin enkele opzoek- en opsporingsscenario's worden beschreven en waar ik dus kon zien welke programmaatjes ze daar gebruiken. Daarnaast ben ik nog enkele andere toepassingen tegen het lijf gelopen. Ik geef hieronder een overzicht van de verschillende kandidaten die ik vond, beschrijf ze kort en geef aan waarom en hoe ik ze al dan niet gebruik.
GNU FILE Het file-commando kan één ding, en het kan dat heel goed: bestanden herkennen aan de hand van hun inhoud. Standaard wordt file geleverd met een lijst van duizenden definities waar de inhoud van een bestand mee vergeleken moet worden. Voor elke definitie geeft het configuratiebestand in leesbare tekens een beschrijving van het bestandstype die moet worden weergegeven indien dit type overeenkomt met het onderzochte bestand. Hiernaast kan ook een MIME media type worden opgegeven zoals geregistreerd bij IANA14 dat ook weergegeven kan worden bij het herkennen van een bestand. Interessant is ook dat definities in aparte bestanden kunnen worden gezet en er dan bij het uitvoeren van file kan gekozen worden enkel dat bepaald bestand (of een lijst van verschillende definitiebestanden) te gebruiken bij het vergelijken van de bestandsinhoud. Zo is het al dan niet herkennen van een JPEG-afbeelding veel sneller wanneer moet vergeleken worden met een bestand met alleen de definitie voor het
13 http://lnx4n6.be/Downloads/hacklu.pdf, laatst geraadpleegd op 05/05/'09. 14 http://www.iana.org/assignments/media-types/, laatst geraadpleegd op 05/05/'09.
11
Ontwerp en uitwerking
JPEG-formaat in, dan wel te vergelijken met alle aanwezige bestandsdefinities. Daarenboven kunnen de definitiebestanden gecompileerd worden tot een binair bestand waarmee nog sneller vergeleken kan worden. Het programma heeft ook enkele snelle ingeprogrammeerde controles aan boord – waarvoor het vergelijken met een definitie uit het bestand veel trager zou zijn (bv. het herkennen van sommige archiefformaten) – die echter desgewenst ook uitgeschakeld kunnen worden door enkele configuratieparameters mee te geven bij uitvoering. Wanneer er dan bv. sowieso niet met die bestandstypes moet worden vergeleken kan dit snelheidswinst opleveren.
GNU FIND De
bestaansreden
van
het
find-programmaatje
dat
bij
alle
POSIX-
besturingssystemen15 wordt geleverd, is het zoeken naar bestanden die aan een aantal voorwaarden voldoen. Find filtert op de zogenaamde metagegevens van een bestand,
maar
niet
op
de
inhoud
van
het
bestand
zelf.
De
belangrijkste
filtermogelijkheden zijn: •
het bestand zit in een bepaalde map
•
de grootte van het bestand ligt tussen bepaalde waarden
•
het bestand is laatst aangemaakt, aangepast of aangeraakt, of de metadata van het bestand (bv. de toegangsrechten) zijn laatst aangepast tussen bepaalde tijdsintervallen
•
de bestandsnaam voldoet aan een bepaalde reguliere expressie
Find zal dan de volledige mappenhiërarchie doorlopen en de paden van alle bestanden die aan de opgegeven voorwaarden voldoen, weergeven. Verder kan aan find ook een commando opgegeven worden als voorwaarde dat per bestand moet worden uitgevoerd. Indien dit commando via zijn exit code16 weergeeft dat het succesvol werd beëindigd, wordt het betreffende bestand als overeenkomend aan de voorwaarde
15 http://www.unix.org/version3/ieee_std.html, laatst geraadpleegd op 05/05/'09. 16 Een uitleg over exit codes kan U hier vinden: http://en.wikipedia.org/wiki/Exit_status, laatst geraadpleegd op 05/05/'09.
12
Ontwerp en uitwerking
beschouwd. Het is dus mogelijk om hier een opdracht mee te geven die via file het bestandstype van een bestand nagaat en dan succesvol eindigt als dit een bepaald bestandstype blijkt te zijn. Het voorgaande in acht nemende lijkt het dat de combinatie van find en file me dus al heel ver kan brengen voor niet-verwijderde bestanden. Interessant!
SLEUTHKIT'S
ISTAT EN STAT
Istat maakt deel uit van The Sleuthkit (TSK), een collectie van verschillende commandolijnprogrammaatjes
voor
digitaal
(forensisch)
onderzoek.
Deze
gereedschappen worden o.a. - zoals ik kan uitmaken uit de presentatie (cfr supra) – door de FCCU gebruikt. De verschillende programmaatjes werken goed samen in de zin dat ze elkaars output als input kunnen gebruiken en dat de parameters op dezelfde wijze en in hetzelfde formaat worden opgegeven. Istat geeft voor een bepaalde inode (een metadatastructuur die verwijst naar een bepaald bestand17) een hele boel informatie weer. De uitvoer is te vergelijken met wat het stat commando op Ubuntu (en soortgelijke systemen) doet voor bestanden. Directory Entry: 14 Allocated File Attributes: File, Archive Size: 11 Name: P1.DAT Directory Entry Times: Written: Thu Jul 19:31:20 2005 Accessed: Mon May 00:00:00 2009 Created: Thu Jul 19:31:20 2005
Tabel 1: Uitvoer van 'istat' op een FAT- (links) en een ext-partitie (midden). Rechts de uitvoer van 'stat'
17 Opgelet: ik gebruik, net als de documentatie van TSK steeds het woord 'inode' voor de structuren in de verschillende bestandssystemen die naar bestanden verwijzen, ongeacht of de documentatie van dat bepaalde bestandssysteem het woord 'inode' gebruikt.
13
Ontwerp en uitwerking
SLEUTHKIT'S
ILS EN VERWIJDERDE BESTANDEN
Met ils is het mogelijk een lijst te krijgen van inodes op een bestandssysteem, met voor iedere inode een aantal metagegevens zoals: het tijdstip van de laatste toegang tot de gegevens waarnaar de inode verwijst, de laatste aanpassing van de gegevens of de laatste aanpassing van de metagegevens, de ID van de gebruiker of groep waartoe het bestand behoort, de bestandsgrootte, of de inode al dan niet toebehoort aan een bestand in de hiërarchie van het bestandssysteem (of het m.a.w. “gealloceerd” is of niet) etc. Het is bovendien ook mogelijk om bv. enkel de informatie op te vragen voor enkel gealloceerde of ongealloceerde inodes, inodes die nog nooit gebruikt zijn door het bestandssysteem enz. De mogelijkheid om een lijst te maken van enkel ongealloceerde inodes die bovendien wel al eens door het bestandssysteem gebruikt zijn geweest, lijkt interessant voor het zoeken van verwijderde bestanden. Dat we deze lijst dan ook nog makkelijk kunnen filteren op basis van alle datumintervallen (aangezien deze gegevens meteen worden meegegeven) maakt de boel des te interessanter. Met verwijderde bestanden worden hier die bestanden bedoeld die niet meer op het bestandssysteem zichtbaar zijn, en bv. niet de bestanden die zich in de 'prullenmand' van een eindgebruikersbesturingssysteem bevinden. Deze “prullenmand” is vaak niet meer dan een systeem dat bestaat uit een aparte map waarin de bestanden worden bijgehouden (al dan niet gecomprimeerd) en een (of enkele) bestand(en)18 waarin metagegevens
over
deze
bestanden
worden
bijgehouden
zoals
de
originele
bestandslocatie e.d. Deze bestanden zijn dus wel nog in de hiërarchie van het bestandssysteem te vinden en zullen zodanig door find kunnen opgespoord worden. Voor het 'verwijderen' van bestanden worden op de meeste bestandssystemen de gegevens
zelf
niet
verwijderd
(het
bitpatroon
blijft
m.a.w.
bestaan
op
de
gegevensdrager) maar enkel de verwijzing naar het bestaan van het bestand in het bestandssysteem. Deze 'verwijzing naar het bestaan' is niet meer dan de al dan niet “gealloceerde” status van een bepaalde inode. Deze niet in gebruik zijnde inodes verwijzen (indien ze ooit in gebruik zijn geweest) echter nog steeds naar de positie van het verwijderde bestand.
18 Bv. een klein databank-bestand of per bestand in de prullenmand een XML-bestand
14
Ontwerp en uitwerking
SLEUTHKIT'S
ICAT
Het icat-gereedschap is iets dat perfect na het vorig besproken programmaatje past. Icat kopieert namelijk bestanden bij opgave van hun inode. Het doet dat niet alleen voor bestanden op het bestandssysteem maar kan ook (bij opgeven van een parameter) bestandshersteltechnieken gebruiken om verwijderde bestanden zo goed en zo kwaad mogelijk terug te toveren. De puzzel voor het zoeken naar en herstellen van bestanden begint dus hier en daar al wat ineen te vallen. Icat kan ook bij het kopiëren van een bestand de slack space (cfr infra) van dat bepaalde bestand mee kopiëren.
SLEUTHKIT'S
FFIND
Ffind's taak bestaat er in voor een bepaalde inode te achterhalen welk de bestandsnaam (en het bestandspad) is van de gegevens die er achter schuilen ... of schuilden. En net voor verwijderde bestanden is dit dus een zeer bruikbaar gereedschap (voor niet verwijderde bestanden kan de bestandsnaam makkelijker worden gevonden). Maar zo gemakkelijk komen we er ook niet vanaf natuurlijk... ook ffind komt met een prijs, namelijk de tijd die het gereedschap kan nodig hebben om een bestandsnaam te vinden. Het moet namelijk alle mapstructuren afgaan om te zoeken naar verwijzingen naar die bepaalde inode waarbij een bestandsnaam is opgegeven. Sommige opdrachten duurden op mijn persoonlijke computer algauw enkele tot tientallen seconden. Hiermee moest ik dus zeker rekening houden wanneer ik het zou gebruiken in een routine waar een hele lijst aan inodes wordt onderzocht.
SLEUTHKIT'S
DLS
Na het bekijken van gealloceerde (met find) en ongealloceerde (via ils) inodes zijn er nog een aantal gegevens door de mazen van het net geglipt: de zogenaamde slack space. Slack space is de ruimte op een harde schijf die aan bestanden is gealloceerd maar
niet
door
dat
bestand
zelf
wordt
gebruikt.
Wanneer
een
bepaald
bestandssysteem de gegevens bv. opslaat in blokken van 512 byte (op Windowssystemen een 'cluster' genoemd, bij Linux noemt met dit 'blocks') en er een bestand van 600 byte wordt opgeslagen, zullen hiervoor 2 blokken gealloceerd worden (1024 byte) maar zal maar 88 byte van het tweede blok worden gebruikt. De overige 424 byte wordt de slack space van dat bestand genoemd. 15
Ontwerp en uitwerking
Dls kan uit een bestandssysteem data extraheren op basis van hun status (gealloceerd, niet-gealloceerd, slack space). Het lijkt mij dan ook mogelijk dit gereedschap te gebruiken om de slack space uit een partitie te extraheren, waarna op deze gegevens bv. zoekopdrachten kunnen worden gedaan om te kijken of bepaalde tekenreeksen voorkomen. Bestanden proberen te herstellen uit data uit de slack space is echter onmogelijk. Per definitie begint de slack space niet aan het begin van een blok, en bestanden doen dit wel, waardoor we nooit het begin van een bestand zullen terugvinden (waar juist meestal de gegevens zitten om een bestandstype te herkennen19). Bovendien is de hoeveelheid slack space per bestand steeds kleiner dan de grootte van een blok in het bestandssysteem, wat op zich een kleine hoeveelheid data is om te visualiseren. Voornamelijk wanneer hier tekst wordt in opgeslagen kan dit nog waarde hebben voor onderzoek dus, me dunkt.
MAGICRESCUE Magicrescue is een gereedschap dat een hele partitie afgaat en wanneer het gegevens van enkele gekende bestandstypes tegenkomt, het bestand zal (proberen te) herstellen.
Bovendien
werkt
dit
volledig
onafhankelijk
van
het
gebruikte
bestandssysteem. Maar enkel rozengeur en maneschijn mag men ook niet verwachten van magicrescue... Het programmaatje werkt op basis van recipes die opgegeven worden in kleine configuratiebestanden. Deze bestandjes dienen enerzijds een definitie (gelijkend op wat bij file wordt opgegeven) te bevatten en anderzijds een opdracht waarmee het bestand dan moet worden gereconstrueerd. Er zijn standaard heel weinig van zulke “recipes” meegeleverd en gewoonweg 'definities' van file overnemen lijkt ook geen mogelijkheid. Nogal een groot minpunt dus. Hiernaast weet de handleiding ook te melden dat er weinig kans is op succes bij een eerder gefragmenteerd bestandssysteem. Het programma dient dan ook enkel voor het terugvinden van data op corrupte bestandssystemen, aldus de handleiding; voor bestandsherstel op een gezond bestandssysteem raadt het zelf The Sleuthkit aan. Aangezien ik me voor mijn masterproef enkel ga toeleggen op dit laatste, laat ik magicrescue verder voor wat het is.
19 Ik bedoel hiermee de bestandshoofding of file header
16
Ontwerp en uitwerking
FOREMOST Foremost is een product van de U.S. Air Force Office of Special Investigations, dat net als magicrescue aan data carving doet: het herstellen van bestanden op basis van bestandssignatuur, onafhankelijk van het gebruikte bestandssysteem. Het heeft zowat dezelfde tekortkomingen als magicrescue. Daarenboven blijkt het enkel een vooraf bepaald aantal bytes van een bestand te herstellen en niet te herstellen tot het een bestandseinde tegenkomt. Om dezelfde redenen als bij magicrescue ga ik foremost links laten liggen.
NTFSUNDELETE NTFSundelete maakt deel uit van ntfsprogs, een aantal gereedschappen voor het behandelen van NTFS-partities. NTFSundelete kan een lijst genereren van alle inodes, kan bestanden herstellen op van een bestandsnaampatroon, kan bestanden voor bepaalde inodes herstellen, enz. Met de combinatie ils+icat kan echter hetzelfde worden bereikt, ook voor NTFS-bestandssystemen. Mogelijk is NTFSundelete sneller (omdat het toegespitst is op één bepaald bestandssysteem), al kon ik dat niet merken bij een paar pogingen. Om deze reden gebruik ik voor mijn eindwerk NTFSundelete niet.
2
Apache en PHP
Zoals ik reeds vermeld heb, gebruikt mijn systeem een webserver die door de gebruiker met zijn of haar webbladerprogamma wordt aangestuurd. De webserver op zijn beurt zal, naargelang de wensen van de gebruiker, een aantal dochterprocessen aansturen om de benodigde gegevens op te halen en deze dan terug aan de gebruiker te kunnen aanbieden. Om dit alles mogelijk te maken (dynamisch de opgehaalde gegevens in HTML-opmaak omzetten om naar de webbrowser van de gebruiker te sturen), maak ik gebruik van scripting aan de serverzijde met PHP. PHP, een recursief acroniem voor “PHP Hypertext Preprocessor”, is een server side scripting taal. Wanneer een gebruiker een PHP-pagina opvraagt van een webserver die over een PHP-motor beschikt, zal deze laatste de PHP-code omzetten naar HTML-code en deze wordt dan door de webserver aan de client doorgegeven. PHP laat het gebruik 17
Ontwerp en uitwerking
van variabelen toe van verschillende datatypes, allerhande lusconstructies kunnen gebruikt worden om voor een groot aantal gegevens HTML-code te genereren (bv. alle elementen van een array als rij in een tabel opnemen), er kunnen externe commando's worden opgeroepen (denk bv. aan de in het stuk hiervoor beschreven gereedschappen) enz. Als webserver heb ik Apache gekozen. Nog steeds de de facto standaard zijnde voor webbrowsers in Linux-systemen (en volgens verschillende onderzoeken heeft het ook het grootste marktaandeel onder de webservers), valt Apache ook nog eens uitstekend uit te breiden – via modules – om bv. ondersteuning voor PHP te bieden. Apache maakt bovendien deel uit van de zogenaamde LAMP-stack20 (het samen gebruiken van Linux, Apache, MySQL en (in dit geval) PHP) die voor de Ubuntu server-uitgave gerenommeerde ondersteuning krijgt21.
3
Het gebruik van shellscripts
Sommige operaties van de gebruikte gereedschappen geven geen meteen bruikbare uitvoer of zouden al te vaak moeten heropgeroepen worden of hangen meteen af van de uitvoer van een ander gereedschap. Indien we zo'n operaties vanuit PHP zouden oproepen zou de PHP-motor mogelijk per opgeroepen operatie moeten wachten op uitvoer om dan verder te beslissen welke actie er moet ondernomen worden ... en ondertussen wacht de gebruiker op antwoord van de webserver. Dit is geen taak voor PHP en zou een al te onaangename gebruikerservaring kunnen betekenen. De oplossing? Shellscripts, zoals de titel al liet weten. Een shellscript is in se een opeenvolging van opdrachten in een tekstbestandje dat uitgevoerd kan worden. Op Ubuntu (net als bij andere moderne besturingssystemen) ondersteunt de standaard commandoshell (bash – kort voor Bourne again shell) echter veel meer dan dat. Met ondersteuning voor variabelen, lusconstructies e.d. kan het zo goed als opboksen tegen de wereld van 'echte' programmeertalen. Door gebruik te maken van shellscripts kunnen we bepaalde routines in één oproep door PHP laten uitvoeren in de achtergrond en bv. aan de oproepende PHP-pagina enkel snel een statusbericht teruggeven (bv. een code die voor “routine gestart” staat 20 Wat meer info: http://nl.wikipedia.org/wiki/LAMP, laatst geraadpleegd op 06/05/'09. 21 Trivia: de oprichter van het bedrijf achter Ubuntu, Mark Shuttleworth, stond zelf ooit in voor het onderhoud van Apache.
18
Ontwerp en uitwerking
of voor “routine kan niet gestart worden”). We kunnen de shellscripts hun uitvoer laten schrijven naar bestanden die dan kunnen opgevraagd worden door een ander PHP-script dat de status weergeeft van de routine. Een voorbeeld van een gebruik van een shellscript in mijn systeem is het filter.shscript dat het uitvoerbestand van het vooraf opgeroepen find commando afgaat en voor ieder bestand kijkt of het aan de bestandssysteemvoorwaarde voldoet. De uitvoer van dit script komt zelf ook weer in een ander bestand terecht. Een ander PHP-script zal routinematig opgeroepen worden om dit bestandje te bekijken en de status van de opdracht terug te geven, die dan aan de gebruiker kan getoond worden.
4
Schrijven naar het RAM-geheugen
Een typische flessenhalssituatie bij computerprogramma's is de toegang tot het secundair geheugen22. Om vertragingen van deze soort te vermijden zullen de verschillende shellscripts hun uitvoer naar een zogenaamde RAMdisk schrijven. Een RAMdisk is een deel van het RAM-geheugen dat wordt gereserveerd en waar een bestandssysteem wordt op geïnstalleerd dat dan kan worden aangekoppeld. Ook hier worden we weer door het gekozen besturingssysteem verwend. Standaard creëert Ubuntu namelijk al een RAMdisk die dynamisch groeit naargelang de behoefte tot een bepaald percentage van het aanwezige geheugen is gebruikt. Deze wordt gebruikt voor tijdelijke bestanden van systeemtoepassingen. In de map waar ik mijn applicatieonderdelen heb ondergebracht heb ik dan ook een verwijzing aangebracht naar deze RAMdisk zodat de bestandshiërarchie duidelijk blijft.
6.4
De Façade: een moderne gebruikersinterface
Om het geheel te voorzien van een fris, gebruiksvriendelijk en toegankelijk jasje, heb ik gebruik gemaakt van moderne webontwikkeltechnieken zoals Javascript (met o.a. AJAX) en CSS.
22 Dit is ons dit schooljaar niet alleen in de lessen van prof. dr. ir. K. De Bosschere op het hart gedrukt geweest, maar ook in de practica voor deze vakken aan bod gekomen.
19
Ontwerp en uitwerking
1
Cascading Style Sheets
Door het gebruik van CSS wordt de inhoud van een pagina van de stijlelementen gescheiden.
Op
deze
wijze
kan
men
makkelijk
uitbreidbare,
overzichtelijke
webpagina's creëren die daarenboven heel toegankelijk kunnen worden gemaakt. Er bestaat de mogelijkheid bv. een apart stijlblad te voorzien met hoge contrastkleuren of voor een afdrukweergave enz. De stijleigenschappen van zo goed als alle elementen in de webpagina's van mijn systeem zijn in het bestand stijlblad.css opgenomen.
2
Scripten aan de client-kant: Javascript, jQuery, AJAX.
Naast het gebruik van scripts op de webserver, wordt ook van de client wat rekenkracht genuttigd (dit zal echter in veel gevallen dezelfde computer zijn, nvdr.). Door het aanwenden van Javascript kan enerzijds de inhoud van het gedrag van de pagina's gescheiden worden en kan anderzijds al snel een gebruikersinterface worden gepresenteerd waar pas nadien die gegevens worden ingevoegd waarvoor het opvragen enige tijd vergt. Het eerste punt, het scheiden van de inhoud van het gedrag van webpagina's, is naast de scheiding t.a.v. de stijlgeving (cfr. supra), een moderne webontwerptechniek met het oog op onder andere de uitbreidbaarheid en overzichtelijkheid van de code. De naam die hieraan wordt gegeven is Unobtrusive Javascript23. Het idee bestaat eruit binnen het element van een HTML pagina geen enkele gedragseigenschap uit te drukken en enkel bepaalde elementen CSS-id's en -classes toe te kennen. In de sectie bevindt zich dan een Javascriptblok of wordt verwezen naar een bestand met Javascriptcode, dat uitgevoerd wordt wanneer de pagina wordt ingeladen. Deze code dient dan om (onder andere) aan de verschillende elementen (met bepaalde CSS-id's of -classes) de gespecificeerde gedragseigenschappen te binden.
23 Zie bv. BIBEAULT, B. en KATZ, Y. “jQuery in Action”, Manning Publications Co, Greenwich – CT - USA, 2008, p 3. of http://en.wikipedia.org/wiki/Unobtrusive_Javascript, laatst geraadpleegd op 05/05/'09.
20
Ontwerp en uitwerking
Hiernaast maak ik gebruik van de zogenaamde Ajax-technieken om vanuit een webpagina asynchroon data op te vragen van de webserver. Ajax staat voor Asynchronous Javascript And XML, een naam die in 2005 door Jesse James Garrett het leven werd ingeroepen24 voor een techniek die echter al langer in gebruik was ... al heeft de aanstekelijke naam zeker geen windeieren gelegd wat de adoptie van de technieken betreft. Ajax wordt gebruikt om asynchroon gegevens, zij het in HTMLindeling, XML, platte tekst of JSON-formaat (Javascript Object Notation
25
) op te
vragen van een webserver en deze dan in een weergave van een pagina te verwerken. Bij klassieke webpagina's uit het pre-Ajax tijdperk (dat nog niet zo lang achter de rug is) dient een gebruiker die naar de webpagina bladert te wachten op het inladen van de pagina. Wanneer door een klik op een koppeling meer gegevens op de pagina moeten worden weergegeven, wordt door de webbrowser een nieuwe HTTP GETaanvraag verstuurd voor de aangepaste pagina en moet de gebruiker wederom wachten tot de pagina is ingeladen. Door het gebruik van de Ajax-technieken is dit allemaal verleden tijd. Maar wat betekent dat “asynchrone” nu juist? Het komt er op neer dat de browser geïnstrueerd kan worden op de achtergrond HTTP-verzoeken te versturen d.m.v. bepaalde Javascript Ajax-functies. Aan deze functies kan bovendien (als argument) een (anonieme) terugkoppelfunctie (callback function) worden meegegeven, die in de achtergrond wordt uitgevoerd eens het HTTP-verzoek is ingewilligd. Op deze manier dient de oproepende code niet te wachten op het beëindigen van de Ajax-oproep. Een voorbeeld van het gebruik van Ajax in mijn systeem is bijvoorbeeld bij het inladen van de eerste pagina (index.php). Bij het tonen van de keuzes aan de gebruiker moet hij of zij onder andere één of meerdere partities kunnen selecteren voor het onderzoek. De lijst met partities ophalen, samen met alle data om deze te identificeren, duurt echter op zich algauw enkele seconden. Om de gebruiker niet zonder enig teken van leven secondelang te laten wachten op een antwoord op het GET request van de webbrowser, zal de indexpagina zelf meteen worden doorgegeven, met alle informatie behalve deze waar op gewacht zou moeten worden. In de HTMLcode is er echter plaats gemaakt voor het partitieoverzicht door een
element te 24 http://www.adaptivepath.com/ideas/essays/archives/000385.php,n laatst geraadpleegd 11/05/'09. 25 JSON is de wijze waarop in Javascript allerlei geavanceerde gegevenstypes als een tekenreeks kunnen worden voorgesteld.
21
Ontwerp en uitwerking
voorzien waar dit perfect inpast. Een stukje Javascriptcode zal dan meteen na het inladen op asynchrone wijze het overzicht van de partities opvragen met een nieuw GET request en deze dan invoegen in het voorziene
element op de pagina. Omdat de Javascriptimplementaties van verschillende webbladeraars - en de API voor Ajax-bevragingen in het bijzonder - niet altijd gelijklopen, maak ik gebruik van de Javascript-bibliotheek
jQuery.
Deze
programmacodebibliotheek
abstraheert
de
verschillen tussen verscheidene webbrowsers en zorgt ervoor dat veel stukken Javascriptcode kunnen vervangen worden door enkele korte oproepen. jQuery maakt het ook makkelijk om enkele grafische effecten te gebruiken op een webpagina (het laten inglijden van stukken van een pagina, stukken laten wegdeemsteren enz.) Het gebruik van deze moderne technieken heeft tot doel de applicatie, alhoewel ze d.m.v. een webbrowserprogramma met de gebruiker interageert, te laten lijken op een “echte” bureaubladtoepassing. Het is met dezelfde bedoeling dat de instellingen van de gebruikte webbrowser zijn aangepast zodat de werkbalken en menu's niet meer zichtbaar zijn. Ook het rechtsklikken en selecteren van tekst op de pagina is d.m.v. Javascript uitgeschakeld om dit te verwezenlijken.
6.5
Het volledige plaatje
Na het beschrijven van de gebruikte technologieën, methoden en technieken, tracht ik onder deze titel - aan de hand van een onderzoeksscenario in stappen - een overzicht te geven van de algehele werking van het systeem.
1
Opstarten van de verdachte PC met de USB-stick
In wat aan dit deel voorafging heb ik de mogelijkheid besproken om mijn systeem ook op een ander medium dan een USB-stick (bv. een CD-ROM) te installeren. Voor mijn eindwerk heb ik echter voor een USB-stick gekozen en is de programmacode hier ook op afgestemd. De code verwacht onder andere een tweede, beschrijfbare partitie op de USB-stick om de te herstellen bestanden op te plaatsen enz. Ik heb niet de tijd gehad de toepassing onafhankelijk te maken van het soort medium of verder te testen met andere media, waardoor enkel deze situatie ondersteund is.
22
Ontwerp en uitwerking
Om een PC te onderzoeken moet dus eerst van de USB-stick opgestart worden. Tijdens het opstartproces wordt de Apache webserver gestart die verbindingen op poort 80 van de PC accepteert. Tegen het einde van het opstartproces wordt een grafische schil gestart waarin standaard een webbrowserkader wordt geopend dat een verbinding aanvraagt met http://localhost/ Dit adres wordt in het configuratie-bestand /etc/hosts van het besturingssysteem aan het IP-adres 127.0.0.1 gekoppeld, de eigen computer dus. Er wordt dus door de browser een GET-verzoek verstuurd naar de Apache webserver voor de root folder, die ingesteld staat als /var/www/. De webserver gaat dan, volgens de instelling, kijken of er in deze map al dan niet een indexbestand aanwezig is en vindt dit onder de naam index.php. Dit bestand wordt door de PHP-motor omgezet in HTML-code die naar de webbrowser wordt verzonden. Deze pagina bevat op zich reeds enkel HTML-code en zal door de PHP-motor dus niet eens aangepast worden. De reden hiervoor is om de mogelijkheid tot eventuele uitbreiding met stukjes PHP-script te behouden. Een blok met een 'rel="stylesheet"' attribuut in de sectie van de HTML-pagina, zorgt ervoor dat de browser het bestand stijlblad.css opvraagt met een nieuwe GET-aanvraag en als standaard stijlblad gebruikt. Hiernaast staan in deze sectie nog een resem <script> blokken die de browser instrueren een bepaald Javascript-bestand op te vragen en in te laden. Alle in mijn toepassing gebruikte Javascript-bestanden heb ik onder een submap “js” geordend. Één van deze bestanden, index.js, bevat de nodige functies voor controle en gedrag van de interface voor het maken van de keuzes, die door de index.php-pagina aan de gebruiker worden gegeven. Een ander bestand dat hier al wordt opgehaald is onderzoek.js. Dit bestand bevat functies die gebruikt worden voor de onderzoeken zelf. Het wordt al door index.php opgehaald omdat de interface, nodig voor het uitvoeren van de onderzoeken, toch op dezelfde pagina wordt ingeladen en de ophaalinstructies voor de verschillende Javascript-bestanden dan mooi bij elkaar staan. De andere opgevraagde Javascript-bestanden zijn bibliotheekbestanden (bijna allemaal van jQuery) met functionaliteit die in de eerstgenoemde bestanden wordt opgeroepen.
23
Ontwerp en uitwerking
De opgevraagde HTML-pagina bevat reeds de statische elementen van de keuzeinterface van het programma, zijnde de keuzevakken voor het soort onderzoeken, het selecteren van minimum- en maximumbestandsgroottes, datumintervallen en het zoeken op basis van bestandsnaam of -inhoud. Het index.js-bestand bevat de jQueryoproep “$(document).ready(...)”. Deze oproep zorgt ervoor dat alle programmeercode die hierin vervat zit wordt uitgevoerd eens de pagina door de webbrowser is opgebouwd, net voor ze voor de gebruiker zichtbaar is. De oproep zorgt in chronologische volgorde voor volgende dingen: •
het onzichtbaar maken van de “Start onderzoek” knop,
•
het uitschakelen van het rechtermuisklikmenu,
•
het onzichtbaar maken van de paginasectie die voorzien is voor de interface van het onderzoek zelf,
•
het uitschakelen van de mogelijkheid tekst te selecteren op de pagina,
•
het oproepen van de functie bindHideShow() die de dynamiek van de in- en uitklapkoppelingen verzorgt,
•
het oproepen van de functie laadPartitiegegevens() die de te kiezen partities asynchroon invoegt in de pagina en het mogelijk maakt deze eenvoudig te selecteren,
•
het oproepen van laadBestandstypegegevens(), een functie die de keuzes voor de verschillende (op een uitbreidbare wijze gedefinieerde) bestandstypes tevens asynchroon invoegt,
•
de functie laadOptieChecks() oproepen die voor de verschillende keuzevakjes de weergave en dynamiek instelt,
•
laadDatumSelectie() oproepen, een functie die een datumselectiewidget bindt aan de verschillende datumkeuzevakken en
•
het klikken op de knop “Start onderzoek” aan het oproepen van de functie checkKeuzes() binden. Deze gaat na of de invoer voor de verschillende velden en keuzevakken correct is. Zoniet geeft ze een waarschuwing weer. Zowel trekt ze het onderzoek op gang door een asynchroon POST-request naar de server te versturen voor de onderzoek.php-pagina.
24
Ontwerp en uitwerking
HET
INLADEN VAN HET PARTITIEOVERZICHT
De functie laadPartitiegegevens zal dus het deel van de pagina voor de weergave van de verschillende op het systeem aanwezige partities inladen. Er wordt op asynchrone wijze een GET-aanvraag verstuurd voor het bestand partitie-overzicht.php. Eens dit bestand ingeladen is, worden door deze functie ook de gedragseigenschappen van de ingevoegde blokken gedefinieerd (een klik op een partitie wordt aan de functie togglePartitieSelectie gebonden) en wordt de “Start onderzoek”-knop terug zichtbaar gemaakt. In het bestand
partitie-overzicht.php staan drie dingen: een PHP-oproep om het
bestand haal-schijfinfo.php in te voegen, een functie om een bestandsgrootte in een andere eenheid om te zetten en de code voor de weergave van de gegevens. Alle PHP-code voor het ophalen van de gegevens zit voor de overzichtelijkheid apart in haal-schijfinfo.php. Dit script geeft geen uitvoer maar creëert enkel een PHP-array met
de
nodige
systeeminformatie.
Hiervoor
zal
het
eerst
het
shellscript
alle_partities.sh oproepen. Dit script geeft een uitvoer weer met per lijn de apparaatnaam van een op het systeem aanwezige partitie, waarvoor het shellscript de inhoud van het systeembestand /proc/partitions uitleest en ontleedt. De uitvoer wordt door de PHP-oproep in een PHP-array bijgehouden. Vervolgens haalt het script de apparaatnaam op van de herstelpartitie door te kijken waarnaar /dev/disk/bylabel/ccHERSTEL verwijst en slaat dit op in een variabele. Het script zal hierna voor iedere partitie uit de opgeslagen array, met uitzondering van de herstelpartitie een shellscriptje (mount.sh)oproepen dat de partitie (her)aankoppelt op het systeem met enkel leesrechten. Op deze wijze kunnen we zeker zijn dat we de gegevens op de partitie niet contamineren. Vervolgens roept het script het parted-gereedschap op, een programma dat gebruikt kan worden om een schijfpartitionering aan te passen. Het scriptje roept het gereedschap echter enkel op om een machineleesbaar overzicht te krijgen van alle schijven en partities op het systeem, samen met informatie over de gebruikte bestandssystemen, de grootte van de partitie, hoeveel ruimte er gebruikt wordt, enz. De uitvoer van deze oproep wordt wederom in een PHP-array bijgehouden. De uitvoer
25
Ontwerp en uitwerking
van een oproep van het df-gereedschap, dat voor de verschillende aangekoppelde partities nog een hoop informatie toont, wordt evenzo in een array opgeslagen en meteen ontleed. Al deze informatie wordt vervolgens samengebracht in één enkele array, door het ontleden van de uitvoer van de oproep van parted, waarbij per partitie waar mogelijk de andere opgezochte informatie wordt bijgevoegd. Deze array wordt dan door de code in partitie-overzicht.php omgezet in een HTML-weergave met tabellen. Op het einde van de functie laadPartitiegegevens in index.js wordt de functie bindPartitieTooltips opgeroepen. Deze functie zal voor iedere weergegeven partitie een asynchrone GET-oproep doen voor de pagina dirtree.php met als argument het aankoppelpunt van de partitie. Dit script maakt een kleine weergave van de aanwezige bestanden en mappen in de basismap van die bepaalde partitie waarbij d.m.v. de opmaak een verschil wordt gemaakt tussen mappen, bestanden, links en uitvoerbare bestanden. Deze informatie wordt door de Javascriptcode in de pagina ingevoerd in een verborgen
-element met als CSS-id de apparaatnaam van de partitie, onder een
-element met als CSS-klasse “dirtree”, dat door partitieoverzicht.php ingevoerd werd, net onder de partitieweergave. Deze verborgen elementen worden echter zichtbaar als zwevend kader wanneer de muiswijzer boven een partitie staat (cfr infra).
2
De gebruikersinteractie met de keuzeinterface en het opstarten van het onderzoek
2.1 De interactie van de gebruiker met de keuzewidgets Eens de pagina met alle keuze-elementen is ingeladen gebeurt er niets tot de gebruiker tot interactie overgaat. Er zijn enkele manieren waarop de interface reageert op de acties van de gebruiker.
26
Ontwerp en uitwerking
A
De status van keuzevakken reflecteren
De status van de keuzevakken wordt gereflecteerd in de kleur van de tekst en invoervakken die erbij horen. Wanneer een keuzevak is aangevinkt zal de tekst die erbij hoort zwart van kleur zijn en zullen de invoervelden actief zijn en dus op invoer reageren. Indien de keuzevakken echter niet geselecteerd zijn wordt de tekst lichtgrijs weergegeven en worden de invoerelementen inactief. Dit
werd
gerealiseerd
d.m.v.
een
stukje
Javascriptcode
in
de
functie
laadOptieChecks(). Deze code zorgt ervoor dat voor ieder keuzevak met CSS-klasse optiecheck bij het aanklikken de status van elk element binnen een tag (bv. een <span> of
element) met een CSS-id dat bestaat uit het id van het keuzevak gevolgd door een liggend streepje, wordt aangepast. Onder aangepast verstaan we hier dat, aan de hand van de status van het keuzevak, de CSS-eigenschappen van de elementen worden veranderd. Hiernaast zal dit stukje code ook zorgen dat, indien er binnen deze tag invoervelden voorkomen, het eerste hiervan de invoeraandacht krijgt.
B
Inklapbare secties voor de zoekrestricties
Een andere manier van reageren op de invoer van de gebruiker is het gedrag van de titels en de “volgende” knoppen van de op te geven zoekrestricties. Wanneer op één van beide wordt geklikt zal de bijhorende keuzesectie worden “ingeklapt” of m.a.w. uit de interface verdwijnen, samen met de knop. Een nieuwe klik op de titel haalt de sectie weer van onder het stof en terug in de interface. Ik heb dit gedaan om verscheidene redenen. Enerzijds zou het bij een uitbreiding van het programma misschien nodig zijn dat de gemaakte keuzes nog zichtbaar zijn (wat nu dus niet het geval is). Zodoende zou de hoeveelheid te tonen informatie nogal groot kunnen worden. De minder gebruikte zoekrestricties zouden dan uit het zicht kunnen gehaald worden om het geheel overzichtelijk te maken. Anderzijds zou een uitbreiding nog meer zoekrestricties kunnen toevoegen en zou het handig zijn delen van de interface die voor het opzetten van het specifieke onderzoek niet (meer) van nut zijn te kunnen verbergen. En tenslotte kunnen weinig gebruikte zoekrestricties eventueel standaard toegeklapt worden maar met een klik door te gebruiker tevoorschijn te toveren zijn.
27
Ontwerp en uitwerking
Hoe dit werkt is heel gelijklopend aan wat ik in de vorige sectie uit de doeken heb gedaan. Iedere sectie heeft een titel met CSS-klasse “hideshow” en een uniek CSS-id. Onder dit element zit in de paginaboom een element met een CSS-id dat gelijk is aan het vorige plus “_h”. In index.js zal de code van de bindHideShow-functie maken dat een klik op de titel of de “Volgende”-knop dit element in- of uitklapt.
C
Een zwevend kader tonen met de inhoud van de partitie met de muis boven
In een vorig deel werd beschreven hoe na het inladen van het partitieoverzicht per partitie ook een verborgen
-element wordt aangemaakt met een overzicht van de inhoud van deze partitie. De functie bindPartitieTooltips doet echter meer dan alleen ophalen van deze informatie. De functie zal namelijk ook blokjes code (anonieme functies) binden met de gebeurtenissen “mouseover”, “mousemove” en “mouseout” voor de verschillende partities. Wanneer de muisaanwijzer boven een partitie komt te staan, wordt de voorheen verborgen informatie zichtbaar gemaakt in een zwevend kader naast de aanwijzer. Bij elke beweging van de muis wordt de plaats van het kader aangepast zodat het de aanwijzer volgt en wanneer de muisaanwijzer de partitie verlaat, wordt het element weer onzichtbaar.
2.2 Het bijhouden en doorgeven van de keuzes van de gebruiker Alle invoerelementen van de pagina staan in een