Interoperable Security-Infrastuktur für J2EE, CORBA und .NET am

Werbung
Kopfzeile: Security Integration zwischen J2EE, CORBA und .NET
Titel: Be secure !
Teil 1 – Definition und Überblick über die Sicherheitsmechanismen
Interoperable Security-Infrastuktur für J2EE, CORBA und .NET am Beispiel des Borland
Enterprise Server
von Martin Heinzl
Die Sicherheit in Software-Infrastrukturen wie J2EE, CORBA oder .NET wird immer mehr ein kritischer Faktor
für den Erfolg von Software. Allerdings bilden (die normalerweise üblichen) inkompatiblen Insellösungen u.a.
im Bereich Sicherheit keine Lösung. Eine standardbasierte, technologieübergreifende Sicherheitslösung ist
notwendig.
Software-Infrastrukturen bilden heute keine hermetisch abgeschlossenen Welten mehr. Die heterogenen Systeme haben
sich etabliert und die Unternehmen müssen versuchen, diese zu verbinden. Dabei haben die Web Services einen neuen
Trend begründet: Die Systeme werden sehr lose miteinander gekoppelt und die Daten über XML ausgetauscht. Für die
Kommunikation zwischen Unternehmen oder auch Unternehmenszweigen mögen Web Services eine sehr gute Wahl
darstellen, doch für die serverlastige Infrastruktur innerhalb eines Unternehmens bedarf es einer soliden Infrastruktur, die
nicht nur sicher ist, sondern bei der besonders Aspekte wie Verfügbarkeit, Ausfallsicherheit, Lastverteilung, Wartbarkeit
und Betrieb berücksichtigt werden. CORBA hat sich für deratige Umgebungen als Standard etabliert
Kommunikationsmöglichkeit ist allerdings nicht alles. Bei den heutzutage immer vernetzteren Welten spielt die
Sicherheit eine immer größere Rolle. Sicherheit in den einzelnen Systemen ist allerdings bei weitem nicht ausreichend. Eine
einheitliche und technologieübergreifende
Standard
Kurzbeschreibung
Sicherheitsschicht wird immer wichtiger. Sicherheit ist
Common Security Interoperability Spezifikation
CSIv2
Version 2 von der OMG
ein äußerst komplexes Thema, das sehr viele
Sicherheit wie vom EJB/J2EE Standard verlangt
EJB/J2EE
unterschiedliche Bereiche umfasst. Neben den vielen
Java Authentication Authorization Service
JAAS
Spezifikationen (siehe Tabelle 1), die hier ein Rolle
Java Secure Socket Extension –
JSSE,SSL,TLS
spielen (u.a. CSIv2, EJB/J2EE Security, JAAS, JSSE,
Übertragunssicherheit und Verschlüsselung
Java Cryptographic Extension
SSL, TLS, JCE, digitale Zertifikate. ...) kommen noch
JCE
Digitale Zertifikate benutzt für https und TLS/SSL
X509
Firewalls, Firmenrichtlinen aber auch Sourcecode
Übertragung
Zertifikate
Security, Dateisystemschutz und vieles mehr hinzu.
OMG Spezifikation für CORBA Kommunikation
OMG
Firewall
Sicherheit in verteilten Systemen besteht also aus einem
durhc die Firewall mittels eines GIOP Proxies
Proxy
ausgeklügelten Zusammenspiel von vielen
Tabelle 1)
unterschiedlichen Komponenten.
Die unterschiedlichen Bereicher einer Sicherheitsinfrastruktur
Sicherheit in verteilen Systemen besteht aus den vier fundamentalen Bereichen
(siehe Bild-1) Authentifizierung, Authorisierung, Übertragungssicherheit und Code
Sicherheit. Jeder dieser Bereiche besteht aus verschiedenen Schnittstellen und
implementierten Standards. Dazu kommen noch weitere Bereiche wie z.B. Firewalls,
VPN (Virtual Private Networks), Dateisystemsicherheit, ... . Dieser Artikel will
anhand eines Beispiels die Sicherheitsinfrastruktur vorstellen, die der Borland
Enterprise Server anbietet. Dieser Server enthält ab der Version 6 auch das Produkt
Janeva, eine native CORBA Implementierung für .NET um über die :NET Remoting
API auf J2EE und CORBA Server zuzugreifen. Teil 2-4 dieser Artikelserie werden
dann die Bereiche Authentifizierung, Authorisierung und
Übertragungssicherheit/Firewall im Detail vorstellen.
Bild 1)
Ein Beispiel für eine technolgieübergreifende, standardbasierte Sicherheitsinfrastruktur.
Das hier vorgestellte (siehe Bild-2) Beispiel soll EJB/Java-CORBA/C++-CORBA/.NET Server sowie EJB/JavaCORBA/C++-CORBA/.NET Clients enthalten. Abgesehen von der .NET nach .NET Kommunikation (es wäre ebenfalls
möglich aber nicht sinnvoll) läuft sämtliche Kommunikation über IIOP mit CSIv2 Sicherheitserweiterung. Alle Server
rufen sich in diesem Beispiel ebenfalls gegenseitig auf. Es können sämtliche Produkte auf dem Markt verwendet werden,
die wirklich J2EE 1.3 zertifiziert
sind (also auch IIOP und CSIv2
Unterstützung haben), sowie alle
ORBs, die auch CSIv2 unterstützen.
Der Borland Enterprise Server ist
zur Zeit das einzige Produkt, das
IIOP/CSIv2 in allen Welten
unterstützt. Die einzige
Einschränkung besteht noch im
.NET Server, der noch keine
Authentifizierung/Authorisierung
sondern zur Zeit nur TLS/SSL
Bild 2)
Verschlüsselung unterstützt.
Zusätzlich – nicht auf der Grafik gezeigt – könnten die Klienten auch über einen IIOP-Firewallproxy (Gatekeeper) auf die
Server zugreifen, sollte sich ein Firewall zwischen den Klienten und den Servern befinden. Die dargestellte Grafik zeigt
eine von vielen möglichen Konstellationen. Es sind eine Reihe von anderen Klienten (z.B.. Tomcat-Webcontainer) und
Kommunikationswege möglich.
In diesem Bild wurde die gesamte Welt der Webservices nicht mitbetrachtet, da dies den Rahmen dieser Artikelserie
sprengen würden. Dazu kommt noch, das die Standardisierung der Sicherheit von Webservices noch nicht abgeschlossen
ist. In diesem Umfeld gibt es verschiedene Ansätze. Angefangen von der Verlagerung der Sicherheit auf den HTTPS
Kommunikationsweg bis hin zu verschiedenen Mechanismen, die Nutzdaten der Webservice Kommunikation verschluesselt
zu übertragen. In Bezug auf Webservice Sicherheit kommt bietet der Borland Enterprise Server zur Zeit HTTPS
Kommunikation an (in der Grafik angedeutet), die für den Transport der Webservice Kommunikation genutzt werden kann.
In den folgenden Abschnitten sollen die oben genannten Bereiche einer Sicherheitsinfrastruktur kurz erklärt und deren
Technologien vorgestellt werden.
1) Authentifizierung
Die Frage könnte auch lauten: Wer ist den dass, der auf den Server zugreifen will ?
Authentifizierung bezeichnet die
Überprüfung der vorgegebenen
Identität von Benutzern bei der
Anmeldung beim System. In der
Regel wird diese Authentifizierung
durch Benutzernamen und
Kennwörter oder durch Zertifikate
erreicht. Die Authentifizierung
gewährt dem Benutzer keine
Zugriffsrechte auf Ressourcen. Dies
erfolgt durch die Autorisierung. Bei
fehlender Authentifizierung kann
Bild-3)
nicht festgestellt werden, welche
Person auf die Ressource zugreift.
Für die Authentifizierung sind zwei Spezifikationen besonders wichtig. Zum einen ist dies JAAS (Java Authentication
Authorization Service) und zum anderen CSIv2 (Commen Security Interoperability Version 2). JAAS enthält als einen
zentralen Baustein die Möglichkeit Benutzer und gruppen von Benutzern in sog. Realms zusammenzufassen. Es können
beliebig viele Realms definiert werden. Für jede Realm wird im Server ein Loginmodul instanziiert. Die komplette JAAS
Konfiguration erfolgt in einer Konfigurationsdatei. Da JAAS
ein Standard ist (und mittlerweise auch Teil der Java
Standard Edition J2SE (früher JDK genannt)) sind die
entsprechenden APIs auch definiert, um beliebige eigene
Loginmodule zu schreiben.
Im diesem Bild (Bild 3) können die Klienten Java/RMI,
Java/CORBA, CORBA oder .NET Klienten sein. Die Server
können J2EE oder CORBA Server sein.
Eine weitere wichtige Konfigurationsmöglichkeit im
Umfeld von Authentifizierung ist die Konfiguration von
Bild 4)
„Trust“ (siehe Bild-4). Klienten werden immer nur am ersten
Server real authentifiziert. Der „Server_Backend“
authentifiziert nur die Server 1-3. Daher ist es notwendig, im „Server_Backend“ zu konfigurieren, welchen Servern (1-3)
dieser Server vertrauen darf, das diese Server die echten Klienten ausreichend authentifiziert haben.
Zum Transport der Sicherheitsinformationen kommt schließlich die Spezifikation CSIv2 in Spiel. Zwei wichtige
bereiche werden hier spezifiziert. Zum ersten wird hier spezifiziert (siehe Bild) wie die unterschiedlichen
Sicherheitsdomänen in den Referenzen auf den Server hinterlegt werden, damit der Klient dies schon aus der IOR auslesen
kann. Zum zweiten wird hier spezifiziert, wie die entsprechenden Sicherheitstoken bei den Aufrufen der
Serverkomponenten (EJBs, CORBA-Objekte, ...) in entsprechenden Servicekontexten des GIOP Protokolls mitübertragen
werden.
Ausserhalb von den hier genannten Spezifikationen besteht hier eine Möglichkeit Sicherheitsinformationen
(normalerweise User/Password/Realm Kombinationen u.a.) nicht als Klartext in irgendwelchen Konfigurationsdateien zu
speichern, sondern in verschlüsselten Dateien, sog. Vault Dateien.
2) Authorisierung
Die Frage könnte auch lauten: Wer darf auf dem Server eigentlich was ?
Authorisierung bezeichnet die Zuweisung von Rechten für authentisierte Benutzer. Sobald ein Benutzer vom System
akzeptiert wurde, kann diesem Benutzer
Zugriffsrechte auf Serverresourcen gegeben bzw.
verweigert werden.
Der größte Teil der Authorisierung
beschäftigt sich mit der Frage, wer darf auf welche
Resourcen zugreifen. Resourcen sind Methoden
auf EJB (Enterprise Java Beans) und Links
(Servlets, JSPs, HTML Seiten, Bilder, Filme, ...)
bei Webanwendungen. Für die J2EE Welt ist dies
in der J2EE und der EJB Spezifikation definiert.
Zugriffsrechte werden hier generell auf Basis von
Bild 5)
logischen Rollen vergeben. Sowohl Zugriffsrechte,
als auch Rollen werden im Deployment Descriptor der entsprechenden Anwendungen definiert.
Im EJB- bzw. Webkontainer werden dann diese logischen Rollen auf eine Liste von physikalischen Usern und
Gruppen umgesetzt. D.h. erst im Kontainer geschieht dann die Zuordnung der logischen Rollen auf die user/Gruppen, gegen
die der Benutzer vorher via JAAS authentifiziert wurde. Der Deployment Descriptor wird ganz bewußt von allen
Infrastrukturabhängigkeiten freigehalten.
Um nicht alle logischen Rollen aller Anwendungen mischen zu müssen, bzw. aufeinander abstimmen zu müssen, gibt
es die Möglichkeit in den Kontainern unterschiedliche Sicherheitsdomänen zu definieren. Jede Sicherheitsdomäne besteht
aus einer Zuordnung von logischen Rollen zu Usern/Gruppen und einigen weiteren Konfiguration wie z.B.
Standardzugriffsrechte, wenn für Resourcen keine expliziten Rechte definiert wurden.
Da CORBA kein vergleichbares Konzept eines Deployment Descriptors kennt, hat z.B. die CORBA Implementierung
VisiBroker eine Erweiterung um die selben Authorisierungskonzepte auf POA bzw. CORBA-Objekt Ebene zu benutzen.
Dies wird durch eine entsprechende „Quality-Of-Protection“ Policy auf POA Ebene und die Implementierung eines
Interfaces erreicht.
3) Transportsicherheit
Die Frage könnte auch lauten: Wer darf die Kommunikation auf dem Transportweg eigentlich verstehen ?
Transportsicherheit bedeutet
Verschlüsselung der Kommunikation
auf dem Transportweg. Der
Transportweg in fast allen Fällen
bedeutet TCP/IP. Sicherheit
Bei der Transportsicherheit
unterscheidet man im wesentlichen
zwischen der Sicherheit einer
normalen TCP/IP Kommunikation
(z.B. über CORBA-IIOP) und einer
Webclient Kommunikation mittels
Bild 6)
HTTP. Beide Kommunikationsformen
können mit ähnlichen Mitteln gesichert
werden. Das zugrundeliegende Protokoll ist in beiden Fällen eine Transportverschlüsselung auf Basis von SSL (Secure
Socket Layer) oder TLS (Transport Layer Security). Beide basieren auf einem asynkronen Public/Private Key Verfahren für
den Erstkontakt. Anschließend kann dann dynamisch auf ein synkrones Verschlüsselungsverfahren gewechselt werden um
eine bessere Performanz zu erzielen.
Zusätzlich zur eigentlichen Verschlüsselung ist es oft wichtig den Sender (Klient) bzw. den Empfänger (Server) zu
identifizieren um zu gewährleisten, das die Nachricht genau denjenigen erreicht, für den sie bestimmt ist. Diese
Authentifizierung geschieht über x509 Zertifikate. Diese Zertifikate werden von bestimmten Institutionen ausgestellt und
digital unterschrieben. In der Java Umgebung bietet das JDK einen Mechanismus an, um diese Zertifikate (sowohl eigene
private Zertifikate, also auch sog. vertrauenswürdige Zertifikate) zu verwalten. Diesen Mechanismus bezeichnet man als
„KeyStores“. Im JDK kommt ein entsprechendes Werkzeug mit um diese KeyStores zu füllen, Zertifikatsanforderungen zu
erstellen und digital signierte Zertifikate in diese KeyStores zu importieren. Eine weitere Möglichkeit mit Zertifikaten zu
arbeiten bietet das Opensource Projekt OpenSSL.
4) Firewalls, Router und VPN Sicherheit
Keine noch so guten Software-Sicherheitsmechanismen sind ausreichend, wenn diese nicht durch entsprechende
Hardwarekomponenten unterstützt werden. Von diesen Hardwarebausteinen gibt es jede Menge. Stellvertretend sollen
einige hier genannt werden.
Die bekanntesten Hardwarekomponenten sind Firewalls oder deren einfachere Geschwister, Router. Diese
Komponenten sind dazu da, bestimmte Netzwerkkommunikationen an deren Ziele durchzulassen, bzw. die Kommunikation
zu unterbinden, wenn diese nicht erwünscht ist. In den meisten Fällen sind diese Maßnahmen für eine CORBA/EJB
Kommunikation nicht ausreichend, bzw. zu grobgranular, da die meisten dieser Hardwarekomponenten die IIOP
Kommunikation nicht verstehen. Die Object Management Group (OMG) hat eine Spezifikation für einen Zusatzproxy für
Firewalls verabschiedet, um Firewalls um das Verständnis von IIOP zu erweitern. Diese Proxies haben eine Reihe von
Eigenschaften, die zwei typische Probleme von IIOP Kommunikation über Firewalls bewältigen sollen. Zum ersten ist das
das Problem der Portbündelung und zum zweiten das Problem der Protokollumsetzung (z.B. HTTP-Tunneling).
Der Borland Enterprise Server enthält eine Implementierung dieses OMG Standards, den sogenannten Gatekeeper.
Dieser unterstützt die folgenden Protokolle: IIOP, HIOP, SSL/IIOP, HTTPS um CORBA/EJB Kommunikation über einen
Firewall zu gewährleisten. Diese Proxies können je nach Bedarf logisch vor oder hinter dem Firewall installiert werden.
Bild 7) Beispiel Deployment
Eine weitere oft verwendete Komponente in der Sicherheitstechnologie ist ein VPN Tunnel („Virtual Private
Network“). Dies ist eine interessante Alternative zur SSL Verschlüsselung, wenn es nur darauf ankommt die Übertragung
auf der Leitung zu sichern und nicht den Sender bzw. Empfänger mittels Zerifikat zu authentisieren.
Diese Liste könnte beliebig erweitert werden, was aber nicht Ziel dieses Artikels ist. Komponenten wie Smartcard
Leser, Finger/Iris Scanner und viele andere Möglichkeiten sind außerhalb dieser Betrachtung.
5) Sicherheit beim Zugriff auf bestimmte Codeelemente
In einem derart komplexen System gibt es noch wesentlich mehr Sicherheitselemente. Eine weitere wichtige Kategorie
ist die Möglichkeit bestimmten Sourcecodeteilen Berechtigungen zu geben bzw. zu verweigern. Im Umfeld vom der Java
Runtime gibt es die Möglichkeit durch Security Manager Codeberechtigungen zu vergeben. Um fertigen Programmen in
einer bestimmten Umgebung
grant codeBase "file:${server.instance.root}/partitions/standard/lib/-" {
Berechtigungen zu geben können
permission java.security.AllPermission;
permission java.io.FilePermission "<<ALL FILES>>", "read, write, delete, execute";
Sourcecode Berechtigungen per
permission java.io.SerializablePermission "enableSubclassImplementation";
permission java.lang.RuntimePermission "checkRealmAccess";
Konfigurationsdatei konfiguriert werden.
permission java.lang.RuntimePermission "checkServletAccess";
permission java.lang.RuntimePermission "checkSetSessionDirectory";
};
Im Microsoft .NET Framework
Beispiel) Java Sourcecode Berechtigungen
wurde vor allem auf Sicherheit sehr viel
Wert gelegt und ähnlich wie im Java Umfeld sind hier vielfältige Sicherheitseinschränkungen und –konfigurationen
möglich. Im Gegensatz zu der alten Win32 Strategie, bei der nur das Benutzerkonto die Rechte festgelegt hat, berücksichtigt
.NET auch – ähnlich wie in Java - die
Quelle des ausführenden
Programmcodes. Diese Code Access
Security vergibt die
Ausführungsrechte nicht an den
Benutzer, sondern nur das konkrete
Programm. Das nachfolgende Bild
zeigt den prinziellen Ablauf der „Code
Access Security“ in einer .NET
Bild 8) Code Access Security im .NET Framework
Anwendung.
Fortsetzung folgt:
Sicherheit ist ein sehr komplexes Thema, bei dem viele unterschiedliche Aspekte und Technologien zusammenspielen
müssen. Die hier genannte Liste könnte noch beliebig fortgesetzt werden. Vor allem im Bereich der verteilten Systeme ist
diese Thematik sehr komplex, da hier noch dazu Sicherheit auf unterschiedlichen Plattformen und über Rechnergrenzen –
potenziell unsichere Netzwerkstrecken – miteinander kombiniert werden muss.
Dieser Artikel sollte einen Eindruck davon geben, wie komplex Sicherheit sein kann und wie viele unterschiedliche
Bestandteile Sicherheit enthalten kann. In den nachfolgenden Artikeln sollen anhand des genannten Beispiels gezeigt
werden, wie Sicherheit in einem J2EE/CORBA System konfiguriert und genutzt werden kann.
Martin Heinzl ist bei Borland als Technologiespezialist im Bereich verteilter System mit dem Schwerpunkt auf J2EE
und CORBA tätig. Als Senior Consultant umfassen seine Tätigkeitsbereiche Training, Architektur- und Produktberatung in
den unterschiedlichsten Projektbereichen (Anforderungen, Softwarearchitektur, Deploymentarchitektur usw. sowie
Projektarbeit.
Herunterladen