Full paper (pdf) - CDC
Full paper (pdf) - CDC Full paper (pdf) - CDC
Fachbereich Informatik Fachgebiet Theoretische Informatik Prof. Dr. Johannes Buchmann Zentralisierte Konfigurationsverwaltung komplexer IT-Systeme Diplomarbeit Betreuer: Markus Ruppert Vladislav Satanovski Darmstadt, 25. August 2005
- Seite 3 und 4: Eidesstattliche Erklärung Hiermit
- Seite 5 und 6: Danksagung In erster Linie möchte
- Seite 7 und 8: Vorwort Bei der vorliegenden Diplom
- Seite 9 und 10: Inhaltsverzeichnis Eidesstattliche
- Seite 11 und 12: INHALTSVERZEICHNIS xi 4.6.1 ADMIN-Z
- Seite 13 und 14: Abbildungsverzeichnis 1.1 FlexiTRUS
- Seite 15 und 16: Kapitel 1 Einleitung 1.1 Problembes
- Seite 17 und 18: 1.1. PROBLEMBESCHREIBUNG 3 • Gene
- Seite 19 und 20: 1.1. PROBLEMBESCHREIBUNG 5 Infrastr
- Seite 21 und 22: 1.1. PROBLEMBESCHREIBUNG 7 • Date
- Seite 23 und 24: 1.2. ANFORDERUNGEN 9 1.2.3 gleichna
- Seite 25 und 26: Kapitel 2 Problemanalyse Noch ohne
- Seite 27 und 28: 2.1. META-KONFIGURATION 13 jdbc:my
- Seite 29 und 30: 2.2. VERTEILUNGSSTRATEGIEN 15 • b
- Seite 31 und 32: Kapitel 3 Datenmodell In diesem Kap
- Seite 33 und 34: 3.1. GLIEDERUNG DER DATENBLÖCKE 19
- Seite 35 und 36: 3.1. GLIEDERUNG DER DATENBLÖCKE 21
- Seite 37 und 38: 3.2. KONFIGURATIONSEINHEITEN 23 roo
- Seite 39 und 40: 3.2. KONFIGURATIONSEINHEITEN 25 XML
- Seite 41 und 42: 3.3. VERERBUNG 27 3.3 Vererbung Ein
- Seite 43 und 44: 3.3. VERERBUNG 29 ... ... Bei e
- Seite 45 und 46: 3.3. VERERBUNG 31 3. Da die Konfigu
- Seite 47 und 48: 3.3. VERERBUNG 33 Abbildung 3.4: IS
- Seite 49 und 50: Kapitel 4 Verwaltung und Verteilung
- Seite 51 und 52: 4.3. DATEN-ABSICHERUNG - LSA/RSA 37
Fachbereich Informatik<br />
Fachgebiet Theoretische Informatik<br />
Prof. Dr. Johannes Buchmann<br />
Zentralisierte Konfigurationsverwaltung<br />
komplexer IT-Systeme<br />
Diplomarbeit<br />
Betreuer: Markus Ruppert<br />
Vladislav Satanovski<br />
Darmstadt, 25. August 2005
Eidesstattliche Erklärung<br />
Hiermit versichere ich, dass ich die vorliegende Diplomarbeit ohne Hilfe Dritter und<br />
nur mit den angegebenen Quellen und Hilfsmitteln angefertigt habe. Diese Arbeit hat<br />
in gleicher oder ähnlicher Form noch keiner Prüfungsehörde vorgelegen.<br />
Darmstadt, 25. August 2005<br />
iii
iv<br />
EIDESSTATTLICHE ERKLÄRUNG
Danksagung<br />
In erster Linie möchte ich meiner Frau Irina von ganzem Herzen für die Unterstützung<br />
und Geduld danken. Sie bemühte sich immer, Rahmenbedingungen zu schaffen, die mir<br />
ein erfolgreiches Studium ermöglichten. Deshalb widme ich ihr diese Arbeit.<br />
Auch meiner Schwester Daria, die sich neben dem Korrektur lesen auch mit meinen<br />
Kinder beschäftigte, während ich an dieser Arbeit schrieb, möchte ich ganz herzlich<br />
danken. Für die Spaziergänge mit meinen Kindern danke ich auch meiner ganzen Familie,<br />
die mir dadurch mehr Ruhe verschaffte, welche ich zum Schreiben dieser Arbeit<br />
verwenden konnte.<br />
Ein besonderer Dank geht an meinen Kollegen Georgios Raptis, der mit mir Konzepte<br />
der Arbeit analysierte und mir wertvolle Verbesserungsvorschläge gab.<br />
Zum Schluss möchte ich mich bei meinem Betreuer Markus Ruppert für das interessante<br />
Thema, sowie die Unterstützung während der Arbeit bedanken. Obwohl die<br />
Fertigstellung meiner Arbeit nach jedem Gespräch mit ihm weiter in die Ferne rückte,<br />
waren seine Ideen und Vorschläge immer sehr konstruktiv und führten zu einer besseren<br />
Lösung des gestellten Problems.<br />
v
vi<br />
DANKSAGUNG
Vorwort<br />
Bei der vorliegenden Diplomarbeit handelt es sich nicht um eine theoretische Arbeit, bei<br />
welcher der Diplomand sich erst viele Wochen lang in das Thema ”<br />
einarbeiten“ muss,<br />
um überhaupt zu verstehen, worum es geht. Diese Arbeit ist sehr praxis-orientiert, da<br />
sie als Folge zahlreicher Probleme beim Konfigurieren und Installieren von komplexen<br />
Anwendungen entstanden ist.<br />
Das Ziel dieser Arbeit war von Anfang an klar – eine Konfiguration eines komplexen<br />
Systems zu vereinfachen und zu standardisieren. Nicht klar war dagegen, wie dieses Ziel<br />
erreicht werden soll.<br />
Bei der Analyse ist ein großes Problem aufgefallen. Aufgrund dessen, dass das Zielsystem<br />
( FlexiTRUST) von vielen Entwicklern während einer langen Zeitperiode entstand,<br />
wurden in unterschiedlichen Modulen öfters unterschiedliche Architekturen verwendet,<br />
welche sich nicht ohne Weiteres zu einem gemeinsamen Nenner bringen lassen. Bei den<br />
ersten Versuchen, einheitliche Schnittstellen zu definieren, stoß man auf Widerstand<br />
seitens Entwickler, weil die Änderungen manchmal einen komplett anderen Ablauf im<br />
jeweiligen Modul nach sich ziehen würden.<br />
Manche Module konnten generell nicht verändert werden, weil sie z.B. nicht direkt von<br />
TUD kamen, sondern in Kooperation mit anderen Unternehmen entwickelt wurden.<br />
Da solche Module aber immer noch einen Teil des Gesamtsystems bilden, müsste man<br />
auch für diese eine Möglichkeit finden, ihre Konfiguration in die Gesamtkonfiguration<br />
des Systems integrieren zu können.<br />
Die Laufzeitumgebung spielte auch eine große Rolle. Manche Umgebungen wie z.B. ein<br />
EJB-Container lassen nicht alle Operationen mit äußeren Resourcen zu, u.A. sind auch<br />
Dateizugriffe eingeschränkt bzw. nur mit großem Aufwand möglich. Ein weiterer Aspekt<br />
bilden Konfigurationsdateien solcher Umgebungen wie EJB-Container, Webserver etc.<br />
Ihre Formate lassen sich nicht verändern, die Inhalte repräsentieren aber einen sehr<br />
wichtigen Teil der Systemkonfiguration, müssen daher auch integriert werden.<br />
Und schließlich spielt die Benutzbarkeit des zu entwickelnden Konfigurationssystems<br />
auch nicht die letzte Rolle. Wird das System zu abstrakt entwickelt und dadurch nicht<br />
benutzerfreundlich, so wird dieses von Entwicklern umgangen, zumindest in der Entwicklungsphase.<br />
In einem solchen Fall bekommt man vor einer Auslieferung des Produktes<br />
das alte Problem wieder - man muss die Konfiguration erst ”<br />
bereinigen“, was<br />
wieder unzählige Tage und Wochen Zeit in Anspruch nehmen kann.<br />
vii
viii<br />
VORWORT<br />
Gesucht ist also ein Konfigurationssystem, welches allen oben genannten technischen<br />
Anforderungen entspricht und dabei noch einfach zu bedienen ist, so dass es während<br />
der gesamten Entwicklung ohne großen Aufwand mit verwendet werden und das fertige<br />
Produkt anschließend mit der existierenden Konfiguration ausgeliefert werden kann.<br />
Hoffentlich präsentiert diese Diplomarbeit eine entsprechende Lösung des Problems.
Inhaltsverzeichnis<br />
Eidesstattliche Erklärung<br />
iii<br />
Danksagung<br />
v<br />
Vorwort<br />
vii<br />
1 Einleitung 1<br />
1.1 Problembeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.1.1 FlexiTRUST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
1.1.2 Konfigurationsdaten . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
1.2 Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
1.2.1 Zugriffsmechanismus . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
1.2.2 logische Strukturierung der Daten . . . . . . . . . . . . . . . . . 8<br />
1.2.3 gleichnamige Parameterlisten . . . . . . . . . . . . . . . . . . . . 9<br />
1.2.4 Wertebereich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />
1.2.5 Integritätsschutz . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />
1.2.6 Profil-Verwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
1.2.7 Abhängigkeiten der Konfigurationsdaten . . . . . . . . . . . . . . 10<br />
ix
x<br />
INHALTSVERZEICHNIS<br />
2 Problemanalyse 11<br />
2.1 Meta-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.1.1 Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.1.2 Transformation der Daten . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.2 Verteilungsstrategien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.2.1 Rollout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.2.2 Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3 Datenmodell 17<br />
3.1 Gliederung der Datenblöcke . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
3.1.1 leere Ebenen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3.1.2 Adressierung der Dateneinheiten - CCMPath . . . . . . . . . . . . 21<br />
3.2 Konfigurationseinheiten . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
3.2.1 Standardtypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
3.2.2 Ableitungen der Typen . . . . . . . . . . . . . . . . . . . . . . . 24<br />
3.3 Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
3.3.1 Ref-Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
3.3.2 EQ-Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
4 Verwaltung und Verteilung der Daten 35<br />
4.1 Abstrakte Sicht der Daten – RAA . . . . . . . . . . . . . . . . . . . . . . 35<br />
4.2 Verteilung der Daten – Connections . . . . . . . . . . . . . . . . . . . . 36<br />
4.3 Daten-Absicherung – LSA/RSA . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
4.3.1 Abstraktion des Schlüssel-Konzeptes . . . . . . . . . . . . . . . . 38<br />
4.4 Datentranformation – XML/INI . . . . . . . . . . . . . . . . . . . . . . 40<br />
4.5 Zustellung der Konfigurationsdaten . . . . . . . . . . . . . . . . . . . . . 40<br />
4.5.1 Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
4.5.2 Roll-Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
4.6 CCM-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
INHALTSVERZEICHNIS<br />
xi<br />
4.6.1 ADMIN-Zugang . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
4.7 Gesamtablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
4.7.1 Ablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />
4.7.2 Rollout-Besonderheiten . . . . . . . . . . . . . . . . . . . . . . . 45<br />
5 Administrierung des CCM-Systems 47<br />
5.1 Problemanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
5.1.1 CCM-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
5.1.2 Content-Administrierung . . . . . . . . . . . . . . . . . . . . . . 48<br />
5.2 Vergleich der existierenden XML-Editoren . . . . . . . . . . . . . . . . . 49<br />
5.2.1 XMLSpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
5.2.2 XAmple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
5.3 Lösungsvorschlag - das configTOOL . . . . . . . . . . . . . . . . . . . . . 51<br />
6 Ausblick 55<br />
6.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
6.1.1 Definition der Abhängigkeiten . . . . . . . . . . . . . . . . . . . . 55<br />
6.1.2 Auflösung der Abhängigkeiten . . . . . . . . . . . . . . . . . . . 59<br />
6.2 Automatische Installation . . . . . . . . . . . . . . . . . . . . . . . . . . 59<br />
6.2.1 Installationsdokumentation . . . . . . . . . . . . . . . . . . . . . 60<br />
6.3 Erweiterung zur funktionsbasierten Sicht . . . . . . . . . . . . . . . . . . 61<br />
6.3.1 Abbildung von Policies . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
7 Zusammenfassung 65<br />
7.1 Rückblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />
7.2 So geht es weiter ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
xii<br />
INHALTSVERZEICHNIS<br />
A Schnittstellen 69<br />
A.1 Secret . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
A.2 RuntimeInitializable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
A.3 ResourceAccessAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . 72<br />
A.4 Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
A.5 LocalSecurityAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />
A.6 RemoteSecurityAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />
B Datenmodell 77<br />
B.1 Schema-Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />
B.2 Beispiel-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82<br />
B.3 Abhängigkeitsdefinitionen . . . . . . . . . . . . . . . . . . . . . . . . . . 88<br />
C CCM-Konfiguration 91<br />
C.1 XMLSchema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />
C.2 Beispiel-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />
C.2.1 Server-seitige Konfiguration . . . . . . . . . . . . . . . . . . . . . 93<br />
C.2.2 Client-seitige Konfiguration . . . . . . . . . . . . . . . . . . . . . 96<br />
Glossar 99
Abbildungsverzeichnis<br />
1.1 FlexiTRUST-Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.2 FlexiTRUST-Interna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
3.1 EQ-Vererbung, Elementen-Vergleich . . . . . . . . . . . . . . . . . . . . 30<br />
3.2 Gesamtkonfiguration, Application-Sicht . . . . . . . . . . . . . . . . . . 30<br />
3.3 Datenbank-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
3.4 IS-Konfiguration (EQ-Vererbung) . . . . . . . . . . . . . . . . . . . . . . 33<br />
3.5 PI-Konfiguration (explizite EQ-Vererbung) . . . . . . . . . . . . . . . . 34<br />
4.1 RemoteAccessAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
4.2 Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
4.3 CCM-Sicherheitsadaptoren . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
4.4 CCM-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
4.5 CCM-Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
5.1 XMLSpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
5.2 XAmple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
5.3 configTOOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
5.4 configTOOL- CCM-Einstellungen . . . . . . . . . . . . . . . . . . . . . . 53<br />
6.1 Funktions- vs. Komponentensicht . . . . . . . . . . . . . . . . . . . . . . 62<br />
6.2 Policy-Validierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />
xiii
xiv<br />
ABBILDUNGSVERZEICHNIS
Kapitel 1<br />
Einleitung<br />
1.1 Problembeschreibung<br />
Egal, welches Computerprogramm man betrachtet, stellt man fest, dass es stets Mechanismen<br />
zur Steuerung vom Programmablauf gibt. Man spricht dabei über das Konfigurieren<br />
eines Programms. Mit Hilfe von sog. Konfigurationsparametern teilt man dem<br />
Programm mit, welche Aufgaben und auf welche Art erledigt werden sollen.<br />
Je einfacher das Programm ist, desto weniger Konfigurationsmöglichkeiten hat es. Zählt<br />
man jedoch die Anforderungen an die Umgebung dazu, so stellt man fest, dass sogar<br />
einfachste ”<br />
Hello World“-Programme über gewisse Konfigurationsmöglichkeiten solcher<br />
Art verfügen – sie müssen z.B. für das lokale Betriebssystem übersetzt worden und hier<br />
ausführbar sein.<br />
Betrachtet man dagegen komplexere Anwendungen, so muss die Laufzeitumgebung<br />
vielen Anforderungen genügen, damit die Anwendung überhaupt ausführbar wird, wie<br />
z.B. Lese- und Schreibrechte auf Programmresourcen, Bestehen einer Netzwerkverbindung<br />
bei verteilten Anwendungen, Authorisierung des Benutzers bei sicherheitskritischen<br />
Komponenten u.V.m.<br />
Das erste Problem tritt auf, wenn der Benutzer die Laufzeitanforderungen des Programms<br />
nicht kennt. Dies mag bei einfachen Programmen kein großes Problem sein,<br />
wenn man aber zu komplexeren Anwendungen übergeht stellt man schnell fest, dass<br />
die Antworte auf manche Fragen nicht immer auf der Hand liegen. Nicht ausreichendes<br />
Dokumentieren einer Anwendung führt sehr oft dazu, dass sie in einer nicht korrekten<br />
Laufzeitumgebung ausgeführt wird. Das führt manchmal zu unerwarteten und schwer<br />
erklärlichen Fehlern und irritiert den Benutzer.<br />
Ein anderes Problem stellen extern für ein Programm abgelegte Konfigurationsdaten<br />
dar. Typischerweise sind es Textdateien, welche bei der Initialisierung des Programms<br />
eingelesen werden und deren Inhalte Programmabläufe steuern. Neben den bereits<br />
erwähnten Anforderungen an die Laufzeitumgebung, die ebenso für solche Dateien<br />
1
2 KAPITEL 1. EINLEITUNG<br />
gelten (z.B. Zugriffsrechte), verbergen sich in den Konfigurationsdaten oft versteckte<br />
Abhängigkeiten, welche manchmal auch komponentenübergreifende Auswirkungen<br />
haben. So setzt z.B. eine Veränderung der Datenbank-Zugangsdaten die Existenz eines<br />
korrespondierenden Datenbank-Benutzerprofils voraus.<br />
Allgemein gesehen beschränken sich alle möglichen Konfigurationsprobleme auf die<br />
oben erwähnten Fälle. An dieser Stelle würde man sich vielleicht fragen, ob das wirklich<br />
Probleme sind, die man in einer Diplomarbeit behandeln müsste. Nun, wenn es um<br />
Eigenprodukte geht, bei denen alle beteiligten Entwickler ständig erreichbar sind, dann<br />
ist es tatsächlich kein so großes Problem, denn die Entwickler selbst können bestimmt<br />
mit eigenen Programmen umgehen und wissen genau, welche Einstellungen welche Folgen<br />
nach sich ziehen. Eine andere Situation hat man, wenn es ums Konfigurieren eines<br />
fremden Produktes geht oder wenn die für eine Komponente verantwortliche Personen<br />
gerade nicht da sind.<br />
Um dies zu verdeutlichen wird an dieser Stelle das Verhalten eines komplexen IT-<br />
Systems analysiert. Als Beispiel für fast alle in dieser Arbeit diskutierten Fälle wird<br />
die Trustcenter-Software FlexiTRUST (siehe [9]) verwendet. Dabei handelt es sich um<br />
ein komplexes verteiltes System, welches sehr viele Konfigurationsmöglichkeiten bietet<br />
und dabei zeigt, wie viele Abhängigkeiten es zwischen einzelnen Komponenten eines<br />
Systems geben kann und wie diese das Konfigurieren des gesamten Systems erschweren<br />
können.<br />
1.1.1 FlexiTRUST<br />
An dieser Stelle wird kurz Architektur von FlexiTRUSTpräsentiert. Dabei wird das Ziel<br />
sein, kein Benutzerhandbuch für FlexiTRUSTzu erstellen, sondern die Funktionen vom<br />
Trustcenter kurz zu beschreiben und einzelne Komponenten des Systems darzustellen.<br />
Trustcenter<br />
Bei einer Public Key Infrastruktur (PKI, siehe [4]) bildet das Vertrauen in sog. digitale<br />
Ausweise das Fundament. Solche Ausweise (auch Zertifikate genannt) beinhalten neben<br />
den Identifizierungsdaten einer Person (Name, Firma etc.) und ihrem öffentlichen<br />
Schlüssel auch eine digitale Signatur einer vertrauenswürdigen Instanz, welche Identität<br />
dieser Person bestätigt. So eine Instanz kann z.B. eine Bank oder eine Behörde sein. Der<br />
Benutzer, welcher ein solches Zertifikat einer anderen Person empfängt, sieht, welche<br />
Person damit autorisiert wird und welche Instanz dies bestätigt. Daraufhin entscheidet<br />
man, ob man dem Zertifikat (und der dahinter stehenden Person) vertraut werden<br />
kann.<br />
Bei angesprochenen vertrauenswürdigen Instanzen handelt es sich um sog. Trustcenter.<br />
Die Aufgaben eines Trustcenters sind u.a.:<br />
• Registrierung neuer Anträge zum Erstellen von Benutzerzertifikaten.
1.1. PROBLEMBESCHREIBUNG 3<br />
• Generieren eines Zertifikates<br />
• Publizieren von Zertifikaten in öffentlichen Verzeichnisdiensten (z.B. LDAP)<br />
• jederzeitiges Verifizieren eines jeden Zertifikates<br />
• Durchführung einer Sperrung von Zertifikaten<br />
Die folgende Abbildung 1.1 auf Seite 3 zeigt eine allgemeine Aufbau eines Trustcenters.<br />
Bei diesem Bild handelt es sich um eine leicht stilisierte Darstellung von Trustcenter-<br />
Komponenten. Man sieht die drei Hauptkomponenten (RA, CA und IS), welche das<br />
Kern eines Trustcenters bilden sowie den FlexiProvider (Kryptoprovider), der alle notwendige<br />
kryptografische Algorithmen implementiert.<br />
Abbildung 1.1: FlexiTRUST-Architektur<br />
Verlässt man diese Abstraktionsebene und taucht etwas tiefer ein, so findet man eine<br />
Fülle von Komponenten, die in ständiger Interaktion miteinander sind und Funktionalitäten<br />
der Hauptkomponenten erweitern. Im Bild 1.2 auf Seite 4 wird das Zusammenspiel<br />
der Komponenten grafisch dargestellt.<br />
Komponentenüberblick<br />
Nachfolgend werden alle im Bild 1.2 dargestellte Komponenten benannt und ihre Funktionen<br />
erläutert. Dabei wird hier ausdrücklich darauf hingewiesen, dass die nachfolgende
4 KAPITEL 1. EINLEITUNG<br />
Abbildung 1.2: FlexiTRUST-Interna<br />
Liste der Komponenten nicht alle zur Zeit implementierte und eingesetzte Komponenten<br />
umfasst und dass nicht alle Konfigurationsvarianten beschrieben werden.<br />
Alle Komponenten sind in zwei Hauptgruppen (RA/IS und CA) und noch zwei weiteren<br />
optionalen Gruppen (Letter-Print und Personalisierung) unterteilt. Normalerweise<br />
werden RA/IS- und CA-Gruppen auf unterschiedlichen Rechnern betrieben, was zur<br />
Sicherheit des Gesamtsystems beiträgt. Optionale Komponentengruppen können bei<br />
Bedarf entweder auf dem RA/IS-Rechner laufen oder auf weitere externe Rechner verteilt<br />
werden.<br />
Registration Authority (RA) Die Aufgaben der RA sind u.A. Entgegennahme<br />
von Anträgen, ihre Überprüfung auf Vollständigkeit und Weiterleitung an die CA. Die<br />
Antragsdaten können übers Web-Frontend oder mittels eines Import-Tools eingegeben<br />
werden und bleiben in der lokalen Datenbank abgelegt.
1.1. PROBLEMBESCHREIBUNG 5<br />
Infrastructure Services (IS) Abhängig vom Aufgabenprofil müssen generierte Daten<br />
(Zertifikate, Schlüsselpaare etc.) weiter verarbeitet werden, z.B. in Verzeichnisdiensten<br />
veröffentlicht, in der Datenbank archiviert, an den Kunden verschickt etc. Dies und<br />
mehr sind die Aufgaben der IS-Komponente.<br />
Import Export Tool (ImpEx) Um den Datentransfer zum Trustcenter sowie zwischen<br />
einzelnen Trustcenter-Rechnern zu automatisieren wurde die ImpEx-Komponente<br />
entwickelt. Zu ihren Aufgaben zählen u.A. der Import von Antragsdaten in Form von<br />
CSV-Dateien, Transfer der Daten zwischen dem RA/IS- und dem CA-Rechner, Erstellung<br />
von Statistiken sowie Sortierung der Dateien nach Mandantenzugehörigkeit.<br />
ProductInspector (PI) Am Anfang nur als ein Tool zum Administrieren der RA/IS-<br />
Datenbank gedacht entwickelte sich der ProductInspector zu einem mächtigen, fast<br />
beliebig erweiterbaren Werkzeug, welches Datenbankinhalte der Trustcenter-Tabellen<br />
über das Web-Frontend anzeigt, BLOB-Felder inspizieren lässt, profilspezifische Operationen<br />
und Tabellenfilter anbietet u.V.m.<br />
Certification Authority (CA) Die Kernkomponente eines jeden Trustcenters! Die<br />
CA übernimmt die eigentliche Generierung von Zertifikaten und evtl. Schlüsselpaaren,<br />
Erstellung von Revokationslisten zum Sperren von Zertifikaten sowie optional elektronische<br />
Personalisierung von Smartkarten. Die CA verwendet ihre eigene Datenbank,<br />
in welcher alle antragsrelevante Daten abgelegt werden. Optional kann die CA mit<br />
einer Eracom-Karte ausgestattet werden, welche sicheres Generieren von Schlüsselpaaren<br />
auf der Hardware-Ebene ermöglicht. Werden Smartkarten personalisiert, so wird<br />
ein Eltron-Drucker angeschlossen, welcher den Karten entsprechend eingetroffene Anträgen<br />
einzieht und elektronisch personalisiert (= Zertifikate und Schlüsselpaare auf die<br />
Karten schreibt)<br />
Listener Die Personalisierung der Smartkarten kann nachträglich auch außerhalb<br />
der CA erfolgen. In diesem Fall werden alle Daten von der CA vorbereitet und an den<br />
RA/IS-Rechner zurückgegeben. Hier werden sie vom Listener erwartet und mit Hilfe<br />
eines Eltron-Druckers elektronisch personalisiert. Im gleichen Schritt werden Karten<br />
auch optisch personalisiert (= bedruckt), und zwar mit einer Fremdkomponente namens<br />
”BadgeMaker”.<br />
Letter-/PIN-Print Bei vielen Systemkonstellationen müssen Benachrichtigung- bzw.<br />
PIN-Briefe gedruckt werden. Diese Aufgaben übernimmt die Letter-/PIN-Print-Komponente,<br />
welche Daten der RA/IS-Datenbank entnimmt, diese nach XML konvertiert<br />
und mittels einer extern definierten XSLT-Datei (XSL-FO-Transformation) ausdruckt.
6 KAPITEL 1. EINLEITUNG<br />
Wie man sieht, wurde FlexiTRUST nicht ohne Grund als Beispiel für Diskussion über<br />
komplexe Beziehungen innerhalb eines Systems ausgewählt. Man hat hier viele Komponenten,<br />
die miteinander in Relationen stehen und deren Abläufe durch Veränderung<br />
der Konfigurationsdaten leicht beeinflusst werden können.<br />
1.1.2 Konfigurationsdaten<br />
An dieser Stelle wird ein weiteres Problem eines solchen Systems dargestellt – heterogene<br />
Konfigurationsdatei-Formate. Dieses Problem taucht auf bei komplexen Systemen,<br />
welche während einer langen Zeitperiode und durch mehrere Entwickler entstanden<br />
sind und dabei immer wieder weiterentwickelt wurden. Aber auch andere Systeme, die<br />
nach einer genaueren Planungsphase entstanden sind, können über solche Heterogenität<br />
verfügen und zwar z.B. durch Benutzung anderer Fremdkomponenten, bei welchen man<br />
auf ein bestimmtes Format von Konfigurationsdaten angewiesen ist.<br />
Property-Files<br />
Typischerweise werden Konfigurationsdaten in Form von Property-Files (auch INI-<br />
Files genannt) abgelegt. Dabei handelt es sich um einfache Textdateien, bei welchen in<br />
jeder Zeile ein Konfigurationspaar = zu finden ist. Die eigentlichen<br />
Konfigurationswerte (value) werden von Programmen über zugehörige Namen (name)<br />
angesprochen.<br />
Die so definierten Properties müssen dabei eindeutige Namen tragen, wodurch diese<br />
Art der Speicherung folgende Schwächen aufweist:<br />
1. Eine Gruppierung der auf der logischen Ebene zusammengehörenden Konfigurationseinheiten<br />
ist nicht möglich;<br />
2. Listen von gleichnamigen Parametern lassen sich nicht ohne Weiteres beschreiben;<br />
3. Der Wertebereich ist für Konfigurationsparameter nicht definierbar;<br />
4. Es ist kein Integritätsschutz der Konfigurationsdaten ohne zusätzlichen Maßnahmen<br />
möglich;<br />
5. Abhängigkeiten zwischen Konfigurationsdaten können nicht automatisch ermittelt<br />
und aufgelöst werden.<br />
Dazu ein erläuterndes Beispiel:<br />
Beispiel 1 Es wird eine abstrakte Konfiguration beschrieben, welche u.A. eine variable<br />
Anzahl der Datenbankverbindungen beschreiben soll. Dabei wird eine DB-Verbindung<br />
durch folgende Größen definiert:
1.1. PROBLEMBESCHREIBUNG 7<br />
• Datenbank-URL<br />
• Datenbank-Treiber (mySQL, Oracle, ...)<br />
• Benutzername<br />
• Benutzerpasswort<br />
Will man eine solche Struktur in Form eines Property-Files beschreiben, so entsteht in<br />
etwa folgendes:<br />
URL = jdbc:mysql://localhost/flexitrust<br />
DRIVER = org.gjt.mm.mysql.Driver<br />
USER = root<br />
PASS = root<br />
...<br />
Versucht man eine Art Strukturierung durch Vergabe entsprechenden Prefixe (z.B. DB )<br />
für Parameternamen deutlich zu machen (→ 1), so entsteht in etwa folgende Beschreibung:<br />
DB_URL = jdbc:mysql://localhost/flexitrust<br />
DB_DRIVER = org.gjt.mm.mysql.Driver<br />
DB_USER = root<br />
DB_PASS = root<br />
...<br />
Da in diesem Beispiel n verschiedene Datenbank-Verbindungen definierbar sein sollen<br />
(→ 2), ändert sich die Property-File-Beschreibung zu:<br />
# n = 5<br />
DB_COUNT = 5<br />
# für n = 1<br />
DB_1_URL = jdbc:mysql://localhost/flexitrust_1<br />
DB_1_DRIVER = org.gjt.mm.mysql.Driver<br />
DB_1_USER = rauser<br />
DB_1_PASS = rauser<br />
# ...<br />
# für n = 5
8 KAPITEL 1. EINLEITUNG<br />
DB_5_URL = jdbc:mysql://localhost/flexitrust_2<br />
DB_5_DRIVER = org.gjt.mm.mysql.Driver<br />
DB_5_USER = isuser<br />
DB_5_PASS = isuser<br />
1.2 Anforderungen<br />
Um die im oberen Kapitel genannte Veränderungen der Programmabläufe unter Kontrolle<br />
zu halten sollte das Konfigurationsmanagementsystem gewissen Anforderungen<br />
genügen. Nach langer Analyse kristallisierten sich folgende Anforderungen aus:<br />
1.2.1 Zugriffsmechanismus<br />
Obwohl Property-Files auf einfache Weise mittels java.util.Properties-Klasse geladen<br />
werden können, müssen die darin enthaltene Datenstrukturen anschließend durch<br />
das manuelle Interpretieren der Konfigurationswerte ausgelesen werden. Die Anwendung,<br />
die die obere Beispielkonfiguration einliest, muss z.B. erst die Anzahl der darin<br />
definierten DB-Konfigurationsblöcke auslesen (hier – 5), dann die Parameternamen für<br />
verschiedene Blöcke bilden (DB 1 URL, DB 2 URL, ...) und anschließend entsprechende<br />
Werte auslesen. Dabei sollte man die Prozedur der Fehlerbehandlung auf keinen Fall<br />
vergessen!<br />
Gewünscht ist also ein Mechanismus, der einheitliche Lese-/Schreibzugriffe auf Konfigurationsdaten<br />
erlaubt, so dass auch auf die komplexen Datenstrukturen über diese<br />
einheitliche Schnittstelle zugegriffen werden könnte.<br />
1.2.2 logische Strukturierung der Daten<br />
Eine Strukturierung der Konfigurationsdaten dient in erster Linie der besseren Lesbarkeit<br />
der Dateien. Obwohl man bei Property-File-Strukturen gewisse Pseudo-Strukturierung<br />
durch Hinzufügen von Prefixen erreicht, sieht die Konfigurationsdatei trotzdem<br />
noch ”flach” unstrukturiert aus. Außerdem müssen die einzelnen Konfigurationsparameter<br />
getrennt voneinander ausgelesen und interpretiert werden. So sind es in der oberen<br />
Beispielkonfiguration 4 Werte, die eine Datenbank-Verbindung beschreiben; diese<br />
werden auch getrennt voneinander eingelesen und ausgewertet, obwohl sie auf der logischen<br />
Ebene zur gleichen Struktur gehören.<br />
Für eine Beschreibung der komplexen Daten benötigt man unbedingt eine Möglichkeit,<br />
Daten strukturiert zu definieren.
1.2. ANFORDERUNGEN 9<br />
1.2.3 gleichnamige Parameterlisten<br />
Weil Properties eindeutig benannt werden müssen, kommt es bei der Beschreibung von<br />
Listen gleichnamiger Parametern zu einem weiteren Problem – eigentlich gleich heißende<br />
Properties sollen nun verschiede Namen tragen. Die Beispielkonfiguration stellt diese<br />
Situation gut dar: Es werden 5 Datenbank-Verbindungen beschrieben, alle Properties<br />
beginnen mit dem Prefix DB (Gruppierung), gefolgt von der Nummer der Property in<br />
der Liste (1...5).<br />
Obwohl es auch bei Property-Files möglich ist, Listen gleichnamiger Properties zu beschreiben,<br />
erfordert diese Lösung gewissen Programmieraufwand und ist nicht ohne<br />
Weiteres einsetzbar. Man bräuchte also eine standardisierte Möglichkeit, solche Listen<br />
zu beschreiben, ohne dass es zu großem Aufwand beim Lesen/Schreiben der Konfigurationsdaten<br />
kommt.<br />
1.2.4 Wertebereich<br />
Je größer die Konfigurationsdateien sind, desto genauer sollen die Properties benannt<br />
werden! Denn bei einer großen Anzahl der Konfigurationsparametern wird ein Entwickler<br />
sehr schnell durcheinander gebracht. Wenn die Konfigurationsdateien dabei nicht<br />
ausreichend kommentiert sind, dann bekommt man sehr schnell das Problem, dass<br />
man nicht weiß, welche Werte für ein Property zulässig sind und was sie bedeuten.<br />
So muss man z.B. wissen, dass der Datenbank-Treiber (Beispielkonfiguration) inklusive<br />
alle Packagenamen angegeben werden soll, und dass der Datenbank-URL Kommunikationsprotokoll<br />
(jdbc:mysql:) vorangestellt werden soll.<br />
Es wäre sehr hilfreich, eine Möglichkeit zu haben, eine Art Definitionsbereich für die<br />
Konfigurationswerte anzugeben. Noch besser wäre es, wenn im Falle einer Liste möglicher<br />
Werte diese dem Benutzer zur Auswahl angeboten werden. Die gesetzten Werte<br />
sollen am Besten noch vor der Ausführung des Programms auf Korrektheit überprüft<br />
werden!<br />
1.2.5 Integritätsschutz<br />
Oft sind die in der Konfiguration definierten Parameter sicherheitskritisch. Falsch definierte<br />
Kombinationen von Parametern können zu einer Sicherheitslücke führen, im<br />
schlimmsten Fall sogar zum Crash des ganzen Systems! Daher sollen korrekte Konfigurationen<br />
von ”nicht gut durchdachten” Änderungen seitens Dritter geschützt werden.<br />
Wünschenswert wäre es, wenn man ein Mechanismus hätte, der die abgelegten Konfigurationen<br />
sicher aufbewahrt und vor unauthorisierten Veränderungen schützt. Dies wäre<br />
z.B. durch digitale Signaturen, die über die Konfigurationsdateien gebildet werden,<br />
möglich.
10 KAPITEL 1. EINLEITUNG<br />
1.2.6 Profil-Verwaltung<br />
Komplexe Systeme wie z.B. FlexiTRUST haben oft mehrere Profile (verschiedene Konfigurationen),<br />
die das System den Bedürfnissen des Auftraggebers anpassen. ”Fertige”<br />
Konfigurationen (oder anders genannt – Releases) möchte man gerne als eigenes Konfigurationsprofil<br />
ablegen und bei Bedarf schnell widerherstellen, ohne dass die anderen<br />
Profile davon betroffen werden.<br />
Konfigurationsmanagementsystem soll den Anwendern eine Möglichkeit geben, solche<br />
Profile mit geringem Aufwand zu erstellen und zu verwalten. Dabei sollen Abhängigkeiten<br />
zwischen einzelnen Konfigurationsdateien mit verwaltet werden, so dass ein Profil<br />
selber weiß, aus welchen Dateien es besteht.<br />
1.2.7 Abhängigkeiten der Konfigurationsdaten<br />
Manchmal existieren gewisse Abhängigkeiten zwischen verschiedenen Konfigurationsdaten,<br />
die evtl. auch in unterschiedlichen Dateien definiert werden. Oder es werden<br />
gleiche Parameter in mehreren Dateien definiert, so dass sie eigentlich immer gleich<br />
sein sollen.<br />
Ein anderes Beispiel: Eine Anwendung verwendet Konfigurationsdateien, die von der<br />
Umgebung bereitgestellt werden und die<br />
• in einem anderen Datenformat abgelegt worden sind (z.B. XML vs. Properties)<br />
oder<br />
• an einer vordefinierten Stelle liegen müssen (z.B. Tomcat, JBoss)<br />
Solche Konfigurationsdateien können nicht vollständig vom Management-System verwaltet<br />
werden, eine Teilmenge der Konfigurationsparametern soll daher aus dem Management-System<br />
in diese übertragen werden (sog. Synchronisation der Konfigurationsdaten).<br />
Hierbei hat man oft große Schwierigkeiten, weil man nicht immer weiß,<br />
welche Abhängigkeiten es überhaupt existieren und ob sie alle bereits berücksichtigt<br />
wurden. Wenn ein Konfigurationsparameter geändert werden muss, so muss man auch<br />
sicherstellen, dass alle deswegen notwendigen Änderungen (auch an weiteren Parametern)<br />
durchgeführt wurden. Hat man eine Abhängigkeit vergessen zu berücksichtigen, so<br />
führt es oft zu ”komischen” Seiteneffekten bzw. Fehlern, die sehr schwer zu lokalisieren<br />
sind!<br />
Das Management-System soll in der Lage sein, solche Abhängigkeiten zwischen Konfigurationsdaten<br />
zu definieren bzw. zu verwalten. Am besten sollen bei Änderungen<br />
eines Datensatzen alle dafür notwendige Änderungen anderer Datensätze automatisch<br />
durchgeführt werden. Ist dies nicht möglich, so soll zumindest eine Liste der betroffenen<br />
Abhängigkeiten ausgegeben werden, jeweils mit einem Kommentar, wie diese aufgelöst<br />
werden könnten.
Kapitel 2<br />
Problemanalyse<br />
Noch ohne sich auf ein bestimmtes Datenformat oder eine bestimmte Architektur zu<br />
binden werden in diesem Kapitel Überlegungen über mögliche Verwaltungsstrategien<br />
der Konfigurationsdaten solcher komplexen IT-Systemen erläutert.<br />
Abstrakt betrachtet existieren zwei Möglichkeiten solche Systeme zu verwalten:<br />
• Konfigurationseinheiten (Dateien) bleiben zwischen den Systemkomponenten verteilt.<br />
Ein Verwaltungsmodul enthält Informationen über das jeweilige Speicherort,<br />
Dateiformat sowie weitere Metadaten (wie z.B. Definitionsbereiche, Profilzugehörigkeit,<br />
etc.);<br />
• Alle Konfigurationsdaten werden zentral in einer abstrakten Form gespeichert.<br />
Beim Initialisieren des Systems werden einzelne Dateneinheiten an die Komponenten<br />
verteilt.<br />
Beide dieser Möglichkeiten haben sowohl Vor- als auch Nachteile.<br />
Im Fall von verteilter Konfiguration hat man eine heterogene Datenmenge, die nur<br />
mit erheblichem Aufwand auf Abhängigkeiten geprüft werden kann. Dazu kommen<br />
Probleme der Zugriffsrechte für einzelne Dateien, wenn es sich um ein Unix/Linuxbasiertes<br />
System handelt.<br />
Im Falle einer zentralen Speicherstelle hat man die oben genannten Probleme nicht,<br />
dagegen kommen aber ein paar andere hinzu. So ist es bei zentralisierter Konfigurationsverwaltung<br />
notwendig, einzelne Dateneinheiten (Dateien) den Anwendungen zur<br />
Verfügung zu stellen. Da die Daten an sich in einer abstrakten Form abgelegt sind<br />
müssen entweder alle Komponenten des Systems umgebaut werden, damit sie Konfigurationsdaten<br />
dieser Art verarbeiten können, oder die Daten zu ursprünglichen Dateiformaten<br />
transformiert und den Komponenten in dieser für sie verständlichen Form<br />
zugestellt werden.<br />
11
12 KAPITEL 2. PROBLEMANALYSE<br />
Trotz aller oben erwähnten Probleme wird hier (wie man dem Titel dieser Arbeit entnehmen<br />
kann) die letztere Variante der Konfigurationsverwaltung bevorzugt, und das<br />
aus folgendem Grund:<br />
Probleme der zentralisierten Konfigurationsverwaltung sind zwar nicht trivial zu<br />
lösen, dafür sind sie aber definitiv lösbar, und zwar mit Hilfe von unterschiedlichen<br />
Standardverfahren, die auf nächsten Seiten näher erläutert werden. Eine<br />
Verwaltung der verteilten Konfigurationseinheiten erzwingt dagegen Entwicklung<br />
neuer Verfahren, die speziell auf diese Probleme orientiert werden müssen.<br />
Darüber hinaus sind mehrere Probleme (wie z.B. Anaylse der Datenabhängigkeiten,<br />
Definitionsbereich, etc.) im Allgemeinen gar nicht oder nur bedingt lösbar.<br />
2.1 Meta-Konfiguration<br />
Unter Metadaten werden hier Konfigurationsdaten verstanden, welche an einer zentralen<br />
Stelle in einer abstrakten Form vorliegen. Neben eigentlichen Konfigurationsdaten<br />
gehören dazu:<br />
• Datentypen zur Eingrenzung der Definitionsbereiche;<br />
• ursprüngliches Format der Konfigurationsdatei sowie zu einer Rücktransformation<br />
in dieses Format notwendige Angaben.<br />
2.1.1 Anforderungen<br />
Betrachtet man alle oben genannten Anforderungen an das Verwaltungssystem, so stellt<br />
man schnell fest, dass die Struktur solcher Metadaten sehr flexibel sein muss. Ausgehend<br />
von dieser Feststellung führt ein weiterer Schritt unvermeidlich zur Festlegung des<br />
Formats, und zwar zu XML. Die Gründe dafür liegen auf der Hand (folgend werden<br />
oben definierte Anforderungen nochmals iteriert):<br />
Zugriffsmechanismen<br />
Es gibt viele standardisierte Zugriffsmechanismen für XML-Datenstrukturen. Die<br />
meisten davon können über JAVA sehr einfach verwendet werden. Hier sei JAXB<br />
hervorzuheben, da es sehr intuitive Lese-/Schreibmöglichkeiten für XML-Datenstrukturen<br />
bietet.<br />
logische Strukturierung der Daten<br />
XML erlaubt beliebig tief verschachtelte Datenstrukturen zu definieren. Die Beispielkonfiguration<br />
einer Datenbank-Verbindung aus dem letzten Kapitel hätte wie<br />
folgt aussehen können:
2.1. META-KONFIGURATION 13<br />
<br />
jdbc:mysql://localhost/flexitrust<br />
org.gjt.mm.mysql.Driver<br />
root<br />
root<br />
<br />
oder als eine Attribut-Variante:<br />
<br />
gleichnamige Parameterlisten<br />
Das Problem der Beschreibung von Listen gleichnamiger Elemente existiert bei<br />
XML nicht! Mehrere Konfigurationsparameter mit gleichen Namen können einfach<br />
nacheinander definiert werden, stellen somit verschiedene XML-Knoten dar<br />
und werden dementsprechend getrennt behandelt. Beim Lesen der Daten mit<br />
JAXB bekommt man z.B. einen Vektor von Elementen gleichen Typs zurück und<br />
kann von diesem die Werte sehr leicht ablesen.<br />
Wertebereich<br />
Verwendung von XMLSchema-Sprache erlaubt eine präzise Definition von erlaubten<br />
Werten eines jeden XML-Knoten. XMLSchema erlaubt genaue Typisierung<br />
der Daten, Einschränkung und Erweiterung der Standardtypen wie Zahl, Text<br />
etc. sowie Bildung komplexer Datenstrukturen. Durch entsprechende XMLSchema-<br />
Definitionen könnte man also festlegen, welche Konfigurationsknoten welche Werte<br />
annehmen können und somit eine Art Syntax-Überprüfung der Gesamtkonfiguration<br />
implizit durchführen.<br />
Integritätsschutz<br />
Integritätsschutz der XML-Dateien kann durch digitale Signaturen dieser gewährleisten<br />
werden. Es existieren bereits Verfahren zum Bilden und zum anschließenden<br />
Verifizieren von digitalen Signaturen eines XML-Dokumentes.<br />
Profil-Verwaltung<br />
Das Problem der Profil-Verwaltung lässt sich durch Entwicklung zusätzlicher Verwaltungstools<br />
lösen und hängt nicht vom eigentlichen Datenformat ab.<br />
Abhängigkeiten<br />
Datenabhängigkeiten lassen sich mit Hilfe zusätzlich definierten Metadaten auflösen.<br />
Man könnte spezielle XML-Tags definieren, welche die Abhängigkeit(en)
14 KAPITEL 2. PROBLEMANALYSE<br />
eines Datensatzes sowie das Verhalten des Management-Systems beim Auftreten<br />
dieser beschreiben. Synchronisationsaktionen lassen sich dagegen komplett mit<br />
Verwaltungstools realisieren, die dann solche Zusatzinformationen in den Metadaten<br />
interpretieren.<br />
2.1.2 Transformation der Daten<br />
Konfigurationsdateien liegen normalerweise in einem lesbaren Format vor. Sei es INI-,<br />
CSV- oder XML-Dateien, der Oberbegriff dafür lautet - Textdateien. Man braucht also<br />
aus einer XML-Struktur (Metadaten) eine Textdatei zu erzeugen oder anders formuliert<br />
- XML-Daten sollen in eine TEXT-Form überführt (=tranformiert) werden.<br />
Spätestens beim Wort ”Transformieren” denkt jeder Informatiker an die XSLT-Technologie,<br />
welche als Ziel gerade das Transformieren von XML-Dokumenten in andere Text-<br />
Formate hat. Für Transformation von Metadaten können also entsprechende XSLT-<br />
Transformationen definiert werden. Da es sich bei Konfigurationsdateien meistens um<br />
Textdateien einer einfachen Form handelt, sind solche Transformationen sehr einfach<br />
zu definieren.<br />
2.2 Verteilungsstrategien<br />
An dieser Stelle, an der das Format der Metadaten bereits festliegt und die allgemeine<br />
Architektur des Systems zur Konfigurationsverwaltung bekannt ist, werden zwei<br />
mögliche Arten der Verteilung von Konfigurationseinheiten (Dateien) analysiert.<br />
2.2.1 Rollout<br />
Unter dem Begriff Rollout versteht man eine Strategie zur Verteilung der Konfigurationsdateien,<br />
bei welcher alle Dateien auf einmal erzeugt und im ganzen Systems an<br />
die richtigen Plätze abgelegt werden. Die Gesamtkonfiguration wird quasi vom Verwaltungsmodul<br />
ausgerollt und betrifft immer alle Knoten des Sytems (alle Konfigurationsdateien).<br />
Das Positive an dieser Strategie ist:<br />
• es sind keine Modifikationen der einzelnen Komponenten des Systems notwendig,<br />
da diese wie gehabt die Konfigurationen auslesen;<br />
• mit einer Aktion ausgehend vom Konfigurationverwaltungsmodul wird die gesamte<br />
Konfiguration des Systems aktualisiert.<br />
Die Strategie hat aber auch folgende Nachteile:
2.2. VERTEILUNGSSTRATEGIEN 15<br />
• bei komplexen Systemen wie FlexiTRUST gibt es Offline-Komponenten (z.B. CA),<br />
welche über keine Netzwerkverbindung mit anderen Komponenten verfügen. Konfigurationen<br />
solcher Komponenten können nicht automatisch aktualisiert werden.<br />
• Darüber hinaus ist es nicht immer möglich sicherzustellen, ob eine Aktualisierung<br />
der Konfigurationsdaten tatsächlich erfolgte, weil manche Komponenten z.B. zum<br />
Zeitpunkt der Aktualisierung laufen könnten und ihre Konfigurationsdateien dadurch<br />
nicht beschreibbar wären.<br />
• bei der Rollout-Strategie müssen zusätzliche Angaben in die Metadaten aufgenommen<br />
werden, wie z.B. Namen und Pfade der Konfigurationsdateien, ihre<br />
Rechte etc. Dabei erzeugt alleine die Angabe von Pfaden ein erhebliches Problem:<br />
Diese zählen ebenso zu Konfigurationsdaten und müssen entsprechend behandelt<br />
werden (z.B. Abhängigkeiten mit anderen Konfigurationseinheiten)<br />
• Da das Ausrollen erst nach der Umformung der Daten zum ursprünglichen Format<br />
erfolgt, können keine weiteren Maßnahmen zum Schutz der Datenintegrität<br />
getroffen werden. Denn die Konfigurationsdaten liegen im Endeffekt im Klartext<br />
vor und können evtl. nach dem Ausrollen geändert werden. Um dieses Problem<br />
zu lösen könnte man vor jedem Systemstart einen zusätzlichen Test durchführen,<br />
welcher ausgerollte Konfigurationsdaten nach Unversehrtheit prüft. Dies stößt<br />
aber wiederum auf das Problem von Offline-Komponenten, bei welchen es keine<br />
Verbindung nach draußen und somit keine Kontrolle-Möglichkeit gibt.<br />
Allgemeiner gesehen besteht das Problem der Rollout-Strategie in der unidirektionalen<br />
Kontrolle über die Konfigurationsdaten: In jenem Moment, in welchem Daten das<br />
Verwaltungssystem verlassen, geht auch jegliche Kontrolle über sie verloren.<br />
2.2.2 Request<br />
Die Idee der Request-Verteilungsstrategie ist sehr einfach: Konfigurationseinheiten (Dateien)<br />
werden von einzelnen Komponenten bei Bedarf angefragt und werden ihnen zur<br />
Laufzeit zur Verfügung gestellt. Es wird vom System also ein kleines Proxy-Modul bereitgestellt,<br />
welches Anfragen solcher Art empfängt und an den Konfigurationsdienst<br />
weiterleitet.<br />
Vorteile einer solchen Lösung sind:<br />
• Integritätsschutz wird immer gewährleistet, da die Konfigurationsdaten erst bei<br />
der Anfrage in das Originalformat konvertiert und an die jeweilige Komponenten<br />
geschickt werden. Konfigurationsdaten können also immer signiert vorliegen und<br />
werden bei jedem Zugriff auf Korrektheit geprüft!<br />
• Durch beidseitige Kontrolle kann auch das Problem der Offline-Komponenten<br />
gelöst werden, indem die Kommunikation mit dem Dienst auf einer abstrakteren<br />
Ebene mit Hilfe von sich auf einem Datenträger befindenden Dateien darstellen<br />
lässt.
16 KAPITEL 2. PROBLEMANALYSE<br />
• Bei jedem Start einer Komponente kann ihr stets die aktuellste Konfiguration zur<br />
Verfügung gestellt werden.<br />
Als Varianten der Request-Strategie gibt es eine Online- und eine Offline-Version.<br />
Bei der Online-Version werden einzelne Komponenten so geändert, dass sie keine Konfigurationsdateien<br />
einlesen, sondern einen Konfigurationsstream auswerten, welchen sie<br />
von dem Proxy bekommen. Dadurch braucht man z.B. Angaben zu Konfigurationsdateinamen,<br />
-pfaden und -rechten nicht zu speichern, was schon einen großen Vorteil mit<br />
sich bringt!<br />
Möchte man keine Änderungen an den Komponenten vornehmen, so kann man die<br />
Offline-Variante verwenden, welche einen Hybrid der Rollout- und Request-Strategie<br />
darstellt – Konfigurationsdaten werden immer noch (bei Bedarf) angefragt, anschließend<br />
aber von den lokal vorhandenen Proxies ausgerollt (an die richtigen Plätze gebracht).<br />
Durch das Kombinieren dieser beiden Varianten bekommt man einen flexiblen<br />
Mechanismus, welcher sowohl Probleme der Offline-Komponenten als auch Konfiguration<br />
von Fremdkomponenten verwalten lässt, bei den man auf das Format und Pfad<br />
der Konfigurationsdateien gebunden ist.
Kapitel 3<br />
Datenmodell<br />
In diesem Kapitel wird die Struktur der Meta-Konfiguration festgelegt. Unter Meta-<br />
Konfiguration versteht man, wie bereits erwähnt, Konfigurationsdaten inklusive zusätzlicher<br />
Informationen wie Wertebereiche, Kommentare, etc.<br />
Am Anfang sollte man das allgemeine Problem der Ablageform lösen. Damit sind zwei<br />
Varianten gemeint, um Konfigurationsdaten auf einem Datenträger abzulegen:<br />
• Konfigurationen einzelner System-Komponenten werden in unterschiedlichen Dateien<br />
(oder sogar Verzeichnissen) abgelegt. Die Unterteilung auf der obersten<br />
logischen Ebene wird also dem Dateisystem überlassen.<br />
• Alle Konfigurationsdaten aller Komponenten werden in einer globalen XML-Datei<br />
abgelegt, welche entsprechende logische Gliederung der Datenblöcke vornimmt.<br />
Auf den ersten Blick scheint die erste Ablageform einfacher realisierbar zu sein. Je<br />
mehr man aber darüber nachdenkt, desto klarer wird die Tatsache, dass die erste<br />
Einschätzung falsch ist – Man überlässt zwar eine bis zwei logischen Strukturierungsebenen<br />
(siehe weiter unten) dem Dateisystem, bekommt dadurch aber mehr Probleme als<br />
Vorteile, wie z.B. Verwaltung von Datei- und Verzeichnissrechten, Synchronisationsmechanismen<br />
bei gleichzeitiger Benutzung einzelner Dateien, das Verhalten im Fehlerfall,<br />
wenn eine oder mehrere Dateien fehlen usw.<br />
3.1 Gliederung der Datenblöcke<br />
Nach langer Überlegung wurde in dieser Arbeit eine Entscheidung für die zweite Ablageform<br />
getroffen. D.h. alle Konfigurationsdaten werden in einer gemeinsamen Datei<br />
abgelegt. Dies ist aber keine endgültige Entscheidung - im Falle einer anderen Ablageform<br />
soll die Aufteilung in die weiter unten beschriebene logische Gliederungsebenen<br />
auf einer anderen Weise erfolgen (siehe Kapitel 4.1 auf der Seite 35).<br />
17
18 KAPITEL 3. DATENMODELL<br />
Die erste logische Gliederungsebene bilden sog. Profiles. Unter einem profile versteht<br />
man eine Konfigurationsmenge, welche ein komplettes IT-System beschreibt. So können<br />
z.B. unterschiedliche Systeme in verschiedenen Profilen definiert und somit an einer einzigen<br />
Stelle verwaltet werden. Es können aber auch unterschiedliche Konfigurationen eines<br />
Systems sein, welche z.B. für verschiedene Ausführungen gedacht sind. Nimmt man<br />
FlexiTRUST als Beispiel, so sind es unterschiedliche kundenspezifische Konfigurationen,<br />
die die Profile bilden - ein TrustCenter mit der Chipkarten-Personalisierung und ein<br />
nur für die Erzeugung von SoftToken ausgelegtes System, eine XEnroll-Konfiguration<br />
für die Out-Of-The-Box-PKI etc.<br />
XML-Ausschnitt 3.1 profile-Definition<br />
<br />
<br />
<br />
Dies ist die Konfiguration eines<br />
Chipkarten-Personalisierungssystems<br />
<br />
Konfigurationsbeschreibung<br />
<br />
weitere Profile<br />
<br />
Das Attribut name gibt einen Namen des Profils an. Der Unterknoten description<br />
lässt eine Profil-Beschreibung definieren.<br />
Ein profile beinhaltet also eine komplette Konfiguration des Systems. Theoretisch<br />
gesehen sollte es möglich sein, durch das einfache Austauschen von Profilen auf ein<br />
anderes System, bestehend aus den gleichen Kernkomponenten, umzustellen und so<br />
unterschiedliche Ausführungen eines Produkts (wie z.B. FlexiTRUST) zu testen oder<br />
vorzuführen. Leider sind noch nicht alle FlexiTRUST-Komponenten in der Lage, ohne<br />
eine Code-Änderung mit unterschiedlichen Profilen zu arbeiten. Das Ziel soll aber sein,<br />
Komponenten zu haben, welche durch das einfache Austauschen der Konfiguration neuen<br />
Anforderungen der Umgebung entsprechen können. Es soll also möglich sein, solche<br />
Komponenten ohne eine einzige Code-Änderung in anderen Systemen einzusetzen.<br />
Daraus folgt, dass das Verwaltungssystem von einem vordefinierten Profil ausgehen soll.<br />
Wird dieses vom Administrator umdefiniert, so wird automatisch eine andere Konfiguration<br />
zur Verfügung gestellt, ohne dass die einzelnen Komponenten etwas davon<br />
mitbekommen.
3.1. GLIEDERUNG DER DATENBLÖCKE 19<br />
Eine weitere logische Ebene bilden sog. applications. Ein profile besteht also aus<br />
beliebig vielen applications, welche Konfigurationen einzelner Komponenten (Anwendungen)<br />
repräsentieren.<br />
XML-Ausschnitt 3.2 application-Definition<br />
<br />
<br />
<br />
Konfiguration der LetterPrint-Komponente<br />
<br />
Konfigurationsbeschreibung<br />
<br />
weitere Applications<br />
<br />
Wie beim profile-Knoten gibt das Attribut name den Namen der Application und der<br />
Unterknoten description ihre Beschreibung an.<br />
Da eine Komponente u.U. mehrere Konfigurationsdateien braucht, wird eine dritte Ebene<br />
logischer Unterteilung eingeführt - Units. Hierbei handelt es sich ursprünglich um<br />
Dateien unterschiedlichen Formats, die von einer Komponente eingelesen werden. Dies<br />
ist z.B. bei der Komponente IS von FlexiTRUST zu sehen – es wird eine Konfigurationsdatei<br />
namens ”<br />
is.ini“ und eine andere namens ”<br />
ca.xml“ verwendet.<br />
XML-Ausschnitt 3.3 unit-Definition<br />
<br />
<br />
<br />
Hauptkonfiguration der Komponente<br />
<br />
<br />
Konfigurationsbeschreibung<br />
weitere Units<br />
20 KAPITEL 3. DATENMODELL<br />
Genau wie bei profile und application definieren das Attribute name den Name des<br />
Units und der Unterknoten description seine Beschreibung.<br />
Die vierte und letzte logische Ebene bilden sog. Versions, welche inhaltlich unterschiedliche<br />
Konfigurationsdateien gleichen Formats beschreiben. So findet man bei der IS-<br />
Komponente aus dem letzten Beispiel mehrere Varianten von der ”<br />
ca.xml“-Datei, für<br />
unterschiedliche Mandantenversionen der Konfiguration (ca1001.xml, ca1012.xml, . . . )<br />
XML-Ausschnitt 3.4 version-Definition<br />
<br />
<br />
Vlad Satanovski, vlad.s@ervion.de<br />
<br />
LetterPrint-Konfiguration des Mandanten 1001<br />
<br />
<br />
Konfigurationsbeschreibung<br />
<br />
weitere Versions<br />
Außer dem Attribut name für den Namen des Units und des Unterknoten description<br />
für seine Beschreibung kann man im Unterknoten author den für diesen Unit verantwortlichen<br />
eintragen.<br />
3.1.1 leere Ebenen<br />
In oberen Abschnitten wurde die Komponente LetterPrint extra ausgewählt, weil bei<br />
ihr alle logischen Konfigurationsebenen present sind. Ist gibt aber oft Komponenten,<br />
welche ihre Konfigurationsdaten auf weniger als vier Ebenen verteilen. Dies ist der<br />
Fall, wenn z.B. keine unterschiedlichen Versionen einer Konfiguration vorliegen (keine<br />
mehreren versions) oder wenn eine Komponente ihre gesamte Konfiguration aus einer<br />
Datei einliest (keine mehreren units).<br />
In solchen Fällen darf man entsprechende Ebene aber trotzdem nicht überspringen,<br />
weil es sonst zu unübersichtlicher Struktur der Gesamtkonfiguration führen würde.<br />
Stattdessen definiert man einen Knoten namens ”<br />
ccm:default-name“, was vom System<br />
als ein unbenannter Knoten interpretiert wird. So wird eine Konfiguration mit einer<br />
einzigen Version wie folgt definiert:
3.1. GLIEDERUNG DER DATENBLÖCKE 21<br />
XML-Ausschnitt 3.5 leere version<br />
<br />
<br />
<br />
<br />
Konfigurationsdaten<br />
<br />
<br />
<br />
<br />
3.1.2 Adressierung der Dateneinheiten - CCMPath<br />
Zur Adressierung einzelnen Konfigurationseinheiten (i.d.R. Konfigurationsdateien) wurde<br />
ein Adressierungsformat namens CCMPath festgelegt. Hierbei werden alle vier logischen<br />
Ebenen definiert, welche im Endeffekt zu exakt einer Konfigurationseinheit<br />
führen.<br />
CCMPath ::= [:][/[()]]<br />
PROFILE ::= <br />
APPLICATION ::= :default-name | <br />
UNIT ::= :default-name | <br />
VERSION ::= :default-name | <br />
CCM-Name ::= NMToken-String (XML)<br />
Beispielhaft zeigt ChipcardPerso:LetterPrint/config(1001) auf die bereits oben<br />
erwähnte Konfigurationseinheit der Anwendung LetterPrint für den Mandanten 1001.<br />
Dabei wird die Konfiguration aus dem Profil ChipcardPerso genommen.<br />
Die CCM-Referenz ChipcardPerso:ImpEx/impex clients.xml(ccm:default-name)<br />
zeigt auf die ImpEx-Konfigurationsdaten impex clients.xml aus dem gleichen Profil.<br />
Hierfür gibt es keine version, daher wird ccm:default-name verwendet. Zur Vereinfachung<br />
können solche leeren Pfadkomponenten ausgelassen werden, so dass der Pfad<br />
ChipcardPerso:ImpEx/impex clients.xml dem ersten equivalent ist.<br />
Profile bei Pfadangaben werden besonders behandelt. Beim Auslassen des Profilnamen<br />
wird ein Standardprofil verwendet. Damit ist nicht das Profil mit dem Namen<br />
ccm:default-name gemeint, sondern das im CCM-System als Standard festgelegtes Profil.<br />
Dieser Mechanismus erlaubt bei laufenden Systemen Profile auszutauschen, ohne<br />
dass die Systemkomponenten dafür umprogrammiert werden müssen. Daher wird an<br />
dieser Stelle dringend empfohlen, bei allen Pfadangaben zu Konfigurationseinheiten<br />
keinen Profilnamen explizit anzugeben. Der Pfad ImpEx/impex clients.xml verweist<br />
zum Beispiel auf die ImpEx-Konfigurationsdatei impex clients.xml des aktuellen Profils.
22 KAPITEL 3. DATENMODELL<br />
3.2 Konfigurationseinheiten<br />
Erst unterhalb von versions werden eigentliche Konfigurationsdaten angegeben. Dabei<br />
stellt man die Menge der Konfigurationsdaten als Liste von Datenelementen dar. Diese<br />
Liste kann neben einfachen Datenknoten auch komplexe Knoten enthalten, welche<br />
eine weitere Liste der Knoten beschreiben. Mit einem solchen Mechanismus lassen sich<br />
sowohl flache Konfigurationsstrukturen (wie INI-Files) als auch komplexe baumartige<br />
Strukturen (XML-Dateien) beschreiben.<br />
XML-Ausschnitt 3.6 element-Definition<br />
<br />
Vlad Satanovski, vlad.s@ervion.de<br />
<br />
<br />
...<br />
...<br />
...<br />
<br />
Knoteninhalt<br />
<br />
<br />
weitere Elemente<br />
<br />
<br />
Innerhalb eines sequence-Knotens können beliebig viele element-Knoten vorkommen,<br />
welche die jeweiligen Konfigurationseinheiten definieren. Die Unterknoten name und<br />
display-name geben den Namen sowie den Screennamen des Knotens an. Mit dem<br />
Knoten description kann eine Beschreibung hinzugefügt werden. Die eigentliche Konfigurationsdaten<br />
findet man innerhalb vom content-Knoten.<br />
Im nächsten XML-Ausschnitt ist eine Definition eines einfachen (root-path) und eines<br />
komplexen (logging) Konfigurationsknotens zu finden.<br />
XML-Ausschnitt 3.7 element-Definition<br />
<br />
Vlad Satanovski, vlad.s@ervion.de<br />
<br />
3.2. KONFIGURATIONSEINHEITEN 23<br />
root-path<br />
Application’s root path<br />
<br />
string<br />
/usr/local/impex<br />
<br />
<br />
<br />
logging<br />
Log settings<br />
<br />
<br />
<br />
path<br />
Logfile path<br />
<br />
string<br />
/data/logs/impex.log<br />
<br />
<br />
<br />
level<br />
Log level<br />
<br />
string<br />
INFO<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Diese Definition könnte z.B. folgende XML-Konfiguration abbilden:<br />
/usr/local/impex<br />
<br />
/data/logs/impex.log<br />
INFO<br />
<br />
Im Falle eines einfachen Knotens enthält der content-Knoten die Unterknoten type<br />
und value, welche den Typ und den Wert des Knotens angeben. Optional kann im<br />
Unterknoten default-value auch der Standardwert definiert werden.
24 KAPITEL 3. DATENMODELL<br />
Wird dagegen ein komplexer Knoten beschrieben, so enthält der content einen weiteren<br />
sequence-Knoten mit wiederum mehreren element-Knoten. Eine solche Verschachtelung<br />
kann beliebige Tiefe aufweisen.<br />
3.2.1 Standardtypen<br />
Im Rahmen der Datenmodellierung wurden Standardtypen für Zeichenketten, Zahlen<br />
und anderes definiert, welche als Werte von type-Knoten vorkommen. Durch Angabe<br />
eines am besten passenden Typs wird der Definitionsbereich des zugehörigen Konfigurationsparameters<br />
eingeschränkt.<br />
Folgende Typen wurden definiert:<br />
• string - beliebige Zeichenkette<br />
• int - eine ganze Zahl<br />
• boolean - ein boolescher Wert (true | false)<br />
• float - eine Fließkommazahl<br />
• date - ein Datum/Uhrzeit<br />
• path - eine Pfadangabe (c:\programme\... oder /usr/local/...)<br />
• url - eine URL (http://www.flexsecure.de/ccm/index.html)<br />
So definiert beispielsweise folgender XML-Fragment einen Pfad zu einer Datei:<br />
<br />
root-cert-path<br />
Path of the root certificate<br />
<br />
path<br />
/usr/local/impex/etc/root.crt<br />
<br />
<br />
3.2.2 Ableitungen der Typen<br />
Die Standarddatentypen bilden ein Fundament für Definition neuer einfachen Datentypen.<br />
Denn sehr oft ist es der Fall, dass man bei manchen Parametern Werte angeben<br />
möchte, die zwar einem String ähnlich sind, aber doch einem gewissen Muster entsprechen<br />
müssen.<br />
Ein typisches Beispiel ist der Loglevel - es können normalerweise nur Werte DEBUG“, ”<br />
” INFO“, ” WARNING“ und ERROR“ verwenden werden. Dies ist offensichtlich eine<br />
”<br />
Einschränkung des Types string, was mit folgendem XML-Ausschnitt definiert wird:
3.2. KONFIGURATIONSEINHEITEN 25<br />
XML-Ausschnitt 3.8 Einschränkung<br />
<br />
log-level<br />
Log-Level<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
INFO<br />
<br />
<br />
Anstatt type wird hier restriction verwendet. Das Attribute base gibt an, welcher<br />
Standardtyp dadurch eingeschränkt wird. Es können folgende Knoten innerhalb eines<br />
restriction-Knotens vorkommen:<br />
list Auflistungen<br />
Der Basistyp wird auf eine Untermenge der aufgelisteten Werten eingeschränkt.<br />
Die Auflistung der erlaubten Werte erfolgt wie im obigen Beispiel mittels item-<br />
Knoten, bei welchen die jeweiligen Werte durch das Attribut value angegeben<br />
werden. Das optionale Attribute comment gibt die Möglichkeit, den zugehörigen<br />
Wert zu kommentieren.<br />
range Intervale<br />
Mittels range werden dem Basistyp untere bzw. obere Grenzen gesetzt. Dazu dienen<br />
die Attribute min und max. Im folgenden Beispiel wird ein Zahlentyp definiert,<br />
welcher nur Werte von 0 bis 9 annehmen darf:<br />
<br />
<br />
<br />
regex Reguläre Ausdrücke<br />
Mit Hilfe von regex schränkt man Basistypen mittels eines regulären Ausdrucks<br />
ein. Folgendes Beispiel definiert ein Telefonnummer-Datentyp:<br />
<br />
<br />
26 KAPITEL 3. DATENMODELL<br />
value Wert-Angabe<br />
Mit value definiert man einen erlaubten Wert des Parameters. Dies gleicht einer<br />
list-Definition mit Angabe eines einzigen item-Wertes. Das value-Tag wird<br />
öfters als Bestandteil komplexer Ausdrücke verwendet (siehe unten).<br />
and UND-Verknüpfung<br />
Das Tag and erlaubt eine UND-Verknüpfung zweier logischen Ausdrücke. Ein<br />
Parameter, welcher z.B. Zahlenwerte zwischen 1 und 5 sowie einen String-Wert<br />
NULL“ annehmen soll, wird wie folgt beschrieben:<br />
”<br />
<br />
<br />
<br />
NULL<br />
<br />
<br />
or ODER-Verknüpfung<br />
Analog zum and bildet das or-Tag eine logische ODER-Verknüpfung zweier Ausdrücke.<br />
Will man z.B. die Schulnoten sowohl mittels Zahlen 1 - 6 als auch mit<br />
entsprechenden Bezeichnungen angeben können, so könnte es wie folgt aussehen:<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
not Verneinung<br />
Eine Verneinung eines Ausdrucks wird mit dem not-Tag erreicht. Für Abergläubige<br />
lässt sich z.B. der int-Basistyp auf eine Zahlenmenge ohne die ”<br />
13“ reduzieren:<br />
<br />
<br />
13<br />
<br />
3.3. VERERBUNG 27<br />
3.3 Vererbung<br />
Eines der größten Problemen bei der Konfigurationsverwaltung stellen interne Datenabhängigkeiten<br />
dar. Obwohl dieses Thema später noch näher betrachtet wird, muss es<br />
hier ebenfalls erwähnt werden, weil solche Abhängigkeiten sehr oft durch Datenredundanz<br />
entstehen. Ein Beispiel dafür:<br />
Beispiel 2 Die FlexiTRUST-Komponenten RA, IS und ProductInspector greifen auf<br />
eine gemeinsame Datenbank zu und tauschen somit gegenseitig Daten aus. Dies implizit,<br />
dass die Datenbank-Konfiguration dieser Komponenten auf die gleiche Datenbank<br />
verweisen muss. Wird die Datenbank durch eine andere ersetzt, so muss eine entsprechende<br />
Änderung bei allen diesen Komponenten durchgeführt werden.<br />
Durch Vererbung lassen sich solche Abhängigkeiten bereits an der Wurzel eliminieren.<br />
Man definiert solche Konfigurationsblöcke an einer anderen Stelle und vererbt diese<br />
an alle betroffene Konfigurationen. Bezogen auf das obere Beispiel hätte man die Datenbankkonfiguration<br />
an einer Stelle definieren und diese dann an alle Komponenten-<br />
Konfigurationen vererben können. Eine Änderung der Datenbank-Konfiguration wirkt<br />
sich automatisch bei allen Konfigurationseinheiten aus.<br />
Gerade bei einer Datenbank-Verbindung ist es so, dass die Datenbank-URL und -<br />
Treiber konstant für alle Komponenten bleiben, die Zugangsdaten (Username, Password)<br />
aber variieren. Um dieses Problem zu lösen können die variierende Dateneinheiten<br />
bei der jeweiligen Komponente direkt angegeben werden, womit die vererbten<br />
Standardwerte überschrieben werden. Die nicht neu definierten Werte bleiben dabei<br />
aber weiterhin erhalten.<br />
Geht man auf eine höhere Abstraktionsebene, so stellt man fest, dass manchmal komplette<br />
Komponenten-Konfigurationen ohne jeglicher Änderung in anderen Profilen verwendet<br />
werden. Durch Vererbung ganzer applications lässt sich auch dieses Problem<br />
lösen.<br />
Es wurden zwei Formen der Vererbung definiert:<br />
• explizite Vererbung durch Verweis (sog. EQ-Vererbung) und<br />
• implizite Vererbung durch Namensgleichheit (sog. Ref-Vererbung)<br />
3.3.1 Ref-Vererbung<br />
Generell kann auf den drei ersten logischen Ebenen vererbt werden:
28 KAPITEL 3. DATENMODELL<br />
profile Profil-Vererbung<br />
Bei einer Profile-Vererbung werden alle applications des Vater-Profils dem Kind-<br />
Profil bekannt und können vom Letzten referenziert werden. Eine solche Vererbung<br />
wird mittels eines Verweises im extends-Attribut des Kind-Profils definiert.<br />
Das Profil mit dem vordefinierten Namen ”<br />
ccm:default-name“ wird beim Vorhandensein<br />
von allen weiteren Profilen vererbt, ohne dass dazu eine explizite<br />
Angabe notwendig ist. Will man Vererbung eines Profils verhindern, so kann man<br />
dies durch den Wert ”<br />
false“ im Attribut inheritable erreichen - solche Profile<br />
werden von anderen nicht referenziert.<br />
XML-Ausschnitt 3.9 (Profile-Vererbung)<br />
<br />
...<br />
<br />
<br />
...<br />
<br />
application Application-Vererbung<br />
Eine Application-Vererbung ähnelt der Profil-Vererbung sehr. Dabei werden diesmal<br />
alle units der Vater-Application an die Kind-Application weitergeleitet. Um<br />
so eine Vererbung zu definieren verwendet man auch bei applications das Attribut<br />
extends. Und auch hier wird die application mit dem vordefinierten<br />
Namen ”<br />
ccm:default-name“ automatisch von allen anderen (auch bereits vererbten)<br />
applications vererbt. Genauso wie bei Profilen wird eine Vererbung<br />
durch inheritable="false" verhindert.<br />
XML-Ausschnitt 3.10 (Application-Vererbung)<br />
<br />
...<br />
<br />
<br />
...<br />
<br />
unit Unit-Vererbung<br />
Auch eine Unit-Vererbung unterscheidet sich von einer Profil- bzw. Application-<br />
Vererbung kaum. Hier werden alle in dem Vater-Unit definierte versions an den<br />
Kind-Unit übergeben. Zur Definition einer solchen Vererbung wird auch bei units<br />
das Attribut extends verwendet. Die versions des units ”<br />
ccm:default-name“<br />
fließen automatisch in alle andere units rein. Und auch bei units kann eine<br />
Vererbung durch Angabe von inheritable="false" verhindert werden.<br />
XML-Ausschnitt 3.11 (Unit-Vererbung)
3.3. VERERBUNG 29<br />
<br />
...<br />
<br />
<br />
...<br />
<br />
Bei einer Ref-Vererbung werden also ganze Konfigurationsabschnitte übernommen. So<br />
werden z.B. Konfigurationen von Komponenten, welche in anderen Umgebungen (z.B.<br />
Profilen) beschrieben wurden, in die aktuelle Umgebung aufgenommen.<br />
3.3.2 EQ-Vererbung<br />
Durch eine Ref-Vererbung auf einer höheren Ebene kann eine EQ-Vererbung implizit<br />
entstehen. Dies ist der Fall, wenn bei einer Profil-Vererbung (Ref-Vererbung)<br />
beide Profile applications gleichen Namen besitzen. Solche applications werden<br />
übereinander gelegt und ”<br />
gemerged“. Das Gleiche passiert auch bei einer Application-<br />
Vererbung mit gleichnamigen units, oder bei einer Unit-Vererbung - mit gleichnamigen<br />
versions.<br />
Eine EQ-Vererbung hört aber auf der version-Ebene nicht auf, wie es bei einer Ref-Vererbung<br />
der Fall ist. Beim Übereinanderlegen (mergen) von zwei Konfigurationsblöcken<br />
werden einzelne Konfigurationseinheiten miteinander verglichen. Nimmt man das obere<br />
Beispiel mit einer gemeinsamen Datenbank, so fließen alle vier Parameter (URL, Treiber,<br />
Username, Password) des Vater-Knotens in den Kind-Knoten und werden hier mit<br />
einem gleichnamigen Knoten verglichen. Gleichnamige Elemente werden durch die gleichen<br />
des Kind-Kontens ersetzt, die nicht im Kind-Knoten vorhandene Elemente werden<br />
hinzugefügt.<br />
explizite EQ-Vererbung<br />
Will man einen bestimmten element-Knoten referenzieren, welcher durch Vererbung<br />
zwar referenzierbar ist, aber einen anderen Namen hat, so kann man dies mit dem<br />
optionalen Tag extends innerhalb eines element tun. Dadurch lassen sich verschiedene<br />
Vererbungsvarianten beliebig kombinieren. Dazu ein Beispiel:<br />
Beispiel 3 In einer Umgebung werden u.a. Komponenten ProductInspector und IS<br />
eingesetzt. Beide dieser Komponenten greifen auf dieselbe Datenbank zu, allerdings werden<br />
dabei unterschiedliche Benutzerkennungen verwendet. Die Datenbank wird nicht<br />
nur in dieser Umgebung verwendet, sondern auch in mehreren weiteren Testumgebungen<br />
(Profilen).<br />
Eine Lösung des geschilderten Problems könnte wie folgt aussehen:
30 KAPITEL 3. DATENMODELL<br />
Abbildung 3.1: EQ-Vererbung, Elementen-Vergleich<br />
1. Die Beschreibung der Datenbank-Konfigurationsparameter soll ausgelagert werden.<br />
Da diese auch außerhalb der aktuellen Umgebung verwendet wird, wird sie<br />
in dem allgemeinen Profile (der mit dem Namen ”<br />
ccm:default-name“) definiert<br />
(siehe Abbildung 3.2). Damit ist ein expliziter Vererbungsverweis vom aktuellen<br />
profile nicht nötig.<br />
Abbildung 3.2: Gesamtkonfiguration, Application-Sicht<br />
2. Die eigentliche Datenbank-Konfiguration wird in Form eines komplexen Knotens<br />
namens ”<br />
db“ mit vier Unterknoten ”<br />
url“, ”<br />
driver“, ”<br />
username“ und ”<br />
password“<br />
angegeben (siehe Abbildung 3.3).
3.3. VERERBUNG 31<br />
3. Da die Konfigurationsparameter keinem unit oder version zugeordnet werden<br />
können, werden diese in einer application beschrieben. Als Name dafür<br />
wird hier Database“ gewählt. Zugehörige unit und version tragen den Namen<br />
”<br />
ccm:default-name“, damit die Parameter allen untergeordneten Einheiten zur<br />
”<br />
Verfügung stehen.<br />
4. Die application ”<br />
ProductInspector“ und ”<br />
IS“ sollen von der ”<br />
Database“ abgeleitet<br />
sein (erben).<br />
5.<br />
6. In der IS-Konfiguration wird ein Element namens ”<br />
db“ definiert, welches durch<br />
EQ-Vererbung alle Unterknoten der Datenbank-Konfiguration besitzt (siehe Abbildung<br />
3.4). Durch Überschreiben der Unterknoten ”<br />
username“ und ”<br />
password“<br />
mit passenden Werten wird die IS-Konfiguration der Datenbankverbindung beendet.<br />
7. Bei der ProductInspector-Konfiguration werden viele aufgabenspezifische PI-<br />
Profile angegeben, welche evtl. mit unterschiedlichen Datenbanken operieren können.<br />
In diesem Beispiel sollen aber alle PI-Profile auf der gleichen Datenbank<br />
basieren, deswegen soll die Datenbank-Konfiguration geerbt werden. Dafür bekommt<br />
jeder PI-Profil-Knoten einen Unterknoten namens ”<br />
database“, welcher<br />
durch eine explizite EQ-Vererbung mit der Datenbank-Konfiguration in Relation<br />
gesetzt wird (siehe Abbildung 3.5). Eine einfache EQ-Vererbung ist an dieser<br />
Stelle nicht möglich, da in einem solchen Fall die Datenbank-Konfiguration nur<br />
einmal present sein würde.
32 KAPITEL 3. DATENMODELL<br />
Abbildung 3.3: Datenbank-Konfiguration
3.3. VERERBUNG 33<br />
Abbildung 3.4: IS-Konfiguration (EQ-Vererbung)
34 KAPITEL 3. DATENMODELL<br />
Abbildung 3.5: PI-Konfiguration (explizite EQ-Vererbung)
Kapitel 4<br />
Verwaltung und Verteilung der<br />
Daten<br />
Dieses Kapitel beschäftigt sich mit dem Problem der Verwaltung und anschließender<br />
Verteilung der Konfigurationsdaten. Bei der Datenverwaltung müssen folgende Kriterien<br />
erfüllt sein, damit das System als benutzbar und vertrauenswürdig sowohl im technischen<br />
als auch im rechtlichen Sinne eingestuft werden kann. Die Konfigurationsdaten<br />
sollen:<br />
• leicht durch einen Administrator modifizierbar sein<br />
• das komplette Anwendungssystem beschreiben, inklusive aller externen Anwendungen<br />
und Schnittstellen<br />
• vor unbefugten Modifikationen geschützt und ihre Unversehrtheit jederzeit verifizierbar<br />
sein<br />
4.1 Abstrakte Sicht der Daten – RAA<br />
Trotz der Analyse und der Festlegung des Datenformats für die Konfigurationsdaten<br />
(siehe Kapitel 3 auf Seite 17) wurde in dieser Arbeit eine entsprechende Schnittstelle<br />
eingeführt, welche das Format der Daten abbildet. Dies ermöglicht eine spätere Erweiterung<br />
des Datenformats oder Verwendung unterschiedlicher Formate, ohne dass die<br />
bestehenden Anwendungen dafür modifiziert werden müssen.<br />
Die Schnittstelle ist durch die Klasse ResourceAccessAdapter (RAA ) beschrieben. Neben<br />
anderen abstrakten Methoden zum Erstellen oder Löschen einzelner Dateneinheiten<br />
wurden zwei folgenden Methoden definiert:<br />
public abstract InputStream getConfigResource(CCMPath)<br />
public abstract void setConfigResource(CCMPath, byte[])<br />
35
36 KAPITEL 4. VERWALTUNG UND VERTEILUNG DER DATEN<br />
Abbildung 4.1: RemoteAccessAdapter<br />
Die get-Methode liefert Konfigurationsdaten für den angegebenen Pfad (siehe Kapitel<br />
3.1.2 auf Seite 21). Um Konfigurationsdaten zu speichern wird die set-Methode verwendet.<br />
Diese erwartet zwei Parameter - den Pfad zum Ziel-Datenblock sowie eigentliche<br />
Daten in Form eines Byte-Arrays.<br />
4.2 Verteilung der Daten – Connections<br />
Bei den zu verwaltenden Systemen handelt es sich meistens um verteilte Systeme. Um<br />
Konfigurationsdaten allen Komponenten zur Verfügung zu stellen, müssen diese zwischen<br />
den Komponenten ausgetauscht werden können, was auf folgende Weise geschehen<br />
kann:<br />
• mittels ”<br />
gemounteten“ Verzeichnissen (mapped folders) innerhalb eines internen<br />
Netzwerkes;<br />
• über einfache Socket-Verbindungen zwischen zwei über Netzwerk erreichbaren<br />
Rechnern;<br />
• mit Hilfe anderer Client/Server-Technologien (wie z.B. RMI, CORBA, JINI);<br />
• durch manuellen Datenaustausch mittels Dateien etc.<br />
Eine abstrakte Schnittstelle einer solchen Verbindung stellt die Klasse Connection dar.<br />
Diese Klasse definiert (neben anderen) zwei folgenden Methoden:<br />
public abstract void send(Message)<br />
public abstract Message receive()
4.3. DATEN-ABSICHERUNG – LSA/RSA 37<br />
Abbildung 4.2: Connection<br />
Dabei werden send - zum Versenden und receive - zum Empfangen einer Nachricht<br />
verwendet.<br />
Im Rahmen dieser Arbeit wurden folgende Varianten einer Connection implementiert:<br />
• SocketConnection - Datenaustausch über eine Socketverbindung zwischen einer<br />
Komponente und dem CCM-System.<br />
• FileConnection - Datenaustausch bei Offline-Systemen. Hierbei handelt es sich<br />
um Datenaustausch über Dateien eines speziellen Formats, welche Systemanfragen<br />
und -antworten in zwei unterschiedlichen Warteschlangen ablegen, um eine<br />
asynchrone Kommunikation zu erlauben. Solche Dateien können als ein virtueller<br />
Kommunikationskanal angesehen und müssen vom Bediener manuell zwischen<br />
den Komponenten transferiert werden.<br />
Bei Bedarf können weitere Connection-Varianten hinzugefügt werden.<br />
4.3 Daten-Absicherung – LSA/RSA<br />
Mittels digitalen Signaturen kann Unversehrtheit der Konfigurationsdaten nachgewiesen<br />
werden. In sicherheitskritischen Umgebungen sollen die Konfigurationsdaten lieber<br />
von Administratoren nach jeder Änderung signiert abgelegt werden. Werden solche<br />
Daten von Dritten verändert, so soll das System dies abfangen und den Administrator<br />
darüber verständigen.<br />
Beinhalten Konfigurationen sicherheitskritische Informationen wie z.B. Passwörter, so<br />
sollten sie nicht nur digital signiert, sondern auch verschlüsselt abgelegt werden, damit<br />
diese Informationen nicht im Klartext vorliegen.
38 KAPITEL 4. VERWALTUNG UND VERTEILUNG DER DATEN<br />
Um die obigen Probleme zu lösen wurde eine Schnittstelle namens Sicherheitsadaptor<br />
definiert, welche Ver- und Entschlüsselung, Signieren und Verifizieren geleisteter Signaturen<br />
der Konfigurationsdaten erlaubt. Dabei werden nicht die kompletten Daten<br />
samt Informationen über profiles, units etc., sondern nur die Inhalte der Konfigurationsblöcke<br />
modifiziert. Bei der Entwicklung des Datenformats wurde dafür gesorgt,<br />
dass der Inhalt des obersten Elementes einer jeden version anstatt im<br />
Klartext mittels name- und content-Knotens auch binär angegeben werden kann.<br />
Es wurden zwei Varianten der Sicherheitsadaptoren definiert:<br />
• LocalSecurityAdapter (kurz LSA ) - Diese Klasse übernimmt die Aufgaben der<br />
lokalen Absicherung der Konfigurationsdaten. Instanzen dieser Klasse werden<br />
direkt in den ResourceAccessAdapter integriert und erlauben somit eine verschlüsselte<br />
bzw. signierte Speicherung der Konfigurationsdaten.<br />
• RemoteSecurityAdapter (kurz RSA )- Um auch den Datentransfer zu dem Client<br />
zu sichern, wurde diese weitere Schnittstelle eingeführt. Sie wird an beiden Kommunikationspunkten<br />
einer Verbindung eingesetzt, um so die Daten während der<br />
Übertragung zu schützen.<br />
LocalSecurityAdapter stellt u.A. folgende Methoden zur Verfügung:<br />
public abstract InputStream getConfig(InputStream in)<br />
public abstract void setConfig(OutputStream out, InputStream data)<br />
Darin erkennt man Ähnlichkeit mit der Schnittstelle des ResourceAccessAdapters. Eine<br />
entsprechende Ähnlichkeit mit dem Connection-Interface bieten auch die Schnittstellen-Methoden<br />
des RemoteSecurityAdapters, da dieser auf eine Connection aufgesetzt<br />
wird:<br />
public abstract void send(Message)<br />
public abstract Message receive()<br />
4.3.1 Abstraktion des Schlüssel-Konzeptes<br />
Die im oberen Abschnitt beschriebenen Sicherheitsadaptoren müssen natürlich in der<br />
Lage sein, Daten verschlüsseln und signieren. Dazu muss intern auf asymmetrische Verschlüsselungs-<br />
und Signaturverfahren zugegriffen werden, was wiederum Verwendung<br />
eines Schlüsselpaars erwartet.<br />
Da es unterschiedliche Möglichkeiten gibt, solche Schlüsselpaare zu verwalten und aufzubewahren,<br />
wurde hier eine weitere abstrakte Schnittstelle namens Secret definiert.<br />
Diese legt folgende Methoden fest:
4.3. DATEN-ABSICHERUNG – LSA/RSA 39<br />
Abbildung 4.3: CCM-Sicherheitsadaptoren<br />
public abstract X509Certificate getCertificate()<br />
public abstract SignedData sign(byte[])<br />
public abstract byte[] decrypt(EnvelopedData)<br />
Beim Ergebnis des getCertificate()-Aufrufs handelt es sich um eine Instanz der Klasse<br />
java.security.cert.X509Certificate, welche ein Benutzerzertifikat repräsentiert.<br />
Die Klassen codec.pkcs7.SignedData und codec.pkcs7.EnvelopedData stammen<br />
vom codec-Paket, welches von der Arbeitsgruppe des Prof. Buchmann (<strong>CDC</strong>) in Zusammenarbeit<br />
mit der Frauenhofer Gesellschaft entwickelt wurde. Eine signierte Dateneinheit<br />
wird durch die SignedData- und eine verschlüsselte - durch die EnvelopedData-<br />
Klasse repräsentiert.<br />
Es werden keine Methoden zum Verschlüsseln bzw. zum Verifizieren einer Signatur<br />
angeboten, da solche Operationen kein Schlüsselpaar, sondern lediglich den öffentlichen<br />
Schlüssel benötigen, welcher dem Benutzerzertifikat entnommen werden kann.<br />
Während der Entwicklung des CCM-Systems wurden zwei Arten von Secrets implementiert,<br />
nämlich:<br />
• SoftTokenSecret - eine Secret-Abstraktion, welche Schlüsselpaare im PKCS#12-<br />
Format in einer Datei erwartet und<br />
• SmartCardSecret - eine Abbildung einer SmartCard, auf welcher das Schlüsselpaar<br />
abgelegt wurde.<br />
Sowohl RSA als auch LSA können mit einer Secret-Instanz initialisiert werden. Das<br />
entsprechende Schlüsselpaar mit jeweiligen, für den Schlüsselcontainer spezifischen, Zugriffsmechanismen<br />
wird dann bei kryptografischen Operationen verwendet.
40 KAPITEL 4. VERWALTUNG UND VERTEILUNG DER DATEN<br />
4.4 Datentranformation – XML/INI<br />
Die mittels Connections zugestellte Konfigurationsdaten müssen im Falle einer Roll-<br />
Out-Zustellung anschließend in das Originalformat überführt werden. Dies wird mit<br />
einer XSL-Transformation durchgeführt, welche als Teil der Konfigurationsdaten definiert<br />
sein soll. Da diese Informationen nicht direkt zur Menge der Konfigurationsdaten<br />
gehören, werden sie nicht neben anderen Daten in die Konfigurationsknoten geschrieben,<br />
sondern müssen in einem anderen Abschnitt namens parameter definiert werden.<br />
Solche parameter-Abschnitte können weder vererbt noch referenziert werden. Bei Vererbung<br />
werden nur Parameter des direkt angesprochenen Knotens ausgewertet!<br />
Neben dem Format der Originaldaten sollen auch weitere Informationen vorhanden<br />
sein, wie z.B. Datennamen und -rechte. Solche Daten können ebenfalls als Inhalte von<br />
parameter-Knoten beschrieben werden, welchen sie bei der Zustellung der Konfigurationsdaten<br />
entnommen werden.<br />
4.5 Zustellung der Konfigurationsdaten<br />
Nachdem einzelne Elemente der Konfigurationsverwaltung angesprochen waren, wird<br />
hier der Gesamtablauf der Zustellung von Konfigurationsdaten näher erläutert. Dabei<br />
werden zwei bereits erwähnten Arten der Datenzustellung beschrieben - Zustellung bei<br />
Anfrage (Request) und Zustellung per Ausrollen der Daten (Roll-Out).<br />
4.5.1 Request<br />
Bei einer Request-Zustellung werden Daten von der jeweiligen Anwendung des Systems<br />
direkt angefragt. Dazu wird eine Schnittstelle namens Client verwendet, welche über<br />
die Methode InputStream getConfiguration(CCMPath) verfügt.<br />
Client client = Client.getInstance();<br />
try {<br />
// try to connect the server<br />
client.connectServer();<br />
}<br />
catch (CCMPException ex) { // Unable to connect the server! }<br />
// read the configuration of CCMPath: ImpEx/impex_clients.xml<br />
CCMPath path = new CCMPath("ImpEx", "impex_clients.xml");<br />
InputStream is = client.getConfiguration(path);
4.6. CCM-PROTOKOLL 41<br />
Macht die Anwendung im CCMPath keine Angaben über die Profil-Zugehörigkeit der<br />
Konfigurationsdaten (was im Regelfall passieren soll, vgl. Kapitel 3.1.2 auf Seite 21),<br />
so wird vom CCM-System das Standardprofil verwendet.<br />
Wie man sieht, besteht der eigentliche Aufruf aus drei Zeilen, in welchen die Schnittstellenklasse<br />
Client instanziiert (Client.getInstance()) und mit dem server verbunden<br />
wird (client.connectServer()). Anschließend wird die Konfiguration mittels<br />
client.getConfiguration() angefragt.<br />
Schlägt der Versuch den Server zu kontaktieren fehl (client.connectServer()), so<br />
wird eine Warnmeldung (CCMPException) ausgegeben. In diesem Falle kann die Anwendung<br />
entscheiden, wie sie darauf reagieren soll - ob sie mit einer Fehlermeldung<br />
beendet wird (bei besonders sicherheitskritischen Komponenten) oder ob sie mit der<br />
lokal gespeicherten Konfiguration weiter arbeiten soll. Wird die geworfene Exception<br />
ignoriert, so wird eine lokal gespeicherte Kopie der Konfigurationsdaten geliefert.<br />
Konnte eine Verbindung zum CCM-Server hergestellt werden, dann werden für die anfragende<br />
Komponente definierte Sicherheitsadaptoren (LSA und RSA) instantiiert. Es<br />
werden die zentral auf dem CCM-Server abgelegte Daten geladen und an den Client<br />
geschickt. Daraufhin wird die Verbindung geschlossen.<br />
Die neu vom Server erhaltene Daten werden mittels eines lokal definierten RAA auf<br />
dem Zielrecher gespeichert, um im Falle eines Server-Ausfalls doch eine Zustellung<br />
der Daten zu gewährleisten. Anschließend werden die Daten beim Vorhandensein einer<br />
XSL-Transformation dieser unterzogen und so an die Komponente in Form eines<br />
InputStream-Objektes gegeben.<br />
4.5.2 Roll-Out<br />
Eine Rollout-Zustellung der Daten unterscheidet sich von einer Request-basierten Zustellung<br />
nur auf der Client-Seite. Hier kommt eine neue Systemkomponente namens<br />
configTOOL zum Erscheinen, welche sowohl für Konfiguration des CCM-Systems, als<br />
auch für Verwaltung der Konfigurationsdaten zuständig ist.<br />
Will man bestimmte Konfigurationseinheiten ”<br />
ausrollen“, so selektiert man diese Einheiten<br />
im configTOOL und startet den Roll-Out-Prozess. Daraufhin fragt das config-<br />
TOOL genau wie bei der Request-Variante nach der aktuellsten verfügbaren Konfigurationsdaten<br />
und speichert diese mit Hilfe von definierten parameter-Knoten an die<br />
richtigen Stellen ab. Dort werden Konfigurationsdateien von der jeweiligen Anwendung<br />
ausgelesen, ohne dass diese verändert werden müssen.<br />
4.6 CCM-Protokoll<br />
Vollständigkeitshalber wird an dieser Stelle das festgelegte Protokoll des internen Datenaustausches<br />
(CCMP ) erläutert.
42 KAPITEL 4. VERWALTUNG UND VERTEILUNG DER DATEN<br />
Abbildung 4.4: CCM-Protokoll<br />
Die Abbildung 4.4 zeigt schematisch den Kommunikationsdialog an. Auf der Client-<br />
Seite kommt eine Anfrage einer Konfiguration für eine bestimmte Anwendung an. Daraufhin<br />
ermittelt der Client eine Liste der für diese Anwendung festgelegten RSAs und<br />
schickt diese samt dem Namen der Anwendung an den Server.<br />
Nach dem Empfang der Anfrage ermittelt der Server den sichersten RSA aus der gelieferten<br />
Liste, welcher gleichzeitig laut Server-Einstellungen für die genannte Anwendung<br />
verwendet werden darf. Der Name dieses RSAs wird im Klartext an den Client zurück<br />
geschickt.<br />
Im nächsten Schritt instantiieren beide Seiten den gleichen RSA und können somit<br />
weitere Kommunikation absichern. Die instantiierten RSAs führen selbsttätig eine gegenseitige<br />
Authentisierung aus, um sicher zu stellen, dass sie tatsächlich miteinander<br />
kommunizieren können bzw. dürfen.<br />
Nach der Authentisierung wird vom Client der komplette CCM-Path der benötigten
4.7. GESAMTABLAUF 43<br />
Konfiguration versendet. Mit diesen Informationen ist der Server in der Lage, alle für die<br />
angefragte Konfiguration relevanten Daten zusammen zu stellen und in einem Bündel<br />
an den Client zu senden.<br />
4.6.1 ADMIN-Zugang<br />
Eine Ausnahme bilden sog. ADMIN-Anfragen, welche von Administrationswerkzeugen<br />
bzw. Administratoren selbst versendet werden können, um z.B. eine Sicherheitskopie<br />
aller Daten zu erstellen, Daten verschiedener Systeme abzugleichen etc.<br />
Der ADMIN-Zugang unterscheidet sich von einem normalen insofern, dass hierbei<br />
stets ein bestimmter RSA eingesetzt wird, nämlich der AdminRemoteSecurityAdapter.<br />
Um also über ADMIN-Zugang Anfragen tätigen zu können, muss man im Besitz des<br />
ADMIN-Secrets sein, welcher in Regelfall in Form einer Chipkarte vorliegen sollte.<br />
Aus dieser Definition folgt implizit, dass alle Konfigurationsdaten des Systems mit einem<br />
(bzw. mehreren) solchen ADMIN-Secret sollen entschlüsselt werden können. Dies<br />
kann man z.B. durch Einsatz von PKCS#7 als Verschlüsselungsformat realisieren, indem<br />
das entsprechende ADMIN-Zertifikat des Secrets in die Liste der Verschlüsselungszertifikaten<br />
mit aufgenommen wird, was spätere Entschlüsselung mit dem zugehörigen<br />
PublicKey ermöglicht. Dieser Aspekt soll bei Entwicklung neuer RSAs unbedingt berücksichtigt<br />
werden - Datensätze sollen stets neben eigentlichen ”<br />
Empfängern“ auch von<br />
ADMINs entschlüsselbar sein!<br />
4.7 Gesamtablauf<br />
Anschließend wird ein kompletter Ablauf einer Anfrage beschrieben. Diese Beschreibung<br />
dient dem Zweck, alle bisher beschriebene Komponenten des CCM-Systems unter<br />
einen Dach zu bringen und zu zeigen, wie sie alle miteinander funktionieren.<br />
Das Gesamtschema der CCM-Architektur ist im Bild 4.5 auf Seite 46 zu sehen. Der Ablauf<br />
wird anhand eines Beispiels erklärt, wobei zwischen den Anfragetypen (Request oder<br />
Rollout) nicht unterschieden wird, weil die interne Kommunikation in beiden Fällen<br />
identisch abläuft.<br />
Beispiel 4 Anfrage der Konfigurationsdaten<br />
CCMPath Ziel der Anfrage<br />
Konfigurationsdaten werden durch den Pfad ImpEx/impex sequence.xml(1001)<br />
adressiert, was soviel wie ”<br />
impex sequence.xml für den Mandanten 1001 der<br />
Komponente ImpEx“ bedeutet.
44 KAPITEL 4. VERWALTUNG UND VERTEILUNG DER DATEN<br />
RAA Datenformat<br />
Auf der Server-Seite werden Konfigurationsdaten vom File-RAA in eine gemeinsame<br />
Datei geschrieben, der Client schreibt lokale Kopien der Daten in unterschiedlichen<br />
Dateien ab (mittels FileSet-RAA-Klasse).<br />
LSA lokale Absicherung der Daten<br />
Zur Absicherung der lokal gespeicherten Konfigurationsdaten wird beim Client<br />
der PasswordLocalSecurityAdapter und beim Server der PKILocalSecurity-<br />
Adapter eingesetzt.<br />
RSA Absicherung der Datenübertragung<br />
Es seien für ImpEx zwei RSAs auf der Client-Seite (PlainRemoteSecurityAdapter<br />
und PKIRemoteSecurityAdapter) und zwei anderen RSAs auf der Server-Seite<br />
(PasswordRemotesecurityAdapter und PKIRemotesecurityAdapter) erlaubt.<br />
4.7.1 Ablauf<br />
1. Es wird versucht eine Verbindung zum Server herzustellen. (Scheitert der Versuch,<br />
dann wird eine entsprechende Exception weitergegeben und es werden lokal<br />
gespeicherte Daten verwendet.)<br />
2. Der Client entnimmt den Application-Namen dem angegebenen CCMPath. Aus<br />
der Client-Konfiguration wird eine Liste der erlaubten RSAs ermittelt. In diesem<br />
Beispiel werden also der Name ”<br />
ImpEx“ mit der RSA-Liste (hier - Plain- und<br />
PKI-RSA) an den Server im Klartext versendet.<br />
3. Server liest seine Konfiguration und holt die Liste der für diese Anwendung zugelassenen<br />
RSAs (hier - Password- und PKI-RSA). Es wird eine Schnittmenge der<br />
erlaubten und der gesendeten RSA-Listen ermittelt und darin der sicherste RSA<br />
(hier also - PKIRemoteSecurityAdapter) bestimmt. Dieser Schritt gibt dem CCM-<br />
Administrator die Möglichkeit, eine minimale Sicherheitsstufe der Kommunikationskanäle<br />
vorzugeben, ohne dass diese von den Client-Anwendungen umgangen<br />
werden kann.<br />
4. Der RSA-Name (hier - PKIRemotesecurityAdapter) wird an den Client geschickt.<br />
Daraufhin werden RSA-Instanzen auf beiden Seiten instantiiert und gegenseitig<br />
authentisiert. Beim PKI-RSA z.B. wird die Authentisierung in Form von<br />
Versenden zweier digital signierten Nachrichtenblöcken erreicht, was die jeweilige<br />
Kommunikationsseite vor Authentizität der anderen überzeugt.<br />
5. Jetzt wird der CCMPath ”<br />
ImpEx/impex sequence.xml(1001)“ über den gesicherten<br />
Kanal gesendet.<br />
6. Nach Empfang der Nachricht werden vom Server die Konfigurationsdaten entsprechend<br />
der Anfrage zusammengestellt. Dabei werden nicht nur direkt angesprochene<br />
Datenblöcke, sondern auch die von ihnen referenzierte Blöcke mitgeschickt<br />
(siehe 3.3 auf Seite 27). Geladen werden die Daten über den lokal spezifizierten
4.7. GESAMTABLAUF 45<br />
RAA (hier - FileResourceAccessAdapter), wobei diese mit Hilfe vom lokalen LSA<br />
(hier - PKILocalSecurityAdapter) entschlüsselt und verifiziert werden.<br />
7. Client empfängt die Konfigurationsdaten und speichert diese mittels lokal definierten<br />
RAA ab (hier - FileSetResourceAccessAdapter). An dieser Stelle werden<br />
Daten durch den spezifizierten LSA (hier - PasswordLocalSecurityAdapter) verschlüsselt<br />
bzw. signiert.<br />
8. Die empfangenen Datenblöcke werden miteinander verschmolzen (gemerged), was<br />
zu einem resultierenden Datenblock führt, welcher anschließend zurückgegeben<br />
werden soll.<br />
9. Wurde eine Transformation der Ergebnismenge definiert, so wird diese durch den<br />
DataTransformer (im Bild 4.5 als DT gekennzeichnet) durchgeführt. Bei der Roll-<br />
Out-Verteilungsstrategie werden durch die Transformation Konfigurationsdateien<br />
generiert, welche dem Originalformat der ursprünglich von der Anwendung erwartenden<br />
Datei entsprechen.<br />
4.7.2 Rollout-Besonderheiten<br />
Online-Komponenten<br />
Wird das CCM-Modul bei Online-Systemen eingesetzt und wird dabei die Rollout-Verteilungsstrategie<br />
verwendet, so lässt sich der Ablauf deutlich vereinfachen.<br />
Das Ausrollen der Konfigurationsdaten, wie bereits in 4.5.2 auf Seite 41 beschrieben,<br />
wird vom configTOOL angesteuert, welches sowohl auf der Client- als auch direkt auf<br />
der Server-Seite ans System angeschlossen werden kann (siehe Abbildung 4.5).<br />
Da es bei Online-Systemen immer möglich ist, Daten direkt übers Netzwerk zu versenden,<br />
ohne auf implementierte Connection-Klassen zurückzugreifen, kann das Ausrollen<br />
direkt von Server-Knoten aus erfolgen. In diesem Falle kommuniziert das configTOOL<br />
direkt mit dem Server-RAA über den Admin-LSA. Die Schritte zum Herstellen einer<br />
Verbindung sowie zum Festlegen eines RSA fallen komplett weg.<br />
Offline-Komponenten<br />
Das Vorhandensein von Offline-Komponenten im System lässt die Verwendung der vereinfachten<br />
Kommunikationsversion des letzten Abschnittes trotzdem zu - Konfigurationen<br />
aller Online-Komponenten können immer direkt vom Server aus ausgerollt werden.<br />
Nur bei Offline-Komponenten müssen diese über das lokal auf dem Rechner installierte<br />
configTOOL angefragt werden, was in diesem Falle eine Kommunikation über eine der<br />
Offline-Connections (z.B. FileConnection) bedeutet. Das Ausrollen direkt vom Server<br />
aus ist in einem solchen Fall nicht möglich, da es stets eine bestimmte Aktion auf<br />
der Empfänger-Seite erwartet, was bei Offline-Systemen nicht möglich ist.
46 KAPITEL 4. VERWALTUNG UND VERTEILUNG DER DATEN<br />
Abbildung 4.5: CCM-Architektur
Kapitel 5<br />
Administrierung des CCM-Systems<br />
Unter Administrierung des CCM-Systems verbergen sich zwei unterschiedliche Aufgaben,<br />
nämlich:<br />
1. Administrierung des eigentlichen CCM-Systems und ihrer Komponenten wie Client<br />
und Server, Definition von verwendeten Connections und Sicherheitsadaptoren<br />
u.v.m. Diese Art der Administrierung wird folglich als ”<br />
CCM-Konfiguration“ bezeichnet.<br />
2. Administrierung der zu verwaltenden Konfigurationsdaten des Systems (auch<br />
Content-Administrierung“ genannt).<br />
”<br />
5.1 Problemanalyse<br />
Abstrakt betrachtet lassen sich beide oben definierten Aufgaben auf das Editieren von<br />
XML-Dateien zurückführen. Verfügt der CCM-Administrator über ausreichendes Wissen<br />
und Erfahrung, so erweisen sich die Aufgaben sogar als recht einfach. Allerdings kann<br />
eine Fehlkonfiguration des Systems für den Betrachter unerklärliche Folgen nach sich<br />
ziehen, die Problembehebung kann dabei sehr viel Zeit in Anspruch nehmen. Wird das<br />
CCM-System in Umgebungen eingesetzt, welche über keinen CCM-Administrator verfügen<br />
oder werden Änderungen von mehreren Personen vorgenommen, so steigt das Risiko<br />
einer Fehlkonfiguration enorm!<br />
Ein manuelles Verändern der XML-Daten mit einem einfachen Text-Editor scheint<br />
daher nicht die richtige Lösung zu sein. Solche Veränderungen wären sehr zeitaufwendig<br />
und fehleranfällig. Der erste Ansatz wäre die Verwendung der bereits existierenden<br />
Werkzeuge zum Editieren von XML-Dateien, welche zumindest Teile der Aufgaben wie<br />
Wohlgeformtheit oder syntaktische Korrektheit des Gesamtdokumentes übernehmen.<br />
47
48 KAPITEL 5. ADMINISTRIERUNG DES CCM-SYSTEMS<br />
5.1.1 CCM-Konfiguration<br />
Im Grunde genommen ist die CCM-Konfiguration nichts anderes, als eine Konfiguration<br />
einer Systemanwendung. Es handelt sich hierbei um eine XML-Datei einer ziemlich<br />
einfachen Struktur. Da solche Dateien aber an mehreren Stellen vorkommen können<br />
(zum Beispiel bei Offline-Konfigurationen), wäre es sehr empfehlenswert, auch für solche<br />
XML-Strukturen bequemere Editier-Möglichkeiten vorzusehen, als nur die Daten<br />
direkt mit einem Text-Editor einzutragen.<br />
Im Allgemeinen erfasst die CCM-Konfiguration folgende Einstellungen:<br />
• Name des verwendeten RAA. Diese Einstellung bildet die physikalische Struktur<br />
der Daten des Datenträgers auf die CCM-Datenstruktur ab.<br />
• Liste der im System definierten Secrets, welche bei kryptografischen Operationen<br />
verwendet werden.<br />
• Liste der im System definierten Anwendungen, welche ihre Konfigurationen über<br />
eine der Verteilungsstrategien übermitteln. Diese Information beinhaltet u.a. folgende<br />
Angaben:<br />
– Name der Anwendung in Form einer CCMPath-Angabe<br />
– Name des zu verwendeten LSA<br />
– Liste der für diese Anwendung zugelassenen RSAs.<br />
– Mapping von den im System definierten Secrets auf die jeweilige Sicherheitsadaptors<br />
5.1.2 Content-Administrierung<br />
Die Aufgabe der Content-Administrierung besteht i.A. darin, XML-Konfigurationen<br />
entsprechend Systemanforderungen anzupassen oder anders ausgedruckt - Konfigurationsänderungen<br />
einzelnen Systemkomponenten vorzunehmen.<br />
Dabei müssen u.U. viele Abhängigkeiten von anderen XML-Blöcken berücksichtigt werden.<br />
So sind bei der Content-Administrierung folgende Probleme hervorzuheben:<br />
• Die Lokalisierung eines bestimmten Datenblocks ist nicht immer einfach, weil im<br />
CCM-System Konfigurationen mehrerer Anwendungen gleichzeitig verwaltet werden.<br />
• Durch Vererbung wird Datenredundanz erheblich verringert. Dadurch werden<br />
aber Abhängigkeiten zwischen einzelnen Konfigurationen immer komplexer. Bei<br />
vielen Komponenten im System sind solche Abhängigkeiten oft sogar mehrstufig!<br />
• Werden Konfigurationsdaten verschlüsselt bzw. signiert abgelegt (durch einen entsprechenden<br />
Sicherheitsadaptor geschützt), so ist das manuelle Verändern der<br />
Daten nicht möglich.
5.2. VERGLEICH DER EXISTIERENDEN XML-EDITOREN 49<br />
5.2 Vergleich der existierenden XML-Editoren<br />
In folgenden Abschnitten werden zwei XML-Editoren als Repräsentanten zweier Gruppen<br />
der Editoren auf ihre Eignung zum Einsatz im CCM-System analysiert.<br />
5.2.1 XMLSpy<br />
XMLSpy ist einer der verbreitetsten und der mächtigsten XML-Editoren. Es folgt eine<br />
kleine Liste der wichtigsten Features von XMLSpy:<br />
• Der Benutzer wird beim Editieren durch das syntaktische Hervorheben des XML-<br />
Tags und die Möglichkeit XML-Fragmente zusammen zu klappen unterstützt - so<br />
können bereits bearbeitete Fragmente zu einer Zeile minimiert dargestellt werden.<br />
• Darüber hinaus kann die Korrektheit der Datenstruktur durch externe DTD- bzw.<br />
XMLSchema-Definitionen überprüft werden (sog. Validierung der Daten).<br />
• Beim Vorhandensein von solchen DTD- bzw. XMLSchema-Definitionen des Dokumentes<br />
werden Benutzereingaben durch Auswahllisten (Dropdown-Menus) mit<br />
möglichen Parametern/Werten unterstützt und vervollständigt.<br />
• Sowohl XSL-Transformationen der XML-Daten als auch XSL:FO werden unterstützt.<br />
Neben den aufgelisteten Features der kostenlosen private-Version von XMLSpy verfügen<br />
Versionen professional und enterprise über weitere mächtige Werkzeuge zum Editieren<br />
von XML-Dateien. XMLSpy kann übers Internet bei www.xmlspy.com bezogen werden.<br />
Die Abbildung 5.1 zeigt einen Screenshot von XMLSpy mit dem Ausschnitt der großen<br />
CCM-Konfigurationsdatei. Der Benutzer wird zwar (wie bereits beschrieben) bei der<br />
Eingabe der Daten unterstützt, indem mögliche Werte/TAGs entsprechend der CCM-<br />
Schemadefinition zur Auswahl angeboten werden. Dies reicht aber für eine komfortable<br />
Arbeit nicht aus, denn durch die großen Datenmengen in der CCM-Datei wird z.B. die<br />
Suche nach bestimmten XML-Knoten erheblich erschwert. Außerdem müssen sehr viele<br />
Metadaten neben eigentlichen Konfigurationsdaten mit eingegeben werden, was lange<br />
Editierzeiten implizit.<br />
5.2.2 XAmple<br />
Im Gegensatz zu XMLSpy ist XAmple kein normaler, sondern ein speziell für den<br />
Einsatz von XMLSchema-basierten XML-Dateien entwickelter Editor. Er erlaubt dem<br />
Benutzer, XML-Dateien eines durch das XMLSchema festgelegten Formates zu generieren<br />
bzw. zu bearbeiten. Dabei werden Daten in Form von Formular-Eingabefeldern<br />
dargestellt und erfasst.
50 KAPITEL 5. ADMINISTRIERUNG DES CCM-SYSTEMS<br />
Abbildung 5.1: XMLSpy<br />
Die Bedienung von XAmple ist sehr intuitiv (siehe Abbildung 5.2). Zu Beginn wählt<br />
man eine XMLSchema-Datei aus, welche als Basis der Daten dient. Als Nächstes kann<br />
man eine existierende XML-Datei des ausgewählten Formats öffnen oder eine neue<br />
anlegen. Die hierarchische Struktur des Dokumentes wird grafisch dargestellt. Daten<br />
werden bereits während der Eingabe auf ihre Korrektheit bzgl. der Schema-Definition<br />
überprüft.<br />
XAmple scheint geeigneter zu sein, CCM-Konfigurationsdateien zu editieren. Durch die<br />
grafische Abbildung von XML-Knoten als Text-Eingabefelder und automatische Validierung<br />
der Daten während ihrer Eingabe ist man mit XAmple einen großen Schritt<br />
weiter als mit XMLSpy, was Bedienungsfreundlichkeit bzgl. CCM-Dateien angeht.<br />
Allerdings löst XAmple nicht alle Probleme, welche beim Editieren von CCM-Dateien<br />
auftauchen. So ist die Suche eines bestimmten Knotens immer noch sehr Zeitaufwendig.<br />
Außerdem werden von XAmple alle XML-Knoten des Dokumentes dargestellt,<br />
was eigentlich beim einfachen Editieren oft überflüssig ist. Zum Beispiel bekommt eine<br />
Liste von profiles beim XAmple ein übergeordnetes Element namens ”<br />
array (1..unbounded<br />
of profile)“, welches dann erst einzelne profile-Knoten enthält. Analog dazu<br />
werden auch andere XMLSchema-Definitionen abgebildet - Wird ein complexType mit<br />
einem eingebetteten choice-Element definiert, so erscheint das choice als ein zusätzliches<br />
Element der Eingabemaske, wodurch alle anderen untergeordneten Elemente eine
5.3. LÖSUNGSVORSCHLAG - DAS CONFIGTOOL 51<br />
Abbildung 5.2: XAmple<br />
logische Stufe tiefer verschoben werden.<br />
Dieses Verhalten mag allgemein richtig und nützlich sein, nicht aber bei festgelegten<br />
CCM-Strukturen. Denn der Administrator muss nicht genau wissen, wie eine CCM-Datei<br />
aufgebaut ist - es würde reichen, wenn er mit der groben Struktur vertraut ist und<br />
bestimmte Informationen aus einer solchen Datei ablesen kann. Das Problem besteht<br />
i.A. darin, dass der Editor keine Besonderheiten der festgelegten Struktur kennt und<br />
deswegen auch nicht optimal eingesetzt werden kann.<br />
5.3 Lösungsvorschlag - das configTOOL<br />
Nach einer Analyse der vorhandenen Werkzeuge wird klar, dass ein solches System wie<br />
CCM eine spezielle, auf ihre Bedürfnisse zugeschnittene Lösung braucht. In einer solchen<br />
Lösung ließen sich z.B. Vorgänge wie ”<br />
Neues Profil anlegen“, ”<br />
Profile synchronisieren“<br />
etc. definieren, welche im Grunde genommen nur bestimmte Manipulationen von XML-<br />
Knoten bedeuten.<br />
Als Prototyp einer solchen Lösung dient im Rahmen dieser Diplomarbeit entwickeltes<br />
Werkzeug namens ”<br />
configTOOL“. Folgendes Bild zeigt einen Screenshot von configTOOL.
52 KAPITEL 5. ADMINISTRIERUNG DES CCM-SYSTEMS<br />
Abbildung 5.3: configTOOL<br />
Das Hauptfenster des configTOOLs ist in drei Regionen unterteilt:<br />
• Der Bereich Path stellt CCM-Metadaten dar. Dazu zählen profile, application,<br />
unit und version-Angaben.<br />
• Im Bereich Content ist die Konfigurationsdaten-Hierarchie abgebildet. Es wird<br />
die Baumstruktur des gerade ausgewählten version-Knotens dargestellt.<br />
• Der Bereich Properties enthält Konfigurationsdaten eines gerade ausgewählten<br />
Elementes der Hierarchie. Hier werden alle Eigenschaften eines Elements dargestellt<br />
und können verändert werden.<br />
Eine solche Aufteilung in drei logische Bereiche bringt mit sich viele Vorteile. So ist<br />
allgemein die Übersichtlichkeit und speziell die Suche nach einem konkreten Konfigurationselement<br />
viel einfacher, weil man bei der Suche den CCMPath der Konfiguration<br />
kennt und somit über den Path-Bereich sofort zum ”<br />
richtigen“ Konfigurationsabschnitt<br />
übergeht. Dieser wird im Content-Bereich in einer kompakten Form dargestellt, welche<br />
Einzelheiten über die genaue Struktur und Typisierung der Daten verbirgt.
5.3. LÖSUNGSVORSCHLAG - DAS CONFIGTOOL 53<br />
Auch im Falle der CCM-Administrierung bietet das configTOOL zum Teil bereits Einstellungsmöglichkeiten.<br />
Diese sollen während bzw. nach der Einführung des CCM-Systems<br />
weiter entwickelt werden.<br />
Das Bild 5.4 zeigt das Dialogfenster vom configTOOL, welches über den Menüpunkt<br />
” Repository“ - Properties“ aufgerufen wird.<br />
”<br />
Abbildung 5.4: configTOOL- CCM-Einstellungen<br />
Der Dialog verfügt über fünf Seiten (Tabs), welche fünf CCM-Konfigurationsbereiche<br />
abbilden:<br />
Preferences - allgemeine Einstellungen von Repository-Pfaden und CCM-Logging.<br />
Secrets - Liste der eingesetzten Secrets<br />
Connections - Liste der verfügbaren Connections<br />
Resource - Liste der definierten Konfigurationsresourcen, welche über entsprechende<br />
ResourceAccessAdapter-Klassen erreichbar sind.<br />
Applications - Liste der zugelassenen Anwendungen, welche direkte Konfigurationsanfragen<br />
stellen dürfen.
54 KAPITEL 5. ADMINISTRIERUNG DES CCM-SYSTEMS
Kapitel 6<br />
Ausblick<br />
Basierend auf langjähriger Erfahrung kann man jetzt schon sagen, dass so eine komplexe<br />
Anwendung wie das CCM nie ganz fertig implementiert werden kann. Es wird immer<br />
wieder Verbesserungs- und Erweiterungsvorschläge geben, welche das System einerseits<br />
weiterentwickeln, andererseits aber auch noch komplexer machen werden.<br />
Ein paar solcher Erweiterungsmöglichkeiten werden in diesem Kapitel vorgestellt. Dabei<br />
handelt sich um System-Erweiterungen, welche bereits in der Entwicklungsphase in<br />
den Modellierungsprozess mit aufgenommen wurden, die aber erst nach praktischer<br />
Erfahrung mit dem CCM-System implementiert werden können.<br />
6.1 Abhängigkeiten<br />
Abbildung von Abhängigkeiten zwischen einzelnen CCM-Komponenten wurde in dieser<br />
Arbeit bereits mehrfach erwähnt. Definitionen solcher Abhängigkeiten und ihre spätere<br />
Auflösung stellen ein weiteres design- und programmiertechnisches Problem dar.<br />
Durch den Einsatz von Vererbungstechniken kann die Anzahl solcher system-internen<br />
Abhängigkeiten enorm reduziert, aber leider nicht komplett eliminiert werden. Es bleiben<br />
außerdem noch die externen Abhängigkeiten wie hardware-spezifische Konfigurationsparameter<br />
etc.<br />
6.1.1 Definition der Abhängigkeiten<br />
Wie bereits in der Praktikum-Ausarbeitung [12] von Niklas Jakob und Sebastian Stark<br />
kurz erwähnt, wurde eine XML-Struktur auf der profile-Ebene definiert, welche Definitionen<br />
von profile-spezifischen Abhängigkeiten erlaubt. Solche Definitionen werden<br />
innerhalb des -Knotens nach allen application’s angegeben.<br />
Eine vollständige (Pseudo-)BNF-Grammatik solcher Definitionen befindet sich im Anhang<br />
auf Seite 88.<br />
55
56 KAPITEL 6. AUSBLICK<br />
Im Allgemeinen wird eine Abhängigkeit durch drei folgenden Merkmale beschrieben:<br />
condition - eine optionale Bedingung, bei welcher die Abhängigkeit auftritt<br />
statement - eine Beschreibung der Abhängigkeit<br />
action - eine Beschreibung der Vorgehensweise zur Auflösung der Abhängigkeit<br />
Condition<br />
Die Bedingung wird mit dem -Knoten definiert, welcher als Inhalt einen<br />
komplexen Ausdruck haben kann. Folgendes Beispiel beschreibt die Bedingung ”<br />
Datei<br />
flexitrust.lck existiert“:<br />
<br />
<br />
<br />
<br />
<br />
<br />
. . .<br />
<br />
In einem anderen Beispiel wird überprüft, ob es sich bei der FlexiTRUST-Konfiguration<br />
um eine Online-Variante handelt (dies ist dann der Fall, wenn alle drei Hauptkomponenten<br />
des Systems auf dem gleichen Rechner laufen):<br />
<br />
<br />
<br />
(RA)/IP-Adresse<br />
(CA)/local/ip-addr<br />
(IS)/IpAddr<br />
<br />
<br />
. . .<br />
<br />
Hier steht im -Knoten der CCMPath (in Klammern) gefolgt von einem<br />
XPath-Ausdruck, welcher auf den Konfigurationsknoten unterhalb des adressierten CCM-<br />
Blocks verweist. In diesem Beispiel wurde angenommen, dass die RA-Komponente ihre<br />
IP-Adresse unter dem Parameternamen ”<br />
IP-Adresse“, die CA - unter ”<br />
local/ip-addr“<br />
und die IS - unter ”<br />
IpAddr“ abgelegt haben.
6.1. ABHÄNGIGKEITEN 57<br />
Statement<br />
Die Abhängigkeit selbst wird durch einen weiteren komplexen Ausdruck beschrieben.<br />
Dieser wird nach dem -Knoten angegeben oder direkt als erstes Kind-<br />
Element des -Knotens, falls für diese Abhängigkeit keine Bedingung<br />
definierbar ist. Folgendes Beispiel zeigt eine Abhängigkeitsdefinition, welche besagt,<br />
dass die RA- und die IS-Komponenten auf der gleichen Datenbank arbeiten sollen.<br />
Dabei wird die Gleichheit der Datenbank durch Gleichheit des DB-Treibers sowie der<br />
DB-URL sichergestellt.<br />
<br />
<br />
<br />
(RA)/database/url<br />
(IS)/db-url<br />
<br />
<br />
(RA)/database/driver<br />
(IS)/db-treiber<br />
<br />
<br />
. . .<br />
<br />
Das nächste Beispiel zeigt einen größeren XML-Fragment, welcher erst überprüft, ob<br />
es sich um die Online-Konfiguration handelt (wie im oberen Beispiel) und dann eine<br />
Gleichheit der Ein- und Ausgabeverzeichnissen verlangt:<br />
<br />
<br />
<br />
<br />
<br />
(RA)/IP-Adresse<br />
(CA)/local/ip-addr<br />
(IS)/IpAddr<br />
<br />
<br />
<br />
<br />
<br />
(RA)/Ausgabeverzeichnis<br />
(CA)/dirs/p7In<br />
<br />
58 KAPITEL 6. AUSBLICK<br />
<br />
(CA)/dirs/p7Out<br />
(IS)/productsDir<br />
<br />
<br />
. . .<br />
<br />
Action<br />
Schließlich kommt man zur Definition einer Aktion, welche die gefundene Abhängigkeit<br />
auflösen soll. Hierfür wird das Element definiert. Momentan wurden folgende<br />
Arten von Aktionen spezifiziert:<br />
synchronize - Daten werden synchronisiert.<br />
message - es wird eine Meldung ausgegeben, der Benutzer kümmert sich um die<br />
Auflösung der Abhängigkeit.<br />
execute - ein Skript oder ein Programm werden zur Auflösung der Abhängigkeit aufgerufen.<br />
Die Aktionen können einzeln oder auch in beliebiger Kombination aufgeführt werden.<br />
Es folgt wieder ein Beispiel. Hier wird die Synchronisation der Daten als Auflösungsmethode<br />
gewählt. Anschließend wird eine Statusmeldung ausgegeben.<br />
<br />
. . .<br />
<br />
<br />
<br />
Daten wurden aktualisiert<br />
<br />
<br />
Durch die Angabe mode="update" wird mitgeteilt, dass die neuere Version der Daten<br />
übernommen werden soll. user-confirmation="yes" erzwingt eine Benutzer-Bestätigung<br />
des Updates.
6.2. AUTOMATISCHE INSTALLATION 59<br />
6.1.2 Auflösung der Abhängigkeiten<br />
An dieser Stelle würde man sich vielleicht fragen, warum all dies im Kapitel ”<br />
Ausblick“<br />
einer Diplomarbeit steht, wenn alles bereits so detailliert durchdacht und spezifiziert<br />
wurde.<br />
Dies ist deswegen der Fall, weil die eigentliche Auflösung der Abhängigkeiten programmiertechnisch<br />
noch nicht realisiert wurde. Außerdem werden nach der Einführung des<br />
CCM-Systems sicherlich weitere Arten von Abhängigkeiten auftauchen, welche dem Autor<br />
während des Modellierungsprozesses nicht aufgefallen sind. Ebenso werden sich<br />
technische Methoden zur Auflösung verschiedener Abhängigkeiten rauskristallisieren.<br />
Außerdem ist es fraglich, ob sich alle Abhängigkeiten mit dem beschriebenen Konstrukt<br />
definieren lassen. Momentan lassen sind Abhängigkeiten anhand folgender Merkmale<br />
beschreiben:<br />
• Konfigurationsparameter können mit bestimmten Werten oder mit weiteren Parametern<br />
verglichen werden;<br />
• Dateien können auf ihre Existenz überprüft werden, Dateirechte bz. -größen lassen<br />
sich mit einbeziehen;<br />
Sehr oft lassen sich komplexere Abhängigkeiten auf die eine der beiden Arten reduzieren.<br />
So könnte Verwendung einer gemeinsamen Datenbank auf die Gleichheit zweier<br />
Konfigurationsparameter reduziert oder das Vorhandensein einer Komponente durch<br />
das Vorhandensein einer für diese Komponente spezifischen Datei nachgewiesen werden.<br />
Dies wird vermutlich aber nicht immer der Fall sein. Eine reine Hardware-Überprüfung<br />
kann z.B. mit definierten Mechanismen nicht durchgeführt werden, abgesehen von der<br />
Möglichkeit, nach bestimmten Treibern der betroffenen Hardwarekomponente zu suchen,<br />
welche als Nachweis des Vorhandenseins der Komponente selbst interpretiert<br />
werden könnten.<br />
6.2 Automatische Installation<br />
Für Benutzer - eine Selbstverständlichkeit, für Programmierer dagegen oft extrem aufwendig<br />
ist die Entwicklung einer Prozedur für eine automatische Installation des programmierten<br />
Systems. Besonders bei verteilten Systemen wie FlexiTRUST, welche so<br />
viele interne wie auch externe Abhängigkeiten haben, ist eine automatische Installation<br />
keine Selbstverständlichkeit, sondern erweist sich immer wieder als ein langwieriger<br />
und fehleranfälliger Prozess.<br />
Eines der Ziele des CCM-Systems ist solche automatische Installationen zu ermöglichen.<br />
Diese könnten dann wie folgt ablaufen:
60 KAPITEL 6. AUSBLICK<br />
• Vor dem Installieren beim Kunden wird die Konfiguration des Systems getestet<br />
und als CCM-Konfigurationsdatei gespeichert;<br />
• eine Installationskomponente überträgt alle für diese Installation notwendige Programmdateien<br />
auf den/die Rechner vom Kunden;<br />
• die Systemkonfiguration wird mit definierten Verteilungsstrategien eingespielt;<br />
• es wird eine Überprüfung auf Abhängigkeiten durchgeführt, welche u.U. weitere<br />
Installationsvorgänge startet;<br />
• anschließend wird das installierte System initialisiert, wonach optional eine weitere<br />
Abhängigkeitsübreprüfung stattfinden könnte.<br />
Bei der Installationskomponente wird es sich um ein Skript oder ein Programm handeln.<br />
Daten, die die Installation beschreiben, können als Teil der CCM-Konfiguration erfasst<br />
werden, so dass die Installationskomponente keiner besonderen Behandlung bedarf.<br />
Um eine automatische Installation zu ermöglichen müssen alle Systemkomponenten<br />
über eine gemeinsame Schnittstelle zum Installieren/Initialisieren verfügen. Dies muss<br />
nicht unbedingt eine programm-technische Schnittstelle sein - u.U. reicht es aus, wenn<br />
das CCM-System über einen entsprechenden Konfigurationsblock pro Komponente verfügen<br />
würde, in welchem alle zur Installation notwendigen Schritte beschrieben sind.<br />
Solche Installationsschritte sollen aber auf eine abstrakte Weise definiert werden, so<br />
dass der Syntax eine generische/automatische Abarbeitung ermöglicht.<br />
6.2.1 Installationsdokumentation<br />
Die Problematik der automatischen Installation könnte auch auf eine andere Weise<br />
gelöst werden. Werden alle Komponenten des Systems eine Installationsanleitung als<br />
Teil der CCM-Konfiguration bereitstellen, so könnte eine komplette Anleitung zur Systeminstallation<br />
per Knopfdruck generiert werden. So eine Anleitung würde dann neben<br />
Anleitungen einzelner Komponenten auch eine Liste der Abhängigkeiten beinhalten,<br />
mit Angaben zu ihrer Auflösung.<br />
Durch den Einsatz von Vererbung und Datenstrukturierung kann die Installationsbeschreibung<br />
komponenten- und profilspezifisch generiert werden, wobei einzelne Teile<br />
der Beschreibung aus unterschiedlichen Konfigurationsblöcken kommen würden. Das<br />
Gleiche betrifft auch die Abhängigkeiten.<br />
Mit einem solchen Ausdruck in der Hand wäre eine Installation viel einfacher, weil man<br />
die Beschreibung als eine Art Checkliste verwenden könnte. Diese Lösung könnte auch<br />
als eine Vorstufe vor einer komplett automatischen Installation eingeführt werden, um<br />
Erfahrungen über Installationsproblematik zu sammeln und entsprechende Techniken<br />
zu entwickeln, welche später in der Installationskomponente realisiert werden sollten.
6.3. ERWEITERUNG ZUR FUNKTIONSBASIERTEN SICHT 61<br />
6.3 Erweiterung zur funktionsbasierten Sicht<br />
Die jetzige Definition von Konfigurationsparametern bildet die Gesamtkonfiguration<br />
des Systems auf die Komponenten-Ebene ab. D.h., das System wird als eine Menge von<br />
Komponenten angesehen.<br />
Diese komponentenbasierte Sicht auf die Systemkonfiguration bildet das Fundament für<br />
weitere Abstraktionen, welche komplexere Analysen des Gesamtsystems ermöglichen<br />
sollen. So wäre eine funktionsbasierte Sicht denkbar (und sogar sehr wünschenswert!),<br />
bei welcher nicht nach Komponenten, sondern nach Funktionen geordnet wird, die vom<br />
System zur Verfügung gestellt werden. Folgendes Beispiel zeigt den Unterschied dieser<br />
zweier Sichten:<br />
FlexiTRUST Komponenten-Sicht:<br />
Das System besteht aus folgenden Komponenten:<br />
• RA,<br />
• CA,<br />
• IS,<br />
• mySQL-DB,<br />
• openLDAP,<br />
. . .<br />
FlexiTRUST Funktionen-Sicht:<br />
Das System bietet folgende Funktionen an:<br />
• PKCS#12,<br />
• CRL,<br />
• SSL,<br />
• CSV-Import,<br />
• PKCS#10-Import,<br />
. . .<br />
Dabei handelt es sich um das gleiche System. Wie man sieht, verrät die Funktionsliste<br />
dem Endanwender viel mehr über das Gesamtsystem, als die Komponentenliste, welche<br />
dagegen einem System-Administrator viel nützlicher erscheinen mag.<br />
Durch eine entsprechende Erweiterung des CCM-Systems ließen sich dann Werkzeuge<br />
entwickeln, welche ja nach Funktonsbedarf unterschiedliche Komponenten anbinden<br />
und somit das Gesamtsystem wie aus einzelnen Bausteinen zusammensetzen. In Verbindung<br />
mit dem Mechanismus für automatische Auflösung der Abhängigkeiten könnte<br />
man dann Systemkonfigurationen ”<br />
zusammenklicken“.
62 KAPITEL 6. AUSBLICK<br />
Abbildung 6.1: Funktions- vs. Komponentensicht<br />
6.3.1 Abbildung von Policies<br />
Durch eine weitere Abstraktion lassen sich auch unterschiedliche Policies abbilden.<br />
Denkbar wäre eine Schnittstelle, welche bestimmte Policy-Definitionssprachen auf entsprechende<br />
Funktionen des Systems abbildet, die wiederum auf Komponentenebene<br />
projiziert werden und somit eine bestimmte Komponentenmenge samt ihren Konfigurationsparametern<br />
beschreiben.<br />
Umgekehrt wäre es auch sehr interessant, eine bestehende Systemkonfiguration auf<br />
Validität bzgl. bestimmten Policy-Vorgaben zu überprüfen. Eine solche Überprüfung,<br />
die auf den ersten Blick als nicht problematisch erscheint, erweist sich leider als alles<br />
andere als trivial. Der erste Ansatz wäre, Policy-Vorgaben bis auf die Komponentenebene<br />
zu projizieren und anschließend das Ergebnis mit der aktuellen Konfiguration<br />
zu vergleichen. Dieses Verfahren würde aber immer ein negatives Ergebnis liefern, weil<br />
eine Gleichheit zweier komponenten-basierten Konfigurationen unmöglich festzustellen<br />
wäre. Solche Konfigurationen unterscheiden sich immer, auch wenn es sich dabei nur<br />
um verschiedene Verzeichnis- oder Benutzernamen handelt.<br />
Erst Funktionsebenen lassen sich miteinander vergleichen. Dafür muss die Komponentenebene<br />
auf die Funktionsebene projiziert und mit dem Ergebnis der Policy-Transformation<br />
verglichen werden.
6.3. ERWEITERUNG ZUR FUNKTIONSBASIERTEN SICHT 63<br />
Abbildung 6.2: Policy-Validierung
64 KAPITEL 6. AUSBLICK
66 KAPITEL 7. ZUSAMMENFASSUNG<br />
(einfachere) Strukturen dafür zu verwenden. Dadurch wird die Konfiguration, und somit<br />
auch die Komponente selbst, übersichtlicher und ”<br />
sauberer“.<br />
Das Konzept der Vererbung ist bestimmt der Kernpunkt der CCM-Architektur. Ihre Verwendung<br />
ist nicht zwingend, aber sehr empfehlenswert. Durch die Vererbung werden<br />
gleich mehrere Ziele erreicht. In erster Linie wird Redundanz der Konfigurationsdaten<br />
vermieden (idealerweise sollen in der Gesamtkonfiguration gar keine Redundanzen<br />
enthalten sein). Dadurch wird das gesamte System besser wartbar - Änderung eines<br />
Parameters wirkt sich auf das gesamte System aus. Natürlich erfordert der Einsatz der<br />
Vererbung mehr Zeit für Modellierung der Konfigurationsstruktur. Analog zu objektorientierter<br />
Programmierung kann man aber sagen, dass dieser Aufwand sich mehrmals<br />
zurück zahlen wird, wenn das System um weitere Komponenten ergänzt wird oder<br />
größere Umstellungen vorgenommen werden.<br />
Dadurch, dass es nun möglich ist, Konfigurationen verschiedener Projekte parallel zu<br />
verwalten und zu verwenden sorgt das CCM-System für bessere Strukturierung der<br />
Hauptanwendung. Ihre Kerngrößen werden zentral gespeichert, projektspezifisch werden<br />
nur noch minimale Justierungen vorgenommen.<br />
7.2 So geht es weiter ...<br />
Jetzt ist das System fertig! Das heißt, die Arbeit kann beginnen! Denn fertig ist nur<br />
die Spezifikation und die Implementierung. Als Nächstes soll das bestehende System<br />
für CCM adoptiert werden.<br />
Dafür soll als Erstes jemand damit beauftragt werden, sich um die zentralisierte Systemkonfiguration<br />
zu kümmern. Denn nur so wird die Konfiguration einen ”<br />
Rahmen“<br />
bekommen, nur so wird sie zu einem gemeinsamen Nenner gebracht. Versuche, dieses<br />
komplexe und flexible System dezentral zu verwalten werden scheitern!<br />
Der Verantwortliche wählt sich eine Komponente des Gesamtsystems und versucht ihre<br />
Konfiguration in das CCM-System einzutragen. Dafür kann entweder das implementierte<br />
configTOOL oder ein anderer XML-Editor verwendet werden. Beim configTOOL handelt<br />
es sich um ein Prototyp, daher wird es notwendig sein dieses zu erweitern.<br />
Um die Konfiguration der Komponente zu adoptieren wird erst die Laufzeitumgebung<br />
dieser analysiert. Dazu gehören Konfigurationsdateien, Skripte, Umgebungsvariablen<br />
etc. Danach wird in der CCM-Konfiguration ein neuer application-Abschnitt angelegt,<br />
welcher alle für diese Komponente relevanten Angaben beschreibt. Die Konfigurationsdaten<br />
sollen dabei nach logischer Zugehörigkeit gruppiert werden, und die mehrmals<br />
bzw. mit anderen Komponenten verwendete Parameter in einen anderen application-<br />
Abschnitt (oder sogar einen profile-Abschnitt) ausgelagert und schließlich per Vererbung<br />
eingebunden werden.<br />
Als Nächstes werden XSL-Transformationen definiert, welche die neu erstellte XML-<br />
Struktur auf die der ”<br />
alten“ Konfigurationsdateien abbilden. Dadurch kann die Komponente<br />
ohne jeglicher Code-Anpassung gestartet werden.
7.2. SO GEHT ES WEITER ... 67<br />
Entscheidet man sich für eine Rollout-Lösung, dann ist man an dieser Stelle schon fertig.<br />
Ansonsten muss die Komponente für die Request-Verteilung leicht angepasst werden.<br />
Anschließend wird die Konfiguration der Komponente zur Verfügung gestellt (ob durch<br />
einen Roll-Out oder durch den Start des CCM-Servers) und die Komponente getestet.<br />
Sobald alles läuft begibt man sich in Richtung einer weiteren Komponente des Systems...
68 KAPITEL 7. ZUSAMMENFASSUNG
Anhang A<br />
Schnittstellen<br />
A.1 Secret<br />
Die Klasse flexsecure.util.security.pkcs7.Secret repräsentiert ein Zertifikatbasiertes<br />
Geheimnis mit einem dazugehörigen Mechanismus, Daten zu entschlüsseln sowie<br />
zu signieren. Ein Objekt der Klasse wird mit der Methoden<br />
void init(java.util.Properties)<br />
initialisiert und stellt anschließend Methoden<br />
codec.pkcs7.SignedData sign(byte[]) und<br />
byte[] decrypt(codec.pkcs7.EnvelopedData)<br />
zur Verfügung.<br />
Mit Hilfe dieser Klasse ist es möglich, sowohl mit SoftTokens als auch auf Chipkartenbasierten<br />
Schlüsselpaaren zu arbeiten. Beide Varianten sind in den Implementierungen<br />
flexsecure.util.security.pkcs7.SoftTokenSecret und<br />
flexsecure.util.security.pkcs7.SmartCardSecret<br />
realisiert.<br />
Beispiel 5 Dieses kurze Beispiel soll zeigen, wie die Klasse Secret verwendet werden<br />
kann, um eine höchstmögliche Transparenz bei der Wahl des verwendeten Sicherheitstyps<br />
(SoftToken vs. Chipkarten) zu gewinnen.<br />
69
70 ANHANG A. SCHNITTSTELLEN<br />
public Secret initSecret(String secretClass, Properties settings)<br />
throws ... {<br />
}<br />
Secret secret = (Secret) Class.forName(secretClass).newInstance();<br />
secret.init(props);<br />
return secret;<br />
// ...<br />
EnveloperData envData = ...<br />
Secret secret = this.initSecret(<br />
"flexsecure.util.security.pkcs7.SmartCardSecret", settings);<br />
byte[] plainData = secret.decrypt(envData);<br />
// ...<br />
byte[] toBeSignData = ...<br />
SignedData signedData = secret.sign(toBeSignData);<br />
// ...<br />
A.2 RuntimeInitializable<br />
Das Interface flexsecure.util.args.RuntimeInitializable definiert eine Schnittstelle,<br />
welche eine Liste der zur Initialisierung der Komponente benötigten Parametern<br />
liefert und somit die Komponente zur Laufzeit initialisieren kann. Diese Vorgehensweise<br />
wird verwendet, um unterschiedliche Ausprägungen von definierten Modellen abhängig<br />
von Konfigurationsdaten zu initialisieren, ohne dass man zuvor etwas über die Anforderungen<br />
der Komponente wissen muss.<br />
Um eine Komponente (Klasse) also zur Laufzeit initialisierbar zu machen muss diese<br />
die Methode<br />
flexsecure.util.args.Arguments getNeededArguments(),<br />
implementieren, wobei die Klasse flexsecure.util.args.Argumens eine Liste der Argumenten<br />
vom Typ flexsecure.util.args.ArgumentDescription kapselt. Bei der<br />
Definition eines Arguments kann sein Typ (String, boolean, Dateireferenz oder Password)<br />
angegeben werden. Außerdem können auch optionale Argumente definiert werden.<br />
Ein besonderer Merkmal dieser Implementierung besteht darin, dass somit nicht definierte<br />
aber zur Initialisierung einer Komponente notwendige Parameter zur Laufzeit<br />
erfragt werden können. Man denke dabei z.B. an Passwörter etc.<br />
Beispiel 6 In diesem Beispiel soll demonstriert werden, wie die oben besprochene<br />
Schnittstelle verwendet werden kann.
A.2. RUNTIMEINITIALIZABLE 71<br />
public class MyClass implements RuntimeInitializable {<br />
// ...<br />
Properties params = new Properties();<br />
// Parameters<br />
private boolean a;<br />
private String b; // Passwort<br />
private String c;<br />
// Getter-/Setter Methoden<br />
public boolean getA(){ return this.a; }<br />
public void setA(boolean a){ this.a = a; }<br />
public String getB(){ return this.b; }<br />
public void setA(String b){ this.b = b; }<br />
public String getC(){ return this.c; }<br />
public void setC(String c){ this.c = c; }<br />
// RuntimeInitializable Funktionalität<br />
public Arguments getNeededArguments() throws ... {<br />
Arguments args = new Arguments();<br />
/*<br />
* zu jedem Parameter werden seinen Namen, Typ, sog. Displaynamen,<br />
* Namen der get-/set-Methoden sowie einen boolean-Werte für<br />
* Erforderlichkeit dieses Parameters angegeben<br />
*/<br />
args.addArgumentDescription("a", ArgumentDescription.TYPE_BOOLEAN,<br />
"Parameter A", "getA", "setA", true);<br />
args.addArgumentDescription("b", ArgumentDescription.TYPE_PASSWORD,<br />
"Parameter B", "getB", "setB", true);<br />
args.addArgumentDescription("c", ArgumentDescription.TYPE_STRING,<br />
"Parameter C", "getC", "setC", false);<br />
}<br />
return args;<br />
// Hauptprogramm<br />
public static void main(String[] args){<br />
MyClass myClass = new MyClass(...);<br />
// params aus dem Configfile laden<br />
params.load(...);<br />
// auf Vollständigkeit überprüfen<br />
Arguments arg = myClass.getNeededArguments();<br />
arg.init(myClass);
72 ANHANG A. SCHNITTSTELLEN<br />
String[] names = arg.getArgumentNames();<br />
for (int i = 0; i < names.length; i++) {<br />
String argName = names[i];<br />
ArgumentDescription argDescr = arg.getArgumentDesciption(argName);<br />
String value = params.getProperty(argName);<br />
if (value == null) {<br />
// Parameter nicht definiert ...<br />
if (argDescr.isRequired()) {<br />
// Parameter erforderlich, Wert erfragen ...<br />
switch (argDescr.getType()) {<br />
case ArgumentDescription.TYPE_STRING :<br />
// String erfragen<br />
value = ...<br />
case ArgumentDescription.TYPE_BOOLEAN :<br />
// boolean erfragen<br />
value = ...<br />
case ArgumentDescription.TYPE_FILE :<br />
// Dateireferenz erfragen<br />
value = ...<br />
case ArgumentDescription.TYPE_PASSWORD :<br />
// Passwort erfragen<br />
value = ...<br />
}<br />
}<br />
// Wert setzen<br />
arg.set(argName, value);<br />
}<br />
// Klasse initialisieren<br />
myClass.update(arg);<br />
}<br />
// ...<br />
A.3 ResourceAccessAdapter<br />
Das Konzept des Zugriffs auf die Konfigurationsdaten ist durch die Schnittstelle<br />
de.flexsecure.ccm.raa.ResourceAccessAdapter<br />
gegeben. Diese definiert mehrere Methoden, welche den Zugriff auf Konfigurationsdaten<br />
erlauben und Änderungen an diesen vornehmen. Zwei wichtigste Methoden sind dabei<br />
java.io.InputStream getResource(CCMPath path) und<br />
void setResource(CCMPath path, byte[] resource)
A.4. CONNECTION 73<br />
Beide Methoden erwarten einen Parameter vom Typ CCMPath, welcher den logischen<br />
Pfad der Konfigurationseinheit bestimmt. Eine Konfigurationseinheit wird von der<br />
getResource()-Methode in Form eines InputStreams zurückgegeben. Geschrieben wird<br />
eine Einheit durch den Aufruf der setResource()-Methode, welche die Daten in Form<br />
eines Byte-Arrays erwartet.<br />
Die Schnittstelle ResourceAccessAdapter erlaubt es, mehrere Varianten der Datenaufteilung<br />
des Systems parallel zu verwenden, ohne dass die restlichen CCM-Mechanismen<br />
modifiziert werden müssen. So wurden im Rahmen dieser Arbeit zwei Referenzimplementierungen<br />
realisiert:<br />
• FileSetResourceAccessAdapter – diese Klasse bildet Konfigurationseinheiten<br />
auf einzelne Dateien ab, gruppiert durch das ”<br />
einfache“ Verzeichnissstruktur der<br />
Festplatte.<br />
• FileResourceAccessAdapter – bei dieser Klasse wird eine einzelne XML-Datei<br />
für Speicherung der gesamten Systemkonfiguration verwendet. Die Unterteilung<br />
in Profiles, Application etc. wird durch interne XML-Strukturierung dieser<br />
Datei realisiert.<br />
Um maximale Flexibilität zu gewährleisten implementieren alle Klassen des Interfaces<br />
die bereits in A.2 beschriebene RuntimeInitializable-Schnittstelle.<br />
A.4 Connection<br />
Für eine saubere Trennung zwischen dem CCM-Client und dem CCM-Server sorgt die<br />
eingeführte Schnittstelle<br />
de.flexsecure.ccm.connection.Connection<br />
Eine jede Implementierung dieser Schnittstelle muss folgende Methoden beschreiben:<br />
void init(List params)<br />
wird zur Initialisierung einer Connection verwendet,<br />
void send(Message req) und<br />
Message receive()<br />
empfangen und versenden Nachrichten,<br />
void startServer() und<br />
void acceptConnection()
74 ANHANG A. SCHNITTSTELLEN<br />
starten den Server und reagieren auf die ankommende Verbindungsanfragen (Serverseitig),<br />
void connectServer()<br />
stellt eine Verbindung mit dem Server her (Client-seitig) und<br />
void close()<br />
schließt eine Verbindung.<br />
Folgende Connection-Implementierungen wurden im Rahmen der Arbeit realisiert:<br />
• SockerConnection – diese Klasse stellt eine Connection über Sockets dar. Dies<br />
ist der Standardfall beim CCM-System.<br />
• FileConnection – diese Connection-Art ermöglicht eine Anbindung von physikalisch<br />
getrennten Komponenten (wie z.B. die Offline-CA). Bei der FileConnection<br />
werden alle Nachrichten nicht über Netzverbindungen übertragen, sondern in speziellen<br />
Dateien abgelegt. Durch Austausch solcher Dateien lässt sich eine Kommunikation<br />
zwischen nicht miteinander verbundenen Komponenten simulieren.<br />
A.5 LocalSecurityAdapter<br />
Das LocalSecurityAdapter-Interface übernimmt die Aufgabe, den Datentransfer zwischen<br />
der Anwendung und dem lokalen Datenträger (Festplatte) zu schützen sowie<br />
Datenintegrität zu gewährleisten.<br />
Neben einer init-Methode zum Initialisieren stellt die Schnittstelle lediglich zwei weiteren<br />
Methoden zur Verfügung:<br />
java.io.InputStream getConfig(java.io.InputStream in) und<br />
void setConfig(java.io.OutputStream out, java.io.InputStream data)<br />
Dabei liefert die getConfig()-Methode Daten vom lokalen Datenträger (und entschlüsselt<br />
diese ggf.). Die setConfig()-Methode schreibt die ”<br />
Plaintext“ Daten auf<br />
die Festplatte (und verschlüsselt bzw. signiert sie dabei).<br />
Die LocalSecurity-Adaptoren werden nie direkt von einer Anwendung verwendet. Diese<br />
werden in den jeweils verwendeten ResourceAccessAdapter integriert und überwachen<br />
den Datenstrom von und zu der Festplatte.<br />
Im Rahmen dieser Arbeit wurde nur eine einfache Variante des Adapters implementiert:
A.6. REMOTESECURITYADAPTER 75<br />
• PlainLocalSecurityAdapter – dieser Adaptor verändert die Daten nicht, sondern<br />
leitet sie einfach weiter.<br />
Eine Implementierung eines Adaptors, welcher Daten verschlüsselt bzw. signiert speichert<br />
und anschließend wieder entschlüsselt bzw. Signatur verifiziert, wäre denkbar und<br />
würde kein Problem darstellen, weil diese Techniken bereits an anderen Stellen (siehe<br />
A.6) zum Einsatz kamen.<br />
A.6 RemoteSecurityAdapter<br />
Analog zum LocalSecurityAdapter dient die Schnittstelle RemoteSecurityAdapter<br />
der Datensicherung. Diesmal aber ist die Sicherung der Datenübertragung über aufgebaute<br />
Connections gemeint. Entsprechend bauen Realisierungen dieser Schnittstelle<br />
nicht auf einem ResourceAccessAdapter, sondern auf einer Connection auf. Aus diesem<br />
Grund müssen hier andere Methoden implementiert werden.<br />
Die zwei wichtigsten Methoden sind<br />
void send(Message req) und<br />
Message receive(),<br />
welche das Versenden und Empfangen von Nachrichten zur Aufgabe haben. Bei diesen<br />
Schritten können Daten durch Verschlüsselung/Signatur geschützt und völlig transparent<br />
für die dahintersteckende Connection übertragen werden.<br />
Um einen sicheren Kommunikationskanal aufbauen zu können müssen sich Client und<br />
Server erst gegenseitig authentisieren. Diese Aufgabe übernehmen die beiden weiteren<br />
Methoden:<br />
void authenticate SSide() und<br />
void authenticate CSide(),<br />
wobei der Suffix ”<br />
SSide“ für die Server-seitige und ”<br />
CSide“ - für die Client-seitige<br />
Authentisierungsprozedur stehen. In dieser Arbeit wurde nicht spezifiziert, wie eine<br />
Authentisierung genau erfolgen soll - dies sei der jeweiligen Implementierung überlassen.<br />
Drei Referenzimplementierungen wurden entwickelt:<br />
• PlainRemoteSecurityAdapter – analog zu der ”<br />
Plain“-Variante des lokalen Adapters<br />
leitet diese Implementierung alle Messages weiter, ohne irgendwelche Änderungen<br />
an versendeten Daten vorzunehmen<br />
• PKIRemoteSecurityAdapter – diese Klasse implementiert einen verschlüsselten<br />
und signierten Datenaustausch, basierend auf dem Secret-Konzept (siehe dazu<br />
A.1)
76 ANHANG A. SCHNITTSTELLEN<br />
• AdminRemoteSecurityAdapter – dies ist die PKI-Variante des Adaptors, welche<br />
bei Admin-Anfragen eingesetzt wird. Der einzige Unterschied besteht in der<br />
internen Verwaltung von Systemzertifikaten.
Anhang B<br />
Datenmodell<br />
B.1 Schema-Definition<br />
Nachfolgend sind Meta-Definitionen für CCM-Konfigurationseinheiten schematisch abgebildet.<br />
Anschließend folgt die XMLSchema-Definition der Dateistruktur.<br />
77
78 ANHANG B. DATENMODELL<br />
< xsd:schema xmlns:xsd =" http: // www .w3.org /2001/ XMLSchema " xmlns:ccm =" http: // www .<br />
flexsecure .de/ccm " xmlns:xsl =" http: // www .w3.org /1999/ XSL / Transform "<br />
targetNamespace =" http: // www . flexsecure .de/ccm "><br />
<br />
< xsd:element name =" config " type =" ccm:configType "/><br />
< xsd:complexType name =" configType "><br />
< xsd:sequence ><br />
< xsd:element name =" profile " type =" ccm:profileType " maxOccurs =" unbounded "/><br />
<br />
<br />
<br />
< xsd:complexType name =" profileType "><br />
< xsd:sequence ><br />
< xsd:element name =" description " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" application " type =" ccm:applicationType " maxOccurs ="<br />
unbounded "/><br />
< xsd:element name =" dependency " type =" ccm:dependencyType " minOccurs ="0"/><br />
< xsd:element name =" parameter " type =" ccm:parameterType " minOccurs ="0"<br />
maxOccurs =" unbounded "/><br />
<br />
< xsd:attribute name =" name " type =" xsd:string " use =" required "/><br />
< xsd:attribute name =" extends " type =" xsd:string "/><br />
< xsd:attribute name =" inheritable " type =" xsd:boolean "/><br />
<br />
<br />
< xsd:complexType name =" applicationType "><br />
< xsd:sequence ><br />
< xsd:element name =" description " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" unit " type =" ccm:unitType " maxOccurs =" unbounded "/><br />
< xsd:element name =" parameter " type =" ccm:parameterType " minOccurs ="0"<br />
maxOccurs =" unbounded "/><br />
<br />
< xsd:attribute name =" name " type =" xsd:string " use =" required "/><br />
< xsd:attribute name =" extends " type =" xsd:string "/><br />
< xsd:attribute name =" inheritable " type =" xsd:boolean "/><br />
<br />
<br />
< xsd:complexType name =" unitType "><br />
< xsd:sequence ><br />
< xsd:element name =" description " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" version " type =" ccm:versionType " maxOccurs =" unbounded "/><br />
< xsd:element name =" parameter " type =" ccm:parameterType " minOccurs ="0"<br />
maxOccurs =" unbounded "/><br />
<br />
< xsd:attribute name =" name " type =" xsd:string " use =" required "/><br />
< xsd:attribute name =" extends " type =" xsd:string "/><br />
< xsd:attribute name =" inheritable " type =" xsd:boolean "/><br />
<br />
<br />
< xsd:complexType name =" versionType "><br />
< xsd:choice ><br />
< xsd:sequence ><br />
< xsd:element name =" description " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" author " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" sequence " type =" ccm:sequenceType " minOccurs ="0"/><br />
< xsd:element name =" parameter " type =" ccm:parameterType " minOccurs ="0"<br />
maxOccurs =" unbounded "/><br />
<br />
< xsd:sequence ><br />
< xsd:any processContents =" skip " minOccurs ="0"/><br />
<br />
<br />
< xsd:attribute name =" name " type =" xsd:string " use =" required "/><br />
< xsd:attribute name =" inheritable " type =" xsd:boolean "/><br />
B.1. SCHEMA-DEFINITION 79<br />
<br />
< xsd:complexType name =" parameterType "><br />
< xsd:sequence ><br />
< xsd:any processContents =" skip " minOccurs ="0" maxOccurs =" unbounded "/><br />
<br />
< xsd:attribute name =" type " type =" xsd:string "/><br />
<br />
<br />
< xsd:complexType name =" sequenceType "><br />
< xsd:sequence ><br />
< xsd:element name =" element " type =" ccm:elementType " maxOccurs =" unbounded "/><br />
<br />
<br />
<br />
< xsd:complexType name =" elementType "><br />
< xsd:sequence ><br />
< xsd:element name =" name " type =" xsd:string "/><br />
< xsd:choice ><br />
< xsd:sequence ><br />
< xsd:element name =" display - name " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" description " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" content " type =" ccm:contentType "/><br />
<br />
< xsd:sequence ><br />
< xsd:element name =" extends " type =" xsd:string "/><br />
< xsd:element name =" content " type =" ccm:contentType " minOccurs ="0"/><br />
<br />
<br />
<br />
< xsd:attribute name =" identifier " type =" xsd:boolean " use =" optional "/><br />
<br />
<br />
< xsd:complexType name =" contentType "><br />
< xsd:choice ><br />
< xsd:sequence ><br />
< xsd:element name =" sequence " type =" ccm:sequenceType "/><br />
<br />
< xsd:sequence ><br />
< xsd:choice ><br />
< xsd:element name =" type " type =" ccm:baseType "/><br />
< xsd:element name =" restriction " type =" ccm:typeType "/><br />
<br />
< xsd:element name =" value " type =" xsd:string "/><br />
< xsd:element name =" default - value " type =" xsd:string " minOccurs ="0"/><br />
<br />
<br />
<br />
< xsd:group name =" elementGroup "><br />
< xsd:choice ><br />
< xsd:element name =" value " type =" xsd:string "/><br />
< xsd:element name =" and " type =" ccm:andorType "/><br />
< xsd:element name ="or" type =" ccm:andorType "/><br />
< xsd:element name =" not " type =" ccm:notType "/><br />
< xsd:element name =" range " type =" ccm:rangeType "/><br />
< xsd:element name =" list " type =" ccm:listType "/><br />
< xsd:element name =" regex " type =" ccm:regexType "/><br />
<br />
<br />
<br />
< xsd:complexType name =" typeType "><br />
< xsd:group ref =" ccm:elementGroup " minOccurs ="0"/><br />
< xsd:attribute name =" base " type =" ccm:baseType " use =" required "/><br />
<br />
<br />
< xsd:simpleType name =" baseType ">
80 ANHANG B. DATENMODELL<br />
< xsd:restriction base =" xsd:string "><br />
< xsd:enumeration value =" string "/><br />
< xsd:enumeration value =" int "/><br />
< xsd:enumeration value =" boolean "/><br />
< xsd:enumeration value =" float "/><br />
< xsd:enumeration value =" date "/><br />
< xsd:enumeration value =" path "/><br />
< xsd:enumeration value =" url "/><br />
<br />
<br />
<br />
< xsd:complexType name =" rangeType "><br />
< xsd:attribute name =" min " type =" xsd:string " use =" optional "/><br />
< xsd:attribute name =" max " type =" xsd:string " use =" optional "/><br />
<br />
<br />
< xsd:complexType name =" listType "><br />
< xsd:sequence ><br />
< xsd:element name =" item " type =" ccm:itemType " maxOccurs =" unbounded "/><br />
<br />
<br />
<br />
< xsd:complexType name =" itemType "><br />
< xsd:attribute name =" value " type =" xsd:string " use =" required "/><br />
< xsd:attribute name =" comment " type =" xsd:string " use =" optional "/><br />
<br />
<br />
< xsd:complexType name =" regexType "><br />
< xsd:attribute name =" value " type =" xsd:string " use =" required "/><br />
< xsd:attribute name =" comment " type =" xsd:string " use =" required "/><br />
<br />
<br />
< xsd:complexType name =" andorType "><br />
< xsd:sequence ><br />
< xsd:group ref =" ccm:elementGroup " minOccurs ="2" maxOccurs ="2"/><br />
<br />
<br />
<br />
< xsd:complexType name =" notType "><br />
< xsd:sequence ><br />
< xsd:group ref =" ccm:elementGroup "/><br />
<br />
<br />
< xsd:group name =" dependencyGroup "><br />
< xsd:choice ><br />
< xsd:element name =" and " type =" ccm:dAndOrType "/><br />
< xsd:element name ="or" type =" ccm:dAndOrType "/><br />
< xsd:element name =" not " type =" ccm:dNotType "/><br />
< xsd:choice maxOccurs =" unbounded "><br />
< xsd:element name =" equals " type =" ccm:equalsType "/><br />
< xsd:element name =" greater " type =" ccm:lgType "/><br />
< xsd:element name =" less " type =" ccm:lgType "/><br />
< xsd:element name ="in" type =" ccm:inType "/><br />
< xsd:element name =" file " type =" ccm:fileType "/><br />
<br />
<br />
<br />
<br />
< xsd:complexType name =" dependencyType "><br />
< xsd:sequence ><br />
< xsd:element name =" condition " type =" ccm:conditionType " minOccurs ="0"/><br />
< xsd:group ref =" ccm:dependencyGroup "/><br />
< xsd:element name =" action " type =" ccm:actionType "/><br />
<br />
< xsd:attribute name =" name " type =" xsd:string " use =" optional "/>
B.1. SCHEMA-DEFINITION 81<br />
<br />
<br />
< xsd:complexType name =" conditionType "><br />
< xsd:group ref =" ccm:dependencyGroup "/><br />
<br />
<br />
< xsd:complexType name =" dAndOrType "><br />
< xsd:group ref =" ccm:dependencyGroup " minOccurs ="2" maxOccurs =" unbounded "/><br />
<br />
<br />
< xsd:complexType name =" fileType "><br />
< xsd:choice maxOccurs =" unbounded "><br />
< xsd:element name =" exists "/><br />
< xsd:element name =" version " type =" ccm:MinMaxEqType "/><br />
< xsd:element name =" filesize " type =" ccm:MinMaxEqType "/><br />
< xsd:element name =" date " type =" ccm:MinMaxEqType "/><br />
<br />
< xsd:attribute name =" name " type =" xsd:string "/><br />
<br />
<br />
< xsd:complexType name =" MinMaxEqType "><br />
< xsd:attribute name =" min " type =" xsd:string "/><br />
< xsd:attribute name =" max " type =" xsd:string "/><br />
< xsd:attribute name =" equals " type =" xsd:string "/><br />
<br />
<br />
< xsd:complexType name =" dNotType "><br />
< xsd:group ref =" ccm:dependencyGroup "/><br />
<br />
< xsd:group name =" paramGroup "><br />
< xsd:choice ><br />
< xsd:element name =" xpath - value " type =" xsd:string "/><br />
< xsd:element name ="expr - value " type =" xsd:string "/><br />
< xsd:element name =" system - property " type =" xsd:string "/><br />
<br />
<br />
< xsd:complexType name =" equalsType "><br />
< xsd:group ref =" ccm:paramGroup " minOccurs ="2" maxOccurs =" unbounded "/><br />
<br />
< xsd:complexType name =" lgType "><br />
< xsd:group ref =" ccm:paramGroup " minOccurs ="2" maxOccurs ="2"/><br />
<br />
< xsd:complexType name =" inType "><br />
< xsd:sequence ><br />
< xsd:group ref =" ccm:paramGroup "/><br />
< xsd:element name =" set " type =" ccm:setType "/><br />
<br />
<br />
< xsd:complexType name =" setType "><br />
< xsd:group ref =" ccm:paramGroup " maxOccurs =" unbounded "/><br />
<br />
< xsd:complexType name =" actionType "><br />
< xsd:choice maxOccurs =" unbounded "><br />
< xsd:element name =" synchronize " type =" ccm:synchronizeType "/><br />
< xsd:element name =" message " type =" xsd:string "/><br />
< xsd:element name =" execute " type =" xsd:string "/><br />
<br />
<br />
< xsd:complexType name =" synchronizeType "><br />
< xsd:attribute name =" mode " type =" ccm:upresType " use =" optional "/><br />
< xsd:attribute name ="user - confirmation " type =" ccm:uConfType " use =" optional "/<br />
><br />
<br />
< xsd:simpleType name =" upresType "><br />
< xsd:restriction base =" xsd:string ">
82 ANHANG B. DATENMODELL<br />
< xsd:enumeration value =" update "/><br />
< xsd:enumeration value =" reset "/><br />
<br />
<br />
< xsd:simpleType name =" uConfType "><br />
< xsd:restriction base =" xsd:string "><br />
< xsd:enumeration value =" yes "/><br />
< xsd:enumeration value ="no"/><br />
<br />
<br />
<br />
B.2 Beispiel-Konfiguration<br />
In diesem Abschnitt wird eine CCM-Beispilkonfiguration vorgestellt. Sie stellt alle entwickelten<br />
und besprochenen Konstrukte der CCM-Architektur dar und gibt somit eine<br />
Möglichkeit, Ziele dieser Kontrukte besser definieren zu können.<br />
Die Konfiguration besteht aus fünf Profilen. Im Default-Profil werden zwei abstrakte<br />
Konstrukte für eine Datenbankverbindung sowie eine Chipkarten-Konfiguration definiert.<br />
Diese werden von allen anderen Profilen automatisch vererbt.<br />
Im Profil Env-1 werden zwei Applications definiert (ProductInspector und IS), welche<br />
von der default application per Ref-Vererbung die Datenbank-Eigenschaften vererben<br />
und die Konfigurationswerte username und password überschreiben.<br />
Im Profil Env-2 werden alle Env-1-Eigenschaften vererbt. Eine neue application RA<br />
definiert dabei wie im Profil Env-1 die Werte für den Datenbankzugang neu. Dagegen<br />
vererbt die ProductInspector-application per EQ-Vererbung alle Eigenschaften<br />
der gleichnamigen Anwendung aus dem Env-1-Profil, definiert aber Dateirechte der zu<br />
erzeugenden Konfigurationsdatei pi.ini.<br />
Profil Env-3 erbt von Env-2 und stellt somit folgende Applications zur Verfügung:<br />
• Database<br />
• SmartCard<br />
• ProductInspector<br />
• IS<br />
• RA<br />
Die hier neu definierte Application Kobil beschreibt Konfigurationsdaten der Datei<br />
smartkey.inf der Kobil-Umgebung (Chipkarten-Anwendungen) und erbt dafür von der<br />
SmartCard-application. Die RA ergänzt hier aber nur vom Env-2 übernommene Konfiguration.<br />
Zum Schlüß ergänzt das Profil Env-4 beide letzten Profile und überschreibt dabei Konfigurationsdaten<br />
von applications ProductInspector und Kobil.
B.2. BEISPIEL-KONFIGURATION 83<br />
< ccm:config xmlns:x0 =" http: // www .w3.org /2001/ XMLSchema " xmlns:ccm =" http: // www .<br />
flexsecure .de/ccm " xmlns:xsl =" http: // www .w3.org /1999/ XSL / Transform "<br />
xmlns:xsi =" http: // www .w3.org /2001/ XMLSchema - instance " xsi:schemaLocation ="<br />
http: // www . flexsecure .de/ccm<br />
configSchema . xsd "><br />
< profile name =" ccm:default - name "><br />
< application name =" Database "><br />
< description > Database settings <br />
<br />
< version name =" ccm:default - name "><br />
< sequence ><br />
< element ><br />
db <br />
Database settings <br />
< content ><br />
< sequence ><br />
< element ><br />
url <br />
Database - URL <br />
< content ><br />
url <br />
jdbc:mysql: // localhost / flexitrust <br />
<br />
<br />
< element ><br />
driver <br />
Database - Driver <br />
< content ><br />
string <br />
org . gjt .mm. mysqk . Driver <br />
<br />
<br />
< element ><br />
username <br />
Database - Username <br />
< content ><br />
string <br />
test <br />
<br />
<br />
< element ><br />
password <br />
Database - Password <br />
< content ><br />
string <br />
test <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
< application name =" SmartCard "><br />
<br />
< version name =" ccm:default - name "><br />
< sequence ><br />
< element ><br />
smartkey <br />
< content ><br />
< sequence ><br />
< element ><br />
port
84 ANHANG B. DATENMODELL<br />
< content ><br />
int <br />
1<br />
1<br />
<br />
<br />
< element ><br />
ctapi - dll <br />
< content ><br />
path <br />
C:\ WINNT \ system32 \ CT32 . dll <br />
<br />
<br />
< element ><br />
application <br />
< content ><br />
< sequence ><br />
< element identifier =" true "><br />
name <br />
< content ><br />
string <br />
BEDIENER SIGNATUR ZERTIFIKAT !!! <br />
<br />
<br />
< element ><br />
Application <br />
< content ><br />
string <br />
0 xD2 0 x76 0 x00 0 x00 0 x03 0 x01 0 x02 <br />
<br />
<br />
< element ><br />
Certificate <br />
< content ><br />
string <br />
0 x43 0 x31 <br />
<br />
<br />
< element ><br />
Modulus <br />
< content ><br />
string <br />
0 x45 0 x31 <br />
<br />
<br />
< element ><br />
Key Number <br />
< content ><br />
string <br />
0 x00 <br />
<br />
<br />
< element ><br />
options <br />
< content ><br />
string <br />
SIGN_ONLY <br />
<br />
<br />
<br />
<br />
<br />
< element ><br />
application <br />
< content >
B.2. BEISPIEL-KONFIGURATION 85<br />
< sequence ><br />
< element identifier =" true "><br />
name <br />
< content ><br />
string <br />
Netkey Verschlüsselungs - Zertifikat <br />
<br />
<br />
< element ><br />
Application <br />
< content ><br />
string <br />
0 xD2 0 x76 0 x00 0 x00 0 x03 0 x01 0 x02 <br />
<br />
<br />
< element ><br />
Certificate <br />
< content ><br />
string <br />
0 x43 0 xB1 <br />
<br />
<br />
< element ><br />
Modulus <br />
< content ><br />
string <br />
0 x45 0 xB1 <br />
<br />
<br />
< element ><br />
Key Number <br />
< content ><br />
string <br />
0 x01 <br />
<br />
<br />
< element ><br />
PUK <br />
< content ><br />
string <br />
0 x08 <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
< profile name ="Env -1"><br />
< application name =" ProductInspector " extends =" Database "><br />
< description > PriductInspector <br />
<br />
< version name =" ccm:default - name "><br />
< sequence ><br />
< element ><br />
profile <br />
Profile <br />
< content ><br />
< sequence >
86 ANHANG B. DATENMODELL<br />
< element ><br />
database <br />
< extends >db <br />
< content ><br />
< sequence ><br />
< element ><br />
username <br />
<br />
< content ><br />
string <br />
revokator2 <br />
<br />
<br />
< element ><br />
password <br />
<br />
< content ><br />
string <br />
pass <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
< parameter type =" exporter "><br />
pi.ini <br />
rw -r--r--<br />
flexitru:tomcat <br />
<br />
<br />
< parameter type =" formatter "><br />
< xsl:stylesheet ><br />
DB_url = <br />
DB_driver = <br />
DB_user = <br />
DB_pass = <br />
<br />
<br />
<br />
<br />
< application name ="IS" extends =" Database "><br />
<br />
< version name =" ccm:default - name "><br />
< sequence ><br />
< element ><br />
db <br />
< content ><br />
< sequence ><br />
< element ><br />
username <br />
<br />
< content ><br />
string <br />
isuser <br />
<br />
<br />
< element ><br />
password <br />
<br />
< content ><br />
string
B.2. BEISPIEL-KONFIGURATION 87<br />
ispass <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
< profile name ="Env -2" extends ="Env -1"><br />
< application name =" ProductInspector "><br />
< description > PriductInspector <br />
<br />
< version name =" ccm:default - name "><br />
< parameter type =" exporter "><br />
pi.ini <br />
rw -r--r--<br />
flexitru:tomcat <br />
<br />
<br />
< parameter type =" formatter "><br />
< xsl:stylesheet ><br />
DB_url = <br />
DB_driver = <br />
DB_user = <br />
DB_pass = <br />
<br />
<br />
<br />
<br />
< application name ="RA" extends =" Database "><br />
<br />
< version name =" ccm:default - name "><br />
< sequence ><br />
< element ><br />
db <br />
< content ><br />
< sequence ><br />
< element ><br />
username <br />
<br />
< content ><br />
string <br />
isuser <br />
<br />
<br />
< element ><br />
password <br />
<br />
< content ><br />
string <br />
ispass <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
< profile name ="Env -3" extends ="Env -2">
88 ANHANG B. DATENMODELL<br />
< application name ="RA"><br />
<br />
< version name =" ccm:default - name "><br />
<br />
<br />
<br />
< application name =" Kobil " extends =" SmartCard "><br />
<br />
< version name =" ccm:default - name "><br />
<br />
<br />
<br />
<br />
< profile name ="Env -4" extends ="Env -1 , Env -3"><br />
< application name =" ProductInspector "><br />
< description > PriductInspector <br />
<br />
< version name =" ccm:default - name "><br />
< parameter type =" exporter "><br />
pi.ini <br />
rw -r--r--<br />
flexitru:tomcat <br />
<br />
<br />
< parameter type =" formatter "><br />
< xsl:stylesheet ><br />
DB_url = <br />
DB_driver = <br />
DB_user = <br />
DB_pass = <br />
<br />
<br />
<br />
<br />
< application name =" Kobil "><br />
<br />
< version name =" ccm:default - name "><br />
< sequence ><br />
< element ><br />
port <br />
< content ><br />
int <br />
2<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
B.3 Abhängigkeitsdefinitionen<br />
Nachfolgend findet man eine Pseudo-Grammatik von Definitionen der Abhängigkeiten.<br />
Ihre Verwendung ist im Abschnitt 6.1 auf Seiten 55ff. beschrieben.<br />
DEPENDENCY ::= < dependency [ name = STRING ]> [ COND ] STAT ACTION <br />
COND ::= < condition > STAT <br />
STAT ::= ( AGGR | EXPR ) [ STAT ]
B.3. ABHÄNGIGKEITSDEFINITIONEN 89<br />
AGGR ::= AND | OR | NOT <br />
AND ::= EVENT EVENT [ EVENT ...] | AGGR <br />
OR ::= EVENT EVENT [ EVENT ...] | AGGR <br />
NOT ::= EVENT | AGGR <br />
EVENT ::= " STAT " | " ACT "<br />
EXPR ::= EQ | GT | LT | IN | FILE<br />
EQ ::= < equals > PARAM PARAM [ PARAM ...] <br />
GT ::= < greater > PARAM PARAM <br />
LT ::= PARAM PARAM <br />
IN ::= PARAM SET <br />
SET ::= [ PARAM ...] <br />
FILE ::= [ PARAM ...] <br />
PARAM ::= PATH - VALUE | EXPR - VALUE | PROPERTY<br />
PATH - VALUE ::= CCM - PATH /X- PATH <br />
EXPR - VALUE ::= MATH - EXPR | STRING <br />
PROPERTY ::= STRING <br />
CCM - PATH ::= ( MODULE [, PROFILE [, CONFIG - NAME [, VERSION ]]])<br />
MODULE ::= STRING<br />
PROFILE ::= STRING<br />
CONFIG - NAME:: = STRING<br />
VERSION ::= STRING<br />
X- PATH ::= STRING<br />
MATH - EXPR ::= STRING<br />
ACTION ::= < action > AGGR | ACT <br />
ACT ::= SYNC | MSG | EXEC<br />
SYNC ::= < synchronize [ mode =" update | reset "] [user - confirmation =" yes |no"]/ ><br />
MSG ::= < message > STRING <br />
EXEC ::= < execute > STRING <br />
STRING ::= (A-Z|a-z |0 -9|_ -)+
90 ANHANG B. DATENMODELL
Anhang C<br />
CCM-Konfiguration<br />
Hier ist die Struktur der CCM-eigener Konfigurationsdatei zu sehen. Diese umfasst Informationen<br />
über die zu verwendeten Adaptoren (RAA, RSA, LSA, . . . ), definiert Logging-<br />
Parameter etc. Anschließend folgen zur Veranschaulichung Beispiel-Konfigurationen für<br />
Server- sowie Client-seitige Anwendungen.<br />
91
92 ANHANG C. CCM-KONFIGURATION<br />
C.1 XMLSchema<br />
< xsd:schema xmlns:xsd =" http: // www .w3.org /2001/ XMLSchema " xmlns:jaxb =" http: // java<br />
. sun . com / xml /ns/ jaxb " xmlns:xjc =" http: // java . sun . com / xml /ns/ jaxb / xjc "<br />
jaxb:extensionBindingsPrefixes =" xjc " jaxb:version =" 1.0 "><br />
< xsd:element name ="meta - config " type =" MetaConfigType "/><br />
<br />
< xsd:complexType name =" Parameter "><br />
< xsd:sequence ><br />
< xsd:element name =" name " type =" xsd:string "/><br />
< xsd:element name =" value " type =" xsd:string "/><br />
<br />
<br />
<br />
< xsd:complexType name =" ParameterClass "><br />
< xsd:sequence ><br />
< xsd:element name =" class - name " type =" xsd:string "/><br />
< xsd:element name =" parameter " type =" Parameter " minOccurs ="0" maxOccurs ="<br />
unbounded "/><br />
<br />
<br />
<br />
< xsd:complexType name =" SecretParameterClass "><br />
< xsd:sequence ><br />
< xsd:element name =" class - name " type =" xsd:string "/><br />
< xsd:element name =" secret - name " type =" xsd:string " minOccurs ="0"/><br />
< xsd:element name =" parameter " type =" Parameter " minOccurs ="0" maxOccurs ="<br />
unbounded "/><br />
<br />
<br />
<br />
< xsd:complexType name =" MetaConfigType "><br />
< xsd:sequence ><br />
< xsd:element name =" type "><br />
< xsd:simpleType ><br />
< xsd:restriction base =" xsd:string "><br />
< xsd:enumeration value =" SERVER "/><br />
< xsd:enumeration value =" CLIENT "/><br />
<br />
<br />
<br />
< xsd:element name =" logger " type =" Logger "/><br />
< xsd:element name =" secret " type =" Secret " minOccurs ="0" maxOccurs ="<br />
unbounded "/><br />
< xsd:element name =" admin " type =" SecretParameterClass "/><br />
< xsd:element name =" raa " type =" ParameterClass "/><br />
< xsd:element name =" lsa " type =" SecretParameterClass "/><br />
< xsd:element name =" application " type =" Application " maxOccurs =" unbounded "/><br />
< xsd:element name =" connection " type =" ParameterClass " maxOccurs =" unbounded "<br />
/><br />
<br />
<br />
<br />
< xsd:complexType name =" Logger "><br />
< xsd:sequence ><br />
<br />
< xsd:element name =" level "><br />
< xsd:simpleType ><br />
< xsd:restriction base =" xsd:string "><br />
< xsd:enumeration value =" DEBUG "/><br />
< xsd:enumeration value =" INFO "/><br />
< xsd:enumeration value =" WARNING "/><br />
< xsd:enumeration value =" ERROR "/><br />
< xsd:enumeration value =" FATAL "/>
C.2. BEISPIEL-KONFIGURATION 93<br />
<br />
<br />
<br />
<br />
< xsd:element name =" path " type =" xsd:string "/><br />
<br />
<br />
<br />
< xsd:complexType name =" Secret "><br />
< xsd:sequence ><br />
< xsd:element name =" name " type =" xsd:string "/><br />
< xsd:element name =" class - name " type =" xsd:string "/><br />
< xsd:element name =" type "><br />
< xsd:simpleType ><br />
< xsd:restriction base =" xsd:string "><br />
< xsd:enumeration value =" FILE "/><br />
< xsd:enumeration value =" SMARTCARD "/><br />
<br />
<br />
<br />
<br />
<br />
< xsd:element name =" parameter " type =" Parameter " minOccurs ="0" maxOccurs ="<br />
unbounded "/><br />
<br />
<br />
<br />
< xsd:complexType name =" Application "><br />
< xsd:sequence ><br />
< xsd:element name =" name " type =" xsd:string "/><br />
< xsd:element name =" rsa " type =" SecretParameterClass " maxOccurs =" unbounded "/<br />
><br />
< xsd:element name =" transformer " type =" ParameterClass " minOccurs ="0"/><br />
<br />
<br />
<br />
C.2 Beispiel-Konfiguration<br />
C.2.1<br />
Server-seitige Konfiguration<br />
<br />
SERVER <br />
<br />
< logger ><br />
DEBUG <br />
/ data / logs / ccm / ccm_server . log <br />
<br />
<br />
< secret ><br />
Server - P12 <br />
flexsecure . util . security . pkcs7 . SoftTokenSecret <br />
FILE <br />
< parameter ><br />
StoreType <br />
P12 <br />
<br />
< parameter ><br />
P12Path
94 ANHANG C. CCM-KONFIGURATION<br />
/ data /ccm - root / server . p12 <br />
<br />
< parameter ><br />
SigAlgorithm <br />
SHA1withRSA <br />
<br />
< parameter ><br />
SigProvider <br />
de. flexiprovider . core . FlexiCoreProvider <br />
<br />
<br />
<br />
Server - Card <br />
flexsecure . util . security . pkcs7 . SmartCardSecret <br />
CARD <br />
< parameter ><br />
StoreType <br />
CARD <br />
<br />
< parameter ><br />
SigProvider <br />
de . flexiprovider . core . FlexiCoreProvider <br />
<br />
< parameter ><br />
SigAlgorithm <br />
SHA1withRSA <br />
<br />
<br />
// --><br />
<br />
<br />
de. flexsecure . ccm . rsa . AdminRemoteSecurityAdapter <br />
Server - P12 <br />
< parameter ><br />
root -cert - dir <br />
/ data /ccm - root /. certs /. root <br />
<br />
< parameter ><br />
certificate - directory <br />
/ data /ccm - root /. certs /. admin <br />
<br />
<br />
<br />
<br />
de. flexsecure . ccm . raa . FileResourceAccessAdapter <br />
< parameter ><br />
config - path <br />
/ data /ccm - root / ccm_config_test . xml <br />
<br />
< parameter ><br />
default - profile <br />
B<br />
<br />
<br />
<br />
<br />
de. flexsecure . ccm . lsa . PlainLocalSecurityAdapter <br />
<br />
C.2. BEISPIEL-KONFIGURATION 95<br />
< application ><br />
ImpEx <br />
<br />
<br />
de. flexsecure . ccm . rsa . PKIRemoteSecurityAdapter <br />
Server - P12 <br />
< parameter ><br />
root -cert - dir <br />
/ data /ccm - root /. certs /. root <br />
<br />
< parameter ><br />
client -cert - dir <br />
/ data /ccm - root /. certs /. user / group1 <br />
<br />
<br />
<br />
de. flexsecure . ccm . rsa . PlainRemoteSecurityAdapter <br />
<br />
<br />
< transformer ><br />
de. flexsecure . ccm .dt. XSLTranformer <br />
<br />
<br />
<br />
< application ><br />
App -B<br />
<br />
de. flexsecure . ccm . rsa . PlainRemoteSecurityAdapter <br />
<br />
< transformer ><br />
de. flexsecure . ccm .dt. XSLTranformer <br />
<br />
<br />
<br />
< application ><br />
ProductInspector <br />
<br />
de. flexsecure . ccm . rsa . PlainRemoteSecurityAdapter <br />
<br />
< transformer ><br />
de. flexsecure . ccm .dt. XSLTranformer <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
< transformer ><br />
<br />
<br />
<br />
// --><br />
<br />
< connection ><br />
de. flexsecure . ccm . connection . SocketConnection <br />
< parameter ><br />
port <br />
1701
96 ANHANG C. CCM-KONFIGURATION<br />
<br />
<br />
< connection ><br />
de. flexsecure . ccm . connection . SocketConnection <br />
< parameter ><br />
port <br />
2001 <br />
<br />
<br />
< connection ><br />
de. flexsecure . ccm . connection . FileConnection <br />
< parameter ><br />
path <br />
/ data /ccm - root / file_conn . bin <br />
<br />
<br />
<br />
C.2.2<br />
Client-seitige Konfiguration<br />
<br />
CLIENT <br />
< logger ><br />
DEBUG <br />
/ data / logs / ccm / ccm_client . log <br />
<br />
< secret ><br />
Client - P12 <br />
flexsecure . util . security . pkcs7 . SoftTokenSecret <br />
FILE <br />
< parameter ><br />
SigProvider <br />
de. flexiprovider . core . FlexiCoreProvider <br />
<br />
< parameter ><br />
StoreType <br />
P12 <br />
<br />
< parameter ><br />
SigAlgorithm <br />
SHA1withRSA <br />
<br />
< parameter ><br />
P12Path <br />
/ data /ccm - root / tn1 . p12 <br />
<br />
<br />
<br />
de. flexsecure . ccm . rsa . AdminRemoteSecurityAdapter <br />
Client - P12 <br />
< parameter ><br />
root -cert - dir <br />
/ data /ccm - root /. certs /. root <br />
<br />
< parameter ><br />
certificate - directory <br />
/ data /ccm - root /. certs /. admin <br />
<br />
<br />
<br />
de. flexsecure . ccm . raa . FileResourceAccessAdapter <br />
< parameter ><br />
config - path
C.2. BEISPIEL-KONFIGURATION 97<br />
/ data /ccm - root / ccm_config_client . xml <br />
<br />
< parameter ><br />
root - path <br />
/ data /ccm - root <br />
<br />
< parameter ><br />
default - profile <br />
B<br />
<br />
<br />
<br />
de. flexsecure . ccm . lsa . PlainLocalSecurityAdapter <br />
<br />
< application ><br />
ImpEx <br />
<br />
de. flexsecure . ccm . rsa . PKIRemoteSecurityAdapter <br />
Server - P12 <br />
< parameter ><br />
root -cert - dir <br />
/ data /ccm - root /. certs /. root <br />
<br />
< parameter ><br />
client -cert - dir <br />
/ data /ccm - root /. certs /. user / group1 <br />
<br />
<br />
<br />
de. flexsecure . ccm . rsa . PlainRemoteSecurityAdapter <br />
<br />
< transformer ><br />
de. flexsecure . ccm .dt. XSLTranformer <br />
<br />
<br />
< application ><br />
App -B<br />
<br />
de. flexsecure . ccm . rsa . PlainRemoteSecurityAdapter <br />
<br />
< transformer ><br />
de. flexsecure . ccm .dt. XSLTranformer <br />
<br />
<br />
< connection ><br />
de. flexsecure . ccm . connection . SocketConnection <br />
< parameter ><br />
host <br />
localhost <br />
<br />
< parameter ><br />
port <br />
1701 <br />
<br />
< parameter ><br />
timeout <br />
30000 <br />
<br />
<br />
98 ANHANG C. CCM-KONFIGURATION
Glossar<br />
JAXB Java Architecture for XML Binding<br />
Eine JAVA-basierte Architektur zum Auslesen und Modifizieren von XML-Inhalten.<br />
CCM Centralized Configuration Management<br />
Ein zentralisiertes System zur Verwaltung von Konfigurationsdaten.<br />
CCMP Centralized Configuration Management Protocol<br />
Das Protokoll des Datenaustausches von CCM.<br />
RAA Resource Access Adapter<br />
Eine Schnittstelle zum Zugriff auf Konfigurationsdaten.<br />
RSA Remote Security Adapter<br />
Eine Schnittstelle zur Sicherung der Datenübertragung.<br />
LSA Local Security Adapter<br />
Eine Schnittstelle zur Sicherung von Datenresourcen.<br />
DT Data Transformer<br />
Eine Schnittstelle zum Transformieren der Konfigurationsdaten.<br />
PKI Public Key Infrastructure<br />
Eine Komponenteninfrastruktur zur Unterstützung von kryptografisch sicherem<br />
Datenaustausch sowie der Benutzerautorisierung mittels asymmetrischen Verschlüsselungsverfahren<br />
(Public Key - Kryptografie).<br />
99
Index<br />
Abhängigkeit, 55, 88<br />
CCM<br />
CCM-Protocol, 41<br />
CCMPath, 21, 35, 40, 41, 44, 48, 52,<br />
56<br />
Vererbung<br />
EQ-Vererbung, 27, 29, 31<br />
Ref-Vererbung, 27, 29, 82<br />
Verteilungsstrategie<br />
Request, 15, 16, 40, 41, 43, 67<br />
Rollout, 14–16, 41, 43, 45, 67<br />
XML<br />
JAXB, 12<br />
XMLSchema, 13<br />
XSLT, 5, 14<br />
100
Literaturverzeichnis<br />
[1] Elliotte Rusty Harold, W. Scott Means, XML in a nutshell, O’Reilly, 2001<br />
[2] Eric van der Vlist, XML Schema, O’Reilly, 2003<br />
[3] Michael Seeboerger-Weichselbaum, Das Einsteigerseminar JAVA/XML, bhv,<br />
2002<br />
[4] Steve Burnett, Stephen Paine, Kryptographie - RSA Security’s Official Guide,<br />
mitp, 2001<br />
[5] Eric Armstrong a.a., The Java Web Services Tutorial, Sun Microsystems, 2003<br />
[6] Java Architecture for XML Binding (JAXB), http://java.sun.com/xml/jaxb/<br />
[7] Scott Oaks, Java Security, O’Reilly; 1998<br />
[8] Brett McLaughlin, Java and XML, O’Reilly, 2000<br />
[9] FlexiTRUST - Produktbeschreibung, www.flexsecure.de/produkte<br />
[10] Installable Unit Deployment Descriptor Specification, Version 1.0,<br />
http://www.w3.org/Submission/2004/SUBM-InstallableUnit-DD-20040712/,<br />
W3C Member Submission 12-July-2004<br />
[11] Installable Unit Package Format Specification, Version 1.0,<br />
http://www.w3.org/Submission/2004/SUBM-InstallableUnit-PF-20040712/,<br />
W3C Member Submission 12-July-2004<br />
[12] Niklar Jakob, Sebastian Stark, Ausarbeitung der Praktikumsarbeit zum Thema:<br />
Public Key Insfrastrukturen<br />
101