Integratie van Adito in aXsGUARD Gatekeeper Christophe Leybaert
Promotoren: prof. dr. ir. Bart Dhoedt, Dieter Roelands (Vasco) Begeleider: Jurgen Van Ham (Vasco) Masterproef ingediend tot het behalen van de academische graad van Master in de toegepaste informatica
Vakgroep Informatietechnologie Voorzitter: prof. dr. ir. Daniël De Zutter Faculteit Ingenieurswetenschappen Academiejaar 2009-2010
Woord Vooraf In de eerste plaats bedank ik Jurgen Van Ham. Zijn eindeloze geduld werd door mij meermaals op de proef gesteld, maar toch mocht ik steeds rekenen op zijn onvoorwaardelijke ondersteuning en begeleiding. Ik kon ook altijd terugvallen op zijn uitgebreide expertise en ideeën, wat deze masterproef voor mij zeer leerrijk maakte. Wie ook veel betekend heeft bij de realisatie van dit werk is promotor Dieter Roelants. Ik vond hem altijd bereid om mijn vorderingen op te volgen en te controleren. Dankzij hem en de andere medewerkers van Vasco kon ik werken in een zeer aangename sfeer, waardoor ik met plezier op deze periode kan terugblikken. Ook professor Bart Dhoedt ben ik zeer erkentelijk. Bij hem kon ik op het laatste moment nog terecht met mijn onderwerp. Hij hield de vorderingen stevig onder controle en was steeds bereikbaar voor mogelijke vragen. Zijn tussentijdse controles hebben dit verslag in goede banen geleid. Aan Alex Ongena een woord van dank voor het vinden van een eindwerk aangepast aan mijn kennis en capaciteiten. Hierdoor kon ik de wetenschap die ik tijdens dit jaar vergaard heb, uitbreiden en in de praktijk toepassen. Ook Johan Leybaert mag ik hier niet vergeten omwille van zijn nauwgezette taal- en spellingscorrecties. Daarnaast vermeld ik zeker Jeroen Leybaert. Hij wist mij te stimuleren om voor dit onderwerp te kiezen en zorgde voor de nodige motivatie en hulp tijdens de aanloop naar dit eindwerk. Ten slotte bedank ik ook de professoren van Universiteit Gent die zich in dit korte jaar hebben ingezet om ons zoveel mogelijk nuttige kennis bij te brengen.
Christophe Leybaert Gent, mei 2010
Masterproef Toegepaste informatica
2009-2010
4
Inhoudsopgave Inhoudsopgave ........................................................................................................... 4 Lijst met figuren en tabellen ........................................................................................ 6 Lijst met afkortingen ................................................................................................... 7 Inleiding
................................................................................................................... 8
1
Probleemstelling .................................................................................................. 9
2
Doelstelling ........................................................................................................ 10
3
Werking Adito .................................................................................................... 11
4
Voorbereiding softwareontwerp ......................................................................... 13
5
4.1
Definities ...................................................................................................... 13
4.2
Inleidende installaties .................................................................................. 14
4.2.1
Apache Ant ........................................................................................... 14
4.2.2
Adito zonder aXsGUARD ...................................................................... 14
4.2.3
Cygwin .................................................................................................. 15
4.2.4
OpenSSL .............................................................................................. 15
4.2.5
Bouncy Castle ....................................................................................... 15
4.3
Identificatie parameters ............................................................................... 16
4.4
Locatie parameters ...................................................................................... 18
4.5
Types bestanden ......................................................................................... 19
4.5.1
Configuratiebestand .............................................................................. 19
4.5.2
Properties.............................................................................................. 19
4.5.3
HSQLDB ............................................................................................... 20
4.5.4
Keystore ................................................................................................ 20
Analyse automatisatie van de installer .............................................................. 21 5.1
Aanmaken configuratiebestand ................................................................... 21
5.2
Aanmaken Properties-bestand .................................................................... 21
5.3
Conversie XML – Java ................................................................................ 22
5.3.1
Algemeen .............................................................................................. 22
5.3.2
Globale bespreking code ...................................................................... 22
5.3.3
Problemen............................................................................................. 23
5.4
Logbestanden .............................................................................................. 24
5.4.1
Algemeen .............................................................................................. 24
5.4.2
Globale bespreking code ...................................................................... 24
5.4.3
Problemen............................................................................................. 24
5.5
Aanmaken keystore-bestand ....................................................................... 25
5.5.1
Algemeen .............................................................................................. 25
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica 5.5.2 5.6
6
7
8
5
Globale bespreking code ...................................................................... 25
Aanmaken hsqldb ........................................................................................ 27
5.6.1
Algemeen .............................................................................................. 27
5.6.2
Globale bespreking code ...................................................................... 28
Softwareontwerp................................................................................................ 30 6.1
Algemeen .................................................................................................... 30
6.2
AditoInstaller.input ....................................................................................... 30
6.3
AditoInstaller.data ........................................................................................ 33
6.4
Adito-Installer............................................................................................... 36
Software-implementatie ..................................................................................... 37 7.1
CopyByMap en getConfig............................................................................ 37
7.2
Javadoc ....................................................................................................... 40
Voorbereiding testfase....................................................................................... 41 8.1
9
2009-2010
Buildfile ........................................................................................................ 41
8.1.1
Manifest ................................................................................................ 41
8.1.2
Buildfile uitvoeren.................................................................................. 42
Testen installer .................................................................................................. 43 9.1
Upgrade vermijden ...................................................................................... 43
9.2
Externe JAR’s .............................................................................................. 43
9.3
Bouncy Castle provider ............................................................................... 44
10 Extra functionaliteiten ........................................................................................ 45 10.1
Certificate signing request ........................................................................ 45
10.2
Toevoegen administrators ........................................................................ 45
Conclusie ................................................................................................................. 49 Literatuurlijst ............................................................................................................. 51 Bijlage I
Documentatie config-bestand ................................................................... 52
Bijlage II Voorbeeld config-bestand ........................................................................ 55
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
6
Lijst met figuren en tabellen Figuur 1: Overzicht Adito ............................................................................................ 8 Figuur 2: Interfaces Adito............................................................................................ 9 Figuur 3: Gebruikersinterface Adito .......................................................................... 11 Figuur 4: Laden Adito Agent ..................................................................................... 11 Figuur 5: Schema werking Adito VPN ...................................................................... 11 Figuur 6: Certificaatkeuze ......................................................................................... 16 Figuur 7: Passphraseconfiguratie ............................................................................. 16 Figuur 8: Certificaatconfiguratie ................................................................................ 16 Figuur 9: Databaseconfiguratie................................................................................. 17 Figuur 10: Super user configuratie ........................................................................... 17 Figuur 11: Webserverconfiguratie ............................................................................. 17 Figuur 12: Proxy-server configuratie ......................................................................... 18 Figuur 13: Procedure conversie XML - Java............................................................. 22 Figuur 14: Overzicht Java logger .............................................................................. 24 Figuur 15: Schema communicatie database - Java .................................................. 28 Figuur 16: Klassendiagram XmlReader .................................................................... 30 Figuur 17: Klassendiagram ConfigWriter .................................................................. 31 Figuur 18: Klassendiagram FieldMapper .................................................................. 32 Figuur 19: Mapping config-file - dataklasse - output file ........................................... 32 Figuur 20: Klassendiagram SqlReader ..................................................................... 33 Figuur 21: Klassendiagram DirectoryReader ............................................................ 33 Figuur 22: Klassendiagram ConfigHolder ................................................................. 33 Figuur 23: Klassendiagram PropertiesHolder ........................................................... 34 Figuur 24: Klassendiagram WebServer .................................................................... 35 Figuur 25: Klassendiagram ExplorerProperties ........................................................ 36 Tabel 1: Locatie parameters ..................................................................................... 18 Tabel 2: Betekenis parameters X509-certificaat ....................................................... 25 Tabel 3: Betekenis certificaatextenties ..................................................................... 26 Tabel 4: Betekenis argumenten setKeyEntry............................................................ 27 Tabel 5: Verschil opbouw ExplorerProperties - Administrator................................... 46
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
Lijst met afkortingen Afkorting AA API BC CA DMZ DNAT DOM HSQLDB http https IPS JAR JCE JDBC JKS LAN PEM PKCS RSA SHA SNAT SSL TCP URL VPN XML
Betekenis Adito agent Application programming interface Bouncy Castle Certificate authority Demilitarized zone Destination network address translation Document object model HyperSQL database Hypertext transfer protocol Hypertext transfer protocol secure Intrusion prevention system Java archive Java cryptographic extension Java database connectivity Java keystore Local area network Privacy enhanced mail Public key cryptography standards Rivest, Shamir, Adleman Secure hash algorithm Source network address translation Secure sockets layer Transmission control protocol Uniform resource locator Virtual private network Extensible markup language
Integratie van Adito in aXsGUARD Gatekeeper
7
Masterproef Toegepaste informatica
2009-2010
8
Inleiding Tegenwoordig wordt steeds meer gebruik gemaakt van mobiele computertechnologieën. Dit zorgt ervoor dat werknemers de mogelijkheid willen hebben om hun mails, applicaties van het bedrijf, bestanden en websites van overal en zonder veel moeite te bereiken. Uiteraard moet ervoor gezorgd worden dat dit op een veilige manier kan gebeuren, zodat misbruik van deze service wordt vermeden. Hiervoor heeft VASCO Data Security de aXsGUARD Gatekeeper ontwikkeld. Dit is een op Linux gebaseerd toestel dat een totaaloplossing biedt voor de beveiliging van de verbinding met een bedrijfsnetwerk. In de basisuitvoering beschikt de Gatekeeper onder andere over een firewall met DMZ (DeMilitarized Zone), een IPS (Intrusion Prevention System) en een VPN. In de Enterpriseversie wordt dit nog verder uitgebreid met bijvoorbeeld een application firewall en een SSLVPN-module Adito is zo een module.
Figuur 1: Overzicht Adito
Een VPN maakt het onder andere mogelijk dat een organisatie op een beveiligde manier gegevens uitwisselt tussen bijvoorbeeld zijn hoofdzetel en een gebruiker die thuis zit. Hiervoor gebruikt het gewoon het publieke Internet, maar alle gegevens worden eerst geëncrypteerd.1 Een nadeel is dat de eindgebruikers altijd eerst gespecialiseerde software zullen moeten installeren om gebruik te kunnen maken van het VPN. Een gelijkaardig effect als een VPN, maar via eenvoudiger technieken zoals port forwarding, kan verkregen worden via de open source Java-applicatie, Adito. Een groot voordeel van Adito is dat de gebruiker niet actief software zal moeten downloaden, maar zich enkel via zijn webbrowser moet verbinden met Adito. Een korte beschrijving van de werking van Adito zal verderop in dit werk gegeven worden.
1
Cursus communicatienetwerken
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
1
2009-2010
Probleemstelling
Adito maakt voor zijn installatie gebruik van een interactieve interface. Hierin moeten veel instellingen door de gebruiker zelf worden vastgelegd. Daarvoor krijgt hij meestal een grote lijst met keuzes die hij kan maken. Voor een ervaren gebruiker is dit geen probleem, maar een minder gemotiveerde gebruiker kan hier al snel verkeerde of onlogische instellingen doorvoeren. Het huidige installatieprogramma van Adito laat niet toe die keuzes te beperken of via een andere bron in te stellen. De gebruiker moet de volledige lijst van instellingen steeds zelf doorlopen en krijgt de totale vrijheid in zijn keuzes. Hieronder wordt ter verduidelijking, maar zonder te sterk in detail te treden, een kort voorbeeld gegeven.
Figuur 2: Interfaces Adito2
Zoals in de inleiding vermeld, is het de bedoeling de gebruiker van overal toegang te geven tot zijn gegevens of applicaties. Het zou onlogisch zijn bij de interface van Adito te kiezen voor één die binnen het interne LAN ligt. Voor een maximale toegankelijkheid wordt er dus voor gezorgd dat de gebruiker enkel uit interfaces van het type Internet kan kiezen. Naast onlogische keuzes kunnen er ook foute keuzes worden gemaakt. Het is bijvoorbeeld wenselijk dat de gebruikers en hun authenticatiegegevens altijd uit de achterliggende Unixdatabase worden gehaald. Om te vermijden dat de gebruiker hier verkeerd kiest, is deze optie voor hem verborgen. Beide voorbeelden tonen aan dat het huidige installatieprogramma van Adito voor toepassing op aXsGUARD niet voldoet. Er moet dus een aangepaste installer geschreven worden die een aantal keuzes beperkt of verbergt.
2
http://www.linklogger.com/images/DMZ1.jpg
Integratie van Adito in aXsGUARD Gatekeeper
9
Masterproef Toegepaste informatica
2
2009-2010
10
Doelstelling
Zoals al gezegd, legt de huidige versie van Adito te veel de verantwoordelijkheid bij de eindgebruiker. Die kan verkeerde beslissingen nemen, zodat de software niet naar behoren werkt. Door het aantal keuzes die hij moet instellen te beperken, wordt hij zo veel mogelijk ontlast van deze taak Er moet dus een nieuwe installer geschreven worden die slechts een beperkt aantal mogelijkheden aan de gebruiker over laat, en voor het overige gebruik maakt van standaardwaarden of gegevens die al in aXsGUARD aanwezig zijn. Op deze manier worden instellingen die aanleiding kunnen geven tot verkeerde keuzes maximaal verborgen voor de eindgebruiker. Het definitieve programma kan opgedeeld worden in twee stukken: een stuk code met bijhorende bestanden die ervoor zorgen dat de huidige installer nagebootst wordt, en een tool die de instellingen van de gebruiker kan inlezen en die van aXsGUARD kan gebruiken. Die tool is eigenlijk al aanwezig op aXsGUARD en bestaat uit een deel interface die instellingen aan de gebruiker presenteert en een deel logica die deze instellingen verwerkt en koppelt. Om een volledig geïntegreerde Adito te bekomen, moet bij het instellen van zijn gegevens ook gebruik gemaakt worden van die tool. Die moet dus ook een stuk aangepast worden. In dit eindwerk worden de bestaande installer en de bijhorende bestanden nagebootst. De bestaande installer geeft een interactieve interface die de gebruiker een grote vrijheid gaf bij de keuze van zijn instellingen. In de nieuwe wordt deze vrijheid beperkt tot enkel logische keuzes. De tool zal dus nog altijd via een interactieve interface met de gebruiker communiceren, maar zal hem slechts een beperkt aantal mogelijkheden aanbieden. Omdat de tool geschreven is in Perl, en de nieuwe installer in Java, zal de tool niet rechtstreeks in verbinding staan met de code van de nieuwe installer, maar hij zal al zijn instellingen wegschrijven naar één centraal bestand. Dit zal dan door het nieuwe installatieprogramma worden ingelezen en toegepast. Het configuratiebestand is dan eigenlijk een manier om een verzameling argumenten van de tool door te geven naar de installer. In dit eindwerk zal een formaat worden vastgelegd voor dit gegevensbestand. De nieuwe installer zal de functies van de oude moeten nabootsen. Het bestaande installatieprogramma kan niet meer toegepast worden, omdat dit geen gebruik maakt van een centraal gegevensbestand, maar zijn instellingen rechtstreeks van de interface opvangt en dan uitvoert. Daarom moet er dus een nieuw stuk code worden geschreven. Om ervoor te zorgen dat de taken van de oude installer kunnen worden overgenomen, wordt eerst onderzocht welke parameters deze nodig heeft, welke bewerkingen hierop worden uitgevoerd en welke bestanden er worden aangemaakt. De integratie van Adito op aXsGUARD gebeurt vrij experimenteel. Er is dus op voorhand geen gedetailleerd beeld van de vereisten of specificaties van de nieuwe installer. Daarom wordt ervoor gezorgd dat de code achteraf nog makkelijk uitbreidbaar en aanpasbaar is. Naast het schrijven van deze code, wordt er ook voor gezorgd dat het geheel voldoende gedocumenteerd is. Op deze manier wordt alles verduidelijkt voor de ontwerpers van de tool, zodat het installatieprogramma vlot integreerbaar of aanpasbaar is.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
3
2009-2010
11
Werking Adito
Zoals eerder vermeld is het grote voordeel van Adito dat de gebruiker niet eerst actief software moeten installeren. Het volstaat dat hij een een verbinding opstelt met Adito. Er wordt een scherm getoond waarbij de gebruiker zichzelf moet inloggen. Eens dit gelukt is, krijgt hij de gebruikersinterface te zien. Hierin laat hij dan de gewenste acties uitvoeren.. Hij kan bijvoorbeeld kiezen om de applicatie putty te starten.
Figuur 3: Gebruikersinterface Adito
Zodra hij deze opdracht heeft doorgegeven, zal de Adito Agent automatisch worden gestart.
Figuur 4: Laden Adito Agent
Nadat de agent is opgestart,, zal een beveiligde connectie naar de gewenste server worden opgezet. Dit verloopt volgens onderstaand schema:
Figuur 5: Schema werking Adito VPN
In bovenstaand geval zit de client achter een SNAT en heeft ip-adres adres 192.168.0.100. Adito heeft publiek adres 212.123.45.10 en privaat adres 172.16.210.132. De gebruiker wil een applicatie openen op de server met adres 157.192.34.10. 1 Hierbij worden een aantal stappen onderscheiden.
Masterproef Toegepaste informatica •
•
• • • •
• •
2009-2010
12
De gebruiker klikt op het icoon van de applicatie. Hierna start de Adito Agent op. Deze draait op de computer van de gebruiker maar moet niet actief door hem worden geïnstalleerd. De Adito Agent gedraagt zich als een TCP-server die luistert naar alles wat binnenkomt op bepaalde poorten van het localhost-adres 127.0.0.1. Deze vormt de toegang tot de TCP-proxyserver. Er wordt een TCP-verbinding opgezet tussen de client en de AA. De client stuurt zijn aanvraag door naar de AA. Er wordt een gecodeerde verbinding opgezet tussen AA en Adito. De AA verpakt de informatie van de client en stuurt die via het http- of https-protocol door naar het publieke adres en de poort van Adito. Deze twee werden ingesteld door het installatieprogramma. Er wordt een TCP-verbinding opgezet tussen Adito en de server. Adito levert de aanvraag af bij de gewenste server.
Na deze stappen is er een connectie opgesteld tussen de client en de server via de proxy, zodat de nodige data (via de proxyserver) kunnen worden uitgewisseld. De proxyserver wordt hier gevormd door zowel de Adito Agent als Adito zelf. Indien Adito voor het versturen van de gegevens naar de server gebruik maakt van een privaat adres, dan zorgt dit ervoor dat enkel de client een verbinding kan opstellen met de server, maar niet omgekeerd: de server kent immers het private adres van Adito niet.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
4
2009-2010
13
Voorbereiding softwareontwerp
Vooraleer er aan het eigenlijke ontwerp van het nieuwe installatieprogramma kan worden begonnen, moet de huidige versie worden onderzocht. Daarom licht dit hoofdstuk toe hoe Adito wordt geïnstalleerd en gebruikt en welke hulpprogramma’s hiervoor nodig zijn. Hierna wordt het installatieproces doorlopen en volgt de identificatie van de belangrijkste parameters die door het programma worden ingesteld. Vervolgens wordt nagegaan in welke bestanden deze parameters worden weggeschreven en hoe dit wordt aangepakt, maar eerst komt de betekenis van een aantal veelgebruikte termen aan bod.
4.1 DEFINITIES a
Keystore
Een keystore is een software- (bestand) of hardwareobject (cryptografische kaart) waarin informatie in verband met authenticatie en encryptie wordt opgeslagen. Hij kan identiteiten, SSL-certificaten, private sleutels en soms ook publieke sleutels bevatten.3
b
PKCS12
PKCS12 is een bestandsformaat dat voor de opslag van X.509 private sleutels en bijhorende public-key-certificaten kan dienen.4 De afkorting staat voor Public-Key Cryptography Standard.
c
Public-key certificaat
Dit certificaat wordt gebruikt bij authenticatie. Het zorgt ervoor dat een webserver zijn identiteit kan bewijzen aan de gebruiker. Kort gezegd gebeurt dit door een koppeling van de identiteitsgegevens van de server aan zijn publieke sleutel. Deze koppeling wordt dan aan de hand van een private sleutel, digitaal ondertekend door ofwel de beheerder van de webserver (self-signed), ofwel door een certificate authority (CA). De identiteitsgegevens van de organisatie die nodig zijn voor het certificaat moeten ingegeven worden bij de installatieprocedure van Adito. Er bestaan verschillende manieren om een certificaat aan te maken. Om inzicht te krijgen in de manier waarop een certificaat wordt gemaakt en geïmporteerd wordt in Adito, werd als voorbereiding een self-signed certificate aangemaakt via OpenSSL.
d
X.509
In de context van dit eindwerk volstaat de definitie dat X.509 een standaard is die onder andere het formaat bepaald van public-key-certificaten.
e
Certificaatketting
Een certificaatketting is een opeenvolging van certificaten, waarbij elk certificaat van de ketting wordt ondertekend door het volgende certificaat.5
3
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzalx/rzalxsecterms.htm http://en.wikipedia.org/wiki/PKCS12 5 http://www.iona.com/support/docs/orbix2000/2.0/tls/html/OpenSSL4.html 4
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
f
2009-2010
14
certificate signing request
Dit wordt gebruikt om een aanvraag voor een public-key-certificaat bij een CA in te dienen. Een certificate signing request bevat de publieke sleutel, de identiteitsgegevens en eventueel extra attributen van de aanvrager. Die ondertekent de volledige aanvraag met zijn private sleutel en stuurt ze door naar de CA. Aan de hand van zijn private sleutel kan die dan een ondertekend certificaat terugsturen.
g
HSQLDB
De afkorting staat voor hyper structured query language database. Dit is een relationeel database management systeem dat geschreven is in Java. Via deze bibliotheek wordt de HSQL-databank aangemaakt.
h
Database dump
Een database dump wordt normaal gebruikt om een back-up van een databank te maken. Dit houdt een opname van het schema en de data in, meestal onder de vorm van een lijst SQL-opdrachten.6
4.2 INLEIDENDE INSTALLATIES In deze paragraaf wordt de installatie van enkele programma’s besproken die nodig zijn voor de installatie of de ondersteuning van Adito.
4.2.1 Apache Ant Bij de installatie van aXsGUARD wordt Adito automatisch mee uitgevoerd. Wordt Adito echter op zichzelf geïnstalleerd, dan gebeurt dit best via het programma Ant. Dit zorgt voor de automatisering van het bouwproces van de software, specifiek die geschreven in Java.7 Alvorens Ant te gebruiken, moeten twee omgevingsvariabelen worden ingesteld: ANT_HOME en JAVA_HOME. Deze bepalen het pad waar de Ant-bestanden en de Javabestanden zitten en worden intern als variabelen in Ant gebruikt. Als dan nog het commando set PATH=%PATH%;%ANT_HOME%\bin ingegeven wordt, is dit klaar voor gebruik. Meer informatie over Ant volgt in hoofdstuk 8.1 Buildfile.
4.2.2 Adito zonder aXsGUARD Om snel te kunnen werken en testen, is het handig als er een installatie van Adito aanwezig is die kan worden uitgevoerd zonder eerst aXsGUARD te moeten installeren. Ant kan Adito gemakkelijk opbouwen aan de hand van het build.xml-bestand dat meegeleverd wordt. De installatieprocedure van Adito kan opgestart worden via het commando ant install. Hiermee kan de software bijvoorbeeld geïnstalleerd worden op de localhost (127.0.0.1). Na de installatie kan de gebruikersinterface van Adito worden opgestart via het commando ant start. Het programma wordt afgesloten door ant met als target stop in te geven. 6 7
http://en.wikipedia.org/wiki/Database_dump http://nl.wikipedia.org/wiki/Apache_Ant
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
15
4.2.3 Cygwin Cygwin is een programma dat een gelijkaardige omgeving als Linux / Unix aanmaakt, maar dan op een Windows-computer. Het biedt een Linux API emulatielaag aan, die ervoor zorgt dat de gebruiker toegang heeft tot een grote hoeveelheid Linux API-functionaliteiten. Daarnaast bevat het ook een ruime verzameling Linux-tools.8 De installatie van Cygwin was hier nodig om OpenSSL te kunnen gebruiken en om gemakkelijk te kunnen werken met de geïnstalleerde aXsGUARD. Deze werd aangemaakt op een virtuele machine (Sun VirtualBox), maar wordt bediend via Cygwin. Om het gebruiksgemak nog te verhogen wordt hierbij de terminal rxvt gebruikt. Deze laat eenvoudiger dan Cygwin toe om lijnen te kopiëren en te plakken. De installatie van Cygwin verloopt bijna volledig automatisch. Achteraf moeten enkel nog wat bijkomende pakketten toegevoegd worden zoals: make, gcc, perl en rxvt.
4.2.4 OpenSSL OpenSSL werd in dit eindwerk gebruikt om te overlopen welke stappen er nodig zijn om bijvoorbeeld een self-signed-certificaat aan te maken. Het programma OpenSSL bestaat uit een bibliotheek en een command line interface. Naast vele andere toepassingen kunnen hiermee de meeste bewerkingen op X509-certificaten worden uitgevoerd.
4.2.5 Bouncy Castle Dit hoort eigenlijk al bij de ontwerpfase, maar om een volledig overzicht te krijgen van alle installaties die moeten worden uitgevoerd, volgt hier al de bespreking. Bouncy Castle is een Java-bibliotheek die hier gebruikt werd voor het aanmaken van de keystore-bestanden. Ze wordt verkregen onder de vorm van een providerbestand in JAR-formaat en als externe referenced library toegevoegd aan een Java-project. Om effectief te kunnen werken met alle klassen uit deze bibliotheek zijn nog een aantal bijkomende instellingen nodig. Ten eerste moeten de unrestricted policy-files voor SUN JCE (Java Cryptographic Extension) worden binnengehaald. Die vervangen de bestaande policybestanden. Als dit niet gebeurt, zal Java bij het gebruik van de bibliotheek de fout java.lang.SecurityException geven.9 Vervolgens moet het bestand java.security worden aangepast. Daar moet een lijn tekst worden toegevoegd die Bouncy Castle als security provider opgeeft. Bijvoorbeeld: security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider10 Een security provider zorgt voor de implementatie van een deel of van de volledige Java Security API. Hij kan bijvoorbeeld een uitwerking geven voor het aanmaken van sleutelparen, wat voor dit eindwerk nodig zal zijn. Na deze stappen bleek de bibliotheek nog steeds niet te werken. Het probleem werd dan uiteindelijk opgelost door bij de eigenschappen (Java Build Path) van het Java-project de
8
http://www.cygwin.com/ http://www.bouncycastle.org/documentation.html 10 http://www.bouncycastle.org/specifications.html 9
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
16
bestaande bibliotheken te verwijderen en ze nadien gewoon terug toe te voegen. Hierdoor wordt vermeden dat Eclipse gecachete informatie zou gebruiken. In de testfase blijkt achteraf dat het aanpassen van het securitybestand vermeden wordt door een aanpassing in de code (zie 9.3 Bouncy Castle provider).
4.3 IDENTIFICATIE PARAMETERS Om een duidelijk beeld te krijgen van de parameters waarop Adito moet worden ingesteld, wat hun betekenis is en waar ze eventueel teruggevonden kunnen worden, wordt het installatieproces een aantal keer doorlopen. In deze paragraaf worden de verschillende installatiestappen kort besproken.
•
Installatiestap 1a: Configure certificate
Adito kan ervoor zorgen dat data beschermd worden doorgestuurd van de beveiligde omgeving naar de gebruiker. Hiervoor authenticeert de webserver waarop Adito draait zichzelf aan de hand van een SSL-certificaat. Er wordt gekozen om een nieuw certificaat aan te maken. Dit certificaat is uiteraard nog niet ondertekend door een Certification Authority en de gebruiker zal dus achteraf nog een aanvraag moeten indienen bij zo een CA.
Figuur 6: Certificaatkeuze
•
Installatiestap 1b: Set Keystore passphrase
Het nieuwe certificaat wordt bewaard in een keystore-bestand. Om dit bestand te kunnen encrypteren en om ervoor te zorgen dat het achteraf nog kan worden aangepast via Java, moet een passphrase worden opgegeven.
Figuur 7: Passphraseconfiguratie
•
Installatiestap 1c: Create new certificate
Voor het nieuwe certificaat moeten een aantal standaardgegevens van de gebruiker worden opgegeven: de hostname, de naam en locatiegegevens van het bedrijf en de afdeling.
Figuur 8: Certificaatconfiguratie
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica •
2009-2010
17
Installatiestap 2: Configure user database
In deze stap wordt ingesteld waar Adito informatie kan krijgen over zijn gebruikers en hoe het zijn authenticatie moet verrichten. Hier wordt gekozen om de achterliggende Unix-database te gebruiken in plaats van de Adito-database. Op deze manier kunnen de gebruikers van aXsGUARD ook dienen voor Adito.
Figuur 9: Databaseconfiguratie
•
Installatiestap 3: Configure super user
Het systeem vereist de instelling/installatie van een administrator. Dit is de taak van de super user. In de geïntegreerde versie van Adito op aXsGUARD kan geen nieuwe gebruiker worden aangemaakt. Er kan enkel gekozen worden uit een lijst van bestaande gebruikers. Dit komt omdat in de vorige stap geopteerd werd om gebruik te maken van de achterliggende Unix-database. De super user van Adito is dan ook automatisch de gebruiker van het Unix-systeem.
Figuur 10: Super user configuratie
•
Installatiestap 4: Configure web server
Hier worden de instellingen opgegeven van de webserver waarop Adito zal worden gebruikt. Hiervoor zijn gegevens in verband met de poort, het protocol (http of https), de interface(s) en de externe hostnamen van de webserver nodig. Optioneel kan worden ingesteld hoe de server moet reageren indien er een ongeldige hostname wordt opgegeven.
Figuur 11: Webserverconfiguratie
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica •
2009-2010
18
Installatiestap 5: Configure proxies
Tot slot is in Adito de mogelijkheid ingebouwd om een verbinding te maken met een externe host. Hiervoor kan het nodig zijn om een proxyserver in te stellen. Wordt daarvan gebruik gemaakt, dan zullen de nodige gegevens hier moeten worden ingesteld.
Figuur 12: Proxy-server configuratie
•
Normal mode: extra instellingen
Nadat de installatie is voltooid, wordt Adito opgestart in normal mode. Hier kunnen nog extra instellingen aangepast worden die niet in de installatieprocedure zelf zijn opgenomen. Voorbeeld zijn het aanmaken van gebruikersgroepen, het instellen van gebruikersrechten, …
4.4 LOCATIE PARAMETERS Nadat de parameters zijn geïdentificeerd, kunnen de verschillende bestanden van Adito doorlopen worden en kan er gezocht worden naar verbanden met die variabelen. Onderstaande tabel toont de parameters die tijdens de installatieprocedure werden ingesteld, het bestand waar zij kunnen gevonden worden en het type van dit bestand. Tabel 1: Locatie parameters
Parameter Passphrase certificate Host name Organisational Unit Company City State Country Code Databaseconfiguratie Webserver port Webserver protocol Webserver interface(s) Webserver hostname(s) Webserver invalid hostname action Proxyserver hostname Proxyserver port Proxyserver username (optie) Proxyserver password (optioneel)
Naam bestand webserver default.keystore default.keystore default.keystore default.keystore default.keystore default.keystore explorer_properties webserver webserver webserver explorer_properties explorer_properties
Type bestand Properties Java Keystore Java Keystore Java Keystore Java Keystore Java Keystore Java Keystore HSQL Database tabel Properties Properties Properties HSQL Database tabel HSQL Database tabel
webserver webserver webserver webserver (geëncrypteerd)
Properties Properties Properties Properties
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica Parameter Non proxy hosts (optioneel)
2009-2010 Naam bestand webserver
19 Type bestand Properties
4.5 TYPES BESTANDEN In deze paragraaf wordt kort besproken wat de betekenis is van de bestanden waarin de verschillende parameters worden bewaard. Een globale strategie voor het aanmaken van deze bestanden zal eveneens worden voorgesteld. De concrete uitwerking wordt gegeven in hoofdstuk 5 Analyse automatisatie van de installer.
4.5.1 Configuratiebestand Hierin worden de gegevens bewaard die moeten worden uitgevoerd door het nieuwe installatieprogramma. Het bestand moet alle parameters in een overzichtelijk formaat kunnen bewaren.
Strategie Er wordt niet opgelegd welk formaat voor dit bestand moet worden gebruikt. Dit kan bijvoorbeeld ASCII, Yaml of XML zijn. Om een zo duidelijk mogelijke structuur in het configuratiebestand te krijgen, zodat die makkelijk kan worden ingevuld, geïnterpreteerd en gevalideerd, wordt hier gekozen voor het XML-formaat. De betekenis van de parameters wordt dan duidelijk aangegeven door hun tags. Om nuttig gebruik te kunnen maken van de structuur van het XML-bestand, moet dit ingelezen worden in Java en omgezet in een objectgeoriënteerde structuur. Dit gebeurt aan de hand van een DOM-structuur (Document Object Model).
4.5.2 Properties Dit zijn de eenvoudigste bestanden. Het belangrijkste voorbeeld hiervan is het webserver.properties-bestand dat bestaat uit een aantal lijnen van de volgende vorm: elementname=value Bijvoorbeeld: webServer.port=4434 Dit toont dat deze bestanden gemakkelijk te maken zijn: er moet enkel nog een elementnaam gelinkt worden aan elke value-waarde die uit de config-file wordt gelezen.
Strategie De properties-bestanden bestaan gewoon uit een aantal lijnen tekst die worden ingelezen vanuit het configuratiebestand en dan in het juiste formaat weer worden uitgeschreven in een bestand met properties-extentie. De enige moeilijkheid hierbij is dat het webserver.properties-bestand ook paswoordgegevens bevat (zie Tabel 1). Deze worden niet zomaar in plain-text opgeslagen, maar onder een geëncrypteerde vorm. De eenvoudige encryptietechniek die hiervoor gebruikt wordt is een
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
20
stuk code dat te vinden is tussen de bestaande Adito-bestanden, en dus gewoon in de eigen installer kan worden overgenomen. Op het eerste gezicht lijkt dit een onveilige methode, aangezien iedereen Adito, en dus ook de encryptiecode, vrij kan downloaden. In de eerste plaats moet de gebruiker zijn computer dus fysiek beveiligen. Kan iemand dan toch nog deze beveiliging omzeilen, dan is het paswoord nog niet direct bruikbaar, omdat het in geëncrypteerde vorm staat.
4.5.3 HSQLDB In de HSQL-database worden de instellingen bewaard die niet in het properties-bestand zitten. Zo kan een duidelijke scheiding gemaakt worden tussen de applicatie en de application server. De instellingen van deze laatste worden bewaard in het propertiesbestand, terwijl die voor de applicatie in de database zitten.
Strategie Er moeten onderzocht worden hoe een HSQL-database vanuit Java kan worden aangemaakt. Nadien wordt bekeken welke tabellen en velden er door de bestaande installer van Adito worden aangemaakt. De bijhorende hoofdingen en beginwaarden worden in principe gemakkelijk verkregen door een initiële installatie van Adito uit te voeren en vervolgens een dump te maken van de aangemaakte database. Het opbouwen van de HSQL-database zal dus in 2 fasen gebeuren. Eerst worden de databankstructuur en de initiële data aangemaakt. De commando’s die nodig zijn om de database te definiëren worden ingelezen vanuit een SQL-bestand. Dit bestand bevat de initiële instellingen van de Adito-databank en wordt aangemaakt door een dump te maken van de database, juist nadat Adito geïnstalleerd is. In een tweede fase worden de concrete data ingevuld. Dit zijn de specifieke gegevens voor de organisatie waarbij Adito wordt geïnstalleerd, bv. de naam van de administrator, de externe hostnames, …
4.5.4 Keystore De keystore bewaart in eerste instantie een self-signed-certificaat en een sleutelpaar. Hij kan op verschillende manieren worden aangemaakt. Om ervoor te zorgen dat de code voor het nieuwe installatieprogramma van Adito zo veel mogelijk gecentraliseerd wordt, moet de methode voor het aanmaken van de keystore geïntegreerd worden in de rest van de installer. Er kan gebruik worden gemaakt van hulpprogramma’s zoals Keytool of OpenSSL, maar de opdrachtgever legde op hiervan af te zien.
Strategie Er moeten methoden worden voorzien die een publieke en private sleutel kunnen aanmaken, die in een certificaat de gegevens van de organisatie kunnen koppelen aan zijn publieke sleutel en dit kunnen bewaren in een keystore. De code hiervoor is gebaseerd op voorbeelden die beschikbaar zijn op het Internet. Deze maken in de meeste gevallen gebruik van de bibliotheek van Bouncy Castle.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
5
2009-2010
21
Analyse automatisatie van de installer
5.1 AANMAKEN CONFIGURATIEBESTAND Zoals eerder vermeld zal de config-file volgens het XML-formaat worden opgebouwd. Hiervoor wordt uiteraard best een gebruiksvriendelijke interface gebruikt, in dit geval Visual Web Developer 2008 Express. De gegevens worden zo veel mogelijk gestructureerd in het XML-document: er wordt bijvoorbeeld een aparte tag proxies aangemaakt die alle noodzakelijke elementen bevat voor het instellen van een proxyserver. De namen van de tags worden daarbij zo intuïtief mogelijk gekozen, zodat de gebruiker van het configuratiebestand duidelijk weet wat hij moet invullen. Om aan te geven hoe het config-bestand wordt opgemaakt en ingevuld, wordt een documentatie voorzien. Die omvat een voorbeeld van zo’n bestand en legt uit wat de verschillende velden betekenen (zie Bijlage I en Bijlage II). Daarnaast wordt ook een XMLschema opgesteld, zodat de input al op voorhand een eerste keer kan worden gecontroleerd. In het configuratiebestand wordt gebruik gemaakt van een webserver hostname voor het webserver.properties-bestand en een common name voor het SSL-certificaat. Hoewel dit beide hostnamen zijn, gaat het niet noodzakelijk over dezelfde. Dit is zo wanneer er DNAT (port redirection) gebruikt wordt om de webserver te bereiken. De client probeert hierbij eerst een https-verbinding naar het publieke ip-adres (met de publieke hostname) op te stellen. Hier moet dus het SSL-certificaat geïnstalleerd zijn, zodat de browser van de client de nodige controles kan verrichten. Hierna wordt de client doorgestuurd naar het private adres van de webserver waarop de Adito-service draait. Beide hostnamen zijn in dit geval dus verschillend.
5.2 AANMAKEN PROPERTIES-BESTAND Het aanmaken van de properties-bestanden kan gezien worden als het inlezen van de config-file en het wegschrijven van deze gegevens volgens een bepaalde lay-out naar een tekstbestand. Java beschikt echter over een ingebouwde klasse om properties-bestanden aan te maken: Properties. Een object van deze klasse is in staat om een hoeveelheid keyvalue-paren bij te houden en deze achteraf automatisch in het juiste formaat naar een bestand weg te schrijven. Aan de hand van de methode setProperty(String key, String value), kan zo een paar toegevoegd worden. Zodra alle gegevens zijn aangevuld, wordt het object eenvoudig weggeschreven naar een bestand door de methode store(OutputStream out, String header) op te roepen. Hieronder volgt een kort voorbeeld. FileOutputStream fo = new FileOutputStream(location); webs.store(fo, "Webserver properties"); fo.close(); Dit zal een bestand aanmaken met inhoud: #Webserver properties #Wed Apr 21 19:08:01 CEST 2010 webServer.keyStoreType=JKS
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
22
5.3 CONVERSIE XML – JAVA 5.3.1 Algemeen Eens de config-file geschreven is, kan hij ingelezen worden door een Java-programma. In principe kan de code hiervoor zelf geschreven worden, maar er bestaan al beproefde standaardcomponenten die dit werk automatisch uitvoeren: XML Parsers. Een parser leest het XML-document in, verwerk het en zet het om naar een XMLdocumentobject dat in het geheugen wordt bewaard. Het documentobject bestaat uit een boomstructuur met knopen (nodes) die de data en de structuur van het XML-bestand bevatten. De toegang tot en het wijzigen van de elementen van de boomstructuur kan via een application programming interface, bijvoorbeeld de DOM API. Aangezien DOM niets anders is dan een verzameling Java-interfaces zonder implementatie, moet die dus nog verder uitgewerkt worden door de XML-parser. Dit zit uiteraard allemaal verwerkt in de parser, zodat de gebruiker zich daar niets moet van aantrekken.11
Figuur 13: Procedure conversie XML - Java
Er zijn verschillende uitgewerkte voorbeelden beschikbaar die een XML-bestand inlezen en omzetten naar Java-objecten. Deze worden in dit werk uiteraard als basis gebruikt en verder uitgewerkt voor de specifieke toepassing. Verderop komt een korte uitleg van de globale stappen van de code.12 3 types objecten komen vaak voor in deze code: NodeList, Node en Element. Het eerste is zoals de naam al suggereert een geordende verzameling van Nodes. Dit is niets anders dan een enkele knoop in de boomstructuur. Er zijn verschillende types knopen mogelijk: tekstknopen, commentaarknopen, elementknopen, … Een Element is een speciaal type knoop dat een element voorstelt uit een XML- of HTML-bestand.
5.3.2 Globale bespreking code •
Stap 1: Aanmaken klassen
In een eerste stap worden verschillende klassen aangemaakt. De objecten hiervan bewaren de informatie die uit het XML-document wordt gelezen. Er wordt bijvoorbeeld een klasse proxies aangemaakt, waarvan een object onder andere het paswoord als String zal opslaan.
11 12
http://developerlife.com/tutorials/?p=30 http://www.totheriver.com/learn/xml/xmltutorial.html#6.1.1
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica •
2009-2010
23
Stap 2: Omzetten XML - DOM
Het XML-bestand moet worden omgezet naar een DOM-document. Hiervoor wordt gebruik gemaakt van een document builder. Op een object van deze klasse wordt een methode opgeroepen die het XML-document vertaalt naar een DOM-representatie.
•
Stap 3: Parsen en bewaren
Voor deze stap moet eerst het root-element van de boomstructuur bepaald worden. Pas dan kunnen vanuit dit root-element andere elementen worden opgevraagd. Zo is het mogelijk bijvoorbeeld alle gegevens die een tag hebben waarvan de naam proxies is, te selecteren en te bewaren in een nodelist. Elk element ervan kan worden bewaard in een object van de gewenste klasse. Uiteraard moet het element hiertoe eerst ontleed worden in zijn verschillende onderdelen. Uit een proxies-element wordt bijvoorbeeld het element met tag password gehaald. Dit wordt dan in de paswoordvariabele van een object van de klasse proxies bewaard.
5.3.3 Problemen Een probleem ontstaat wanneer het XML-document lege elementen bevat. In de config-file zijn bijvoorbeeld tags voorzien voor de instellingen van een proxyserver, maar als die niet gebruikt wordt, blijven die elementen uiteraard leeg. In de code die als basis werd aangewend gaf dit een foutmelding bij de volgende methode: private String getTextValue(Element ele, String tagName) { String textVal = null; NodeList nl = ele.getElementsByTagName(tagName); if(nl != null && nl.getLength() > 0) { Element el = (Element)nl.item(0); textVal = el.getFirstChild().getNodeValue(); } return textVal; }
Deze methode krijgt als argument een element mee uit de nodelist (bv. proxies) en zoekt binnen dit element naar andere elementen waarvan de tagname wordt bepaald door het argument tagName (bv. password). De bedoeling is dat het dan de inhoud uit dit laatste element haalt en bewaart in een String. De if-voorwaarde zorgt ervoor dat de methode stopt indien er geen elementen bestaan met als tag tagName, maar houdt er geen rekening mee dat het element binnen die tag leeg kan zijn. Hierdoor kan el null zijn, en zal el.getFirstChild().getNodeValue() een foutmelding geven. De oplossing bestaat er uiteraard eenvoudig in eerst te controleren of el null is en indien dit het geval is, een waarschuwing te geven in een logbestand.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
24
5.4 LOGBESTANDEN 5.4.1 Algemeen Bij sommige stappen in de code is het interessant om een logbestand bij te houden. Java beschikt hiervoor over de nodige bibliotheken. Voor een eenvoudig geval is een logger, een handler en een formatter nodig. Een applicatie die iets wil loggen, kan de methode log toepassen op een object van de klasse Logger. Het loggerobject geeft zijn informatie door naar een handler, die zorgt voor de publicatie van de gegevens. Aan deze handler kan een formatter toegekend worden. Die bepaalt hoe de informatie gestructureerd wordt in het logbestand. Handler en logger maken gebruik van levels en filters om te beslissen in welke informatie ze geïnteresseerd zijn. Bij installatieproblemen beslist de lezer van het logbestand aan de hand van de levels welke informatie van belang is: fouten tijdens de procedure worden bijvoorbeeld als severe aangeduid, terwijl gewone informatie de level info zal krijgen.
Figuur 14: Overzicht Java logger
5.4.2 Globale bespreking code De configuratie van de logger gebeurt in een aparte klasse. Die bevat een methode die de root-logger opvraagt, de level hiervan instelt en er een handler aan toekent die o.a. de layout en de bestandslocatie van het logbestand vastlegt. De methode wordt eenmalig opgeroepen bij het begin van de installatie. Elke andere gebruikte logger erft de eigenschappen van de root-logger. Ze worden in elke klasse aangemaakt met de volgende code: protected final static Logger logger = Logger.getLogger(classname.class.getName());
Aan de hand van de naam van de klasse roept dit telkens een unieke logger op. Hierna kunnen boodschappen naar het logbestand worden geschreven, bijvoorbeeld: logger.severe("logboodschap");
5.4.3 Problemen De logger is bedoeld om foutboodschappen en algemene informatie weg te schrijven naar een bestand. Dit bestand moet uiteraard eerst aangemaakt worden. De gebruiker heeft de mogelijkheid om zelf een directory op te geven waar de loggegevens moeten worden geplaatst. Indien een onbestaande directory wordt gekozen, wordt het bestand niet aangemaakt en verschijnt een foutmelding. Uiteraard wordt de oorzaak van deze fout niet gedocumenteerd in het logbestand, aangezien dit nog niet is aangemaakt. Daarom wordt een aparte methode aangemaakt die controleert of de opgegeven directory bestaat en deze
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
25
eventueel zelf aanmaakt. De informatie over deze stappen wordt in dit geval rechtstreeks naar het scherm geschreven aan de hand van een system.err.
5.5 AANMAKEN KEYSTORE-BESTAND 5.5.1 Algemeen Het aanmaken van een keystore-bestand kan opgedeeld worden in 3 stappen. • •
•
Eerst wordt een sleutelpaar bestaande uit een publieke en een private sleutel aangemaakt. Vervolgens moet een certificaat worden gegenereerd dat de publieke sleutel en de gegevens van de organisatie met elkaar verbindt. Zo een certificaat voor een bepaalde organisatie is eigenlijk niets anders dan een publieke sleutel waarvan een derde garandeert dat hij bij de private sleutel van de organisatie hoort. Tot slot wordt het keystore-bestand aangemaakt waarin het certificaat en het sleutelpaar worden bewaard.
5.5.2 Globale bespreking code a
Keypair
Een keypair kan eenvoudig worden aangemaakt door gebruik te maken van de ingebouwde bibliotheek java.security. Eerst wordt een KeyPairGenerator-object gedeclareerd. Dit gebeurt via de statische methode getInstance, met als argument het coderingsalgoritme (RSA) en de provider (Bouncy Castle). Na de opgave van de lengte van de sleutel kan de generator geïnitialiseerd worden. Om ervoor te zorgen dat elke aangemaakte sleutel uniek is, wordt bij de initialisatie telkens een stuk random data meegegeven. Dit wordt eenvoudig gegenereerd door de oproep new SecureRandom(). Na deze stappen krijgt de generator de opdracht om een keypair aan te maken.
b
Certificaat
Hier wordt opnieuw gebruik gemaakt van een generator, de X509V3CertificateGenerator van Bouncy Castle, die met een gewone constructor wordt aangemaakt. De generator beschikt over een aantal set-methodes voor het instellen van de publieke sleutel, de uitgever en de eigenaar van het certificaat, een serienummer, de keuze van het algoritme voor de digitale handtekening(SHA-256 met RSA-versleuteling) en een geldigheidstermijn voor het certificaat. Het instellen van de eigenaar en de uitgever gebeurt hier aan de hand van een X509Name. Deze bundelt de gegevens van de organisatie en van de CA. Bij de constructor van de X509Name moet een String worden opgegeven die als volgt is opgebouwd: Eigenschap1 = waarde1, eigenschap2 = waarde2, … Tabel 2: Betekenis parameters X509-certificaat
Eigenschap
Betekenis CN Common name O Organisation OU Organisation Unit
Integratie van Adito in aXsGUARD Gatekeeper
Voorbeeldwaarde localhost Vasco Able
Masterproef Toegepaste informatica Eigenschap E C L ST
2009-2010
Betekenis e-mail Country Locality State
26 Voorbeeldwaarde
[email protected] Belgium Mechelen Oost-Vlaanderen
De X509Name wordt dan doorgegeven aan het certificaat, bv. X509Name x509Name = new X509Name("CN=127.0.0.1, O=Testorganisatie,…");
certGen.setSubjectDN(x509Name); Nadat de basisgegevens voor het certificaat zijn ingesteld, kunnen nog enkele uitbreidingen worden toegevoegd. Deze dienen bijvoorbeeld om aan te geven waarvoor het certificaat kan worden gebruikt.13 Tabel 3: Betekenis certificaatextenties
Extensie BasicConstraints
KeyUsage
Betekenis Geeft aan of het certificaat mag worden gebruikt als een CA, dus of het andere certificaten mag ondertekenen. Bevat beperkingen op het gebruik van de publieke sleutel in het certificaat.
ExtendedKeyUsage Verfijnt nog verder de KeyUsage.
Waarde false
Motivatie Het gaat om een selfsigned certificaat.
digitalSignature
De digitale handtekening heeft tot doel te verzekeren dat de data die doorgestuurd worden, afkomstig zijn van de webserver keyEncipherment Het certificaat wordt gebruikt in combinatie met een protocol dat sleutels encrypteert (SSL). KeyPurposeId. Het certificaat dient om id_kp_serverAuth de server te authenticeren.
Na de installatie van deze gegevens wordt het certificaat via de generator aangemaakt.
c
Keystore
Voor het aanmaken van de keystore wordt weer gebruik gemaakt van de bibliotheek java.security. Eerst wordt een KeyStore-object (store) aangemaakt via de statische getInstance-methode. Hierbij wordt opgegeven over welk type keystore het gaat (JKS, PKCS12). Om de keystore leeg te initialiseren wordt gebruik gemaakt van de code store.load(null, null).
13
http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Gen eration
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
27
Een KeyStore-object kan twee types entiteiten beheren: key-entiteiten en trusted certificateentiteiten. Het laatste type bevat één publieke sleutelcertificaat, dat vertrouwd wordt door de eigenaar van de keystore. Het eerste type beschikt over een geheime sleutel of een private sleutel in combinatie met een certificaatketting die de publieke sleutel bindt aan zijn eigenaar. Dit is wat gebruikt wordt bij self-authentication.14 De certificaatketting bestaat in dit geval maar uit één element: het self-signedcertificaat. Zoals hiervoor vermeld, wordt dus gebruik gemaakt van de key-entiteit. Deze wordt voor de keystore ingesteld aan de hand van een set-methode: setKeyEntry(String alias, Key key, char[] password, Certificate[] chain) Tabel 4: Betekenis argumenten setKeyEntry
Argument alias key password Chain
Betekenis geeft een alias aan de sleutel de sleutel die moet worden bewaard het paswoord dat de sleutel zal beschermen Als de sleutel die bewaard wordt een private sleutel is, moet de certificaatketting die de sleutel bindt aan de organisatie meegegeven worden. Hier is dit dus het self-signed certificaat.
Hierna wordt het KeyStore-object eenvoudig weggeschreven naar een keystore-bestand via de store-methode. Nu is er enkel nog een paswoord nodig om de toegang tot de keystore te beveiligen.
5.6 AANMAKEN HSQLDB 5.6.1 Algemeen In het HSQLDB-pakket, dat via het Internet vrij verkrijgbaar is, zit een uitgewerkt voorbeeld met de nodige methodes die toelaten een database aan te maken. Die zullen vanzelfsprekend in de code van de installer verwerkt worden. Specifiek voor dit programma zijn 3 onderwerpen van belang: het aanmaken of het openen, het vullen en het correct afsluiten van de database. Alvorens deze onderwerpen uit te werken, wordt een overzicht gegeven van de verschillende tabellen die via HSQLDB kunnen worden aangemaakt:15 Type tabel Memory
Cached
Beschrijving Bij deze tabellen zit zowel de structuur als de inhoud volledig in het geheugen. Elke wijziging wordt wel bijgehouden in het script-bestand (zie 5.6.2d Bestanden). Wordt de databank afgesloten en weer geopend, dan dient dit bestand om de Memory-tabellen en hun inhoud opnieuw op te bouwen. Dit zijn de standaardtabellen die gebruikt worden bij een HSQLDB. Dit type wordt toegepast bij grote tabellen, die anders te veel geheugen innemen. Hiervan wordt slechts een beperkt deel in het geheugen bijgehouden. Hun data worden bewaard in een data-bestand (zie 5.6.2d Bestanden). Deze tabellen werken snel voor grote hoeveelheden data, maar relatief traag voor kleine hoeveelheden. Hoewel de tabellen van Adito weinig
14
http://java.sun.com/j2se/1.4.2/docs/api/java/security/KeyStore.html#load%28java.io.InputStream,%20char[]%29 15 http://hsqldb.org/doc/guide/ch01.html
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica Type tabel
Text
2009-2010
28
Beschrijving gegevens bevatten, kozen de ontwerpers er tpch voor om vooral dit type te gebruiken. Deze tabellen gebruiken begrensde tekstbestanden, bijvoorbeeld Comma Separated Value,, als bron van gegevens. gegevens
5.6.2 Globale bespreking code a
Connectie openen
Java kan in SQL-taal taal communiceren met een database via een speciale API: JDBC ((Java DataBase Connectivity). Om ervoor te zorgen dat Java kan verbinden met een specifiek type databank, bijvoorbeeld HSQLDB, is er een speciale driver nodig voor dat type databank.16 De JDBC-driver verzorgt de connectie met de databank en implementeert het protocol voor de overdracht van gegevens tussen het programma en de database.17 De driver van HSQL is volledig in Java geschreven en communiceert zonder tussenlaag met de database, dit is dus een type 4-driver: Direct to Database Pure Java Driver. In het geval van HSQLDB is dit eigenlijk een speciaal type, waarbij waar het database management system in de driver zit ingebouwd.
Figuur 15: Schema communicatie database - Java
Door op deze manier gebruik te maken van een drivers, wordt de code onafhankelijk gemaakt van de gebruikte database. De driver wordt als volgt ingeladen: Class.forName("org.hsqldb.jdbcDriver" "org.hsqldb.jdbcDriver");
Hierna kan de connectie met de databank opgezet worden. Dit gebeurt door het oproepen van de getConnection-methode methode op de DriverManager-klasse uit de java.sql-bibiotheek: bibiotheek: conn = DriverManager.getConnection getConnection("jdbc:hsqldb:" + name);
16 17
http://nl.wikipedia.org/wiki/Java_DataBase_Connectivity http://en.wikipedia.org/wiki/JDBC_driver
Masterproef Toegepaste informatica
2009-2010
29
De gegevens tussen haakjes vormen een database-URL:18 jdbc duidt de driver aan, hsqldb het protocol en name de naam van de databank. Optioneel zijn een gebruiker en een paswoord. Indien de databank bestaat, wordt een connectie uitgevoerd. In het andere geval wordt een nieuwe database aangemaakt. Na deze stap is de connectie geopend.
b
Opdracht uitvoeren
Om een SQL-opdracht (statement) te kunnen uitvoeren moet eerst een statement-object voor de database aangemaakt worden: st = conn.createStatement(). Op dit object wordt dan de methode executeUpdate toegepast, wat ervoor zorgt dat een SQL-opdracht zoals insert, delete of update wordt uitgevoerd, bv: st.executeUpdate(“INSERT INTO EXPLORER_PROPERTIES VALUES('client.shutdown.wait','','0','0','','2500')”);
Nadat de opdrachten zijn uitgevoerd, moet het statement-object gesloten worden via de close()-methode.
c
Connectie sluiten
Eens de nodige opdrachten zijn uitgevoerd, wordt de database afgesloten. Dit gebeurt aan de hand van 2 opdrachten: st.execute("SHUTDOWN"); conn.close();
De eerste maakt een controlepunt aan, plus een nieuw scriptbestand met daarin de data van de memory-tabellen (zie 5.6.2d Bestanden) en zorgt ervoor dat een nieuwe back-up wordt bewaard in het back-upbestand. De tweede opdracht sluit het connectieobject.
d
Bestanden
Nadat de nodige commando’s in Java zijn uitgevoerd, worden automatisch een aantal types bestanden aangemaakt door HSQLDB:19 Type Properties Script Log Data Backup Lock
18 19
Inhoud de globale instellingen van de database de definitie van tabellen en andere databaseobjecten en de data van de niet gecachete tabellen Bevat de recente veranderingen die aan de database gemaakt zijn. de data van de gecachete tabellen Bewaart een gecomprimeerde versie van de laatst gekende consistente toestand van de database. Geeft aan welk proces of programma de database gebruikt. Het lckbestand verdwijnt indien een normale SHUTDOWN (zie 5.6.2c Connectie sluiten) wordt uitgevoerd.
http://hsqldb.org/doc/guide/ch04.html http://hsqldb.org/doc/guide/ch01.html
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
6
2009-2010
30
Softwareontwerp
6.1 ALGEMEEN De nieuwe installer voor Adito wordt opgedeeld in 4 packages. Op deze manier is er een onderscheid tussen de verschillende functies van de klassen. Een van deze packages bevat alle logica voor het inlezen en parsen van bestanden: AditoInstaller.input. De hieruit gefilterde gegevens worden in de klassen van AditoInstaller.data bewaard. Deze data moeten in het juiste formaat en volgens de juiste lay-out weggeschreven worden naar de specifieke bestanden (zie Types bestanden). De package die daarvoor zorgt is AditoInstaller.output. Daarnaast zijn er nog een aantal klassen die geen van de vorige functies vervullen, bijvoorbeeld de configuratie van een logger, een algemene klasse die alles regelt. Deze klassen worden in AditoInstaller geplaatst. In de volgende paragrafen komt een bespreking van de verschillende klassen en hun samenhang.
6.2 ADITOINSTALLER.INPUT a
XmlReader
Deze klasse verzorgt het inlezen van de gegevens uit het config.xml-bestand.
Figuur 16: Klassendiagram XmlReader
De methode parseXmlFile kijkt na of het Document-object al bestaat (zie 5.3 Conversie XML – Java). Als dit het geval is, moet er verder niets gebeuren en geeft de methode true terug. Is dit niet het geval, dan wordt geprobeerd een nieuw Document-object van het config-bestand te maken. De methode geeft als uitvoer aan of dit al dan niet gelukt is. De meeste methoden die worden aangemaakt, hebben een boolean als resultaat. Op deze manier kan in de algemene klasse die de installer bedient (zie 6.4 Adito-Installer), gemakkelijk bepaald worden of de installatie volledig gelukt is. In de verdere tekst wordt hier niet meer verder op ingegaan. De methode copyByMap staat in voor het kopiëren van de data die uit de nodelist (zie 5.3 Conversie XML – Java) worden gehaald naar een ConfigHolder (zie 6.3a ConfigHolder – PropertiesHolder). Dit is een interface die gebruikt wordt om alle klassen te verzamelen die gegevens uit het configuratiebestand bewaren. De FieldMapper(zie 6.2c FieldMapper) zorgt voor de verbinding tussen de velden van een ConfigHolder en de elementen van de nodelist. Omdat de copyByMap-methode verdere uitleg vraagt, is deze volledig uitgewerkt in paragraaf 7.1 CopyByMap en getConfig.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
31
Tot slot bevat deze klasse nog de methode getConfig. Die zorgt ervoor dat de elementen met een tag bepaald door het argument tag, uit het config-bestand worden gehaald en in de specifieke ConfigHolder worden bewaard. Daarvoor wordt van de vorige twee methoden gebruik gemaakt.
b
ConfigWriter
De ConfigWriter vormt een uitbreiding op de XmlReader-klasse:
Figuur 17: Klassendiagram ConfigWriter
Het nadeel van getConfig uit de klasse XmlReader is dat bij het oproepen van deze methode twee argumenten moeten worden meegegeven: een specifieke tag (bv. proxies) en een specifieke dataklasse (bv. Proxies). Dit is niet zo interessant. Beter is het te werken met zoveel mogelijk kant-en-klare methoden, dus zonder al te veel argumenten te moeten opgeven. Een oplossing bestaat erin een nieuwe methode aan te maken. Deze methode roept zelf getConfig op en vult default-waarden in voor de twee argumenten. Bijvoorbeeld: public WebServer readWebserverData() { WebServer ws = new WebServer(); if (!this.getConfig("WebServer", ws)) { return null; } return ws; }
Dit is wel een zeer specifieke methode, en gaat in tegen het principe om de methodes van XmlReader zo algemeen mogelijk te houden. Daarom wordt deze in ConfigWriter geplaatst, wat een uitbreiding is van XmlReader.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
c
2009-2010
32
FieldMapper
Figuur 18: Klassendiagram FieldMapper
De klasse FieldMapper bevat één gegevenselement van het type HashMap<String,String>. Een hashmap bestaat uit een verzameling key-valueparen, waarbij geen enkele key meer dan een keer mag voorkomen. In het geval van de FieldMapper zijn beide elementen uit een paar van de klasse String. Voor de installer van Adito wordt deze mapper gebruikt om de gegevenselementen van een klasse te koppelen aan de corresponderende elementen uit de configfile en de lay-out van de uitvoerbestanden. Dit wordt verduidelijkt met het volgende voorbeeld. In het config-bestand (input) zit een element met tag keyStoreType. Dit komt overeen met het gegevenselement keystoretype uit de klasse WebServer (data). In het webserver.properties-bestand (output) moet de tekst webServer.keyStoreType=JKS geschreven worden. Dit resulteert dan in een mapping tussen keyStoreType en keystoretype en tussen keystoretype en webServer.keyStoreType. Config-file
Webserver data
JKS
public String keystoretype;
Output file
webServer.key StoreType =JKS
Figuur 19: Mapping config-file - dataklasse - output file
De klasse bevat twee methoden addMap: addmap(String target, String source) en addmap(String target). Valt de keuze op de methode met het enkelvoudige argument, dan wordt gewoon een mapping gemaakt tussen het element en zichzelf. Dit is bijvoorbeeld het geval wanneer zowel het gegevenselement van de klasse als de tag uit de config-file dezelfde naam hebben. Er zijn twee bevragingsmethoden voorzien. Met getSource kan de gebruiker aan de hand van de key de value-waarde van een key-value-paar opvragen. Daarnaast wordt ook een methode gemaakt om de volledige set van unieke key-waarden terug te geven. Dit laat samen met getSource toe om een volledige hashmap te overlopen en de key-value-paren af te drukken.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
d
2009-2010
33
SqlReader
Deze klasse bevat de logica voor het inlezen van de SQL-bestanden.
Figuur 20: Klassendiagram SqlReader
De methode readSql leest een bestand, verwijdert commentaar en geeft dan een rij van SQL-opdrachten in String-formaat .
e
DirectoryReader
Zoals eerder vermeld, heeft de installer de mogelijkheid om de initiële gegevens van de HSQL-database in te stellen aan de hand van een SQL-bestand. In de praktijk worden evenwel meerdere bestanden ingelezen en uitgevoerd. Deze bestanden worden gegroepeerd in een bestandsmap. Het installatieprogramma moet dus de mogelijkheid hebben om alle bestanden in een directory te herkennen, te lezen en uit te voeren.
Figuur 21: Klassendiagram DirectoryReader
De bestanden worden allemaal gekenmerkt door een volgnummer, zodat ze in volgorde uitgevoerd worden. Dit is nodig omdat elk bestand voortbouwt op het vorige: er kunnen bijvoorbeeld pas bepaalde waarden in een tabel ingevuld worden, als die door het vorige bestand al is aangemaakt. De lijst met bestanden wordt daarom eerst gesorteerd aan de hand van het Bubble Sort-algoritme.
6.3 ADITOINSTALLER.DATA a
ConfigHolder – PropertiesHolder
Figuur 22: Klassendiagram ConfigHolder
ConfigHolder vormt een interface voor de dataklassen. Dit zorgt ervoor dat de verschillende dataklassen allemaal kunnen aangesproken worden als ConfigHolder. Dit laat toe de methoden die ervoor zorgen dat deze klassen opgevuld worden, zo algemeen mogelijk te houden. Een voorbeeld hiervan is terug te vinden in paragraaf 6.2a XmlReader: de methoden copyByMap en getConfig krijgen de algemene interface ConfigHolder als argument mee. Op deze manier worden geen aparte methoden geschreven voor
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
34
bijvoorbeeld het inlezen van de certificaatgegevens (getCertConfig) en het inlezen van de databasegegevens (getDataConfig), maar maken ze beide gebruik van één en dezelfde methode: getConfig. Elke klasse die gegevens bewaart is immers een ConfigHolder. De interface ConfigHolder beschikt over 1 methode die een hashmap als resultaat heeft. Deze methode bestaat uit de paren die de gegevenselementen van een specifieke ConfigHolder linken aan de overeenkomstige tags in het config-bestand. Analoog met de ConfigHolder wordt een interface PropertiesHolder aangemaakt. De methode getPrintMap zorgt voor de verbinding tussen de gegevenselementen van een specifieke PropertiesHolder en de tekst zoals die moet worden uitgeschreven in de uitvoerbestanden (zie 6.2c FieldMapper).
Figuur 23: Klassendiagram PropertiesHolder
Er wordt in de eerste plaats gebruik gemaakt van een aparte interface, omdat niet elk gegevenselement overeenkomt met één eenvoudige lijn in een uitvoerbestand. De gegevens die bijvoorbeeld weggeschreven worden naar de database, moeten worden verpakt in een specifieke SQL-opdracht. Daarom zal de klasse die de gegevens voor de databank bevat enkel de interface ConfigHolder, maar niet PropertiesHolder, implementeren. Data die daarentegen weggeschreven worden naar het webserver.properties-bestand, kunnen wel als eenvoudige lijnen worden opgebouwd. De klassen die deze data bevatten implementeren dus beide interfaces. Hieronder volgt een voorbeeld om het verschil in opbouw duidelijk te maken: INSERT INTO EXPLORER_PROPERTIES VALUES('client.heartbeat.interval','','0','0','','40000')
webServer.keyStoreType=JKS
Een tweede reden voor een aparte interface is dat niet elke klasse haar data effectief naar een bestand móet uitschrijven. De klasse waarvan de instanties de gegevens in verband met de bestandslocaties bewaren, worden door de installer enkel gebruikt, maar niet afgeprint. De locatie van de database moet bijvoorbeeld nergens afgeprint worden, maar ze moet wel intern in het installatieprogramma kunnen worden gebruikt.
b
WebServer
Zodra de algemene interface is aangemaakt, kunnen de specifieke dataklassen worden geïmplementeerd. Een voorbeeld hiervan is WebServer.
Masterproef Toegepaste informatica
2009-2010
35
Figuur 24: Klassendiagram WebServer
Zoals eerder vermeld is WebServer een realisatie van zowel ConfigHolder als PropertiesHolder en is een concrete uitwerking voor de methoden getPrintMap en getParseMap noodzakelijk. De klasse gebruikt ook een element van het type Encrypteer. In paragraaf 4.5.2 Properties is al uitgelegd waarom het paswoord wordt geëncrypteerd. Er wordt dus gebruik gemaakt van aggregatie om de daarvoor benodigde logica te integreren in WebServer. De meeste andere dataklassen zijn volgens hetzelfde principe opgebouwd.
c
HSQL-data
Het grootste deel van de waarden die ingevuld moeten worden in de HSQL-database, bevinden zich in de tabel explorer_properties. Hieronder staat een voorbeeld van een opdracht die op deze tabel moet worden uitgevoerd: INSERT INTO EXPLORER_PROPERTIES VALUES('security.userDatabase','','0','1','','unixAuth')
Dit zorgt ervoor dat de gebruikersgegevens uit de onderliggende Unix-database worden aangewend. De aanmaak van de tabel explorer_properties gebeurde aan de hand van de volgende opdracht: CREATE CACHED TABLE EXPLORER_PROPERTIES( KEY_1 VARCHAR(255) NOT NULL, KEY_2 VARCHAR(255) NOT NULL, KEY_3 VARCHAR(255) NOT NULL, KEY_4 VARCHAR(255) NOT NULL, KEY_5 VARCHAR(255) NOT NULL, VALUE VARCHAR(255) NOT NULL );
Uit deze twee opdrachten zijn de betekenissen van KEY_1 en VALUE gemakkelijk af te leiden. Die van de andere keys zijn echter nog niet achterhaald. Indien Adito twee keer wordt geïnstalleerd, waarbij de eerste keer gekozen wordt om de achterliggende Unix-database te
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
36
gebruiken en de tweede keer de eigen Adito-database, Adito dan blijkt dat enkel de VALUE verandert, de keys blijven en ongewijzigd. De waarden voor de keys zijn dus standaard, onafhankelijk van de gekozen value. value. Het heeft dan ook geen nut om ze op te ne nemen in het configuratiebestand. Om te voorkomen dat deze standaardwaarden worden gebruikt door het nieuwe installatieprogramma, wordt ervoor gezorgd dat elk veld in de tabel al een defaultwaarde bevat. Deze worden ingelezen vanuit de SQL-bestanden. SQL Ze e bevatten dan bijvoorbeeld al de opdracht: INSERT INTO EXPLORER_PROPERTIES VALUES('security.userDatabase','','0','1',' VALUES('security.userDatabase','','0','1','','builtIn') Op deze manier komt in de tabel al een waarde security.userDatabase (KEY_1) voor. Deze waarde kan nu eenvoudig aan de hand van een update die de correcte waarde (unixAuth) uit het configuratiebestand gebruikt, overschreven worden: UPDATE EXPLORER_PROPERTIES SET VALUE='unixAuth' WHERE KEY_1='security.userDatabase' In de dataklasse worden dus us enkel die waarden bewaard die specifiek moeten worden overschreven.. Dit geeft dan bijvoorbeeld onderstaand klassendiagram: klasse
Figuur 25: Klassendiagram ExplorerProperties
6.4 ADITO-INSTALLER Deze package bevat onder andere de klassen klasse die de logger configureren,, die certificaten en sleutels maken en die de HSQLDB-operaties HSQLDB mogelijk maken.. De belangrijkste hier is echter General. Die regelt het volledige verloop van de installer en schrijft in het logbestand of de installatie al dan niet geslaagd is.
Masterproef Toegepaste informatica
7
2009-2010
37
Software-implementatie
Dit hoofdstuk bevat de uitwerking van een methode uit de nieuwe installer: copyByMap. Deze code is van essentieel belang in de klasse XmlReader, die verantwoordelijk is voor het inlezen van het config-bestand en het bewaren van de gegevens in de dataklassen. Aangezien elk uitvoerbestand deze gegevens en dus deze methode nodig heeft, is het noodzakelijk dat ze snel en eenvoudig toepasbaar is voor elk type bestand.
7.1 COPYBYMAP EN GETCONFIG Om de methode copyByMap goed te kunnen begrijpen, moet gestart worden bij de code van getConfig. Die krijgt als argumenten een tag en een ConfigHolder mee, bijvoorbeeld: WebServer ws = new WebServer(); getConfig(“WebServer”, ws); Deze argumenten worden dan verwerkt in de getConfig-methode: protected boolean getConfig(String tag, ConfigHolder ch) { if (parseXmlFile()) {
Hier wordt eerst gecontroleerd of het Document-object (dom) al dan niet kan of moet worden aangemaakt (zie 6.2a XmlReader). Vervolgens wordt het FieldMapper-object van de ConfigHolder opgevraagd: FieldMapper map = ch.getParseMap();
Hierna komt een stuk code dat ervoor zorgt dat een NodeList wordt aangemaakt die alle elementen bevat met een tag zoals die meegegeven als argument van getConfig (bijvoorbeeld WebServer). Element docEle = dom.getDocumentElement(); NodeList ws = docEle.getElementsByTagName(tag);
Bevat het config-bestand geen elementen met die tag of is het aantal elementen binnen die tag nul, dan wordt een foutmelding gegeven: if (ws == null || ws.getLength() == 0) { logger.severe( "missing nodelist: \"" + tag + "\" not found" ); return false; }
Indien dit geen probleem is, wordt vervolgens de methode copyByMap opgeroepen. Daarnaast wordt nog gecontroleerd of deze oproep succesvol was en of het config-bestand kon gelezen en ontleed worden.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
38
else if (copyByMap(ch, map, ws)) return true; } else { logger.warning("can not parse xml"); } return false; }
De methode copyByMap krijgt als argument de ConfigHolder, zijn FieldMapper en een NodeList mee. De ConfigHolder is initieel leeg, maar zal door de methode opgevuld worden. Aan de hand van de velden die voorkomen in zijn FieldMapper haalt het hiervoor gegevens uit de NodeList. private boolean copyByMap( ConfigHolder h, FieldMapper map, NodeList nodelist) { Element elem = null; if (nodelist == null || nodelist.getLength() == 0) { logger.log(Level.SEVERE, "missing nodelist"); return false; }
Hier wordt de NodeList opnieuw gecontroleerd. Het kan immers voorkomen dat de methode copyByMap ergens anders dan in getConfig wordt opgeroepen. Indien de NodeList niet correct is, wordt in deze laatste methode een foutboodschap gegeven die preciezer is dan die van copyByMap: de tag die de fout veroorzaakt kan immers ook mee afgeprint worden. Dan wordt het eerste element uit de NodeList opgevraagd: elem = (Element) nodelist.item(0);
Hierbij wordt verondersteld dat elke hoofdtag slechts één keer voorkomt in het configbestand, wat voor deze installer het geval zal zijn. Alle gegevens in verband met de WebServer worden bijvoorbeeld binnen één tag geplaatst, en die komt ook maar één keer voor: <WebServer> <protocol>https
Nu wordt gecontroleerd of het element al dan niet null is: if (elem == null) { logger.severe("missing element"); return false; }
Er moet een mapping gemaakt worden tussen de elementen van de config-file en de gegevenselementen van de ConfigHolder. Zoals eerder gezegd wordt hiervoor de FieldMapper gebruikt. Die bevat als key-waarden de naam van de gegevenselementen uit de ConfigHolder en als value-waarden de tags van de overeenkomstige elementen. De keyvalue-paren kunnen gemakkelijk overlopen worden:
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
39
Iterator<String> iter = map.keySet().iterator(); while (iter.hasNext()) { String target = iter.next(); String source = map.getSource(target);
De iterator overloopt de Set van key-waarden, zodat de overeenkomstige value-waarde uit de FieldMapper wordt gehaald (zie 6.2c FieldMapper). Hierna kan er telkens een NodeList worden aangemaakt die de elementen bevat met een tag bepaald door de value-waarden van de FieldMapper: String value = null; NodeList nl = elem.getElementsByTagName(source); if (nl != null && nl.getLength() > 0) { Element el = (Element) nl.item(0); if (el != null) { Node node = el.getFirstChild();
In de variabele el zit nu het element uit het XML-docement met tag source. Om te weten te komen wat er binnen die tag zit, wordt het eerste kindelement hiervan opgevraagd. Dit levert dan in principe een Node van het type Text op. Deze wordt bewaard in de variabele node. Dan wordt de volgende code gebruikt: Field fld = h.getClass().getDeclaredField(target);
H is de ConfigHolder die moet worden gevuld. De methode getClass levert de runtime-klasse op.20 Dit wil zeggen dat indien de ConfigHolder een object was van de klasse WebServer, deze laatste klasse als antwoord wordt gegeven. De methode getDeclaredField geeft een Field terug dat een gedeclareerd veld representeert uit de klasse die verkregen is via GetClass.21 Een Field levert informatie over en toegang tot een veld van een klasse of interface.22 Dit zorgt ervoor dat men via dit object de waarde van een gegevenselement van de klasse kan opvragen of aanpassen. Deze techniek behoort tot het domein van de reflectie. De code gaat hierna als volgt verder: if (node != null) { value = node.getNodeValue(); } else { value = ""; logger.warning( source + " Empty tag in " + elem.getNodeName() ); } if (fld.getType() == String.class) { fld.set(h, value); } else if (fld.getType() == Encrypteer.class) { fld.set(h, new Encrypteer(value)); }
20
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getDeclaredField%28java.lang.String%29 22 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Field.html 21
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
40
Er wordt gecontroleerd of het element uit de config-file een (tekst-)node bezit. Indien dit het geval is, moet de waarde hiervan bewaard worden in de ConfigHolder. Hiervoor wordt gebruik gemaakt van de methode set(Object obj,Object value). Obj is het object waarvan het veld moet worden aangepast en value is de nieuwe waarde die het veld krijgt.23 Voor de gegevenselementen van de dataklassen werden twee types gebruikt: String en Encrypteer. In het eerste geval wordt de waarde rechtstreeks weggeschreven. In het andere geval moet het paswoord in tekstformaat dat ingelezen wordt uit het config-bestand omgezet worden naar een object van de klasse Encryptor. Indien er geen tekst is voorzien tussen de tags, wordt een lege String als waarde meegegeven. Het is niet verplicht om tekst tussen de tags te plaatsen, maar in dat geval moet de gebruiker wel op de hoogte gebracht worden door een waarschuwing te registreren in het logbestand. Voor het aanmaken van het veld werd een Try geplaatst. Deze wordt hier aangevuld door de nodige catch-blokken. } catch (NoSuchFieldException e) { logger.severe( "Field " + target + " in class " + h.getClass().getName() + "does not exist (" + e.getMessage() + ")" ); return false; } catch (IllegalAccessException e) { logger.severe( "Field " + target + " in class " + h.getClass().getName() + "can't be set(" + e.getMessage() + ")" ); return false; }
Dit zorgt ervoor dat een foutboodschap wordt gegenereerd wanneer het veld niet bestaat of wanneer geen toegang wordt verkregen tot het veld. Hiermee zijn de gegevens van het config-bestand naar de juiste ConfigHolder geschreven. Tot slot wordt de methode afgesloten met nog een aantal voorwaarden en logboodschappen indien bepaalde Elements of NodeLists niet bestaan.
7.2 JAVADOC Voor de toekomstige gebruikers van de nieuwe installer zou het handig zijn mocht er een documentatie aanwezig zijn. Hiervoor kan gebruik gemaakt worden van Javadoc. Op deze manier kunnen de verschillende methoden in HTML-formaat uitgelegd worden.
23
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Field.html#set%28java.lang.Object,%20java.lang.Object %29
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
8
2009-2010
41
Voorbereiding testfase
8.1 BUILDFILE De nieuwe installer bestaat uit een verzameling van packages. Die worden allemaal toegevoegd aan een Java Archive (JAR). Dit JAR-bestand wordt aangemaakt via Ant. Zoals eerder vermeld zorgt Ant voor het automatiseren van het bouwproces van de software. Hiermee wordt bedoeld dat het probeert een aantal doelen of targets te bereiken. Een doel is bijvoorbeeld het compileren van het programma of het aanmaken van een JAR-bestand. De benodigde stappen om een bepaald target te verwezenlijken, staan beschreven in een XMLdocument: een Buildfile.24 In Eclipse kan voor een bepaald project automatisch een Buildfile gegenereerd worden. Dit wordt ook bij deze installer toegepast. Het XML-bestand dat hierdoor aangemaakt wordt, bevat echter geen optie om een JAR-bestand aan te maken. De Buildfile moet dus aangevuld worden met een bijkomende target om dit bestand te kunnen genereren.25
<mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes" /> <mkdir dir="build/AditoInstaller"/> <jar destfile="build/AditoInstaller/AditoInstaller.jar" basedir="build/classes" > <manifest>
Deze code maakt 3 nieuwe directories aan: build, classes en jar. In de tweede map zorgt het commando javac ervoor dat de broncode die in de src-map zit, wordt gecompileerd tot classbestanden. Op deze manier wordt de broncode omgezet tot bestanden die kunnen worden uitgevoerd door de Java Virtual Machine.26 Dit levert uiteraard dezelfde bestanden op als deze die in de bin-map worden gemaakt door rechtstreeks te compileren in Eclipse.
8.1.1 Manifest Eens deze bestanden zijn aangemaakt, kan het JAR-bestand gegenereerd worden via de jar-tag. Een belangrijk stuk binnen deze code is het deel manifest. Een manifest-bestand bevat metadata die meegeleverd worden in de directory META_INF van een JAR. Zo een bestand bestaat uit een aantal name-value-paren, bijvoorbeeld:
24
http://nl.wikipedia.org/wiki/Apache_Ant http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html 26 http://nl.wikipedia.org/wiki/Javac 25
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
Name Ant-Version
42
Value : Apache Ant 1.6.1
Een van de paren die in dit bestand geschreven wordt, duidt de basisklasse aan van het JAR: Name Value Main-Class : AditoInstaller.General Deze lijn zorgt ervoor dat het JAR-bestand executable wordt gemaakt. Bij de uitvoering van het archief wordt nu direct de Main-class opgeroepen. Het uitvoeren van zo een executable JAR file, gebeurt aan de hand van het commando java -jar AditoInstaller.jar. In Eclipse bestaat de optie om automatisch een executable JAR file te genereren. Het voordeel hiervan is uiteraard dat dit veel gebruiksvriendelijker is: er moet geen build-bestand worden aangemaakt en het is ook niet nodig zelf een manifest-bestand te schrijven. Het nadeel is wel dat eventuele aanpassingen aan de code steeds via Eclipse (of een gelijkaardig programma) moeten gebeuren. Dit is niet het geval wanneer een build-bestand wordt gebruikt. De code wordt dan bijvoorbeeld gewoon met een editor aangepast en nadien wordt het JAR-bestand opnieuw aangemaakt via het bestaande build-bestand. Hier is bijgevolg helemaal geen specifieke software meer nodig. Daarom wordt ervoor gekozen om geen gebruik te maken van de automatische generator in Eclipse.
8.1.2 Buildfile uitvoeren Zodra al deze instellingen zijn gemaakt, kan Ant de software bouwen. Hiervoor wordt het commando ant Jar opgegeven. Daarmee wordt in de map build/jar een executable Jar file gemaakt met als manifest-inhoud: Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.0 Created-By: 1.6.0_16-b01 (Sun Microsystems Inc.) Main-Class: AditoInstaller.General
Nu is de installer klaar voor de testfase.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
9
2009-2010
43
Testen installer
9.1 UPGRADE VERMIJDEN Bij het testen van de installer ontstaat een eerste probleem bij het upgraden van de database. Als Adito wordt opgestart, wordt automatisch nagekeken of er geen updates van de tabellen moeten worden uitgevoerd. Is dit het geval, dan worden nieuwe tabellen aangemaakt of de bestaande aangepast aan de hand van SQL-bestanden die zich in de directory Upgrade bevinden. Dit zorgt voor een conflict met de database die door de nieuwe installer is aangemaakt. Een van de bestanden voert bijvoorbeeld de volgende SQL-opdracht uit: CREATE CACHED TABLE EXPLORER_PROPERTIES De database die door de installer aangemaakt werd bevat deze tabel echter al. Dit zorgt ervoor dat er een foutmelding wordt gegenereerd en dat de database uiteindelijk niet meer toegankelijk is. Om te vermijden dat de upgrades worden uitgevoerd, wordt de directory waarin deze SQLbestanden zitten hernoemd, bijvoorbeeld naar UpgradeOld. Dit moet uiteraard automatisch gedaan worden door de nieuwe installer.
9.2 EXTERNE JAR’S In Eclipse werden een aantal externe JAR-files als referentie toegevoegd aan het project. Indien deze niet bij de nieuwe installer gevoegd worden, kunnen er fouten optreden. Ontbreekt bijvoorbeeld hsqldb.jar, dan kan de JDBC-driver niet ingeladen worden en wordt dus geen database gemaakt. Er moet voor gezorgd worden dat de Java Virtual Machine te weten komt waar deze bestanden kunnen worden gevonden. Dit gebeurt aan de hand van het argument class-path, wat ingesteld kan worden in het manifestbestand van het JAR van de installer.27 Het nadeel is wel dat dit pad altijd verwijst naar een locatie buiten het JARbestand. Dit wil zeggen dat de ontbrekende referenties niet mee kunnen worden verpakt in het archief van de installer, waardoor dit uit meerdere bestanden zal bestaan. Om ervoor te zorgen dat de paden ingesteld zijn, wordt de Ant buildfile verder uitgebreid: <mkdir dir="build/AditoInstaller/externalJars"/>
Dit zorgt ervoor dat de JAR-bestanden die in de gegevensmap JAR zitten, gekopieerd worden naar een directory binnen build. Die laatste bevat dan alle gegevens die nodig zijn voor en gegenereerd worden door Ant. In de directory JAR zitten de bestanden hsqldb.jar voor de HSQLDB en bcprov-ext-jdk16-145.jar voor Bouncy Castle. De jar-tag ziet er nu als volgt uit:
27
http://en.wikipedia.org/wiki/Classpath_%28Java%29
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
44
<jar destfile="build/AditoInstaller/AditoInstaller.jar" basedir="build/classes"> <manifest>
Op deze manier wordt een class-path gedefinieerd naar de externe JAR-bestanden.
9.3 BOUNCY CASTLE PROVIDER De vorige twee paragrafen waren voldoende om de installer te laten werken op de eigen computer. Op aXsGUARD gaf hij echter de volgende foutmelding in de klasse CertKeystore: no such provider: BC. Deze klasse bevat 2 methoden: een om een certificaat en een om een sleutelpaar aan te maken. Ze beschikken beide over een stuk code dat gebruik maakt van de Bouncy Castle provider, respectievelijk x509Cert = certGen.generate(key.getPrivate(), "BC"); en KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
In de eerste methode wordt deze provider (BC) expliciet opgeroepen via Security.addProvider(new BouncyCastleProvider()). In de tweede methode gebeurt dit niet, maar toch werd de security provider op de eigen computer gevonden, omdat hij zo was ingesteld in het bestand java.security (zie 4.2.5 Bouncy Castle). Hier moet dus eigenlijk gekozen worden om ofwel telkens gebruik te maken van de code Security.addProvider(new BouncyCastleProvider()) of om het bestand java.security aan te passen. Op aXsGUARD is uiteraard geen aanpassing gemaakt aan de Java-bestanden. Om ook hier gebruik te kunnen maken van de provider, wordt in de tweede methode dus ook een extra lijn code geplaatst.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
10
2009-2010
45
Extra functionaliteiten
10.1 CERTIFICATE SIGNING REQUEST In Adito zit een functie ingebouwd die automatisch een certificate signing request genereert. Deze aanvraag kan dan door een gebruiker ter ondertekening ingediend worden bij een CA. Het zou handig zijn mocht dit bestand automatisch mee aangemaakt worden door de installer, zodat de gebruiker zelf zo weinig mogelijk in Adito moet werken. In principe zijn alle gegevens om de aanvraag te maken al aanwezig in de code. Er moet dus nog een methode worden gevonden om deze gegevens geëncrypteerd en in het juiste formaat in een csr-bestand te schrijven. Hiervoor wordt weer gebruik gemaakt van de klassen die voorzien zijn in Bouncy Castle: PKCS10CertificationRequest req = null;
Om deze request te initialiseren wordt de volgende constructor gebruikt: PKCS10CertificationRequest( java.lang.String signatureAlgorithm, javax.security.auth.x500.X500Principal subject, java.security.PublicKey key, ASN1Set attributes, java.security.PrivateKey signingKey)
In deze installer worden geen extra attributen voorzien. Voor attributes zal dus null ingegeven worden. Zoals vermeld wordt de private sleutel niet opgenomen in de aanvraag, maar dient hij enkel om het csr-bestand digitaal te ondertekenen. Toegepast in de Java-code geeft dit dan: req = new PKCS10CertificationRequest( "SHA256WithRSAEncryption", cert.getSubjectX500Principal(), key.getPublic(), null, key.getPrivate());
Deze aanvraag moet vervolgens onder het juiste formaat weggeschreven worden. Hiervoor wordt gebruik gemaakt van de klasse PEMWriter van Bouncy Castle, bijvoorbeeld: FileWriter out = FileWriter(request.csr); PEMWriter pem = PEMWriter(out); pem.writeObject(req); pem.close(); out.close();
10.2 TOEVOEGEN ADMINISTRATORS Het is de bedoeling de mogelijkheid te voorzien om aan Adito extra administrators toe te kennen. Deze kunnen eenvoudig in de database worden ingevoerd, bijvoorbeeld: INSERT INTO POLICY_PRINCIPAL_RELATIONSHIP VALUES(1,'sysadmin',0);
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
46
De administrators (bv. sysadmin) moeten worden ingelezen van het config-bestand. Hierin zal zich dan een lijst met namen bevinden, zoals: Jos Piet
Dit vereist wel een totaal andere aanpak bij het verwerken van het XML-bestand: het uitgangspunt is immers dat elke tag maar 1 keer bestaat, terwijl in dit geval meerdere namen voorkomen. In de eerste plaats wordt nu de methode copyByMap aangepast, zodat ook tags met dezelfde naam kunnen worden ingelezen. Dit zorgt ook voor een andere aanpak bij de dataklasse die deze namen zal bewaren. Vroeger had men voor elke element binnen een tag in het config-bestand een overeenkomstig gegevenselement in de dataklasse. Aangezien men niet op voorhand weet hoeveel administrators er zullen worden ingevoerd, is het moeilijk te bepalen hoeveel gegevenselementen er moeten worden voorzien. De gegevens moeten dus in een rij worden bewaard. Onderstaande tabel verduidelijkt de verschillen: Tabel 5: Verschil opbouw ExplorerProperties - Administrator
ExplorerProperties
Administrator
public String database;
public String [] names;
public String smtp; public String keymode; public String maskAnswers; public String admin; public String externalHostnames; public String invalidHostname; public FieldMapper getParseMap() {
public FieldMapper getParseMap() {
FieldMapper mapping = new FieldMapper();
FieldMapper mapping = new FieldMapper();
mapping.addMap( "database", "security.userDatabase" ); … mapping.addMap( "invalidHostname", "webServer.invalidHostnameAction" ); return mapping; }
mapping.addMap("names","name"); return mapping; }
De aanpassingen in de methode copyByMap gebeuren als volgt:
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
47
NodeList nl = elem.getElementsByTagName(source); if (nl != null && nl.getLength() > 0) { ArrayList<String> elements = new ArrayList<String>(); for(int i=0;i1) { String [] names = new String[elements.size()]; elements.toArray(names); fld.set(h, names); } else { value = elements.get(0); if (fld.getType() == String.class) { fld.set(h, value); } else if (fld.getType() == Encryptor.class) { fld.set(h, new Encryptor(value)); } }
In tegenstelling met de oude methode wordt elk element van de nodelist overlopen via de for-lus. Indien het om een unieke tag gaat, wordt de lus dus maar één keer doorlopen. De gegevens die worden gelezen uit het config-bestand, worden in eerste instantie bewaard in een ArrayList, zodat de methode compatibel wordt met meervoudige tags. Achteraf wordt gekeken hoeveel elementen in deze lijst zitten en wordt een gepaste actie uitgevoerd om deze data te bewaren in de overeenkomstige gegevenselementen. Een ander probleem doet zich voor bij het type gegevens dat moeten worden ingevoerd bij een SQL-opdracht: INSERT INTO POLICY_PRINCIPAL_RELATIONSHIP VALUES(1,'sysadmin',0); INSERT INTO EXPLORER_PROPERTIES VALUES('security.userDatabase','','0','1','','unixAuth') In de table explorer_properties, heeft men één unieke waarde en één benaming voor security.userDatabase. Deze waarde kan gemakkelijk via een update aangepast worden. De tabel policy_principal_relationship bestaat evenwel uit een verzameling van administrators.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
48
Dit heeft voor gevolg dat een update voor deze toepassing niet nuttig kan worden gebruikt. Voor deze tabel moeten dus effectief nieuwe rijen worden toegevoegd. Elke rij dient uiteraard uniek te zijn, zodat eerst moet worden gecontroleerd of een administrator al aanwezig is in de databank. Dit kan snel gebeuren door bijvoorbeeld de volgende SQL-opdracht te laten uitvoeren: SELECT COUNT(*) FROM POLICY_PRINCIPAL_RELATIONSHIP WHERE PRINCIPAL_ID = ‘sysadmin’ Indien het resultaat hiervan 0 is, mag een nieuwe administrator worden toegevoegd.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
49
Conclusie Het nieuwe installatieprogramma voor Adito zal bestaan uit 3 delen: een configuratiebestand dat de instellingen bevat die moeten worden ingevoerd, een aanpassing aan de tool die ervoor zorgt dat dit bestand wordt opgevuld en een installer die alles toepast in Adito. Deze aanpak vergemakkelijkt uitbreidingen of aanpassingen. In dit eindwerk werd een eerste versie van de installer gemaakt en het formaat van het config-bestand vastgelegd. Er werd beslist om het configuratiebestand, dat de instellingen voor Adito bevat, in XMLformaat te maken. Dit laat een zeer gestructureerde opbouw toe, zodat de gebruiker zijn gegevens snel en duidelijk kan invoeren. Dankzij het XML-schema kan hij daarnaast zijn invoer ook al een eerste keer controleren. Op deze manier komt hij te weten of alle velden die de installer nodig heeft zijn ingevuld. Een ander voordeel van dit formaat is dat het zich goed leent voor het inlezen en verwerken in Java. Hiervoor werd onder andere gebruik gemaakt van de DOM API, die toelaat om op een eenvoudige manier gegevens uit het configuratiebestand te filteren. Samen met de techniek van reflectie zorgt dit ervoor dat de gegevens zeer generiek kunnen worden ingelezen en dat de volledige installer op een bijzonder simpele en snelle wijze uitbreidbaar is. De installer zelf werd opgedeeld in 4 packages: input, data, output en een package met overige logica. In principe is het niet nodig dat de ingelezen gegevens eerst worden bewaard in een object van een klasse uit het data-package, om dan nadien toch direct naar een ander bestand weggeschreven te worden. De tussenliggende dataklassen zorgen er wel voor dat er een duidelijke scheiding kan worden gemaakt tussen het input- en outputdeel van de installer, wat uiteraard opnieuw een eenvoudige uitbreiding mogelijk maakt. Het installatieprogramma moet onder andere zorgen voor de aanmaak van een public-keycertificaat dat bewaard wordt in een keystore. Hiervoor werd gebruik gemaakt van de klassen die aanwezig zijn in de Bouncy Castle-bibliotheek. Aan de hand hiervan kunnen een self-signed certificaat en als extra een certificate signing request worden aangemaakt. Om te begrijpen welke methoden er uit de bibliotheek moeten worden gebruikt, is wat zoekwerk nodig, maar uiteindelijk levert dit wel het gewenste resultaat op. Naast een keystore moet de installer een HSQL-database voorzien. Daarbij wordt eveneens gebruik gemaakt van een specifieke bibliotheek. Hierin bevindt zich al een uitgewerkt voorbeeld, dat na een aantal aanpassingen en uitbreidingen geïmplementeerd werd bij het nieuwe installatieprogramma. Een aantal SQL-opdrachten wordt standaard uitgevoerd. Ze werden al op voorhand verzameld in een directory onder de vorm van SQL-bestanden die door de installer worden ingelezen en uitgevoerd. Het aantal uitgevoerde bestanden ligt niet op voorhand vast. De volledige code wordt bewaard in een executable JAR-bestand. Er werd voor gekozen om dit niet automatisch door Eclipse te laten genereren, maar het te laten opbouwen door Ant via een build-bestand. Dit zorgt ervoor dat de code niet afhankelijk is van Eclipse, maar later bijvoorbeeld gewoon met een editor kan worden aangepast en onafhankelijk opnieuw in een JAR-bestand kan worden verpakt. Het enige nadeel is dat de classloader van Java niet toelaat te verwijzen naar geneste JAR-bestanden. Hierdoor bestaat de installer niet compact uit 1 bestand, maar dit is voor deze toepassing geen noodzaak. Aangezien het integreren van Adito op aXsGUARD vrij experimenteel is, kan het zijn dat de installer of het configuratiebestand achteraf nog aangepast moet worden. Er moet ook een tool voorzien zijn die zorgt voor het aanmaken en opvullen van de configuratiegegevens.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
50
Deze tool werkt met een aantal gegevens die al beschikbaar zijn, maar moet daarnaast ook een interface voorzien die de overige keuzes van de gebruiker opvangt. Uiteindelijk komt het hier op neer dat de configuratie van Adito nu niet langer overgelaten wordt aan Adito zelf, maar aan de tool van aXsGUARD. Dit zorgt voor een optimale integratie.
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
2009-2010
51
Literatuurlijst Certificate Chaining. Geraadpleegd op 19 april 2010 via http://www.iona.com/support/docs/orbix2000/2.0/tls/html/OpenSSL4.html Demeester, P. (2009-2010). Communicatienetwerken. Cursus, Universiteit Gent, Faculteit ingenieurswetenschappen, vakgroep Informatietechnologie. (Figuur interfaces Adito). Geraadpleegd op 30 april 2010 via http://www.linklogger.com/images/DMZ1.jpg
http://www.wikipedia.org. Verschillende definities geraadpleegd gedurende de volledige masterproef. Introduction to XML and XML With Java. Geraadpleegd op 7 april 2010 via http://www.totheriver.com/learn/xml/xmltutorial.html#6.1.1 iSeries Informatiecentrum. (Versie 5 release 6). Beveiligingsterminologie. Geraadpleegd op 7 april 2010 via http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzalx/rzalxsecterms.htm Nazmul. Introduction to DOM. Geraadpleegd op 5 mei 2010 via http://developerlife.com/tutorials/?p=30
Sun Microsystems, Inc. JavaTM 2 Platform, Standard Edition, v 1.4.2 API Specification. Geraadpleegd april 2010 via http://java.sun.com/j2se/1.4.2/docs/api/overview-summary.html The Apache Ant Project. Tutorial: Hello World with Ant. Geraadpleegd op 22 april 2010 via http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html The hsql Development Group. Chapter 1. Running and Using Hsqldb. Geraadpleegd op 13 april 2010 via http://hsqldb.org/doc/guide/ch01.html The hsql Development Group. Chapter 4. Advanced Topics. Geraadpleegd op 19 april 2010 via http://hsqldb.org/doc/guide/ch04.html The Legion of the Bouncy Castle. Documentation. Geraadpleegd op 26 april 2010 via http://www.bouncycastle.org/documentation.html The Legion of the Bouncy Castle. Specifications. Geraadpleegd op 26 april 2010 via http://www.bouncycastle.org/specifications.html
The Legion of the Bouncy Castle. X.509 Public Key Certificate and Certification Request. Geraadpleegd op 19 april 2010 via http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certifica tion+Request+Generation What is Cygwin?. Geraadpleegd op 7 april 2010 via http://www.cygwin.com/
Integratie van Adito in aXsGUARD Gatekeeper
Masterproef Toegepaste informatica
Bijlage I
2009-2010
52
Documentatie config-bestand
Hoofdtag Tag WebServer
KeystorePassphrase
port keyStoreType
protocol
disableCertificateWarning
RedirectPort certificatename bindAddress
proxies
host (waarde is optioneel) password (waarde is optioneel)
port (waarde is optioneel) nonHosts (waarde is optioneel) user (waarde is optioneel)
certificate
Integratie van Adito in aXsGUARD Gatekeeper
Beschrijving Bevat alle gegevens in verband met de instelling van de webserver die zullen worden weggeschreven naar het bestand webserver.properties. Het paswoord dat gebruikt wordt om de keystore voor de webserver te encrypteren. De poort van Adito waarop zijn webserver beschikbaar zal zijn. Het type keystore dat gebruikt wordt op de webserver (bijvoorbeeld een Java KeyStore). Het protocol dat gebruikt wordt voor de communicatie tussen de gebruiker en de Adito-service. Logisch is dit https. Geeft aan of er een waarschuwing wordt gegeven bij een nietvertrouwd certificaat. • true • false Poort waarop geluisterd wordt naar http-aanvragen. De naam van het SSL-certificaat dat aangemaakt wordt. Het ip-adres van de interface die staat te luisteren om een connectie te maken. Bevat alle gegevens in verband met de instelling van de proxyserver die worden weggeschreven naar het bestand webserver.properties. Hostname of ip-adres van de proxyserver. Indien authenticatie wordt gebruikt voor de proxyserver, moet het paswoord worden opgegeven. De poort waarop de proxyserver werkt. De hosts die niet via de proxyserver moeten gaan. Indien authenticatie wordt gebruikt voor de proxyserver, moet de user opgegeven worden. Bevat alle gegevens die nodig zijn voor het opmaken van het selfsigned certificaat en de certificate
Masterproef Toegepaste informatica
2009-2010
Hoofdtag Tag password
53 Beschrijving signing request. Moet hetzelfde zijn als KeystorePassphrase. In principe kan er een verschillend paswoord worden gebruikt om de sleutel te encrypteren en om de keystore te encrypteren, maar dit is niet voorzien in de huidige installer.
commonName e-mail country state localityName organizationName organizationUnitName ExplorerProperties
security.userDatabase
smtp.startOnStartup
security.privateKeyMode
security.maskPersonalAnswers
security.administrators
Integratie van Adito in aXsGUARD Gatekeeper
Bevat alle gegevens die extra moeten worden ingesteld in de tabel explorer_properties van de database explorer_configuration. Geeft aan welke databank Adito moet gebruiken voor zijn authenticatie. • unixAuth (dit moet gekozen worden) • builtIn Duidt aan of het SMTPberichtsysteem moet worden opgestart bij het aanzetten van Adito. • true • false (dit moet gekozen worden) Geeft aan hoe de passphrase voor de publieke sleutel van een gebruiker wordt bepaald. Deze sleutel dient om de attributen (bijvoorbeeld de security questions) van een gebruiker te encrypteren. Voor een digipass ligt het paswoord niet vast, hier wordt dus best disable gekozen). • disable (dit moet gekozen worden) • prompt • automatic Toont of het antwoord van de gebruiker op zijn persoonlijke vraag moet worden verborgen door sterren. • false • true De naam van de super user.
Masterproef Toegepaste informatica
2009-2010
Hoofdtag Tag webServer.validExternalHostname s (waarde is optioneel)
webServer.invalidHostnameAction
locations
AditoDir conf (waarde is optioneel)
db (waarde is optioneel)
SqlImportfilesDir
CertificateSigningRequestDir (waarde is optioneel)
CertificateSigningRequestName (waarde is optioneel)
Administrators (tag is optioneel) name (tag en waarde zijn optioneel) Components keystore (als tag leeg is dan wordt automatisch true gekozen)
Integratie van Adito in aXsGUARD Gatekeeper
54 Beschrijving Indien hier een waarde wordt opgegeven, moet de gebruiker een van deze hostnames selecteren om verbinding te maken met Adito. Indien hij een andere kiest, zal hij door zijn browser doorverwezen worden naar de eerste externe hostname uit de lijst. Actie die moet worden ondernomen indien een ongeldige hostname wordt opgegeven: • none (allow connection) • redirect (redirect to valid hostname) • error (refuse all requests using invalid hostname) • disconnect (close connection immediately) Bevat de gegevens in verband met de directory- en bestandslocaties die gebruikt zullen worden. De hoofdmap van Adito. De configuratiemap van Adito. Indien dit de map “conf” is binnen de hoofdmap, dan mag dit veld leeggelaten worden. De databasemap van Adito. Is dit de map “db” binnen de hoofdmap, dan mag dit veld leeggelaten worden. De map waarin de SQL-bestanden zitten die zullen worden ingelezen en uitgevoerd door de installer. De directory waarin het certificate signing request zal worden bewaard. Bij een leeg veld is dit in de hoofddirectory. De naam voor het certificate signing request. Indien dit veld leeg blijft, wordt de naam servercertificate gekozen. Bevat de namen van de administrators. De naam van een administrator. Toont welke componenten al dan niet moeten worden geïnstalleerd. Geeft aan of de keystore (al dan niet opnieuw) moet worden aangemaakt. • true • false
Masterproef Toegepaste informatica
Bijlage II
2009-2010
55
Voorbeeld config-bestand
<WebServer> aditopas <port>443 JKS <protocol>https false 80 private key 192.168.56.101 <proxies> <password> <port>1080 <nonHosts> <user> <password>aditopas 192.168.56.101 <e-mail>[email protected] Belgium <state>Vlaanderen Mechelen TestOrganisatie TestOrganisatieUnit <ExplorerProperties> <security.userDatabase>unixAuth <smtp.startOnStartup>false <security.privateKeyMode>disable <security.maskPersonalAnswers>false <security.administrators>suadmin <webServer.validExternalHostnames> <webServer.invalidHostnameAction> none /ub/java/adito /ub/java/adito/conf/ /ub/java/adito/db/ <SqlImportfilesDir>SQLA sysadmin true
Integratie van Adito in aXsGUARD Gatekeeper