Full paper (pdf) - CDC

Full paper (pdf) - CDC Full paper (pdf) - CDC

cdc.informatik.tu.darmstadt.de
von cdc.informatik.tu.darmstadt.de Mehr von diesem Publisher
20.11.2013 Aufrufe

Fachbereich Informatik Fachgebiet Theoretische Informatik Prof. Dr. Johannes Buchmann Zentralisierte Konfigurationsverwaltung komplexer IT-Systeme Diplomarbeit Betreuer: Markus Ruppert Vladislav Satanovski Darmstadt, 25. August 2005

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!