Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Konfiguration und Tests Bundesamt für Sicherheit in der Informationstechnik Postfach 20 03 63 53133 Bonn Tel.: +49 (0) 1888 9582 0 E-Mail: [email protected] Internet: http://www.bsi.bund.de © Bundesamt für Sicherheit in der Informationstechnik 2006 Bundesamt für Sicherheit in der Informationstechnik Seite 2 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Inhaltsverzeichnis Inhaltsverzeichnis 1. EINLEITUNG........................................................................................................... 9 2. INSTALLATION DER DEBIAN 3.1 SARGE BASISPLATTFORM........................ 11 2.1 Vorbereitung einer virtuellen Maschine....................................................................................................... 12 2.2 Installation von Debian 3.1 Sarge in der virtuellen Maschine....................................................................23 2.3 Installation der zu testenden Anwendungen................................................................................................ 28 2.4 Replikation von virtuellen Maschinen.......................................................................................................... 29 3. INSTALLATION DER SOFTWAREKOMPONENTEN.......................................... 31 3.1 Java Software Design Kit (SDK, Version 1.5.0_05).....................................................................................32 3.2 Apache Webserver (Version 2.0.54).............................................................................................................. 33 3.3 Jakarta Tomcat Servlet Container (Version 5.5.9)......................................................................................35 3.4 Jakarta Tomcat Connector Modul mod_jk (Version 1.2.14)..................................................................... 39 3.4.1 Apache-Konfigurationsdatei httpd.conf.................................................................................................... 40 3.4.2 Tomcat Konfigurationsdatei server.xml.................................................................................................... 41 3.4.3 Apache-Konfigurationsdatei workers.properties.......................................................................................43 3.5 Installation des MySQL-Connectors/J..........................................................................................................45 3.6 Installationen für die JNDI-Konnektivität................................................................................................... 46 3.7 Installation der Logging-Komponenten........................................................................................................46 3.8 Einrichtung des lokalen DNS-Servers...........................................................................................................47 3.9 Werkzeuge für Penetrationstests...................................................................................................................51 3.9.1 SPIKE........................................................................................................................................................ 51 3.9.2 Benutzung von SPIKE...............................................................................................................................51 3.9.3 Ethereal...................................................................................................................................................... 54 3.9.4 OpenSSL....................................................................................................................................................54 3.10 Werkzeuge für statische Tests..................................................................................................................... 55 3.10.1 Flawfinder und Splint für C.....................................................................................................................55 3.10.2 Findbugs für Java.....................................................................................................................................57 3.10.3 Java-Dokumentation................................................................................................................................ 60 Seite 3 (von 187) Bundesamt für Sicherheit in der Informationstechnik Inhaltsverzeichnis Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 4. EINRICHTUNG DER AUTHENTISIERUNGSINFORMATIONEN..........................61 4.1 Einrichtung von Test-Benutzerkonten auf Betriebssystemebene...............................................................61 4.2 Einrichtung von Test-Benutzerkonten für die Web-Authentisierung....................................................... 61 4.3 Initialisierung der tomcat_users.xml Datei.................................................................................................. 62 4.4 Initialisierung der MySQL-Datenbank mit den Authentisierungsinformationen....................................63 4.5 Initialisierung der LDAP-Datenbank mit den Authentisierungsinformationen.......................................64 4.6 Konfiguration des LDAP-Browsers gq......................................................................................................... 68 4.7 Erzeugung einer CA und Generierung von SSL-Server- und Client-Zertifikaten.................................. 71 4.7.1 Installation einer Certification Authority (CA)......................................................................................... 71 4.7.2 Erzeugung eines SSL Server-Zertifikats (Tomcat)................................................................................... 73 4.7.3 Erzeugung eines SSL Server-Zertifikats (Apache)................................................................................... 76 4.7.4 Erzeugung von Client-Zertifikaten............................................................................................................78 5. DURCHFÜHRUNG DER TESTS........................................................................... 84 5.1 Funktionale Tests der Sicherheitsfunktionen von Tomcat......................................................................... 84 5.1.1 Funktionale Tests für die Authentisierung................................................................................................ 84 5.1.1.1 Ergebnisse zu Test1............................................................................................................................86 5.1.1.1.1 T1: HTTP Connector, BASIC-Authentisierung, Memory Realm.............................................. 87 5.1.1.1.2 T2: HTTP Connector, BASIC-Authentisierung, JDBC Realm.................................................. 88 5.1.1.1.3 T3: HTTP Connector, BASIC-Authentisierung, JNDI Realm................................................... 88 5.1.1.1.4 T4: HTTP Connector, DIGEST-Authentisierung, Memory Realm............................................89 5.1.1.1.5 T5.1: HTTP Connector, FORM-Authentisierung, Memory Realm........................................... 89 5.1.1.1.6 T5.2: HTTP Connector, FORM-Authentisierung, JDBC Realm............................................... 90 5.1.1.1.7 T5.3: HTTP Connector, FORM-Authentisierung, JNDI Realm................................................ 91 5.1.1.1.8 T6: HTTPS Connector, Client Zertifikat Authentisierung, Memory Realm.............................. 91 5.1.1.1.9 T7: AJP1.3 Connector, BASIC-Authentisierung, Memory Realm............................................ 92 5.1.1.1.10 T8: AJP1.3 Connector, DIGEST-Authentisierung, Memory Realm........................................92 5.1.1.1.11 T9: AJP1.3 Connector, FORM-Authentisierung, Memory Realm...........................................93 5.1.1.1.12 T10: AJP1.3 / SSL Connector, Client Zertifikat Authentisierung, Memory Realm................ 93 5.1.1.2 Ergebnisse zu Test2............................................................................................................................93 5.1.1.2.1 T11: HTTP Connector, BASIC-Authentisierung, Memory Realm............................................ 93 5.1.1.2.2 T12: HTTP Connector, DIGEST-Authentisierung, Memory Realm..........................................94 5.1.1.2.3 T13.1: HTTP Connector, FORM-Authentisierung, Memory Realm......................................... 94 5.1.1.2.4 T13.2: HTTP Connector, gemischte BASIC- und FORM-Authentisierung, Memory Realm... 96 5.1.1.2.5 T14: HTTPS Connector, Client Zertifikat Authentisierung, Memory Realm............................ 97 5.1.1.2.6 T15: AJP1.3 Connector, BASIC-Authentisierung, Memory Realm........................................ 100 5.1.1.2.7 T16: AJP1.3 Connector, DIGEST-Authentisierung, Memory Realm......................................100 5.1.1.2.8 T17.1: AJP1.3 Connector, FORM-Authentisierung, Memory Realm......................................100 5.1.1.2.9 T17.2: AJP Connector, gemischte BASIC- und FORM-Authentisierung, Memory Realm.... 100 5.1.1.2.10 T18: AJP1.3 / SSL Connector, Client Zertifikat Authentisierung, Memory Realm.............. 100 5.1.1.3 Ergebnisse zu Test3..........................................................................................................................101 5.1.1.3.1 T19.1: HTTP Connector, BASIC-Authentisierung, Memory Realm....................................... 101 5.1.1.3.2 T19.2: HTTP Connector, BASIC-Authentisierung, JDBC Realm...........................................101 5.1.1.3.3 T19.3: HTTP Connector, BASIC-Authentisierung, JNDI Realm............................................ 102 Bundesamt für Sicherheit in der Informationstechnik Seite 4 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Inhaltsverzeichnis 5.1.1.3.4 T20: HTTP Connector, DIGEST-Authentisierung, Memory Realm........................................102 5.1.1.3.5 T21: HTTP Connector, FORM-Authentisierung, Memory Realm.......................................... 102 5.1.1.3.6 T22: HTTPS Connector, Client Zertifikat Authentisierung, Memory Realm.......................... 103 5.1.1.3.7 T23.1: AJP1.3 Connector, BASIC-Authentisierung, Memory Realm..................................... 103 5.1.1.3.8 T23.2: AJP1.3 Connector, BASIC-Authentisierung, JDBC Realm......................................... 104 5.1.1.3.9 T23.3: AJP1.3 Connector, BASIC-Authentisierung, JNDI Realm.......................................... 104 5.1.1.3.10 T24: AJP1.3 Connector, DIGEST-Authentisierung, Memory Realm....................................104 5.1.1.3.11 T25: AJP1.3 Connector, FORM-Authentisierung, Memory Realm.......................................105 5.1.1.3.12 T26: AJP1.3 / SSL Connector, Client Zertifikat Authentisierung, Memory Realm.............. 105 5.1.2 Funktionale Tests für die Zugriffskontrolle ........................................................................................... 106 5.1.2.1 Tests der Zugriffsrechte auf dem Niveau der Java Virtual Machine............................................... 106 5.1.2.1.1 T27 Tomcat beenden................................................................................................................ 107 5.1.2.1.2 T28 neuen Prozess starten.........................................................................................................108 5.1.2.1.3 T29 Netzwerk-Socket öffnen und Daten übertragen................................................................109 5.1.2.1.4 T30.1 Lesen innerhalb des Bereichs der Web-Anwendung..................................................... 109 5.1.2.1.5 T30.2 Schreiben innerhalb des Bereichs der Web-Anwendung...............................................110 5.1.2.1.6 T30.3 Löschen innerhalb des Bereichs der Web-Anwendung................................................. 111 5.1.2.1.7 T30.4 Ausführen innerhalb des Bereichs der Web-Anwendung..............................................112 5.1.2.1.8 T31 Lesen / Schreiben / Löschen / Ausführen außerhalb der Web-Anwendung.....................112 5.1.2.1.9 T32 Zugriff auf Tomcat-eigene Komponenten.........................................................................113 5.1.2.2 Tests der Zugriffsrechte auf dem Niveau von Webanwendungen...................................................114 5.1.2.2.1 T33.1 HTTP Connector, Zugriff auf eine geschützte JSP-Seite...............................................115 5.1.2.2.2 T33.2 AJP13 Connector, Zugriff auf eine geschützte JSP-Seite..............................................116 5.1.2.2.3 T34.1 HTTP Connector, Zugriff auf ein geschütztes Verzeichnis .......................................... 116 5.1.2.2.4 T34.2 AJP13 Connector, Zugriff auf ein geschütztes Verzeichnis ......................................... 116 5.1.2.2.5 T35 Schutz einzelner HTTP-Methoden vor anonymen Zugriffen........................................... 116 5.1.2.3 Tests der Zugriffsrechte auf dem Niveau von Valves......................................................................119 5.1.2.3.1 T36.1 HTTP Connector, verbotene Anfragen mit IP-Adresse des Clients.............................. 121 5.1.2.3.2 T36.2 AJP13 Connector, verbotene Anfragen mit IP-Adresse des Clients..............................121 5.1.2.3.3 T37 Erlaubte Anfragen mit IP-Adresse des Clients................................................................. 122 5.1.2.3.4 T37.1 HTTP Connector, erlaubte Anfragen mit IP-Adresse des Clients................................. 122 5.1.2.3.5 T37.2 AJP13 Connector, erlaubte Anfragen mit IP-Adresse des Clients.................................123 5.1.2.3.6 T38 / T 39 HTTP bzw. AJP13 Connector, verbotene / erlaubte Anfragen mit Hostname des Clients...................................................................................................................................................... 123 5.1.2.4 Protokollierung.................................................................................................................................127 5.1.2.4.1 T40 Kontrolle der Log-Datei für eine <Logger>-Komponente............................................... 128 5.1.2.4.2 T41 Protokollierung mit Access Log Valve............................................................................. 129 5.1.2.5 Zuverlässigkeit der Dienstleistung................................................................................................... 129 5.1.2.5.1 T42 Failover beim Ausfall einer Tomcat-Instanz.....................................................................130 5.1.2.5.2 T43 Persistente Sessions beim Herunterfahren........................................................................ 131 5.1.2.6 Verschlüsselung............................................................................................................................... 132 5.1.2.6.1 T44 SSL mit Null-Cipher......................................................................................................... 132 5.1.2.6.2 T45 SSL mit schwacher Verschlüsselung................................................................................ 133 5.1.2.6.3 T46 SSLv2, SSLv3 oder TLS...................................................................................................133 5.1.2.7 Datenschutz...................................................................................................................................... 136 5.1.2.7.1 T47 / T48 Datenschutz-bezogene Analyse der Ergebnisse aus Tests T40 und T41................ 136 5.1.2.8 Minimale Rechtevergabe..................................................................................................................137 5.1.2.8.1 T49 Ausführung von Tomcat als nicht-privilegierter Benutzer............................................... 138 5.2 Penetrationstests - Vorgehensweise.............................................................................................................138 5.2.1 Angriffsszenarien.....................................................................................................................................138 5.2.2 Beispielanwendungen.............................................................................................................................. 139 Seite 5 (von 187) Bundesamt für Sicherheit in der Informationstechnik Inhaltsverzeichnis Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.3 HTTP-Connector: Angriffe von einem HTTP-Client............................................................................... 140 5.4 AJP-Connector ohne SSL-Client-Authentisierung....................................................................................141 5.4.1 Angriffe eines maliziösen HTTP-Clients................................................................................................ 141 5.4.1.1 Vorgehensweise............................................................................................................................... 141 5.4.1.2 Bewertungskriterien......................................................................................................................... 143 5.4.1.3 Ergebnis............................................................................................................................................143 5.4.2 Angriffe einer maliziösen Web-Anwendung...........................................................................................148 5.4.2.1 Vorgehensweise............................................................................................................................... 148 5.4.2.2 Bewertungskriterien......................................................................................................................... 151 5.4.2.3 Ergebnis............................................................................................................................................152 5.5 AJP Connector mit SSL Client Authentisierung....................................................................................... 152 5.5.1 Funktionsweise des Systems....................................................................................................................153 5.5.2 Angriffe....................................................................................................................................................158 5.5.2.1 Testfälle............................................................................................................................................ 158 5.5.2.2 Vorgehensweise............................................................................................................................... 159 5.5.2.3 Bewertungskriterien......................................................................................................................... 160 5.5.2.4 Ergebnis............................................................................................................................................161 5.6 Quellcode-Analysen.......................................................................................................................................163 5.6.1 Automatische Überprüfung des Quellcodes............................................................................................ 163 5.6.2 Manuelle Überprüfung des Quellcodes................................................................................................... 164 5.6.3 Umfang der Quellcode-Analyse.............................................................................................................. 167 5.6.3.1.1 T91/T94 Automatische und manuelle Prüfung des Quellcode.................................................168 5.6.3.1.2 T92 Manuelle Sichtung der Schnittstelle zu JSSE (SSL).........................................................172 5.6.3.1.3 T93 Manuelle Sichtung der Authentisierungsmethoden.......................................................... 173 6. EMPFEHLUNGEN UND MASSNAHMEN........................................................... 176 6.1 Allgemeine Maßnahmen bzw. Maßnahmen auf Betriebssystemebene....................................................176 6.1.1 Dateiberechtigungen und -zuordnung..................................................................................................... 176 6.1.2 Passworte für die Benutzer / Webanwendung.........................................................................................177 6.1.3 Passwort des JAVA Zertifikatspeichers.................................................................................................. 177 6.1.4 Host-basierte Firewall (netfilter / iptables)..............................................................................................178 6.1.5 Gesicherte Kommunikation..................................................................................................................... 178 6.1.6 Eingeschränkte Laufzeitumgebung (chroot)........................................................................................... 179 6.1.7 Nutzung von erweiterten Zugriffsschutzmechanismen unter SELinux...................................................179 6.2 Maßnahmen beim Apache Webserver.......................................................................................................179 6.2.1 Zugriffsberechtigungen........................................................................................................................... 180 6.2.2 Watchdog-Funktionalität......................................................................................................................... 180 6.3 Maßnahmen beim Jakarta Tomcat Servlet Container............................................................................. 180 6.3.1 Installation unter einem Tomcat Benutzer...............................................................................................180 6.3.2 Shutdown-Port......................................................................................................................................... 181 6.3.3 Logging....................................................................................................................................................181 6.3.4 Manager und Admin Webanwendungen................................................................................................. 182 6.3.5 Zugriffsbeschränkungen.......................................................................................................................... 183 6.3.6 Tests der Konfiguration........................................................................................................................... 183 6.3.7 Verschlüsselte Verbindung (SSL)........................................................................................................... 184 6.3.8 Anbindung einer Datenbank per JDBC...................................................................................................185 Bundesamt für Sicherheit in der Informationstechnik Seite 6 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Inhaltsverzeichnis 6.3.9 Anbindung einer Datenbank per JNDI.................................................................................................... 185 6.3.10 Single-Sign-On...................................................................................................................................... 185 7. WEITERE PUNKTE / BUGS / VERBESSERUNGSMÖGLICHKEITEN.............. 186 8. ABKÜRZUNGEN................................................................................................. 187 9. WICHTIGE SHELL-VARIABLEN, VERZEICHNISSE UND DATEIEN................ 188 10. REFERENZEN................................................................................................... 189 10.1 Web-Referenzen (Stand 30.11.2005)......................................................................................................... 189 Seite 7 (von 187) Bundesamt für Sicherheit in der Informationstechnik Inhaltsverzeichnis Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Seite 8 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einleitung 1. Einleitung Das Bundesamt für Sicherheit in der Informationstechnik (BSI) hat eine Sicherheits­ untersuchung des Open Source Jakarta Tomcat durchführen lassen. Diese Untersuchung teilt sich in mehrere Projektphasen auf. Dieses Dokument beschreibt die durchgeführten Tests und Analysen sowie die Installation des dazugehörigen Testsystems. Die durchzuführenden Tests wurden in einer früheren Projektphase im Dokument „Feinkonzept zur Sicherheitsuntersuchung des Apache Tomcat Servlet Containers“ fest­ gelegt. Dieses frühere Dokument wird im weiteren unter [Tomcat Fein.] referiert. Es ist für das Verständnis des jetzigen Dokuments nicht erforderlich, da die Beschreibung der Testfälle 1:1 übernommen wurde, aber dennoch eine empfehlenswerte Lektüre. Der Umfang des Dokuments liegt begründet in dem Streben nach: 1. Nachvollziehbarkeit und Reproduzierbarkeit der Testergebnisse und 2. Rückverfolgbarkeit der Testergebnisse zu den Testbeschreibungen des Feinkonzepts. Dieses Dokument stellt im ersten Schritt die Vorgehensweise bei der VMware-basierten Installation eines Debian 3.1 Sarge Linux Betriebssystems (basierend auf der Debian 3.1 Linuxtag 2005 Edition Installations-DVD) zum Zweck der Sicherheitsuntersuchung von Tomcat zusammen. Im zweiten Schritt wird die Installation und Konfiguration • des Webservers Apache (Version 2.0.54) • des Servlet-Containers1 Tomcat (Version 5.5.9) • des Connectors mod_jk (Version 1.2.14.1) sowie die Durchführung der damit durchgeführten und [Tomcat Fein.] zusammengestellten Tests beschrieben. Abschließend werden Empfehlungen für die sichere Konfiguration zum Betrieb von Tomcat gegeben. In diesem Dokument verwendete Notation Dieses Dokument verwendet die folgende Regeln zur Darstellung und Hervorhebung: • 1 Hinweis: die Zeichenvorlage Hinweis kommt am Anfang von Absätzen zum Einsatz, die als ganzes hervorzuheben sind. Der optische Effekt bleibt somit minimal. Ein Servlet Container dient als Laufzeitumgebung für Java Servlets [Sun Servlets] bzw. Java Server Pages [Sun JSP]. Der Container ist die Schnittstelle zwischen den Webserver und den Servlets, die sich in dem Container befinden. Der Container lädt, initialisiert und führt die Servlets aus. Der Container ordnet einer ankommenden Anfrage einem Servlet zu und leitet diese Anfrage an das Servlet weiter. Das Servlet bearbeitet die Anfrage, ggf. unter Einbeziehung weiterer Hintergrundapplikationen, und erzeugt eine Antwort. Der Container leitet diese Antwort an den Webserver weiter, der sie dann an den Web-Client (z. B. Browser) übermittelt. Seite 9 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einleitung Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Dateinamen, Konfigurationsvariablen, Kommandos, Programm-generierte Ausgaben im Fließtext werden in der Zeichenvorlage Code dargestellt (in der Praxis oft als Fixed-Width Font [z. B. Courier], hier Kursiv)2 • Listing 1: Als Überschrift oder zur Namensgebung für längere Abschnitte aus Scripts bzw. Konfigurationsdateien. Tabellen und Abbildungen werden dagegen unterhalb der Tabelle bzw. Abbildung beschriftet. Für ganze Scripts wird die Absatzvorlage Code eingesetzt (auch möglichst als Fixed-Width Font, z. B. Courier). Die kleinerere Schriftgröße wird zur Vermeidung von automatischen Zeilenumbrüchen bei den z. T. sehr langen Zeilen verwendet. • Zwischenüberschriften werden durch Fettdruck und vertikalen Abstand vom umgebenden Text getrennt, aber im Gegensatz zu Überschriften nicht nummeriert. • Literaturverweise auf das Literaturverzeichnis in Abschnitt 10 am Ende des Dokuments werden in eckigen Klammern angegeben, z. B. als [Tomcat Fein.]. Davor befindet sich in Abschnitt 8 ein Abkürzungsverzeichnis. • URLs auf Webseiten im Internet werden in der Fußnoten angegeben. Der Fließtext bleibt lesbar. • Lange Datei- bzw. Verzeichnisnamen werden teilweise in Fußnoten verlegt, wobei der Fließtext eine eindeutige Kurzform enthält – meist ohne Verzeichnis. Gegen Ende dieses Dokuments findet der Leser eine Zusammenstellung einiger stets wiederkehrender Shellvariablen, Dateinamen und dazugehörige Verzeichnisse. • URLs auf Webseiten / -Applikationen innerhalb der Testumgebung werden mit der Zeichenvorlage URL Intern formatiert. Diese sind nur bei aufgebauter Testumgebung nutzbar. Hinweis: derzeit werden die Formatvorlagen Code / URL Intern farbig hinterlegt, um die Stellen des Auftretens entsprechenden Textes leicht zu identifizieren, bis sich ein möglichst vielen Lesern gefälliges Format herauskristallisiert. 2 Treten derartige Texte in Fußnoten auf, so wird die Zeichenvorlage Fußnote_Code verwendet. Bundesamt für Sicherheit in der Informationstechnik Seite 10 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform 2. Installation der Debian 3.1 Sarge Basisplattform Um eine flexible Testumgebung zu erhalten, werden sämtliche Installationen in virtuellen Maschinen vorgenommen. Zur Schaffung einer einheitlichen Arbeitsplattform wird zunächst ein Prototyp der virtuellen Maschine erstellt, der dann bei Bedarf repliziert werden kann. Zum Einsatz kommt ein VMware GSX Server3 Version 3.1.0 Build 9089 auf einer Novell-SuSE4 Professional Linux 9.3 Host-Plattform (Rechner bigmama) zur Realisierung der virtuellen Maschinen, die selbst auf dem Debian5 3.1 Sarge Linux Betriebssystem aufsetzen. Eine Übersicht über das gesamte Testsystem gibt die folgende Abbildung: W e b b r o w s e r 1 9 b 2 . i 1 g 6 m 8 . 1 a 1 m 8 . 1 a / 2 6 ( V M w a r e H o s t ) D o m a i n : e x t e r n a l . d e v i r t u e l l e r R o u t e r D o m a i n : b s i t o m c a t . d e F I n i r t e e r w n a e l t l / t e m p l 1 a 9 t 2 e . 1 6 8 . 1 1 8 . 1 0 0 / 2 6 t o m c a t 1 h 9 2 o . 1 s 6 t 8 . 1 1 8 . 1 0 1 / 2 6 ( v i r t u e l l e M ( v a i s r t c u h e i n l l e e ) M a s c h i n e ) W e b b r o w s e r T o m c a t , A p a c h e D N M S y , S L Q D L A P , ( + B a s i s i n s t a l l a t i o n ) W e b b r o w s e r Abbildung 2.1: Architektur des Testsystems Das VMware-Hostsystem (bigmama) beherbergt die virtuellen Maschinen. Das Aufsetzen der virtuellen Maschine template wird im folgenden Abschnitt beschrieben. Sie dient als Referenzplattform und Ausgangspunkt zur Erzeugung weiterer virtueller Maschinen durch 3 4 5 http://www.vmware.com http://www.novell.com/de-de/products/linuxprofessional/ http://www.debian.org Seite 11 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Replikation. Die Konfigurationen und Tests werden anschließend auf der so erzeugten Systemkopie tomcathost durchgeführt. 2.1 Vorbereitung einer virtuellen Maschine Nach dem Login auf dem VMware Server (bigmama) wird die VMware Virtual Console in einem Konsolenfenster mit dem Kommando vmware geöffnet. Abbildung 2.2: VMware Virtual Machine Console Um später eine Textkonsolenumschaltung der in den virtuellen Maschinen laufenden LinuxSystemen zu ermöglichen (per Ctrl-Alt-Fn)6, wird der VMware Hot-Key von Ctrl-Alt auf ShiftCtrl-Alt umgestellt (Menü Edit → Preferences, Reiter Hot-Keys) und VMware anschließend beendet und neu gestartet. 6 Fn entspricht einer der Funktionstasten F1 ... F6 auf der Tastatur, über Ctrl-Alt-F7 wird auf die grafische X Window Benutzeroberfläche umgeschaltet. Bundesamt für Sicherheit in der Informationstechnik Seite 12 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform Abbildung 2.3.: Änderung des VMware Hot-Keys Über den Eintrag „New Virtual Machine“ wird zunächst eine Debian 3.1 Sarge Basisplattform erzeugt, die durch Replikation wieder verwendet werden kann. Die Schritte zur Einrichtung der virtuellen Maschine sind wie folgt: Es soll eine anwendungsspezifische Konfiguration der virtuellen Maschine erfolgen (Abbildung 2.4). Seite 13 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 2.4.: Auswahl des Konfigurationstyps: Custom Es erfolgt die Festlegung des zu installierenden Betriebssystems (Abbildung 2.5). Bei der Debian 3.1. Sarge Installation soll ein Kernel der 2.6.x Serie verwendet werden. Abbildung 2.5.: Auswahl des Gast-Betriebssystems innerhalb der virtuellen Maschine Die Pfade für die Ablage der VMware Dateien der virtuellen Maschine werden in dem in Abbildung 2.6 dargestellten Fenster definiert. Bundesamt für Sicherheit in der Informationstechnik Seite 14 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform Abbildung 2.6.: Name und Pfade der Dateien der virtuellen Maschine Die neu erstellte virtuelle Maschine wird für den Zugriff durch mehrere Benutzer (auf der VMware Host-Plattform) freigegeben (Abbildung 2.7). Abbildung 2.7.: Zugriffsberechtigungen zur virtuellen Maschine Seite 15 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Die virtuelle Maschine soll beim Hochfahren der VMware Host-Plattform nicht automatisch gestartet und beim Herunterfahren automatisch angehalten werden (Abbildung 2.8). Abbildung 2.8.: Start- und Shutdown-Optionen Die virtuelle Maschine wird mit einem Speicher von 256 MB konfiguriert (Abbildung 2.9). Bundesamt für Sicherheit in der Informationstechnik Seite 16 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform Abbildung 2.9.: Speicherkonfiguration der virtuellen Maschine Um die virtuellen Maschinen (zur Nachbildung eines Multi-Host-Szenarios) untereinander vernetzen zu können und ggf. externe Internet-Zugriffe über den VMware-Host als Router durchführen zu können, wird das Netzwerk im NAT-Modus (Network Address Translation) konfiguriert (Abbildung 2.10). Abbildung 2.10.: Netzwerkkonfiguration der virtuellen Maschine Seite 17 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 2.11.: Art des I/O-Adapters der virtuellen Maschine Die virtuelle Maschine soll eine SCSI-Festplatte mit einer Größe von 1,5 GB zur Aufnahme des Betriebssystems und der Nutzerdaten simulieren (Abbildung 2.11 ... Abbildung 2.14). Bundesamt für Sicherheit in der Informationstechnik Seite 18 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform Abbildung 2.12.: Einrichtungsoptionen für die simulierte Festplatte Abbildung 2.13.: Art der Festplatte der simulierten virtuellen Maschine Seite 19 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 2.14.: Größe der simulierten Festplatte Bundesamt für Sicherheit in der Informationstechnik Seite 20 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform Abbildung 2.15.: VMware Konsolenfenster für die neu eingerichtete virtuelle Maschine Nachfolgend werden ggf. noch weitere Parameter der virtuellen Maschine spezifiziert, falls die Standardeinstellungen der VMware-Umgebung für den geplanten Einsatz nicht geeignet sind. Es handelt sich dabei um Einstellungen • zum DVD-Laufwerk (hier ist bei der in der VMware-Umgebung vorhandenen Hardware der Eintrag „legacy emulation“ zu aktivieren) • zum Floppy-Disk-Laufwerk • zur Netzwerkkarte Sobald diese Einstellungen angepasst sind, kann die neu erstellte virtuelle Maschine zum ersten Mal gebootet werden, um die Installation von Debian 3.1 Sarge von DVD aus vorzunehmen. 2.2 Installation von Debian 3.1 Sarge in der virtuellen Maschine Die nachfolgende Zusammenstellung der Installationsschritte eines Debian 3.1 Sarge Linux kann – unabhängig von den zuvor beschriebenen VMware Einstellungen – verwendet werden, um eine paketreduzierte Installationsplattform für den Einsatz des Tomcat Servlet Containers zu schaffen. Die Installation beginnt wie üblich mit dem Booten der virtuellen Maschine (bzw. des Rechners, auf dem diese Plattform installiert werden soll) vom Debian 3.1 Sarge Installationsmedium. Seite 21 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Zur Installation des Kernels 2.6.x wird beim ersten Debian Bootprompt der Parameter • linux26 verwendet. Weitere Parameter bei der Installation: • Sprache: Deutsch • Land oder Gebiet: Deutschland • Tastaturlayout: Deutsch • Rechnername: debian-template • Domänenname: tomcattest • Partitionierung der virtuellen Festplatte SCSI1 (0,0,0) (sda) – 1.6 GB: • Partition 1: primary, 1.35 GB, Mountpoint /, Filesystem ext3 • Partition 2: primary, 255 MB, swap Es erfolgt die Installation des Debian Grundsystems. • Installation des GRUB-Bootloaders im Master Boot Record der virtuellen Maschine Entnahme der Installations-DVD und Reboot der neu installierten virtuellen Maschine. Konfiguration des Debian-Grundsystems 7 • Hardware-Uhr auf GMT eingestellt: nein • Zeitzone: Europa/Berlin • Root-Passwort: vmware • Anlegen eines Benutzerkontos: Selektion abbrechen ausführen • apt konfigurieren (dazu die Debian 3.1 Sarge Installations-DVD wieder ins Laufwerk einlegen, nach dem Einlesen der DVD erfolgt die folgende Abfrage): • Zugriffsmethode für apt auf das Paketarchiv: cdrom • Weitere Installations-CDs: nein • Weitere apt-Quellen hinzufügen: nein • Nutzung der Sicherheitsupdates von security.debian.org7: ja (zur Installation der seit der Fertigstellung der Installations-DVD hinzugekommenen Sicherheits­ updates des Betriebssystems) http://security.debian.org Bundesamt für Sicherheit in der Informationstechnik Seite 22 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Pakete auswählen und installieren: • Manuelle Auswahl • • Installation der Debian 3.1 Sarge Basisplattform hier wird zunächst die Standardvorgabe an Paketen (keine Modifikation der Paketliste) nachinstalliert, bevor in einem späteren Schritt noch Anwenderspezifizierte Pakete ergänzt werden Konfiguration vor der Installation • SSH: nur SSH Protokoll Version 2 erlauben • ssh-keysign: mit SUID Bit installieren • sshd Server: starten Anschließend werden zunächst die Standardpakete nachinstalliert (von der InstallationsDVD, oder, falls für diese Pakete bereits Security Updates vorhanden sind, direkt von der Debian Security Webseite). Nach Abschluss dieses Installationsschrittes sind 314 MB auf der Festplatte belegt. • Im nächsten Schritt wird die Konfiguration des Grundsystems abgeschlossen und es erfolgt ein root-Login im Grundsystem • Mit dem Installationswerkzeug aptitude werden nun noch weitere benötigte Pakete nachinstalliert (Editoren, Webbrowser, minimale X-Window Umgebung, Netzwerk­ diagnose). Dazu werden die unten genannten Pakete manuell selektiert. Pakete, von denen die selektierten abhängen, werden dabei automatisch mit installiert: • Kategorie nicht installierte Pakete: • • in Kategorie devel – main: • ant • ant-doc • autoconf • cvs in Kategorie doc – main: • • bind9-doc in Kategorie editors – main: • emacs21 • vim-full Seite 23 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform • in Kategorie libdevel – main: • • • • • libssl-dev (zur Übersetzung von mod_ssl für Apache) in Kategorie misc – main: • mysql-client (zum Test der JDBC-basierten Authentisierung) • mysql-server (zum Test der JDBC-basierten Authentisierung) in Kategorie net – main: • bind9 (zum Aufsetzen eines lokalen DNS-Servers) • gq (LDAP Browser) • ldap-utils (zum Test der LDAP-basierten Authentisierung) • slapd (zum Test der LDAP-basierten Authentisierung) • rsync • tcpdump in Kategorie utils – main: • bzip2 • openssl in Kategorie web – main: • • Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers mozilla-firefox in Kategorie x11 – main: • desktop-base iceconf • icepref • icewm • x-window-system (In einer reinen Server-Umgebung ohne grafische Benutzeroberfläche kann bei der Installation auf die Pakete der beiden letzten Kategorien web bzw. x11 verzichtet werden) Die Abfragen zur Konfiguration werden wie folgt beantwortet: • CVS Repository-Wurzelverzeichnis: /var/lib/cvs Bundesamt für Sicherheit in der Informationstechnik Seite 24 (von 187) Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • CVS Repository: anlegen • CVS-pserver starten: nein • libpango - entrust font management to defoma: ja • x-ttcidfont-conf TrueType font handling backend: freetype • Konfiguration von slapd (wird zum Test LDAP-basierter Authentisierung benötigt) • • • Domänenname: bsitomcat.tsi-itcsec.de • Organisationsname: BSI-Tomcat TSI ITC-Security • Admin-Passwort: vmware • LDAPv2 Protokoll erlauben: nein Konfiguration von xserver-xfree86 (diese Schritte würden in einer reinen ServerUmgebung ohne grafische Benutzeroberfläche entfallen) • Grafikkarte automatisch erkennen: ja • Kernel-Framebuffer Schnittstelle verwenden: ja • XKB-Regelsatz: xfree86 • Tastaturoptionen: - keine - • Maus automatisch erkennen: ja • Mausanschluss: /dev/input/mice • Monitor automatisch erkennen: ja • LCD-Monitor: ja • Monitor-Konfiguration: medium • Monitor-Auflösung: 1024x768, 60 Hz • verwendete Video-Modi: 1024x768, 800x600, 640x480 • Farbtiefe: 16 bit8 Konfiguration von xprint-common • 8 Standard Druckerauflösung (dpi): 600 Die ursprünglich hier vorgegebenen 24 bit Farbtiefe müssen entsprechend den Einstellungen der Farbtiefe auf dem VMware-Hostrechner angepasst werden. Daher wurde der Parameter „DefaultDepth“ in der Datei /etc/X11/XF86config4 von ursprünglich 24 auf 16 bit geändert. Seite 25 (von 187) Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Debian 3.1 Sarge Basisplattform Es erfolgt die Installation der übrigen Pakete von DVD bzw. aus den heruntergeladenen Paketen des Debian Security Servers. Nach Abschluss dieses Installationsschrittes sind 600MB auf der Festplatte belegt. Weitere manuelle Konfigurationsänderungen: • /etc/inittab: durch die Tastenkombination Ctrl-Alt-Del wird ein Shutdown-Halt (statt Reboot) ausgeführt, um die virtuelle Maschine gezielt anhalten zu können. 2.3 Installation der zu testenden Anwendungen Im nächsten Schritt werden die benötigten Anwendungspakete für eine Installation innerhalb der virtuellen Maschinen übertragen (per Web-Download bzw. aus einem lokalen SoftwareRepository per scp). Zur Vereinheitlichung wird von folgenden Voraussetzungen ausge­ gangen (eine detaillierte Beschreibung der Installationsschritte wird in Abschnitt 3 gegeben): • die heruntergeladenen Pakete werden unter /root/bsi_tomcat abgelegt • um mit möglicherweise bereits installierten Paketen (z. B. aus der entsprechenden Linux-Distribution) keine Konflikte zu erzeugen, werden die Installationen unter dem Verzeichnis /opt durchgeführt. Soweit erforderlich erfolgt die Übersetzung der Soft­ warepakete unterhalb des Verzeichnisses /root/bsi_tomcat. Somit befinden sich nach Abschluss der Installation die verschiedenen Softwarepakete in den folgenden Unterverzeichnissen (soweit auf der jeweiligen virtuellen Maschine vorhanden): • Java SDK 1.5.0_05: /opt/jdk1.5.0_05 (nachfolgend auch als $JAVA_HOME bezeichnet) Das Skript /root/bsi_tomcat/install_jdk5.sh führt die Installation des Java Software Design Kits aus. • Apache 2.0.54: /opt/httpd-2.0.54 (nachfolgend auch als $HTTPD_HOME oder $APACHE_INSTALL bezeichnet) Das Skript /root/bsi_tomcat/install_apache.sh übersetzt und installiert Webserver. • Jakarta Tomcat: /opt/jakarta-tomcat-5.5.9 $CATALINA_HOME bezeichnet) den Apache (nachfolgend auch als Das Skript /root/bsi_tomcat/install_tomcat.sh entpackt die Binärversion des Jakarta Tomcat Servlet Containers. • Jakarta Tomcat Connector (mod_jk): Das Connector-Modul (mod_jk.so) befindet sich nach der Installation im Unterverzeichnis modules der Apache-Installation. Die Übersetzung und Installation /root/bsi_tomcat/install_mod_jk.sh des Bundesamt für Sicherheit in der Informationstechnik Connector-Moduls erfolgt mit dem Skript Seite 26 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Installation der Debian 3.1 Sarge Basisplattform MySQL Database Java Connector: Das zur Verbindung mit der MySQLDatenbank benötigte Java Archiv mysql-connector-java-3.1.10-bin.jar wird in das common/lib Unterverzeichnis der Jakarta Tomcat Installation kopiert. Das Skript /root/bsi_tomcat/install_mysqlj.sh führt die Installation des MySQL Connectors aus. • Log4J und commons-logging: zum Logging in Tomcat wird je ein jar-Archiv in das common/lib Unterverzeichnis der Jakarta Tomcat Installation kopiert sowie eine Konfigurationsdatei common/classes/log4j.properties erzeugt. Skript /root/bsi_tomcat/install_logging_components.sh führt die Installation der Logging-jarArchive aus. Eine Konfiguration dieser Softwarekomponenten erfolgt zunächst nicht. Nach Abschluss der allgemeinen Installation / Konfiguration wird die virtuelle Maschine zur Erzeugung einer Arbeitskopie heruntergefahren (shutdown -h now). 2.4 Replikation von virtuellen Maschinen Zur Realisierung mehrerer virtueller Hostinstanzen kann die zuvor erstellte virtuelle Maschine beliebig oft repliziert und nebenläufig betrieben werden. Die Replikation von virtuellen Maschinen für weitere Arbeiten erfolgt in zwei Stufen: • Auf Betriebssystemebene wird das Verzeichnis mit den Dateien der virtuellen Maschine (Festplattenimage der virtuellen Maschine, Konfigurationsdateien) kopiert: cp -rp Debian_3.1_template Debian_3.1_host<n> • Anschließend muss die Kopie der VMware Konsole noch bekannt gemacht werden (Schritte in Abbildungen 2.16 … 2.18) Abbildung 2.16.: Suche der neuen virtuellen Maschine mit dem „Browse“ Button Seite 27 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Debian 3.1 Sarge Basisplattform Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 2.17.: Auswahl der .vmx-Datei zur selektierten virtuellen Maschine Abbildung 2.18.: Anpassung des Namens der virtuellen Maschine Alternativ kann das von VMware selbst bereitgestellte Duplikationsverfahren angewendet werden. Bundesamt für Sicherheit in der Informationstechnik Seite 28 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 3. Installation der Softwarekomponenten In den nachfolgenden Abschnitten wird die Installation der für den Test benötigten Softwarekomponenten beschrieben. Es handelt sich dabei um • das Java Software Design Kit (Binärpaket) • den Apache Webserver (Quellcodepaket) • den Jakarta Tomcat Servlet Container (Binärpaket) • den Jakarta Tomcat Connector mod_jk (Quellcodepaket) • den MySQL-Connector/J zur Datenbankanbindung (Binärpaket) • die Log4j und commons-logging Software (Binärpakete) Soweit es sich um Binärpakete handelt (Java SDK, Jakarta Tomcat Servlet Container, MySQL-Connector/J), werden diese direkt installiert. Quellcodepakete werden zunächst übersetzt und dann installiert. In der Testinstallation wird die oben genannte Software nach Bezug von den Entwickler-Webseiten nachinstalliert. Seite 29 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Vergleichbare Softwarekomponenten aus der Linux-Distribution sind in der Testinstallation nicht vorhanden. Um anderen Nutzern eine vergleichbare Installation zu ermöglichen, werden sämtliche Softwarekomponenten unter dem Verzeichnis /opt installiert, sodass es zu keinen Konflikten mit möglicherweise an anderer Stelle installierten Softwarepaketen aus der von diesen Nutzern verwendeten Linux-Distribution kommen sollte. Die unten im Text aufgeführten install_*.sh Shell-Skripts wurden für die Reproduzierbarkeit der Installationsschritte erstellt und eingesetzt. 3.1 Java Software Design Kit (SDK, Version 1.5.0_05) Der Java-basierte Jakarta Tomcat Servlet Container benötigt zur Ausführung die Installation eines Java Software Design Kits (SDK). Die für die beschriebenen Untersuchungen verwendete aktuelle Version 1.5.0 Update 05 ist für Linux-Plattformen zum Download erhältlich von Sun Microsystems, Inc.9 Die Installation erfolgt nach dem Download als Nutzer root mit folgendem Installationsskript install_jdk5.sh: Listing 2: Installationsskript install_jdk5.sh #!/bin/bash # where we can find the installation packages / sources: SW_REPOSITORY="/root/bsi_tomcat" # where to install: INSTALL_BASE="/opt" #----------------------------------------------------------------# Install the Java 1.5.0_05 SDK cd ${INSTALL_BASE} chmod u+x ${SW_REPOSITORY}/j2se_5/jdk-1_5_0_05-linux-i586.bin ${SW_REPOSITORY}/j2se_5/jdk-1_5_0_05-linux-i586.bin #----------------------------------------------------------------# -- eof -#----------------------------------------------------------------- Hierdurch wird das Java Software Design Kit unter dem Verzeichnis /opt/jdk1.5.0_05 ($JAVA_HOME) installiert. Da die von der jeweiligen Linux-Distribution mitgelieferten Java SDK Installationen üblicherweise in die /usr, /etc, ... Verzeichnisse integriert werden, ergibt sich durch die Installation unter /opt kein Konflikt. Gegebenenfalls ist zur Nutzung dieser Java SDK Installation beim Setzen der Suchpfade und Java-Environment-Variablen die geänderte Lage zu berücksichtigen. Feststellung: Eine Durchsicht der Java SDK Installation hat ergeben, dass sämtliche Dateien unter Benutzer:Gruppe root:root installiert werden. Weder die Gruppe noch andere (World) haben Schreibberechtigungen auf die installierten Dateien und es sind weder SUID (Set User ID) noch SGID (Set Group ID) Bits in den installierten Dateien gesetzt, sodass Modifikationen an den installierten Dateien nur durch den Benutzer root10 vorgenommen werden können. 9 10 http://java.sun.com/j2se/1.5.0/download.jsp bzw. durch andere Benutzer, die temporär root Berechtigungen erlangen können (z. B. per su oder sudo Kommando) Bundesamt für Sicherheit in der Informationstechnik Seite 30 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Nach Abschluss der Installation sollte das Passwort des globalen Java CA-Zertifikat­ speichers von der Standardeinstellung changeit geändert werden (s. Abschnitt 6.1.3). Dies gilt insbesondere bei der Verwendung von Client-Zertifikat-basierten Authentisierungs­ verfahren in Tomcat Webanwendungen. 3.2 Apache Webserver (Version 2.0.54) Für den Apache Webserver wird aus der Quelltextversion, die von der EntwicklerWebsseite11 heruntergeladen werden kann, eine Standardinstallation durchgeführt. Hierzu werden die Quelltexte übersetzt und die Binärversion der Programme sowie die Konfigurations- und Dokumentationsdateien aus Gründen der Vermeidung von Konflikten mit möglicherweise aus der Linux-Distribution installierten Apache Webserver Software unter dem Verzeichnis /opt/httpd-2.0.54 ($APACHE_INSTALL) installiert. Die Installation erfolgt als Nutzer root mit dem Skript install_apache.sh: Listing 3: Installationsskript install_apache.sh #!/bin/bash # where we can find the installation packages / sources: SW_REPOSITORY="/root/bsi_tomcat" # where to install: INSTALL_BASE="/opt" APACHE_INSTALL="${INSTALL_BASE}/httpd-2.0.54" #--------------------------------------------------------------------# install the apache web server cd ${SW_REPOSITORY}/apache rm -rf ${SW_REPOSITORY}/apache/httpd-2.0.54 tar xvfz ${SW_REPOSITORY}/apache/httpd-2.0.54.tar.gz cd ${SW_REPOSITORY}/apache/httpd-2.0.54 ./configure --prefix=${APACHE_INSTALL} --enable-ssl && \ make && \ make install #--------------------------------------------------------------------# configuration for apache - tomcat cooperation: # ${APACHE_INSTALL}/conf/httpd.conf # ${APACHE_INSTALL}/conf/ssl.conf cd ${APACHE_INSTALL}/conf ln -s ${INSTALL_BASE}/jakarta-tomcat-5.5.9/conf/workers.properties mkdir ${APACHE_INSTALL}/conf/ssl.crt mkdir ${APACHE_INSTALL}/conf/ssl.key # copy the apache webserver certificate / key to these directories # #--------------------------------------------------------------------#--------------------------------------------------------------------# to start Apache with SSL support: # # ${APACHE_INSTALL}/bin/apachectl -f ${APACHE_INSTALL}/conf/httpd.conf -DSSL # 11 http://httpd.apache.org/ Seite 31 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers #--------------------------------------------------------------------# -- eof -#--------------------------------------------------------------------- Feststellung: Eine Durchsicht der Apache Webserver Installation hat ergeben, dass die Dateien überwiegend unter Benutzer:Gruppe root:root, teilweise aber auch unter dem auf dem Testsystem nicht vorhandenen Benutzer:Gruppe 1000:1000 (es sind dies überwiegend die Dateien in den Verzeichnissen error, htdocs, icons, include, sowie manual) installiert werden. Weder die Gruppe noch andere (World) haben Schreibberechtigungen auf die installierten Dateien und es sind weder SUID (Set User ID) noch SGID (Set Group ID) Bits in den installierten Dateien gesetzt, sodass Modifikationen an den installierten Dateien nur durch den Benutzer root12 bzw. teilweise durch den auf dem System nicht vorhandenen Nutzer 1000 vorgenommen werden können. Zum grundlegenden Test der erfolgreichen Installation kann der Apache Webserver zunächst für den Betrieb ohne HTTPS-Verbindungsunterstützung mit dem Kommando APACHE_INSTALL=/opt/http-2.0.54 && \ ${APACHE_INSTALL}/bin/apachectl -f ${APACHE_INSTALL}/conf/httpd.conf gestartet werden. Um HTTPS-Verbindungen zum Webserver freizugeben, ist das letztgenannte Kommando mit der Option -DSSL aufzurufen. Hierzu müssen zuvor ggf. noch weitere Konfigurationen in der Datei $APACHE_INSTALL/conf/ssl.conf vorgenommen sowie Server-Zertifikat und zugehöriger privater Schlüssel installiert werden (s. Abschnitt 4.7.3). Mit einem Webbrowser kann nun die URL http://127.0.0.1:80 geöffnet werden und sollte zu folgender Webseite führen: 12 bzw. durch andere Benutzer, die temporär root Berechtigungen erlangen können (z. B. per su oder sudo Kommando) Bundesamt für Sicherheit in der Informationstechnik Seite 32 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 3.1.: Test-Startseite des Apache Webservers Es ist zu beachten, dass es sich hierbei wegen der noch durchzuführenden Tests um einen völlig unkonfigurierten Webserver handelt. Dieser sollte, um erhebliche Sicherheitsprobleme zu vermeiden, so nicht für einen Zugriff z. B. aus dem Internet freigeschaltet werden. 3.3 Jakarta Tomcat Servlet Container (Version 5.5.9) Die Installation des Jakarta Tomcat Servlet Containers erfolgt nach dem Download des Binärpaketes von der Entwickler-Webseite13 als Nutzer root mit dem Installationsskript install_tomcat.sh: Listing 4: Installationsskript install_tomcat.sh #!/bin/bash # where we can find the installation packages / sources: SW_REPOSITORY="/root/bsi_tomcat" # where to install: INSTALL_BASE="/opt" #--------------------------------------------------------------------# Install the binary package of jakarta-tomcat 5.5.9 cd ${INSTALL_BASE} tar xvfpz ${SW_REPOSITORY}/jakarta_tomcat/jakarta-tomcat-5.5.9.tar.gz #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # --- optionally: install the jsvc tool for running tomcat as daemon 13 http://jakarta.apache.org/site/downloads/downloads_tomcat.html Seite 33 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers cd ${INSTALL_BASE}/jakarta-tomcat-5.5.9/bin tar xvfpz jsvc.tar.gz cd jsvc-src autoconf ./configure --with-java=${INSTALL_BASE}/jdk1.5.0_05 make cp jsvc .. cd .. #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # --- optionally: install the admin package tar xvfpz ${SW_REPOSITORY}/jakarta_tomcat/jakarta-tomcat-5.5.9-admin.tar.gz #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # environment variables definitions cat > ${INSTALL_BASE}/jakarta-tomcat-5.5.9/bin/setenv.sh <<EOF ###################################################################### # environment variables for tomcat ###################################################################### export export export export JAVA_HOME="${INSTALL_BASE}/jdk1.5.0_05" JRE_HOME="${INSTALL_BASE}/jdk1.5.0_05/jre" CATALINA_HOME="${INSTALL_BASE}/jakarta-tomcat-5.5.9" CATALINA_BASE="${INSTALL_BASE}/jakarta-tomcat-5.5.9" ###################################################################### # -- eof -###################################################################### EOF #--------------------------------------------------------------------# to start tomcat: # # ${INSTALL_BASE}/jakarta-tomcat-5.5.9/bin/catalina.sh start # #--------------------------------------------------------------------#-------------------------------------------------------------------# -- eof -#--------------------------------------------------------------------- Neben der eigentlichen Installation wird die Datei $CATALINA_HOME/bin/setenv.sh erzeugt, mit der die Suchpfade zum Java SDK bzw. zur Tomcat Installation gesetzt werden. Um den Jakarta Tomcat Servlet Container als Daemon zu nutzen, muss das im TomcatBinärpaket vorhandene Tool jsvc für das Ziel-Betriebssystem übersetzt werden. Mit Hilfe von jsvc -user ist es auch möglich, den Jakarta Tomcat Servlet Container als non-root Benutzer auszuführen, auch wenn privilegierte Ports (1 .. 1023) verwendet werden. Feststellung: Eine Durchsicht der Apache Webserver Installation hat ergeben, dass sämtliche Dateien unter Benutzer:Gruppe root:root installiert werden. Weder die Gruppe noch andere (World) haben Schreibberechtigungen auf die installierten Dateien und es sind weder SUID (Set User ID) noch SGID (Set Group ID) Bits in den installierten Dateien gesetzt, sodass Modifikationen an den installierten Dateien nur durch den Benutzer root14 vorgenommen werden können. 14 bzw. durch andere Benutzer, die temporär root Berechtigungen erlangen können (z. B. per su oder sudo Kommando) Bundesamt für Sicherheit in der Informationstechnik Seite 34 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Zum Test der erfolgreichen Installation kann der Jakarta Tomcat Servlet Container nun mit dem Kommando INSTALL_BASE=/opt && \ ${INSTALL_BASE}/jakarta-tomcat-5.5.9/bin/catalina.sh start gestartet werden. Mit einem Webbrowser kann nun die URL http://127.0.0.1:8080 geöffnet werden und sollte zu folgender Tomcat-Start-Webseite führen: Abbildung 3.2.: Test-Startseite des Jakarta Tomcat Servlet Containers In dieser Betriebsart arbeitet der Jakarta Tomcat Servlet Container selbst als HTTP-Server und kann somit über seinen HTTP-Connector direkt per HTTP angesprochen werden (entsprechend dem Einsatzszenario 1 aus [Tomcat Fein.]). Auch hier gilt wie im Fall des zuvor beschriebenen Basistests der Installation des Webservers Apache, dass diese Installation ohne weitere Konfiguration aus Sicherheitsgründen nicht für Zugriffe aus dem Internet freigeschaltet werden sollte. In den meisten Fällen wird man jedoch für die Bereitstellung der statischen Internetseiten einen dafür optimierten Webserver (wie z. B. Apache) verwenden (entsprechend den Einsatzszenarien 2 – 6 aus [Tomcat Fein.]). Um diesen in Verbindung mit dem Jakarta Tomcat Servlet Container nutzen zu können, wird ein Connector Modul benötigt, das im Seite 35 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Webserver die Kommunikation zwischen dem Webserver und dem Tomcat Servlet Container, die auf dem AJPv13 (Apache JServ Protocol version 1.3) basiert, abwickelt. Dessen Installation wird im folgenden Abschnitt beschrieben. Bundesamt für Sicherheit in der Informationstechnik Seite 36 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 3.4 Jakarta Tomcat Connector Modul mod_jk (Version 1.2.14) Da von der Entwickler-Webseite des Jakarta Tomcat Connector Moduls15 keine Binärversion für die in der Testumgebung gewählte Debian 3.1 Sarge Linux Version verfügbar ist, muss diese aus dem Quellcodepaket erzeugt werden. Hierfür ist das Installationsskript install_mod-jk.sh vorgesehen, das auf den Hinweisen der Connector-Modul-Dokumentation16 basiert: Listing 5: Installationsskript install_mod-jk.sh #!/bin/bash # where we can find the installation packages / sources: SW_REPOSITORY="/root/bsi_tomcat" # where to install: INSTALL_BASE="/opt" APACHE_INSTALL="${INSTALL_BASE}/httpd-2.0.54" #--------------------------------------------------------------------# prepare the mod_jk connector cd ${SW_REPOSITORY}/jakarta_tomcat tar xvfpz ${SW_REPOSITORY}/jakarta_tomcat/jakarta-tomcat-connectors-1.2.14.1-src.tar.gz cd ${SW_REPOSITORY}/jakarta_tomcat/jakarta-tomcat-connectors-1.2.14.1-src/jk/native ./configure --with-apxs=${APACHE_INSTALL}/bin/apxs && \ make && \ make install # installs mod_jk.so under ${APACHE_INSTALL}/modules/ #--------------------------------------------------------------------# configuration: # ${APACHE_INSTALL}/conf/httpd.conf: # # # ${APACHE_INSTALL}/conf/workers.properties: # copy / link from ${INSTALL_BASE}/jakarta-tomcat-5.5.9/conf/workers.properties # #--------------------------------------------------------------------# to start tomcat: # # ${INSTALL_BASE}/jakarta-tomcat-5.5.9/bin/catalina.sh start # # to start apache: # # ${APACHE_INSTALL}/bin/apachectl -f ${APACHE_INSTALL}/conf/httpd.conf # #--------------------------------------------------------------------# -- eof -#--------------------------------------------------------------------- 15 16 http://jakarta.apache.org/site/downloads/downloads_tomcat.html http://jakarta.apache.org/tomcat/connectors-doc/install/apache2.html Seite 37 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 1 Das erzeugte mod_jk.so Modul zur Einbindung in den Apache Webserver wird durch das Kommando make install im Skript automatisch in das Verzeichnis modules der Apache Installation kopiert. Es wird dort unter Benutzer:Gruppe root:root und ohne Schreibberechtigung für die Gruppe oder andere [World] installiert. Weitere Änderungen oder Ergänzungen in der Apache Installation werden automatisch nicht durchgeführt. Zur Nutzung des Connector Moduls sind in der Konfigurationsdatei $APACHE_INSTALL/conf/httpd.conf des Apache Webservers manuell entsprechende Einstellungen vorzunehmen, die ein dynamische Laden des Connector Moduls veranlassen, sowie die Datei $APACHE_INSTALL/conf/workers.properties zu erzeugen, wie dies im Folgenden beschrieben ist. 3.4.1 Apache-Konfigurationsdatei httpd.conf Zur Aktivierung des Connector Moduls im Apache Webserver sind entsprechende Eintra­ gungen in der Konfigurationsdatei $APACHE_INSTALL/conf/httpd.conf vorzunehmen. Dies sind einmal die Ladedirektive für das Connector Modul, die Konfigurationen des Loggings (JkLogStampFormat bzw. JkRequestLogFormat: welche Informationen werden protokolliert) und außerdem eine Deklaration sämtlicher Webanwendungen, die über das Connector Modul durch den Jakarta Tomcat Servlet Container bedient werden sollen (hierzu gehören die Tomcat-Dokumentation, die Standard-Administrationsapplikationen manager und admin sowie die 3 Webanwendungen simple_info(1|1a|2) für Authentisierungstests, s. S. 84): Listing 6: Auszug aus der Apache-Konfigurationsdatei httpd.conf ... <IfModule !mod_jk.c> LoadModule jk_module modules/mod_jk.so </IfModule> <IfModule mod_jk.c> JkWorkersFile "conf/workers.properties" JkLogFile "logs/mod_jk.log" JkLogLevel info 1. JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " JkRequestLogFormat "%w %V %T" # all requests are handled by worker bsi_ajp13_1 JkMount /tomcat-docs bsi_ajp13_1 JkMount /tomcat-docs/* bsi_ajp13_1 JkMount /admin bsi_ajp13_1 JkMount /admin/* bsi_ajp13_1 JkMount /manager bsi_ajp13_1 JkMount /manager/* bsi_ajp13_1 JkMount /simple_info1 bsi_ajp13_1 JkMount /simple_info1/* bsi_ajp13_1 JkMount /simple_info1a bsi_ajp13_1 JkMount /simple_info1a/* bsi_ajp13_1 JkMount /simple_info2 bsi_ajp13_1 JkMount /simple_info2/* bsi_ajp13_1 </IfModule> ... Bundesamt für Sicherheit in der Informationstechnik Seite 38 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Softwarekomponenten Weiterhin hilfreich für die Zustandsanalyse des Apache Webservers im Rahmen der Untersuchungen ist die Freigabe der Statusinformationen, die dann über die URL http://127.0.0.1/server-status abgerufen werden können: ... ExtendedStatus On <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 </Location> ... Eine Beschränkung der Zugriffe auf den localhost (IP-Adresse 127.0.0.1) bzw. ggf. auf einen Management-Host ist aus Sicherheitsgründen sinnvoll, um Statusabfragen von anderen Hosts aus über das Netzwerk zu verhindern. 3.4.2 Tomcat Konfigurationsdatei server.xml Nachfolgend ist eine Basiskonfiguration für die Datei $CATALINA_HOME/conf/server.xml aufgeführt, in der beispielsweise festgelegt wird, über welche Ports die Kommunikation mit dem Jakarta Tomcat Servlet Container erfolgt. Darin sind • Port 8080 für direkte HTTP-Zugriffe auf den Tomcat Servlet Container (Szenario 1), • Port 8443 für direkte HTTPS-Zugriffe auf den Tomcat Servlet Container (zunächst noch ohne Client-Authentisierung. Mit dem unter $CATALINA_HOME/conf/.keystore abgelegten Server-Zertifikat und den später für die Client-Authentisierung verwen­ deten Zertifikaten der Certification Authorities (CAs), die zur Signierung der ClientZertifikate verwendet wurden, in $CATALINA_HOME/conf/truststore), • Port 8009 für AJP (Apache JServ Protocol) Anfragen des Apache Webserver (über das mod_jk Connector Modul) an den Jakarta Tomcat Servlet Container (Szenarien 2 - 6) und • Port 8005 (hier in Verbindung mit der gewählten Zeichenkette SHUTDOWN) zum Herunterfahren des Tomcat Servlet Containers17 vorgesehen. Weiterhin sind die für die verschiedenen Authentisierungsverfahren benötigten Einträge (für Memory Realm, JDBC Realm, JNDI Realm) bereits in der Datei vorhanden, jedoch durch XML-Kommentare bis auf den gerade zu testenden deaktiviert: Listing 7: Tomcat-Konfigurationsdatei $CATALINA_HOME/conf/server.xml <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/> <GlobalNamingResources> <Environment name="simpleValue" type="java.lang.Integer" 17 Zur Erhöhung der Sicherheit gegen Denial-of-Service Angriffe sollte überlegt werden, ob dieser Port überhaupt aktiviert werden sollte, siehe Abschnitt 6.3.2. Seite 39 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers value="30"/> <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase" pathname="conf/tomcat-users.xml" factory="org.apache.catalina.users.MemoryUserDatabaseFactory"/> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" redirectPort="8443" minSpareThreads="25" connectionTimeout="20000" maxSpareThreads="75" maxThreads="150" maxHttpHeaderSize="8192"> </Connector> <Connector port="8443" minSpareThreads="25" connectionTimeout="20000" maxSpareThreads="75" maxThreads="150" maxHttpHeaderSize="8192" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="vmware" truststoreFile="conf/truststore" truststorePass=“vmware“> </Connector> <Connector port="8009" redirectPort="8443" protocol="AJP/1.3"> </Connector> <Engine defaultHost="localhost" name="Catalina"> <!-use XML comments to de-/activate the relevant section ################################################## # for MemoryRealm: ################################################## --> <Realm className="org.apache.catalina.realm.MemoryRealm"/> <!-################################################## # for JDBCRealm: ################################################## <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99" driverName="org.gjt.mm.mysql.Driver" connectionURL="jdbc:mysql://localhost/authority?user=jdbcuser&amp;password=jdbcpass" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name" /> Bundesamt für Sicherheit in der Informationstechnik Seite 40 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers ################################################## # for JNDIRealm: ################################################## <Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" connectionURL="ldap://localhost:389" userPattern="uid={0},ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de" roleBase="ou=groups,dc=bsitomcat,dc=tsi-itcsec,dc=de" roleName="cn" roleSearch="(uniqueMember={0})" digest="MD5" /> ################################################## --> <Host appBase="webapps" name="localhost"> </Host> </Engine> </Service> </Server> 3.4.3 Apache-Konfigurationsdatei workers.properties Weiterhin sind in der Datei $CATALINA_HOME/conf/workers.properties einige Anpassungen vorzunehmen. Diese Anpassungen betreffen im Wesentlichen spezifische Pfade der jeweiligen Installation. Die minimale verwendete Konfigurationsdatei sieht nach Entfernung zahlreicher Kommentare und weiterer zunächst nicht benötigter Direktiven wie folgt aus: Listing 8: Apache-Konfigurationsdatei $CATALINA_HOME/conf/workers.properties ##################################################################### # workers.properties.minimal ##################################################################### # # This file provides minimal jk configuration properties needed to # connect to Tomcat. # workers.tomcat_home=/opt/jakarta-tomcat-5.5.9 workers.java_home=/opt/jdk1.5.0_05 ##################################################################### # The workers that jk should create and work with # worker.list=bsi_ajp13_1 # # Defining a worker named bsi_ajp13_1 and of type ajp13 # Note that the name and the type do not have to match. # worker.bsi_ajp13_1.type=ajp13 worker.bsi_ajp13_1.host=localhost worker.bsi_ajp13_1.port=8009 ##################################################################### # -- eof -##################################################################### Am günstigsten ist für eine Bereitstellung identischer Dateien für den Apache Webserver wie für den Jakarta Tomcat Servlet Container, wenn diese Datei im System nur einmal Seite 41 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers vorhanden ist (z. B. im Tomcat-Konfigurationsverzeichnis $CATALINA_HOME/conf, auf die dann aus dem Apache Konfigurationsverzeichnis $APACHE_INSTALL/conf per Soft-Link verwiesen wird). Anschließend kann der Apache Webserver mit dieser geänderten Konfiguration wieder gestartet werden und als Funktionstest die Tomcat-Dokumentation über den Apache Web­ server mit der URL http://127.0.0.1/tomcat-docs/ aufgerufen werden. Dies sollte im Erfolgsfall zu folgendem, dem des direkten Abrufs dieser Webseite über Tomcat entsprechenden Ergebnis, d. h. ohne die Verwendung des Apache Webservers über die URL http://127.0.0.1:8080/tomcat-docs/, führen: Abbildung 3.3.: Aufruf der Tomcat-Dokumentation über den Apache Webserver (http-Standard-Port) und den mod_jk-Connector. Zur Nutzung der Tomcat admin18 und manager Applikationen wird die Datei $CATALINA_HOME/conf/tomcat-users.xml modifiziert, die im Rahmen der Memory Realmbasierten Authentisierung verwendet wird19: 18 Bestandteil des jakarta-tomcat-5.5.9-admin.tar.gz Paketes und inzwischen nicht mehr im Tomcat Paket selbst enthalten. Bundesamt für Sicherheit in der Informationstechnik Seite 42 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Listing 9: Tomcat-Benutzer-Definitionsdatei $CATALINA_HOME/conf/tomcat-users.xml <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="admin"/> <role rolename="manager"/> <role rolename="user1"/> <role rolename="user2"/> <user username="memadmin" password="vmware" roles="admin"/> <user username="memadminhash" password="92963abd36c896b93a36b8e296ff3387" <user username="memmanager" password="vmware" roles="manager"/> <user username="memmanagerhash" password="92963abd36c896b93a36b8e296ff3387" <user username="memuser1" password="vmware" roles="user1"/> <user username="memuser1hash" password="92963abd36c896b93a36b8e296ff3387" <user username="memuser2" password="vmware" roles="user2"/> <user username="memuser2hash" password="92963abd36c896b93a36b8e296ff3387" </tomcat-users> roles="admin"/> roles="manager"/> roles="user1"/> roles="user2"/> 3.5 Installation des MySQL-Connectors/J Zum Test von Verbindungen des Tomcat Servlet Containers mit dem MySQL-DBMS (beispielsweise zur Authentisierung mit Hilfe von in der Datenbank abgelegten Nutzern bzw. Passworten sowie deren zugeordnete Rollen) wird der MySQL-Connector/J benötigt. Dieser MySQL-Connector/J kann derzeit in der Produkt-Version 3.1 von der Entwickler-Webseite 20 heruntergeladen werden. Die Installation erfolgt dann mit Hilfe des Skriptes install_mysqlj.sh: Listing 10: Installationsskript install_mysqlj.sh #!/bin/bash # where we can find the installation packages / sources: SW_REPOSITORY="/root/bsi_tomcat" # where to install: INSTALL_BASE="/opt" #--------------------------------------------------------------------# Install the binary package of mysql-connector/j3.1 cd ${SW_REPOSITORY} tar xvfpz ${SW_REPOSITORY}/mysql-connector-java-3.1.10.tar.gz # copy the non-debug version of the connector jar # to common/lib (which makes it available for both tomcat as well # as for web applications cp -p mysql-connector-java-3.1.10/mysql-connector-java-3.1.10-bin.jar \ ${INSTALL_BASE}/jakarta-tomcat-5.5.9/common/lib 19 20 Für einen Produktiveinsatz des Jakarta Tomcat Servlet Containers sind natürlich die Standardvorgaben für die Passwörter auf sinnvolle Werte gemäß den jeweils vor Ort geltenden Passwortrichtlinen zu ändern. Die zum Test der verschiedenen Authentisierungsmethoden verwendeten Benutzernamen und Passworte sind in Abschnitt 4 zusammengestellt. http://www.mysql.com/products/connector/j/ Seite 43 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers #--------------------------------------------------------------------# -- eof -#--------------------------------------------------------------------- 3.6 Installationen für die JNDI-Konnektivität Eine Nachinstallation von JNDI-Komponenten (wie in der Tomcat Dokumentation ange­ geben) ist zur Nutzung mit OpenLDAP bei der verwendeten Tomcat Version und in Verbindung mit der installierten Java SDK Version 5 nicht mehr erforderlich. 3.7 Installation der Logging-Komponenten Eine Standardinstallation verfügt über ein Logging basierend auf den java.util.logging Klassen, die bereits im Java SDK enthalten sind. In der Tomcat Dokumentation wird auf eine alternative / optionale Logging-Möglichkeit hingewiesen, die auf den log4j Bibliotheken des Jakarta Projekts selbst stammen. Für das alternative log4j Logging aus Tomcat heraus werden mit dem Skript install_logging_components.sh zwei jar-Archive sowie eine Konfigurationsdatei installiert: Listing 11: Installationsskript install_logging_components.sh #!/bin/bash # where we can find the installation packages / sources: SW_REPOSITORY="/root/bsi_tomcat" # where to install: INSTALL_BASE="/opt" CATALINA_HOME="${INSTALL_BASE}/jakarta-tomcat-5.5.9" #--------------------------------------------------------------------# Unpack and install the required jar files to support logging cd ${SW_REPOSITORY} mkdir -p ${CATALINA_HOME}/common/lib tar -xvzOf logging-log4j-1.2.12.tar.gz \ logging-log4j-1.2.12/dist/lib/log4j-1.2.12.jar \ > ${CATALINA_HOME}/common/lib/log4j.jar # !! jar file without version number !! tar -xvzOf commons-logging-1.0.4.tar.gz \ commons-logging-1.0.4/commons-logging.jar \ > ${CATALINA_HOME}/common/lib/commons-logging.jar #--------------------------------------------------------------------# prepare the log configuration file mkdir -p ${CATALINA_HOME}/common/classes cat > ${CATALINA_HOME}/common/classes/log4j.properties <<EOF log4j.rootLogger=debug, R log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=${CATALINA_HOME}/logs/tomcat.log log4j.appender.R.MaxFileSize=10MB Bundesamt für Sicherheit in der Informationstechnik Seite 44 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n log4j.logger.org.apache.catalina=DEBUG, R EOF #--------------------------------------------------------------------# -- eof -#--------------------------------------------------------------------- Die jar-Dateien befinden sich in den Binär-Installationspaketen • logging-log4j-1.2.12.tar.gz21 sowie • commons-logging-1.0.4.tar.gz22. Bei den dynamischen Tests wurde jedoch das Standard-Logging des Java SDK verwendet. Die oben aufgeführten Binär-Installationspakete werden jedoch von manchen Modulen explizit referenziert (beispielsweise Jasper), so dass sie bei einer Übersetzung des Quellcodes vorhanden sein müssen. 3.8 Einrichtung des lokalen DNS-Servers Um Tests der Zugriffsfilterfunktionen anhand der Host- oder Domänennamen aus der vorhandenen Testumgebung heraus durchführen zu können, wird ein lokaler Domain Name Service (DNS) Server aufgesetzt, der ausschließlich lokal im Testnetz (192.168.118.0/24) arbeitet und lokale Anfragen hieraus beantwortet. Dieser DNS-Server dient dazu, aus den beim Tomcat-Server eintreffenden IP-Adressen per Reverse DNS Lookup die zugehörigen Hostnamen für einen Vergleich mit den vordefinierten Mustern für die Zugriffsteuerung zu gewinnen. Für die Konfiguration des DNS-Servers wird davon ausgegangen, dass die beteiligten virtuel­ len Hosts (VH) bzw. der VMware Host (VM-Host) mit den folgenden statischen IP-Adressen konfiguriert sind (s. a. Abbildung 2.1): • tomcathost.bsitomcat.de (VH): 192.168.118.101/26 • template.bsitomcat.de (VH): 192.168.118.100/26 • bigmama.external.de (VM-Host): 192.168.118.1/26 Für den DNS-Server (tomcathost) werden die folgenden Dateien erzeugt bzw. geändert, die Datei /etc/resolv.conf wird auch auf auch auf der zweiten virtuellen Testmaschine (template) installiert. Diese Informationen werden nicht auf den VM-Host übertragen, um dessen Netzwerkeinbindung und Namensauflösung nicht zu beeinflussen. Daher sind Verbindungen von dieser Maschine zum Apache-Test-Webserver bzw. zu Tomcat über die IP-Adresse des Testrechners (tomcathost) zu adressieren. 21 22 erhältlich unter http://logging.apache.org/log4j/docs/download.html erhältlich unter http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi Seite 45 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Listing 12: DNS-Server-Konfigurationsdatei /etc/bind/named.conf: // // // // // // // This is the primary configuration file for the BIND DNS server named. Please read /usr/share/doc/bind9/README.Debian.gz for information on the structure of BIND configuration files in Debian, *BEFORE* you customize this configuration file. If you are just adding zones, please do that in /etc/bind/named.conf.local include "/etc/bind/named.conf.options"; // prime the server with knowledge of the root servers zone "." { type hint; file "/etc/bind/db.root"; }; // be authoritative for the localhost forward and reverse zones, and for // broadcast zones as per RFC 1912 zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "bsitomcat.de" { type master; file "/etc/bind/db.bsitomcat.de"; allow-query { 192.168.118.0/24; }; allow-transfer { none; }; allow-update { none; }; }; zone "external.de" { type master; file "/etc/bind/db.external.de"; allow-query { 192.168.118.0/24; }; allow-transfer { none; }; allow-update { none; }; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; zone "118.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192.168.118"; allow-query { 192.168.118.0/24; }; allow-transfer { none; }; allow-update { none; }; }; Bundesamt für Sicherheit in der Informationstechnik Seite 46 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers // zone "com" { type delegation-only; }; // zone "net" { type delegation-only; }; // From the release notes: // Because many of our users are uncomfortable receiving undelegated answers // from root or top level domains, other than a few for whom that behaviour // has been trusted and expected for quite some length of time, we have now // introduced the "root-delegations-only" feature which applies delegation-only // logic to all top level domains, and to the root domain. An exception list // should be specified, including "MUSEUM" and "DE", and any other top level // domains from whom undelegated responses are expected and trusted. // root-delegation-only exclude { "DE"; "MUSEUM"; }; include "/etc/bind/named.conf.local"; Listing 13: DNS-Server-Konfigurationsdatei /etc/bind/named.conf.options: options { directory "/var/cache/bind"; // // // // // If there is a firewall between you and nameservers you want to talk to, you might need to uncomment the query-source directive below. Previous versions of BIND always asked questions using port 53, but BIND 8.1 and later use an unprivileged port by default. // query-source address * port 53; // // // // If your ISP provided one or more IP addresses for stable nameservers, you probably want to use them as forwarders. Uncomment the following block, and insert the addresses replacing the all-0's placeholder. // forwarders { // 0.0.0.0; // }; auth-nxdomain no; notify no; # conform to RFC1035 }; Listing 14: DNS-Server-Zonenkonfigurationsdatei /etc/bind/db.bsitomcat.de: ; ; BIND data file for local bsitomcat.de. test domain ; $TTL 604800 ; @ IN SOA tomcathost.bsitomcat.de. postmaster.bsitomcat.de. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; ; local name server bsitomcat.de. IN NS localhost. ; ; hosts managed by our bsitomcat.de. dns server ; Seite 47 (von 187) Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Softwarekomponenten tomcathost.bsitomcat.de. debian-host1.bsitomcat.de. template.bsitomcat.de. IN A IN A IN A 192.168.118.101 192.168.118.101 192.168.118.100 Listing 15: DNS-Server-Zonenkonfigurationsdatei /etc/bind/db.external.de: ; ; BIND data file for local external.de. test domain ; $TTL 604800 ; @ IN SOA tomcathost.bsitomcat.de. postmaster.bsitomcat.de. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; ; local name server external.de. IN NS localhost. ; ; hosts managed by our external.de. dns server ; bigmama.external.de. IN A 192.168.118.1 gateway.external.de. IN A 192.168.118.2 Listing 16: DNS-Server-Reverse-Zonenkonfigurationsdatei /etc/bind/db.192.168.118: ; ; BIND data file for local bsitomcat.de. test domain ; $TTL 604800 ; 118.168.192.in-addr.arpa. IN SOA tomcathost.bsitomcat.de. postmaster.bsitomcat.de. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; ; local name server ; 118.168.192.in-addr.arpa. IN NS tomcathost.bsitomcat.de. ; ; hosts managed by our bsitomcat.de. dns server ; 101.118.168.192.in-addr.arpa. IN PTR tomcathost.bsitomcat.de. 100.118.168.192.in-addr.arpa. IN PTR template.bsitomcat.de. 1.118.168.192.in-addr.arpa. IN PTR bigmama.external.de. 2.118.168.192.in-addr.arpa. IN PTR gateway.external.de. Listing 17: Konfigurationsdatei zur Namensauflösung /etc/resolv.conf: search bsitomcat.de nameserver 192.168.118.101 Bundesamt für Sicherheit in der Informationstechnik Seite 48 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Softwarekomponenten Nach Einrichtung der Konfiguration kann der DNS-Server mit Hilfe des Kommandos /etc/init.d/named restart aktiviert werden. 3.9 Werkzeuge für Penetrationstests Die in diesem Dokument beschriebenen Penetrationstests werden mit Hilfe frei und kostenlos verfügbarer Werkzeuge durchgeführt. Diese Werkzeuge und deren Installation werden hier beschrieben. 3.9.1 SPIKE SPIKE ist ein frei verfügbares Fuzz-Testing-Werkzeug, mit dem bereits viele Implemen­ tierungsschwachstellen in Softwareprodukten entdeckt wurden. SPIKE arbeitet nach dem Prinzip des Fuzz-Testing. Einer Software-Komponente werden viele unterschiedliche Parameter übergeben, die inhaltlich stark von gewöhnlichen Parametern abweichen. Die Übergabeparameter sind dabei sowohl sehr lange Zeichen­ ketten, Zeichenketten mit Sonderzeichen und definierten Sonderzeichenkombinationen sowie sehr große positive oder negative Zahlen. Auch wenn man mit dem Funktionsprinzip von SPIKE (Fuzz-Testing) nicht alle Schwachstellen in Software-Produkten finden kann, so stellt die Verwendung von SPIKE dennoch eine gute Ergänzung innerhalb von Sicherheitsuntersuchungen, beispielsweise bei einer Source-Code-Analyse, dar. Bezugsquelle Zur Zeit der Penetrationstests war die Version 2.9 des SPIKE-Toolsets aktuell. SPIKE wird von der amerikanischen IT-Security Firma ImmunitySec hergestellt und kann im Internet23§ bezogen werden. Installation SPIKE wurde unterhalb des Ordners /root/bsi_tomcat installiert: debian-template:~/bsi_tomcat/pentests# tar zxf /tmp/SPIKE2.9.tgz.gz debian-template:~/bsi_tomcat/pentests# cd SPIKE/SPIKE/src/ debian-template:~/bsi_tomcat/pentests/SPIKE/SPIKE/src# ./configure && make 3.9.2 Benutzung von SPIKE Für die Verwendung von SPIKE als Fuzz-Tester bei HTTP-Protokollen wird die Erzeugung des SPIKE-Programms durch das Werkzeug makewebfuzz.pl erleichtert. Die einzelnen Schritte für das Fuzz-Testing teilen sich in die folgenden Punkte auf: • Netzwerkmitschnitt als Datei abspeichern, • SPIKE-Programm erzeugen, 23 http://www.immunitysec.com/downloads/SPIKE2.9.tgz Seite 49 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten • SPIKE-Programm kompilieren und • SPIKE-Programm ausführen. Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Netzwerkmittschnitt Voraussetzung für die Benutzung von SPIKE ist ein vorhandener Netzwerkmitschnitt des zu untersuchenden Netzwerkdienstes. Ein beispielhafter Netzwerkmitschnitt ist in Abbildung 3.4 dargestellt. Abbildung 3.4: Netzwerkmitschnitt einer HTTP-Anfrage Übersetzung zum C-Programm Mit dem SPIKE-Werkzeug makewebfuzz.pl wird nun aus dem Netzwerkmitschnitt automatisch eine Datei mit C-Source-Code erzeugt. Diese Datei trägt den Namen webfuzz.c und wird nach individueller Anpassung übersetzt und zur Ausführung gebracht. Unter der Voraussetzung, dass der HTTP-Netzwerkmitschnitt als Datei request.txt abgespeichert wurde, lautet der Befehl zur Erzeugung des SPIKE Programms webfuzz.c folgendermaßen: SPIKE_HOME=/root/bsi_tomcat/pentest/SPIKE/SPIKE/src cd $SPIKE_HOME ./makewebfuzz.pl request.txt >webfuzz.c Bundesamt für Sicherheit in der Informationstechnik Seite 50 (von 187) Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Der nachfolgende Source-Code zeigt einen Ausschnitt aus der Datei webfuzz.c, aus dem deutlich wird, wie man die Eigenschaften der einzelnen Bestandteile des Netzwerkprotokolls entweder als Variable oder als Konstante definieren kann. Variable Teile werden im Rahmen des Fuzz-Testings, in vielen Wiederholungen mit verschiedenen Inhalten gefüllt, konstante Teile jedoch nicht verändert. ... /*end webfuzzprelude.c */ s_setfirstvariable(); s_string("GET "); s_string("/simple_info1/index.jsp"); s_string(" HTTP/1.1"); s_string("\r\n"); s_string("Host: localhost\r\n"); s_string("User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/2 0050825 Firefox/1.0.4 (Debian package 1.0.4-2sarge3\r\n"); s_string("Accept: "); s_string("text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/pl ain;q=0.8,image/png,*/*;q=0.0"); s_string("\r\n"); s_string("Accept-Language: en-us,en;q=0.0\r\n"); s_string("Accept-Encoding: gzip,deflate\r\n"); s_string("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.0\r\n"); s_string("Connection: close\r\n"); s_string("Authorization: "); s_string_variable("Basic bWVtd3VzZXI6dm13YXJl"); s_string("\r\n"); s_string("Pragma: no-cache\r\n"); s_string("Cache-Control: no-cache\r\n"); s_string("\r\n"); /*Done with Headers*/ s_string("\r\n"); s_block_start("post"); s_setfirstvariable(); s_block_end("post"); /* Start webfuzzpostlude.c */ if (spike_send_tcp(target,port)==0) { printf("Couldn't connect to host or send data!\r\n"); /*exit(-1);*/ ... Kompilation des C-Programms / Durchführen des Fuzz Testing Ist das Programm webfuzz.c so angepasst, wie man es für den jeweiligen Test benötigt, so wird das Programm kompiliert und zur Ausführung gebracht. SPIKE_HOME=/root/bsi_tomcat/pentest/SPIKE/SPIKE/src cd $SPIKE_HOME gcc -o webfuzz -I ../include/ spike.o listener.o hdebug.o tcpstuff.o spike_dcerpc.o base64.o udpstuff.o spike_oncrpc.o webfuzz.c ./webfuzz localhost 80 >ergebnis.txt In diesem Beispiel wird das Ergebnis der Fuzz-Tests in der Datei ergebnis.txt abgelegt. Seite 51 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 3.9.3 Ethereal Zum Erstellen der Netzwerkmitschnitte wurde das Programm Ethereal verwendet. Abbildung 3.5 zeigt eine beispielhafte Konfiguration von ethereal zum Mitschneiden des Netzwerkverkehrs auf Port 80/tcp (HTTP). Abbildung 3.5: Konfiguration von Ethereal für das Mitschneiden von HTTP 3.9.4 OpenSSL OpenSSL wird verwendet, um automatisiert SSL-verschlüsselte HTTP-Anfragen, im Folgenden HTTPS-Anfragen genannt, an den Webserver zu stellen. Die folgende Befehlskette führt eine automatisierte HTTPS-Anfrage durch. echo -e „GET / HTTP/1.0\r\n\r\n“ | openssl s_client -connect localhost:443 -quiet 2>/dev/null Die Zeichenkette „GET / HTTP/1.0 <zweimal Zeilenumbruch>“ ist die eigentliche HTTPAnfrage, die in SSL getunnelt wird. Der Parameter „localhost:443“ ist der Hostname und die Port-Nummer, unter welcher der SSL Webserver ansprechbar ist. Bundesamt für Sicherheit in der Informationstechnik Seite 52 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Softwarekomponenten Für die HTTPS-Anfragen, die während der Tests durchgeführt wurden, musste sich der HTTPS-Client mit einem SSL-Client-Zertifikat am SSL-Webserver authentisieren. Dies wurde durch folgendes Shell-Script umgesetzt. #!/bin/bash echo -e "GET /simple_info1/index.jsp HTTP/1.0\r\n\r\n"|openssl s_client \ -connect localhost:443 -cert memuser10.pem \ -key memuser10.key \ -CAfile /root/bsitomcat_ca/ssl/ca/ca.pem \ -quiet 3.10 Werkzeuge für statische Tests Unter statischen Tests werden diejenigen verstanden, bei denen es im Gegensatz zu dynamischen Tests nicht zur Ausführung der untersuchten Software kommt. Source-CodeReviews und die Programmanalyse gehören zu den Methoden des statischen Testen, Penetrationstests zu denen des dynamischen Testen. 3.10.1 Flawfinder und Splint für C Sowohl flawfinder und splint sind in Debian als Pakete enthalten und werden daher beispielsweise über aptitude installiert. Beide lassen sich von der Kommandozeile aus aufrufen. Angenehmer wird deren Einsatz jedoch innerhalb des Texteditors emacs, weil dann die monierten Zeilen des Quellcode mit einem Mausklick angesprungen und begutachtet werden können. Die nächste Abbildung Seite 53 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten zeigt Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers ein Anwendungsbeispiel: Abbildung 3.6: splint, angewendet auf eine Datei, innerhalb von Emacs Bundesamt für Sicherheit in der Informationstechnik Seite 54 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Softwarekomponenten Diese Erleichterung erreicht man unter Verwendung des Compile-Modus von Emacs: C-u M-x compile Daraufhin ersetzt man den Vorschlag (den Aufruf von make) durch beispielsweise: splint +unixlib "-Du_int8_t=unsigned char" "-Du_int16_t=unsigned short" "-Du_int32_t=unsigned int" -DJK_PRODUCTION=1 jk_ajp14.c 3.10.2 Findbugs für Java Die wenigsten Werkzeuge sind fähig, unterschiedliche Programmiersprachen zu analysieren. Quellcode in Java lässt sich auch mit emacs, ergänzt durch spezielle Hilfspakete, bearbeiten. Manche werden jedoch die spezialisierte grafische Entwicklungsumgebung Eclipse24 vorziehen. Diese bietet viele winzige Schaltflächen und Aktionen, mit denen beispielsweise die Signatur einer Methode, die aktuelle Superklasse der Vererbungshierarchie oder auch die Kurzdokumentation zur Methode unter dem Mauszeiger eingeblendet werden können. Darüberhinaus stellt Eclipse Erweiterungsmechanismen zur Einbettung unabhängiger Module bereit. So unterstützt Eclipse nicht nur Java, sondern auch die Programmiersprache C++. Insbesondere aber lässt sich das Werkzeug findbugs25 in die Benutzeroberfläche von Eclipse integrieren. Daraufhin werden dessen Meldungen im gleichen Fenster angezeigt wie die sonstigen Meldungen des Java-Compilers. Dies zeigt folgende Abbildung: 24 25 http://www.eclipse.org/ http://findbugs.sourceforge.net/ Seite 55 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 3.7: Meldungen von Findbugs innerhalb von Eclipse Wir haben Eclipse in der während des Projekts aktuellen Version 3.1.1 direkt aus dem Internet26 bezogen, anstatt die in Debian enthaltene Version 3.0 zu verwenden. Aufgrund verschiedener in der Version 3.0 enthaltener Fehler können wir derzeit nur den Einsatz der Version 3.1 oder 3.1.1 empfehlen. Installiert wurde daraufhin nicht in ein zentrales Verzeichnis, sondern in ein Benutzerverzeichnis wie $HOME/eclipse/. Findbugs wird in Eclipse installiert, indem das Archiv de.tobject.findbugs_0.0.17.rc1.zip27 entgegen der Dokumentation nicht in das Verzeichnis eclipse/, sondern in das Unterverzeichnis eclipse/plugins/ extrahiert wird. Daraufhin erkennt Eclipse beim nächsten Start das Plugin und es kann in das Projekt einbezogen werden. Die nächste Abbildung zeigt, wie Findbugs gemäß dessen Dokumentation aktiviert wird. Innerhalb des Projektmenüs erscheint eine zusätzliche Schaltfläche. 26 27 http://www.eclipse.org/downloads/index.php http://sourceforge.net/project/showfiles.php?group_id=96405 Stichwort Eclipse Plugin Bundesamt für Sicherheit in der Informationstechnik Seite 56 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Installation der Softwarekomponenten Abbildung 3.8: Menü Projekt → Properties → FindBugs Es gibt noch weitere Werkzeuge für die Code-Analyse speziell für Java. Die meisten begnügen sich jedoch mit syntaktischen Analysen und Aufbereitungen. Datenflussanalysen kommen leider selten vor. Ein Beispiel einer einfachen Analyse ist das Erkennen von leeren Catch-Blöcken im Programmcode. Dessen Vorkommen weist auf fragwürdiges ExceptionHandling hin, denn damit werden die Fehlermeldungen des betroffenen Teils des Programms einfach unterdrückt und die Fehler bleiben so unerkannt. Dennoch soll das einigermaßen beliebte Werkzeug pmd28 erwähnt werden. Auch dieses Werkzeug kann helfen, Fehler in Programmen zu finden. Da wir bei unseren Sicherheits­ analysen aber eher an tiefer gehenden Analysen interessiert waren, kam dieses Werkzeug im Projekt nicht zum Einsatz. pmd arbeitet auf Ebene des Quellcode in Java, während findbugs den erzeugten Bytecode, also die .class-Dateien und auch die .jar-Archive für die JVM analysiert. Dies lässt unter­ schiedliche Anwendungsgebiete zu, die hier jedoch nicht von Bedeutung sind. 28 http://pmd.sourceforge.net/ Seite 57 (von 187) Bundesamt für Sicherheit in der Informationstechnik Installation der Softwarekomponenten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 3.10.3 Java-Dokumentation Für die Zwecke des Software-Review ist es ganz nützlich, die Dokumentation zum Java SDK ebenfalls zu installieren. Die gleiche Dokumentation ist ebenfalls online erreichbar29. Das nach Akzeptieren der Lizenzvereinbarung von Sun zum Download bereitgestellte Paket30 ist enorm groß (ca. 50 MB an Dokumentation, gepackt), dennoch sind in den HTML-Seiten zahlreiche Querverweise auf weitere Dokumente auf dem Webserver von Sun zu Java31 enthalten. Die Dokumentation zu den zahlreichen APIs ist nach Installation vollständig lokal verfügbar und enthält ebenfalls nützliche Dokumente zu JCE, JSSE, JAAS. Hinweis: Eclipse ist selbst ohne dieses Paket in der Lage, zu zahlreichen Methoden die Kurzdokumentation einzublenden. Darüber hinaus wurden für das Software-Review noch zahlreiche Online-Quellen verwendet, darunter die Online-Dokumentation zum Apache httpd32, zum Apache Portable Runtime (APR)33 und zu commons-logging für Java (JCL)34. 29 30 31 32 33 34 http://java.sun.com/j2se/1.5.0/docs/index.html http://java.sun.com/j2se/1.5.0/download.jsp#docs http://java.sun.com/ http://httpd.apache.org/docs/2.0/developer/ sowie http://docx.webperf.org/group__APACHE__CORE__LOG.html http://apr.apache.org/docs/apr/globals.html http://jakarta.apache.org/commons/logging/ Bundesamt für Sicherheit in der Informationstechnik Seite 58 (von 187) Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 4. Einrichtung der Authentisierungsinformationen 4.1 Einrichtung von Test-Benutzerkonten auf Betriebssystemebene Um die verschiedenen Tests nicht als Benutzer root durchführen zu müssen, werden mit Hilfe des Skriptes install_dusers.sh zwei Benutzer duser1 und duser2, jeweils mit dem LoginPasswort vmware, auf der Betriebssystemebene eingerichtet. Von diesen Benutzerkonten aus können die verschiedenen Webanwendungen per Browser aufgerufen werden, wobei je nach Test-Szenario verschiedene Web-Identitäten zum Einsatz kommen können, deren Einrichtung im folgenden Abschnitt beschrieben ist. 4.2 Einrichtung von Test-Benutzerkonten für die Web-Authentisierung Zum Test der verschiedenen Web-Authentisierungsvarianten wird ein konsistentes WebBenutzer-Schema verwendet. In eckigen Klammern [] sind dabei die im Feinkonzept [Tomcat Fein.] der Projektphase 1 sowie in den nachfolgenden Tabellen der durchgeführten Tests verwendete Kurzbezeichnung mit aufgeführt: • Memory Realm [User] • JDBC Realm in Verbindung mit einer MySQL-Datenbank [JDBC] • JNDI Realm in Verbindung mit einem OpenLDAP-Server [JNDI] Hierbei werden für jede Authentikationsvariante die Nutzer • admin (Rolle: admin) • manager (Rolle: manager) • user1 (Rolle: user1) • user2 (Rolle: user2) eingerichtet, wobei dem Web-Benutzernamen der Realm-Typ • mem: für Memory Realm • jdbc: für JDBC Realm • jndi: für JNDI Realm vorangestellt wird. Die Rollen admin bzw. manager werden in Verbindung mit den den Tomcat-Administrationsanwendungen aus dem jakarta-tomcat-5.5.9-admin.tar.gz Paket benötigt. Zum Test der Unterscheidung von Klartext-Passworten und Digest-Passworten, die per MD5-Digest aus den Klartext-Passworten gewonnen werden, wird bei den Benutzern mit Digest-Passworten die Benutzernamenserweiterung hash angehängt. Somit erhält man folgendes Benutzer-Schema: Seite 59 (von 187) Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen Benutzer mem Re jdbc al m jndi admin memadmin manager memmanager user1 memuser1 user2 memuser2 memadminhash memmanagerhash memuser1hash memuser2hash jdbcadmin jdbcmanager jdbcuser1 jdbcuser2 jdbcadminhash jdbcmanagerhash jdbcuser1hash jdbcuser2hash jndiadmin jndimanager jndiuser1 jndiuser2 jndiadminhash jndimanagerhash jndiuser1hash jndiuser2hash Tabelle 1 Verfügbare Benutzer für die verschiedenen Authentisierungsvarianten Zur Vereinfachung der Tests wird für alle Benutzer einheitlich das Passwort vmware verwen­ det. Dies entspricht einem in Verbindung mit dem <Realm>-Attribut digest=“MD5“ verwen­ deten MD5-Digest-Wert von 92963abd36c896b93a36b8e296ff3387, der mit dem Kommando $CATALINA_HOME/bin/digest.sh -a MD5 vmware erzeugt wurde. In der vorliegenden Testumgebung sind zwar alle Kombinationen vorhanden, in Abhängigkeit von dem jeweils gesetzten bzw. nicht gesetzten <Realm>-Attribut digest=“MD5“ in der Konfigurationsdatei $CATALINA_HOME/conf/server.xml sind aber jeweils nur die Digest-User / -Passworte Non-Digest-User / -Passworte verwendbar. Für die Tests wurde eine server.xml Datei erzeugt, deren unterschiedliche Abschnitte bezüglich der Authentisierung durch XML-Kommentare <!-- ... --> aktiviert bzw. deaktiviert werden können. Nach einer Änderung ist der Tomcat Servlet Container neu zu starten. Außerdem muss gewährleistet sein, dass der OpenLDAP-Daemon slapd bzw. die MySQL-Datenbank (mysqld) aktiv sind und die Datenbanken mit entsprechenden Benutzerinformationen gefüllt sind, wenn auf diesem Weg eine Authentisierung erfolgen soll. Für CLIENT-CERT-basierte Authentisierung sind darüber hinaus noch Einträge für zugelas­ sene Zertifikate und deren Rollenzuordnung in der Datei tomcat_users.xml zu erzeugen (s. hierzu S. 78). 4.3 Initialisierung der tomcat_users.xml Datei Für eine Memory Realm-basierte Authentisierung $CATALINA_HOME/conf/tomcat_users.xml verwendet: wird die folgende Datei Listing 18: Tomcat-Benutzer-Definitionsdatei tomcat_users.xml: <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="admin"/> <role rolename="manager"/> <role rolename="user1"/> <role rolename="user2"/> <user username="memadmin" password="vmware" roles="admin"/> <user username="memadminhash" password="92963abd36c896b93a36b8e296ff3387" roles="admin"/> <user username="memmanager" password="vmware" roles="manager"/> Bundesamt für Sicherheit in der Informationstechnik Seite 60 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen <user username="memmanagerhash" password="92963abd36c896b93a36b8e296ff3387" roles="manager"/> <user username="memuser1" password="vmware" roles="user1"/> <user username="memuser1hash" password="92963abd36c896b93a36b8e296ff3387" roles="user1"/> <user username="memuser2" password="vmware" roles="user2"/> <user username="memuser2hash" password="92963abd36c896b93a36b8e296ff3387" roles="user2"/> </tomcat-users> 4.4 Initialisierung der MySQL-Datenbank mit den Authentisierungsinformationen Zur Erstellung der zur JDBC Realm-basierten Authentisierung benötigten Datenbank, die Tabellen und Tabelleninhalte im MySQL-DBMS wird das Skript mysql_init_db.sql verwendet, das aus der MySQL-Kommandozeile per mysql> source mysql_init_db.sql ausgeführt wird. Darin werden die benötigte Datenbank, die einzelnen Tabellen, deren Tabelleninhalte sowie die Benutzer-Zugriffsberechtigungen auf diese Inhalte definiert. Listing 19: MySQL-Initialisierungsdatei mysql_init_db.sql ############################################################ # MySQL setup script for # JDBC based web application authentication ############################################################ ############################################################ # setup the database ############################################################ create database authority; use authority; ############################################################ # define the record structure # (we use 35 characters for all elements to allow for # storing MD5 hashes) ############################################################ create table users ( user_name varchar(35) not null primary key, user_pass varchar(35) not null ); create table user_roles ( user_name varchar(35) not null, role_name varchar(35) not null, primary key (user_name, role_name) ); ############################################################ # populate the users table with the predefined examples ############################################################ Seite 61 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers insert into users (user_name,user_pass) values ('jdbcadmin','vmware'), ('jdbcadminhash','92963abd36c896b93a36b8e296ff3387'), ('jdbcmanager','vmware'), ('jdbcmanagerhash','92963abd36c896b93a36b8e296ff3387'), ('jdbcuser1','vmware'), ('jdbcuser1hash','92963abd36c896b93a36b8e296ff3387'), ('jdbcuser2','vmware'), ('jdbcuser2hash','92963abd36c896b93a36b8e296ff3387'); ############################################################ # populate the user_roles table ############################################################ insert into user_roles (user_name,role_name) values ('jdbcadmin','admin'), ('jdbcadminhash','admin'), ('jdbcmanager','manager'), ('jdbcmanagerhash','manager'), ('jdbcuser1','user1'), ('jdbcuser1hash','user1'), ('jdbcuser2','user2'), ('jdbcuser2hash','user2'); ############################################################ # setup a user to perform JDBC queries ############################################################ grant update,select on authority.* to [email protected] identified by "jdbcpass"; ############################################################ # report the current table setups ############################################################ select * from authority.users; select * from authority.user_roles; select * from mysql.db; ############################################################ # -- eof -############################################################ 4.5 Initialisierung der LDAP-Datenbank mit den Authentisierungsinformationen Basierend auf den bei der Installation des Betriebssystems gemachten LDAP-Konfigurations­ angaben (s. S. 25) werden die Informationen für eine JNDI Realm-basierte Authentisierung in die LDAP-Datenbank aufgenommen. Hierfür wurde das Skript setup_openldap.sh erstellt, das die LDAP-Datenbank neu anlegt: Listing 20: LDAP-Initialisierungsskript setup_openldap.sh #!/bin/bash ############################################################ # setup_openldap.sh ############################################################ Bundesamt für Sicherheit in der Informationstechnik Seite 62 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen # reinitialize the LDAP database OPENLDAP_LIB_DIR=`egrep -e "^directory" /etc/ldap/slapd.conf | cut -f 2 -d \"` if [ -z "$OPENLDAP_LIB_DIR" ] || [ ! -d $OPENLDAP_LIB_DIR ] ; then echo "#E# OPENLDAP_LIB_DIR undefined or not existing" exit 1 fi echo "#I# stopping slapd" /etc/init.d/slapd stop echo "#I# Purging OpenLDAP OPENLDAP_LIB_DIR $OPENLDAP_LIB_DIR" echo "#I# removing existing directory" rm -rf $OPENLDAP_LIB_DIR echo "#I# recreate OpenLDAP database" mkdir $OPENLDAP_LIB_DIR slapadd -v -l openldap_debian_init.ldif slapadd -v -l openldap_init.ldif echo "#I# restarting slapd" /etc/init.d/slapd start ############################################################ # -- eof -############################################################ Dieses Skript verwendet die in der Datei openldap_init.ldif eingetragen Benutzer- und Rollen­ definitionen: Listing 21: LDAP-Benutzer- bzw. Rollendefinitionsdatei openldap_init.ldif ############################################################ # Initialization LDIF file for # JNDI based web application authentication ############################################################ ############################################################ # Define an entry to contain people # # Searches for users are based on this entry dn: ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: organizationalUnit ou: people #----------------------------------------------------------# define entries for every user #----------------------------------------------------------# Define a user entry for "jndiadmin" dn: uid=jndiadmin,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndiadmin sn: jndiadmin cn: jndiadmin userPassword: vmware # Define a user entry for "jndiadminhash" dn: uid=jndiadminhash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndiadminhash Seite 63 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers sn: jndiadminhash cn: jndiadminhash userPassword: 92963abd36c896b93a36b8e296ff3387 # Define a user entry for "jndimanager" dn: uid=jndimanager,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndimanager sn: jndimanager cn: jndimanager userPassword: vmware # Define a user entry for "jndimanagerhash" dn: uid=jndimanagerhash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndimanagerhash sn: jndimanagerhash cn: jndimanagerhash userPassword: 92963abd36c896b93a36b8e296ff3387 # Define a user entry for "jndiuser1" dn: uid=jndiuser1,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndiuser1 sn: jndiuser1 cn: jndiuser1 userPassword: vmware # Define a user entry for "jndiuser1hash" dn: uid=jndiuser1hash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndiuser1hash sn: jndiuser1hash cn: jndiuser1hash userPassword: 92963abd36c896b93a36b8e296ff3387 # Define a user entry for "jndiuser2" dn: uid=jndiuser2,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndiuser2 sn: jndiuser2 cn: jndiuser2 userPassword: vmware # Define a user entry for "jndiuser2hash" dn: uid=jndiuser2hash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: inetOrgPerson uid: jndiuser2hash sn: jndiuser2hash cn: jndiuser2hash userPassword: 92963abd36c896b93a36b8e296ff3387 ############################################################ # Define an entry to contain LDAP groups # # Searches for roles are based on this entry dn: ou=groups,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: organizationalUnit ou: groups #----------------------------------------------------------# define entries for every role #----------------------------------------------------------- Bundesamt für Sicherheit in der Informationstechnik Seite 64 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen # Define an entry for the "admin" role dn: cn=admin,ou=groups,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: groupOfUniqueNames cn: admin uniqueMember: uid=jndiadmin,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de uniqueMember: uid=jndiadminhash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de # Define an entry for the "manager" role dn: cn=manager,ou=groups,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: groupOfUniqueNames cn: manager uniqueMember: uid=jndimanager,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de uniqueMember: uid=jndimanagerhash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de # Define an entry for the "user1" role dn: cn=user1,ou=groups,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: groupOfUniqueNames cn: user1 uniqueMember: uid=jndiuser1,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de uniqueMember: uid=jndiuser1hash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de # Define an entry for the "user2" role dn: cn=user2,ou=groups,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: groupOfUniqueNames cn: user2 uniqueMember: uid=jndiuser2,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de uniqueMember: uid=jndiuser2hash,ou=people,dc=bsitomcat,dc=tsi-itcsec,dc=de ############################################################ # -- eof -############################################################ Diese Definitionen ergänzen die bei der Installation des Betriebssystems zur Konfiguration von slapd gemachten Angaben (s. S. 25). Die initiale LDAP-Konfiguration wird zuvor mit dem Kommando slapcat > openldap_debian_init.ldif für ein mögliches künftiges erneutes Aufsetzen der OpenLDAP-Datenbank unmittelbar nach der Erstinstallation und -konfiguration des Betriebssystems, also noch vor der Einbringung der Informationen aus der o. g. Datei openldap_init.ldif, in die Datei openldap_debian_init.ldif gesichert und hat folgenden Inhalt: Listing 22: LDAP-Inhalt aus Betriebssysteminstallation openldap_debian_init.ldif dn: dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: top objectClass: dcObject objectClass: organization o: BSI-Tomcat TSI ITC-Security dc: bsitomcat structuralObjectClass: organization entryUUID: 449e0962-ca90-1029-9b2b-fe9c288508dd creatorsName: cn=anonymous modifiersName: cn=anonymous createTimestamp: 20051006083809Z modifyTimestamp: 20051006083809Z entryCSN: 20051006083809Z#000001#00#000000 Seite 65 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers dn: cn=admin,dc=bsitomcat,dc=tsi-itcsec,dc=de objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: e2NyeXB0fVdXOVBDYTJnMXVyRVU= structuralObjectClass: organizationalRole entryUUID: 44a3814e-ca90-1029-9b2c-fe9c288508dd creatorsName: cn=anonymous modifiersName: cn=anonymous createTimestamp: 20051006083809Z modifyTimestamp: 20051006083809Z entryCSN: 20051006083809Z#000002#00#000000 Hinweis: Zur Vereinfachung der Durchführung der Tests mit einer vereinfachten manuellen Änderung von Passworten werden sämtliche Passworte im Klartext gespeichert. Für den Einsatz in einer Wirkumgebung wird empfohlen, neben geeigneten Zugriffsberechtigungen auf die Passwortinformationen durch die Verwendung geeigneter LDAP Access Control Listen (ACL) Einträge die Passworte nur als Hashwert in der Datenbank abzulegen. Für die JNDI-Authentisierung hat dies keine Folge, da das von Tomcat an den OpenLDAP Server weitergereichte Passwort dann ggf. vor einem Vergleich mit dem in der Datenbank gespeicherten Wert gleichfalls in einen Hashwert umgesetzt wird. 4.6 Konfiguration des LDAP-Browsers gq Zur Durchführung von späteren Änderungen an den Authentisierungsinformationen in der LDAP-Datenbank wird der gq LDAP-Browser verwendet, der für eine Verbindung mit dem LDAP-Server wie folgt konfiguriert wird: Nach dem Start von gq wird die Konfiguration über das Menü File → Preferences, Reiter Server mit den in Abschnitt 2.2 bei der Konfiguration des LDAP-Servers angegebenen Parametern vorgenommen: Bundesamt für Sicherheit in der Informationstechnik Seite 66 (von 187) Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 4.1.: Allgemeine Einstellungen zum LDAP-Server Zur Änderung von Passworten erfolgt die Anmeldung als LDAP-Administrator an den LDAPServer mit dem BIND-DN cn=admin,dc=bsitomcat,dc=tsi-itcsec,dc=de . Seite 67 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 4.2.: Verbindungseinstellungen zum LDAP-Server Über den „Browse“ Reiter im Hauptfenster kann nun eine Verbindung zum LDAP-Server durchgeführt werden, wobei das konfigurierte Passwort für den LDAP-Administrator vmware zu verwenden ist. Abbildung 4.3.: In der LDAP-Datenbank gespeicherte Informationen zu einem Benutzer Bundesamt für Sicherheit in der Informationstechnik Seite 68 (von 187) Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Mit Hilfe des gq LDAP-Browsers können nun die benötigten Änderungen vorgenommen werden. 4.7 Erzeugung einer CA und Generierung von SSL-Server- und Client-Zertifikaten Für die Zertifikat-basierte Client-Authentisierung werden entsprechende Zertifikate benötigt, die im Webbrowser zu installieren sind. Diese Zertifikate sind von einer Certification Authority (CA) zu signieren, mit der die Webanwendungen in einer Vertrauensbeziehung stehen. Um die von der eigenen CA signierten Zertifikate (z. B. Client-Zertifikate) überprüfen zu können, ist das Zertifikat der CA mit dem JAVA keytool in den JAVA Zertifikatspeicher $JAVA_HOME/jre/lib/security/cacerts zu importieren (mit dem Default-Passwort des Zertifikatspeichers changeit). Die nachfolgend beschriebenen Shell-Scripts werden der Einfachheit halber vom Benutzer root ausgeführt. Üblicherweise erzeugt ein Benutzer selbst sein Client-Zertifikat-Request, reicht dieses Zertifikat dann zusammen mit den für die Zertifizierung notwendigen Authentisierungsdoku­ menten bei der CA zur Signierung ein und erhält das signierte Zertifikat zum Import in verschiedene Applikationen wie z. B. den Webbrowser zurück. 4.7.1 Installation einer Certification Authority (CA) Die Installation einer einfachen CA für die hier durchzuführenden Tests erfolgt mit dem Skript setup_ca.sh. Listing 23: CA-Installationsskript setup_ca.sh #!/bin/bash -x ############################################################### # setup a private CA for issueing user certificates # used for certificate based user authentication ############################################################### ## some global setups export CA_ROOT=/root/bsitomcat_ca export export export export JAVA_HOME="/opt/jdk1.5.0_05" JRE_HOME="/opt/jdk1.5.0_05/jre" CATALINA_HOME="/opt/jakarta-tomcat-5.5.9" CATALINA_BASE="/opt/jakarta-tomcat-5.5.9" CA_DIR=${CA_ROOT}/ssl/ca SSL_SERVER_DIR=${CA_ROOT}/ssl/server CLIENT_DIR=${CA_ROOT}/ssl/client CA_PASSWORD=vmware CACERTS_PASSWORD=changeit #-------------------------------------------------------------mkdir -p $CA_ROOT cd $CA_ROOT # remove data from previous installations rm -rf ssl Seite 69 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers ############################################################### # SETTING UP YOUR CA ############################################################### #-------------------------------------------------------------# Create directories to hold your CA keys, your SSL server keys and, # if you want to use SSL client authentication, your client keys. For # the sake of argument let's assume that these directories are called # "${CA_DIR}", "${SSL_SERVER_DIR}" and "${CLIENT_DIR}". mkdir -p ${CA_DIR} ${SSL_SERVER_DIR} ${CLIENT_DIR} #-------------------------------------------------------------# Create a private key and certificate request for your own CA: openssl req -new -newkey rsa:1024 \ -subj "/CN=BSITomcat ITC-Sec CA/L=Bonn/ST=NRW/C=DE/[email protected]/O=BSITomcat ITC-Sec Certification Authority" \ -days 3650 \ -passout pass:${CA_PASSWORD} \ -out ${CA_DIR}/ca.csr \ -keyout ${CA_DIR}/ca.key #-------------------------------------------------------------# Create your CA's self-signed certificate: openssl x509 -trustout \ -signkey ${CA_DIR}/ca.key \ -passin pass:${CA_PASSWORD} \ -days 3650 \ -req -in ${CA_DIR}/ca.csr \ -out ${CA_DIR}/ca.pem #-------------------------------------------------------------# Import the CA certificate into the JDK certificate authorities # keystore: ## ## ## ## !! !! !! !! some www research (at http://mindprod.com/jgloss/keytool.html as well as "man keytool", search for 'cacerts keystore') has shown, that $JAVA_HOME/jre/lib/security/cacerts is protected by the password "changeit" # well, use the actual system wide JDK cacerts keystore # read by Java and tomcat: # purge old version of our CA certificate - if not available # in the keystore, it will generate an error message: # Keytool-Fehler: java.lang.Exception: Alias <bsitomcat_ca> existiert nicht. echo "#I# Subsequent command may generate error if no old certificat exists" ${JAVA_HOME}/bin/keytool -delete \ -keystore $JAVA_HOME/jre/lib/security/cacerts \ -storepass $CACERTS_PASSWORD \ -alias bsitomcat_ca \ -noprompt # import current version of our CA certificate ${JAVA_HOME}/bin/keytool -import \ -keystore $JAVA_HOME/jre/lib/security/cacerts \ -storepass $CACERTS_PASSWORD \ -file ${CA_DIR}/ca.pem \ -alias bsitomcat_ca \ -noprompt #-------------------------------------------------------------- Bundesamt für Sicherheit in der Informationstechnik Seite 70 (von 187) Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers # Create a file to hold your CA's serial numbers. # with the number "2": This file starts echo "02" > ${CA_DIR}/ca.srl # the CA is now ready to sign certificate requests ############################################################### # -- eof -############################################################### Das CA-Zertifikat wird für eine weitere Nutzung auch automatisch in den globalen JAVA Zertifikatspeicher installiert. Abhängig von der Nutzung des globalen JAVA Zertifikat­ speichers ($JAVA_HOME/jre/lib/security/cacerts) oder des Tomcat-Zertifikatspeichers (definiert mit dem Attribut truststoreFile, z. B. $CATALINA_HOME/conf/truststore) ist bei der Konfiguration des SSL-Connectors in der Konfigurationsdatei $CATALINA_HOME/conf/server.xml folgendes zu beachten: • Ist das Attribut truststoreFile (ggf. mit truststorePass) definiert, so wird das CAZertifikat aus dem Tomcat-Zertifikatspeicher verwendet. Dies muss dort vorhanden sein, da ansonsten eine CLIENT-CERT Authentisierung nicht möglich ist. • Ist das Attribut truststoreFile (ggf. mit truststorePass) nicht definiert, so wird das CAZertifikat aus dem globalen Java-Zertifikatspeicher verwendet. Beide Fälle wurden durchgespielt, aber letztlich hauptsächlich der Java-Zertifikatspeicher verwendet. Das in Listing 4.6 dargestellte Skript speichert das CA-Zertifikat in den JavaZertifikatspeicher. Bei Verwendung eines Tomcat-Zertifikatspeichers ist das keytool -import Kommando aus dem Skript entsprechend auf den Tomcat-Zertifikatspeicher anzuwenden. Mit Hilfe dieser CA-Installation können nachfolgend Server-Zertifikate zur Server-Authenti­ sierung beim Aufbau von SSL-Verbindungen wie auch Client-Zertifikate signiert werden. 4.7.2 Erzeugung eines SSL Server-Zertifikats (Tomcat) Zur Authentisierung des Webservers wird beim Aufbau einer SSL-Verbindung ein ServerZertifikat benötigt. Dies wird mit dem Script setup_server_cert.sh durchgeführt und in die Tomcat Installation übertragen. Voraussetzung für das Ausführen dieses Scripts ist das Vorhandensein der im vorigen Schritt generierten CA. Listing 24: Skript zur Erzeugung eines SSL-Server-Zertifikats setup_server_cert.sh #!/bin/bash -x ############################################################### # setup a server certificate required for tomcat SSL server # authentication ############################################################### ## some global setups export CA_ROOT=/root/bsitomcat_ca export export export export JAVA_HOME="/opt/jdk1.5.0_05" JRE_HOME="/opt/jdk1.5.0_05/jre" CATALINA_HOME="/opt/jakarta-tomcat-5.5.9" CATALINA_BASE="/opt/jakarta-tomcat-5.5.9" Seite 71 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers CA_DIR=${CA_ROOT}/ssl/ca SSL_SERVER_DIR=${CA_ROOT}/ssl/server CLIENT_DIR=${CA_ROOT}/ssl/client CA_PASSWORD=vmware WEBSERVER_PASSWORD=vmware #-------------------------------------------------------------# check, if the required CA is already installed if [ ! -d ${CA_DIR} ] ; then echo "#E# $0 requires a CA to be installed" echo "#E# Please run setup_ca.sh first" exit 1 fi #-------------------------------------------------------------mkdir -p $CA_ROOT cd $CA_ROOT # remove data from previous installations rm -rf ${SSL_SERVER_DIR}/{server.crs|server.crt|truststore} ############################################################### # SETTING UP YOUR WEB SERVER ############################################################### #-------------------------------------------------------------# Create directories to hold your CA keys, your SSL server keys and, # if you want to use SSL client authentication, your client keys. For # the sake of argument let's assume that these directories are called # "${CA_DIR}", "${SSL_SERVER_DIR}" and "${CLIENT_DIR}". mkdir -p ${SSL_SERVER_DIR} #-------------------------------------------------------------# Create a keystore for your web server. ${JAVA_HOME}/bin/keytool -genkey \ -alias tomcat \ -keyalg RSA \ -keysize 1024 \ -keystore ${SSL_SERVER_DIR}/.keystore \ -storetype JKS \ -keypass $WEBSERVER_PASSWORD \ -storepass $WEBSERVER_PASSWORD \ -validity 1000 \ -dname "CN=tomcathost, OU=BSI-Tomcat, O= T-Systems International SSC T&S, L=Bonn, ST=NRW, C=DE" #-------------------------------------------------------------# Create a certificate request for your web server. ${JAVA_HOME}/bin/keytool -certreq \ -keyalg RSA \ -alias tomcat \ -file ${SSL_SERVER_DIR}/server.csr \ -storepass $WEBSERVER_PASSWORD \ -keystore ${SSL_SERVER_DIR}/.keystore # You need to edit the certificate request file slightly. Open it up # in a text editor and amend the text which reads "NEW CERTIFICATE # REQUEST" to "CERTIFICATE REQUEST" Bundesamt für Sicherheit in der Informationstechnik Seite 72 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen sed -e 's/ NEW CERTIFICATE REQUEST/ CERTIFICATE REQUEST/' \ < ${SSL_SERVER_DIR}/server.csr > ${SSL_SERVER_DIR}/server.csr_tmp mv ${SSL_SERVER_DIR}/server.csr_tmp ${SSL_SERVER_DIR}/server.csr #-------------------------------------------------------------# Have your CA sign your certificate request: openssl x509 \ -CA ${CA_DIR}/ca.pem \ -CAkey ${CA_DIR}/ca.key \ -CAserial ${CA_DIR}/ca.srl \ -passin pass:$CA_PASSWORD \ -req \ -in ${SSL_SERVER_DIR}/server.csr \ -out ${SSL_SERVER_DIR}/server.crt \ -days 3650 #-------------------------------------------------------------# Import your signed server certificate into your server keystore: ${JAVA_HOME}/bin/keytool -import \ -alias tomcat \ -storepass $WEBSERVER_PASSWORD \ -keystore ${SSL_SERVER_DIR}/.keystore \ -trustcacerts \ -file ${SSL_SERVER_DIR}/server.crt # You should see a message "Certificate reply was installed in keystore". #-------------------------------------------------------------# Import your CA certificate into your server truststore: ${JAVA_HOME}/bin/keytool -import \ -alias bsitomcat_ca \ -storepass $WEBSERVER_PASSWORD \ -keystore ${SSL_SERVER_DIR}/truststore \ -trustcacerts \ -file ${CA_DIR}/ca.pem \ -noprompt # This step is only necessary if you wish to use SSL client # authentication with Tomcat. #-------------------------------------------------------------# Set up an SSL connector for Tomcat. I assume that you know, or can # find out, how to do this. Open up conf/server.xml in a text editor # and search for the text "keystoreFile". Ensure that the attribute # value is the keystore you've created above. #-------------------------------------------------------------# distribute the certificates and keys files to the tomcat # installation cp -p ${SSL_SERVER_DIR}/.keystore ${SSL_SERVER_DIR}/truststore \ ${CATALINA_HOME}/conf ############################################################### # -- eof -############################################################### Das in Tomcat einzubindende Zertifikat befindet sich nach Abarbeitung dieses Skripts schließlich unter $CATALINA_HOME/conf/.keystore und kann bei der Aktivierung des Seite 73 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Tomcat HTTPS-Connectors in der Datei $CATALINA_HOME/conf/server.xml mit dem gewählten Passwort genutzt werden. Hinweis: Wichtig ist bei der Erzeugung des Server-Zertifikates, dass bei den Eingaben statt eines Inhaber-Namens (Vor- / Nachname) der Hostname des Servers eingetragen wird. Andernfalls gibt der Webbrowser, der eine so konfigurierte Webseite aufruft, eine Warn­ meldung aus, dass der Server-Name und der Name des Zertifikatinhabers nicht überein­ stimmen. 4.7.3 Erzeugung eines SSL Server-Zertifikats (Apache) Um HTTPS-Verbindungen zum Apache Webserver öffnen zu können, muss dieser über ein dazu notwendiges Server-Zertifikat zu seiner Authentisierung gegenüber dem Webbrowser verfügen. Zur Durchführung der Authentisierung muss im Webserver auf den jeweils zum Server-Zertifikat gehörigen privaten Schlüssel zugegriffen werden. Weil Tomcat und Apache diese privaten Schlüssel aber in unterschiedlichen Formaten verwenden, zwischen denen es keine Import- / Exportmöglichkeit gibt, wird für den Apache Webserver mit dem Skript setup_apacheserver_cert.sh ein eigenes Server-Zertifikat erzeugt: Listing 25: Skript zur Erzeugung eines SSL-Server-Zertifikats setup_apacheserver_cert.sh #!/bin/bash -x ############################################################### # setup a server certificate required for Apache SSL server # authentication ############################################################### ## some global setups export CA_ROOT=/root/bsitomcat_ca export export export export JAVA_HOME="/opt/jdk1.5.0_05" JRE_HOME="/opt/jdk1.5.0_05/jre" CATALINA_HOME="/opt/jakarta-tomcat-5.5.9" CATALINA_BASE="/opt/jakarta-tomcat-5.5.9" export HTTPD_HOME="/opt/httpd-2.0.54" CA_DIR=${CA_ROOT}/ssl/ca SSL_SERVER_DIR=${CA_ROOT}/ssl/server CLIENT_DIR=${CA_ROOT}/ssl/client CA_PASSWORD=vmware #-------------------------------------------------------------# check, if the required CA is already installed if [ ! -d ${CA_DIR} ] ; then echo "#E# $0 requires a CA to be installed" echo "#E# Please run setup_ca.sh first" exit 1 fi #-------------------------------------------------------------mkdir -p $CA_ROOT cd $CA_ROOT # remove data from previous installations rm -rf ${SSL_SERVER_DIR}/apache* Bundesamt für Sicherheit in der Informationstechnik Seite 74 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen ############################################################### # SETTING UP YOUR WEB SERVER ############################################################### #-------------------------------------------------------------# Create directories to hold your CA keys, your SSL server keys and, # if you want to use SSL client authentication, your client keys. For # the sake of argument let's assume that these directories are called # "${CA_DIR}", "${SSL_SERVER_DIR}" and "${CLIENT_DIR}". mkdir -p ${SSL_SERVER_DIR} #-------------------------------------------------------------# Create a certificate request for your apache web server. openssl req -new \ -newkey rsa:2048 \ -nodes \ -out ${SSL_SERVER_DIR}/apache_ssl.csr \ -keyout ${SSL_SERVER_DIR}/apache_ssl.key \ -subj "/CN=tomcathost/L=Bonn/ST=NRW/C=DE/emailAddress=${CLIENT}@bsitomcat.de/O=BSITomcat ITC-Sec" #-------------------------------------------------------------# Have your CA sign your certificate request: openssl x509 \ -CA ${CA_DIR}/ca.pem \ -CAkey ${CA_DIR}/ca.key \ -CAserial ${CA_DIR}/ca.srl \ -passin pass:$CA_PASSWORD \ -req \ -in ${SSL_SERVER_DIR}/apache_ssl.csr \ -out ${SSL_SERVER_DIR}/apache_ssl.crt \ -days 3650 #-------------------------------------------------------------# Import your # - CA certificate # - signed server certificate # - server key # into the respective directories to allow for client certificate # based client authentication and for SSL server authentication mkdir -p ${HTTPD_HOME}/conf/ssl.key ${HTTPD_HOME}/conf/ssl.crt \ ${HTTPD_HOME}/conf/ca.crt cp -p ${CA_DIR}/ca.pem \ ${HTTPD_HOME}/conf/ca.crt/. cp -p ${SSL_SERVER_DIR}/apache_ssl.crt \ ${HTTPD_HOME}/conf/ssl.crt/. cp -p ${SSL_SERVER_DIR}/apache_ssl.key \ ${HTTPD_HOME}/conf/ssl.key/. # keep the original names, but make the files available # under the standard names as used in conf/ssl.conf: for s in key crt ; do cd ${HTTPD_HOME}/conf/ssl.${s} ln -sf apache_ssl.${s} server.${s} done ############################################################### Seite 75 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers # -- eof -############################################################### Das signierte Zertifikat sowie der dazu gehörige private Schlüssel werden in die entsprechenden Verzeichnisse, die in der $APACHE_INSTALL/conf/ssl.conf Konfigurations­ datei der Apache-Installation angegeben sind, kopiert. In dieser Konfigurationsdatei sind noch folgende Ergänzungen durchzuführen, um eine auf Client-Zertifikaten basierende Client-Authentisierung zu ermöglichen. Listing 26: Ergänzungen in der Apache-Konfigurationsdatei ssl.conf SSLVerifyClient require SSLCACertificateFile /opt/httpd-2.0.54/conf/ca.crt/ca.pem SSLVerifyDepth 1 SSLOptions +StdEnvVars +ExportCertData +FakeBasicAuth 4.7.4 Erzeugung von Client-Zertifikaten Zur Browser-Authentisierung gegenüber dem Webserver werden in einigen Tests ClientZertifikate verwendet. Diese könne mit dem Skript setup_client_cert.sh generiert werden, das der Einfachheit aus vom Benutzer root ausgeführt wird. Üblicherweise würde ein Benutzer seinen Zertifikat-Request selbst erzeugen, reicht dieses Zertifikat dann zusammen mit den notwendigen Authentisierungsdokumenten bei der CA zur Signierung ein und erhält das signierte Zertifikat zum Import in verschiedene Applikationen wie z. B. den Webbrowser zurück). Das Skript kann optional den Benutzernamen (als erstes Argument, default: memuser1), sowie ggf. ein Zertifikatpasswort (als zweites Argument, default: vmware) erhalten. Listing 27: Skript zur Erzeugung von Client-Zertifikaten setup_client_cert.sh #!/bin/bash -x ############################################################### # setup a client certificate ############################################################### ## some global setups export CA_ROOT=/root/bsitomcat_ca export export export export JAVA_HOME="/opt/jdk1.5.0_05" JRE_HOME="/opt/jdk1.5.0_05/jre" CATALINA_HOME="/opt/jakarta-tomcat-5.5.9" CATALINA_BASE="/opt/jakarta-tomcat-5.5.9" CA_DIR=${CA_ROOT}/ssl/ca SSL_SERVER_DIR=${CA_ROOT}/ssl/server CLIENT_DIR=${CA_ROOT}/ssl/client CA_PASSWORD=vmware # use either the command line arguments for this script # $1: client_name or the default memuser1 # $2: client_password or the default vmware CLIENT=${1:-memuser1} CLIENT_PASSWORD=${2:-vmware} Bundesamt für Sicherheit in der Informationstechnik Seite 76 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen #-------------------------------------------------------------# check, if the required CA is already installed if [ ! -d ${CA_DIR} ] ; then echo "#E# $0 requires a CA to be installed" echo "#E# Please run 'setup_ca.sh' first" exit 1 fi #-------------------------------------------------------------mkdir -p $CA_ROOT cd $CA_ROOT # remove data from previous installations rm -rf ${CLIENT_DIR}/${CLIENT}* ############################################################### # SETTING UP AN SSL CLIENT ############################################################### #-------------------------------------------------------------# Create directories to hold your CA keys, your SSL server keys and, # if you want to use SSL client authentication, your client keys. For # the sake of argument let's assume that these directories are called # "${CA_DIR}", "${SSL_SERVER_DIR}" and "${CLIENT_DIR}". mkdir -p ${CLIENT_DIR} #-------------------------------------------------------------# Create a client certificate request: openssl req -new \ -newkey rsa:2048 \ -passout pass:$CLIENT_PASSWORD \ -out ${CLIENT_DIR}/${CLIENT}.req \ -keyout ${CLIENT_DIR}/${CLIENT}.key \ -subj "/C=DE/ST=NRW/L=Bonn/O=BSITomcat ITC-Sec/OU=Testlab/CN=${CLIENT}" # The common name of the client must match a user in Tomcat's user # realm (e.g. an entry in conf/tomcat-users.xml) in REVERSE # order: # <user username="CN=${CLIENT}, OU=Testlab, O=BSITomcat ITC-Sec, L=Bonn, # ST=NRW, C=DE" password="" roles="userrole">. #-------------------------------------------------------------# Have your CA sign your client certificate. openssl x509 \ -CA ${CA_DIR}/ca.pem \ -CAkey ${CA_DIR}/ca.key \ -CAserial ${CA_DIR}/ca.srl \ -passin pass:${CA_PASSWORD} \ -req \ -in ${CLIENT_DIR}/${CLIENT}.req \ -out ${CLIENT_DIR}/${CLIENT}.pem \ -days 3650 #-------------------------------------------------------------# Generate a PKCS12 file containing your server key and server # certificate. # convert to PKCS12 for import by web browser openssl pkcs12 \ -export \ -clcerts \ -in ${CLIENT_DIR}/${CLIENT}.pem \ Seite 77 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers -inkey ${CLIENT_DIR}/${CLIENT}.key \ -out ${CLIENT_DIR}/${CLIENT}.p12 \ -passin pass:${CLIENT_PASSWORD} \ -passout pass:${CLIENT_PASSWORD} \ -name "${CLIENT}_client_certificate" #-------------------------------------------------------------# Import the PKCS12 file into your web browser to use as your client # certificate and key. #-------------------------------------------------------------# Enable client certificate authentication in Tomcat. Open up # conf/server.xml and search for the text "clientAuth". Set the value # of the attribute to "true". ############################################################### # -- eof -############################################################### Zu beachten ist, dass bei der Erzeugung der Client-Zertifikate mit openssl das Element emailAddress nicht verwendet werden sollte, da diese Information nicht als eigenständiger Eintrag im Zertifikat erscheint, sondern offenbar an ein anderes Element angehängt wird. Außerdem ist die Reihenfolge der Attribute des subjectDN zu beachten: Einem subjectDN-Eintrag für die Erzeugung des Client-Zertifikatrequests ... -subj "/C=DE/L=Bonn/ST=NRW/O=BSITomcat ITC-Sec/OU=Testlab/CN=my_username" ... muss ein Eintrag <user username=“CN=my_username, OU=Testlab, O=BSITomcat ITC-Sec, L=Bonn, ST=NRW, C=DE" password=““ roles=“user1“/> in der $CATALINA_HOME/conf/tomcat-users.xml Konfigurationsdatei entsprechen (d. h. mit umgekehrter Reihenfolge der Elemente), um eine CLIENT-CERT Authentisierung erfolgreich durchführen zu können. Außerdem ist es erforderlich, dass das CA-Zertifikat der CA, mit der das Client-Zertifikat signiert wurde, im globalen Java- oder im Tomcat-Zertifikatspeicher vorhanden sein muss. Dort stehen alle CA-Zertifikate, denen z. B. im Hinblick auf die Signierung von Client- oder Benutzer-Zertifikaten vertraut werden soll. Wird hingegen im Rahmen einer lokalen Zertifikatprüfung eines Client- oder Benutzer-Zertifikats das zugehörige CA-Zertifikat nicht in einem der lokalen Zertifikatspeicher vorgefunden, so wird eine Fehlermeldung ausgegeben, dass das Client- bzw. Benutzer-Zertifikat nicht verifiziert werden konnte. Wird der Zugriff auf den Zertifikatspeicher mit einem Passwort geschützt, so muss das Passwort für den Zugriff auf den jeweiligen Zertifikatspeicher in der Konfigurations­ datei $CATALINA_HOME/conf/server.xml spezifiziert sein. Nach der Erzeugung des Client-Zertifikates durch das Skript in Listing 4.10, das das ClientZertifikat für einen Import in den Webbrowser im PKCS12 Format bereitstellen muss, ist das erzeugte Zertifikat noch aus dem Verzeichnis /root/bsitomcat_ca/ssl/client in ein Verzeichnis zu kopieren, auf das vom entsprechenden Benutzer lesend zugegriffen werden kann.35 Dieses Zertifikat ist für eine Verwendung anschließend in den benutzten Webbrowser zu importieren. Am Beispiel des Webbrowsers Firefox werden die benötigten Schritte nach­ folgend zusammengefasst: 35 Dies entspricht der Lieferung des signierten Zertifikats durch die CA an den Benutzer. Bundesamt für Sicherheit in der Informationstechnik Seite 78 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen Im Webbrowser Firefox wird unter Edit→Preference→Advanced im Abschnitt Certificates das Fenster zur Zertifikatverwaltung geöffnet: Abbildung 4.4.: Zertifikatverwaltung im Browser Firefox Mit der Schaltfläche „Manage Certificates ...“ wird das Zertifikate-Verwaltungsfenster geöffnet: Seite 79 (von 187) Bundesamt für Sicherheit in der Informationstechnik Einrichtung der Authentisierungsinformationen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 4.5.: Zertifikatimport Das zuvor erzeugte Zertifikat kann nun über die Schaltfläche „Import“ importiert werden, wobei der Dateiname des Zertifikats in einem weiteren Popup-Fenster einzugeben ist. Beim Import ist das bei der Zertifikaterstellung verwendete Passwort anzugeben: Abbildung 4.6.: Passwortabfrage zum Importieren Der erfolgreiche Zugriff auf das in der Importdatei vorhandene Zertifikat und dessen Import wird bestätigt. Bundesamt für Sicherheit in der Informationstechnik Seite 80 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Einrichtung der Authentisierungsinformationen Abbildung 4.7.: Bestätigung des erfolgreichen Imports des Zertifikats Das importierte Zertifikat wird in der Übersicht der vorhandenen Zertifikate angezeigt und steht nach Abschluss des Importes zur Verwendung zur Verfügung. Abbildung 4.8.: Übersicht über die nun im Webbrowser vorhandenen Zertifikate Hinweis: Falls der Zertifikatspeicher des Webbrowsers Firefox durch ein Passwort geschützt ist, das bei erstmaliger Benutzung der Zertifikat-Management-Funktionen gesetzt werden kann, ist abweichend von der dargestellten Vorgehensweise bei Zugriffen auf den Zertifikatspeicher dieses Passwort (ggf. an mehreren Stellen) auf Anfrage einzugeben. Seite 81 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5. Durchführung der Tests Die nachfolgend beschriebenen Tests wurden der Feinspezifikation [Tomcat Fein.] aus der Projektphase 1 entnommen und mit den gewonnenen Ergebnissen ergänzt. Hinweis: In den URLs der nachfolgenden Tests ist der Hostname tomcathost synonym zu localhost und wurde in der Datei /etc/hosts nachgetragen. Das für HTTPS / SSL benötigte Server-Zertifikat wurde auf den Host tomcathost ausgestellt. Dies kann zur Überprüfung der Ausgabe einer Warnung im Webbrowser verwendet werden, die erscheinen sollte, wenn sich der Hostname in der vom Webbrowser verwendeten URL und im Server-Zertifikat unter­ scheiden. 5.1 Funktionale Tests der Sicherheitsfunktionen von Tomcat Ziel dieser Tests ist es festzustellen, • ob es möglich ist, die Sicherheitsfunktionen von Tomcat zu umgehen und • ob die Sicherheitsfunktionen von Tomcat der Dokumentation entsprechen. Bei den Tests wird überprüft, welche Arbeitsschritte Tomcat durchführt, wenn die jeweilige Sicherheitsfunktion von Tomcat verwendet wird. Die Analyse besteht dabei im wesentlichen aus der Auswertung der Netzkommunikation der beteiligten Kommunikationspartner und der Sichtung der Tomcat Protokolldateien bei geeignet eingestelltem Debug-Level. Die Tomcat Protokoll-Dateien befinden sich in den vorliegenden Testinstallationen im Verzeichnis $CATALINA_HOME/logs. 5.1.1 Funktionale Tests für die Authentisierung Die einzelnen Webanwendungen können verschiedene Authentisierungsmethoden verwen­ den. Es werden daher bei den Tests zwei Anwendungen mit unterschiedlichen Benutzern und Rollen eingesetzt. Die zur Verfügung stehenden Benutzer und Rollen wurden in Abschnitt 4 definiert. Es werden die folgenden Tests durchgeführt: 1. Test1: Ein Benutzer gibt ungültige Authentisierungsinformationen (Kombination von Benutzernamen / Passwort bzw. Client Zertifikat) bei der Authentisierung an einer Webanwendung an. Es wird die Verarbeitung der Authentisierungsinformationen durch Tomcat sowie der Protokollierung ausgewertet. 2. Test2: Ein Benutzer authentisiert sich erfolgreich an einer Webanwendung. Anschließend ruft er eine andere Webanwendung auf, auf die er laut Einstellungen der web.xml-Datei der Webanwendung keinen Zugriff hat. Für diesen Test wird Single Sign On (SSO) eingestellt, da ansonsten für jede Webanwendung eine erneute Authentisierung erforderlich wäre. Der Test wird zunächst mit Anwendungen durchgeführt, die so konfiguriert sind, dass sie die gleiche Authentisierungsmethode gegenüber dem Client einsetzen (z. B. HTTP FORM für beide). Anschließend wird der Test mit Anwendungen wiederholt, die unterschiedliche Authentisierungsmethoden einsetzen (z. B. HTTP FORM für die eine und HTTP BASIC für die andere Anwendung). So wird das Funktionieren des SSO Valves überprüft. Das SSO Valve sollte im Falle der erfolgreichen Authentisierung nur Zugriffsrechte entsprechend der Einstellungen in den web.xml-Dateien der einzelnen Webanwendungen erteilen. Bundesamt für Sicherheit in der Informationstechnik Seite 82 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 3. Test3: Der Benutzer authentisiert sich erfolgreich. Die Authentisierungsdatenbank wird anschließend geändert. Es wird überprüft, ob dies von Tomcat bemerkt wird. Dies sollte bei dem JDBC Realm und bei dem JNDI Realm in jedem Fall bemerkt werden. Im Falle des File Realms hängt das Erkennen der Änderungen durch Tomcat davon ab, ob die Konfigurationsdatei direkt über einen Datei-Editor oder über die entsprechende Tomcat Web-GUI Anwendung (admin) geändert wurde. Im zweiten Fall, d. h., Änderung über die Web-GUI, sollte die Änderung von Tomcat bemerkt werden. Bei den Tests werden die unterschiedlichen Connectoren von Tomcat, die einsetzbaren Authentisierungsmethoden (BASIC, DIGEST, FORM und CLIENT-CERT) und die von Tomcat unterstützten Methoden, die auf Authentisierungsdatenbestände (Realms: UserDatabase, JDBC (MySQL), JNDI (LDAP)) zugreifen, berücksichtigt. Aufgrund der Architektur von Tomcat – die drei angesprochenen Komponenten sind im Wesentlichen voneinander unabhängig (Ausnahme: Authentisierung über Client Zertifikate) – besteht keine Notwendigkeit alle möglichen Kombinationsmöglichkeiten zu testen. Die vorgesehenen Tests sind in Tabelle 2 zusammengefasst. Test Tomcat­ Authentisierungsmethode/ Testbeschreibung Nr. Connector Benutzerdatenbank T 1 HTTP BASIC User Test1 (s. o.) T2 JDBC Test1 (s. o.) T3 JNDI Test1 (s. o.) User Test1 (s. o.) FORM User Client-Zertifikat User BASIC User Test1 (s. o.) Test1 (s. o.) Test1 (s. o.) DIGEST User Test1 (s. o.) T9 FORM User T 10 AJP1.3 / SSL Client-Zertifikat User T 11 HTTP BASIC User Test1 (s. o.) Test1 (s. o.) Test2 (s. o.) T 12 DIGEST User Test2 (s. o.) T 13 T 14 HTTPS T 15 AJP1.3 FORM User Client-Zertifikat User BASIC User Test2 (s. o.) Test2 (s. o.) Test2 (s. o.) T 16 DIGEST User Test2 (s. o.) T 17 FORM User T 18 AJP1.3 / SSL Client-Zertifikat User T 19 HTTP BASIC User Test2 (s. o.) Test2 (s. o.) Test3 (s. o.) T 20 DIGEST User Test3 (s. o.) T 21 T 22 HTTPS T 23 AJP1.3 FORM User Client-Zertifikat User BASIC User Test3 (s. o.) Test3 (s. o.) Test3 (s. o.) T 24 DIGEST User Test3 (s. o.) T 25 FORM User T 26 AJP1.3 / SSL Client-Zertifikat User Test3 (s. o.) Test3 (s. o.) T4 T5 T6 T7 DIGEST HTTPS AJP1.3 T8 Seite 83 (von 187) Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Tabelle 2: Funktionale Tests der Authentisierung Die Verwendung der zwei Tomcat Connectoren (HTTP/HTTPS bzw. AJP1.3) entspricht den Einsatzszenarien 1 (HTTP / HTTPS-Verbindung direkt zu Tomcat) bzw. 2 (Verbindung über den AJP1.3-Connector zu Tomcat) des Feinkonzepts [Tomcat Fein.]. Da sich die Authentisierung bei anderen Einsatzszenarien nicht grundlegend unterscheidet, ist eine explizite Berücksichtigung der anderen Einsatzszenarien bei diesem Test nicht sinnvoll. Nach den für die jeweiligen Tests vorgenommenen individuellen Konfigurationseinstellungen wird der Tomcat Servlet Container neu gestartet, um sicherzustellen, dass die Konfigura­ tionseinstellungen auch in den Betrieb übernommen wurden. Außerdem muss ggf. der Webbrowser wegen der Pufferung der Authentisierungsinformatio­ nen nach einmal erfolgter Authentisierung verlassen werden, um sich unter einem anderen Benutzer anmelden zu können. Zur Vorbereitung der nachfolgenden Zugriffsschutz- und Single-Sign-On-Tests werden drei einfache Webanwendungen (simple_info1, simple_info1a, simple_info2) definiert und unter $CATALINA_HOME/webapps installiert. Sie enthalten jeweils die „Top-Level“ Webseite index.jsp und eine weitere confidential.jsp sowie die entsprechende Tomcat-Konfigurations­ datei der Webanwendungen unter WEB-INF/web.xml. Die Zugriffsberechtigungen sind wie folgt vergeben: Webanwendung simple_info1 Datei simple_info1/index.jsp simple_info1/confidential.jsp simple_info1a simple_info1/subdir/moreinfo.jsp simple_info1a/index.jsp simple_info2 simple_info1a/confidential.jsp simple_info2/index.jsp simple_info2/confidential.jsp Freigabe für Rolle, verwendete Authentisierungs­ methode - alle user1, BASIC-Authentisierung user1, FORM-Authentisierung user2, DIGEST-Authentisierung Tabelle 3: Test-Webanwendungen und den Dateien zugeordnete Rollenfreigaben Für jede Webanwendung werden darüber hinaus auch die beiden in Verbindung mit der FORM-Authentisierung benötigten Dateien login.jsp sowie error.jsp installiert, die für alle Benutzer freigegeben sein müssen, da ansonsten durch die Blockierung von noch un­ authentisierten Zugriffen auf diese beiden Dateien keine erfolgreiche Authentisierung durchgeführt werden kann. 5.1.1.1 Ergebnisse zu Test1 Für die Tests der verschiedenen Authentisierungsmethoden können zunächst die mit installierten Applikationen • simple_info1 (für BASIC-Authentisierung), • simple_info1a (für FORM-Authentisierung), Bundesamt für Sicherheit in der Informationstechnik Seite 84 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Durchführung der Tests simple_info2 (für DIGEST-Authentisierung) verwendet werden, wobei die jeweilige Authentisierungsmethode in der Datei WEBINF/web.xml der Webanwendung spezifiziert wird. Für die Tests wurden, soweit nicht anders angegeben, keine besonderen oder weitergehenden Logging-Optionen aktiviert. Bei den Tests konnte durch das Mitlesen der Netzwerkkommunikation mit dem Werkzeug ethereal verifiziert werden, dass über die HTTP-Verbindung zwischen dem Webbrowser und dem Webserver36 bzw. zwischen dem Webbrowser und dem Tomcat Servlet Container37, die Authentisierungsinformationen in folgenden Fällen im Klartext ausgetauscht werden: • BASIC-Authentisierung: als reversibel Base64-codierte Zeichenkette der Konkatena­ tion von benutzername:passwort mit dem Doppelpunkt als Trennzeichen zwischen Benutzername und Passwort. Damit ist die BASIC-Authentisierung bei einer Verwendung über unsichere Netzwerke (z. B. das Internet), wo der Datenverkehr zwischen dem Webbrowser und dem Webserver abgehört werden kann, nicht als sicher zu betrachten. • FORM-Authentisierung: im Klartext innerhalb eines HTTP-POST Paketes, womit die FORM-Authentisierung gleichfalls nicht als sicher zu betrachten ist. Lediglich bei der DIGEST-Authentisierung kann das Benutzerpasswort nicht einfach aus den übertragenen HTTP-Nachrichten rekonstruiert werden und sollte daher zur Authentisierung über ungeschützte Netzwerke verwendet werden. 5.1.1.1.1 T1: HTTP Connector, BASIC-Authentisierung, Memory Realm Zunächst erfolgt eine Aktivierung der Memory Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei. Anschließend wird Tomcat neu gestartet. Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die geschützte Webseite http://tomcathost:8080/simple_info1/confidential.jsp der simple_info1 Anwendung führte zur Ablehnung des Logins ohne Protokollierung einer Fehlermeldung in $CATALINA_HOME/logs/catalina-<datum>.log, woraufhin das Browser-Popup-Fenster zur HTTP-Authentisierung erneut geöffnet wird. Auch ein Zugriffsversuch mit dem für eine andere Rolle eingetragenen Benutzer memuser2 und dem zugehörigen gültigen Passwort vmware führte ebenso zu einer Ablehnung des Logins, diesmal mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser. Ein nachfolgender Zugriff im neu gestarteten Webbrowser mit dem Benutzer memuser1 und dem Passwort vmware auf die manager Anwendung wurde erfolgreich, aber auch ohne Logdateieinträge, durchgeführt. Ein Neustart des Webbrowsers war erforderlich, da die vorherige Benutzerinformation für den Webbrowser noch gültig war38 und im WebbrowserCache vorlag. Wenn ein erneuter Zugriff auf dieselbe Webseite mit den gleichen Benutzerinformationen versucht worden wäre, hätte dies erneut zur Ablehnung durch den 36 37 38 bei Verwendung von Apache-mod_jk sowie Tomcat mit AJP13 Connector beim Direktzugriff auf den HTTP-Connector von Tomcat Die Fehlermeldung des Webservers war schließlich „HTTP Status 403 - Access denied“ und deutet damit auf ein Zugriffsverbot, nicht aber einen Authentisierungsfehler hin. Seite 85 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Webserver mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied" geführt. Für eine Protokollierung von Fehlzugriffen auf die von Tomcat bereitgestellten Web­ anwendungen sollte eine Aktivierung der Logging-Funktionen gemäß den in Abschnitt 6.3.3 gegebenen Hinweisen beachtet werden. 5.1.1.1.2 T2: HTTP Connector, BASIC-Authentisierung, JDBC Realm Zunächst erfolgt eine Aktivierung der JDBC Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei. Anschließend wird Tomcat neu gestartet. Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die Anwendung simple_info1 http://tomcathost:8080/simple_info1/confidential.jsp führte zu einer Ablehnung des Logins und zwar ohne Protokollierung einer Fehlermeldung in $CATALINA_HOME/logs/catalina-<datum>.log. Anschließend wird das Browser-PopupFenster zur Eingabe der HTTP-Authentisierungsdaten erneut geöffnet. Auch ein Zugriffsversuch mit dem für eine andere Rolle eingetragenen Benutzer jdbcuser2 und dem zugehörigen gültigen Passwort vmware führte ebenso zu einer Ablehnung des Logins mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser. Ein nachfolgender Zugriff im neu gestarteten Webbrowser mit dem Benutzer jdbcuser1 und dem Passwort vmware auf die manager Anwendung wurde erfolgreich aber auch ohne Logdateieinträge durchgeführt. Bei der Nachverfolgung des Netzwerkverkehrs mit dem MySQL-Server (Port 3306) konnte festgestellt werden, dass das in der Datenbank gespeicherte Referenzpasswort für die Authentisierung im Klartext zurück zum Tomcat Servlet Container übertragen wird. Falls diese Übertragung nicht innerhalb eines gesicherten Netzwerkbereiches erfolgt (z. B. bei Aufteilung auf separaten Tomcat-Rechner und MySQL-Rechner), ist das Risiko des Mitlesens von Passwortinformationen zu berücksichtigen. 5.1.1.1.3 T3: HTTP Connector, BASIC-Authentisierung, JNDI Realm Zunächst erfolgt eine Aktivierung der JNDI Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei. Anschließend wird Tomcat neu gestartet. Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die simple_info1 Anwendung http://tomcathost:8080/simple_info1/ führte zur Ablehnung des Logins ohne Protokollierung einer Fehlermeldung in $CATALINA_HOME/logs/catalina<datum>.log, woraufhin das Browser-Popup-Fenster zur HTTP-Authentisierung erneut geöffnet wird. Auch ein Zugriffsversuch mit dem für eine andere Rolle eingetragenen Benutzer jndiuser2 und dem zugehörigen gültigen Passwort vmware führte ebenso zu einer Ablehnung des Logins, diesmal mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser. Bundesamt für Sicherheit in der Informationstechnik Seite 86 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Ein nachfolgender Zugriff im neu gestarteten Webbrowser mit dem Benutzer jndiuser1 und dem Passwort vmware auf die simple_info1 Anwendung wurde erfolgreich aber auch ohne Logdateieinträge. durchgeführt. Bei der Nachverfolgung des Netzwerkverkehrs mit dem OpenLDAP-Server (Port 389) konnte festgestellt werden, dass das vom Benutzer zur Authentisierung eingegebene Passwort an den OpenLDAP-Server zur dortigen Überprüfung übertragen wird. Falls diese Übertragung nicht innerhalb eines gesicherten Netzwerkbereiches erfolgt (Aufteilung auf separaten Tomcat-Rechner und OpenLDAP-Rechner), ist das Risiko des Mitlesens von Passwortinformationen zu berücksichtigen. 5.1.1.1.4 T4: HTTP Connector, DIGEST-Authentisierung, Memory Realm Zunächst erfolgt eine Aktivierung der Memory Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei. Anschließend wird Tomcat neu gestartet. Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die manager Anwendung http://tomcathost:8080/simple_info2/ führte zur Ablehnung des Logins ohne Protokollierung einer Fehlermeldung in $CATALINA_HOME/logs/catalina-<datum>.log. Auch ein Zugriffsversuch mit dem im Test T1 verwendeten Benutzer memuser1 und dem Passwort vmware führte ebenso zu einer Ablehnung des Logins mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser. Ein nachfolgender Zugriff im neu gestarteten Webbrowser mit dem Benutzer memuser2 und dem Passwort vmware auf die manager Anwendung wurde erfolgreich, aber auch ohne Logdateieinträge, durchgeführt. Durch die Verwendung • eines vom Webserver gelieferten Zufallswertes, • dem Benutzernamen, • dem Passwort sowie • der Realm-Information wird ein Digest-Wert berechnet und zum Webserver übertragen. Somit sind keine Passwortinformationen bei der Übertragung vom Webbrowser zum Webserver im Klartext bzw. in einfacher Base64-codierter39 Form sichtbar. Dies konnte beim Mitlesen des Netzwerkverkehrs zwischen diesen beiden Kommunikationspartnern verifiziert werden. 5.1.1.1.5 T5.1: HTTP Connector, FORM-Authentisierung, Memory Realm Zunächst erfolgt eine Aktivierung der Memory Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei. Anschließend wird Tomcat neu gestartet. 39 wie bei der HTTP BASIC-Authentisierung Seite 87 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die simple_info1a Anwendung http://tomcathost:8080/simple_info1a/ führte zur Ablehnung des Logins ohne Protokollierung der Fehlermeldung in $CATALINA_HOME/logs/catalina<datum>.log und Ausgabe der von der Webanwendung bereitgestellten Fehler-Webseite http://tomcathost:8080/simple_info1a/error.jsp im Webbrowser. Auf die gleiche Weise wurde ein Zugriffsversuch mit dem einer anderen Rolle zugeordneten Benutzer memuser2 und dem Passwort vmware abgewiesen, wobei die Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser ausgegeben wurde. Ein nachfolgender Zugriff im neu gestartetem Webbrowser mit dem Benutzer memuser1 und dem Passwort vmware auf die simple_info1a Anwendung wurde erfolgreich und ohne Logdateieinträge durchgeführt. Zu beachten ist bei der Verwendung des FORM-Authentisierungsverfahrens, dass Benutzername und -passwort im Klartext über die HTTP-Verbindung (Tomcat-Frontend) übertragen werden und somit auf dem Weg zwischen dem Webbrowser und dem HTTPConnector von Tomcat abgehört werden kann. Nachfolgend werden der Vollständigkeit halber noch die Varianten JDBC Realm, JNDI Realm sowie Memory Realm mit Digest in Verbindung mit FORM-Authentisierung getestet. 5.1.1.1.6 T5.2: HTTP Connector, FORM-Authentisierung, JDBC Realm Zunächst erfolgt eine Aktivierung der JDBC Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei und ein Restart von Tomcat. Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die simple_info1a Anwendung http://tomcathost:8080/simple_info1a/ führte zur Ablehnung des Logins ohne Protokollierung der Fehlermeldung in $CATALINA_HOME/logs/catalina<datum>.log und Ausgabe der von der Webanwendung bereitgestellten Fehler-Webseite http://tomcathost:8080/simple_info1a/error.jsp im Webbrowser. Auch ein Zugriffsversuch mit dem für eine andere Rolle eingetragenen Benutzer jdbcuser2 und dem zugehörigen gültigen Passwort vmware führte ebenso zu einer Ablehnung des Logins mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser. Ein nachfolgender Zugriff im neu gestarteten Webbrowser mit dem Benutzer jdbcuser1 und dem Passwort vmware auf die simple_admin1a Anwendung wurde erfolgreich und ohne Logdateieinträge durchgeführt. Zu beachten ist bei der Verwendung des FORM-Authentisierungsverfahrens, dass Benutzername und -passwort im Klartext über die HTTP-Verbindung (Tomcat-Frontend) übertragen werden und somit auf dem Weg zwischen dem Webbrowser und dem HTTPConnector von Tomcat abgehört werden kann (analog zum vorigen Test T5.1). Bei der Nach­ verfolgung des Netzwerkverkehrs des Tomcat Servlet Containers mit dem MySQL-Server (Port 3306) konnte festgestellt werden, dass das in der Datenbank gespeicherte Referenz­ passwort für die Authentisierung im Klartext zurück zum Tomcat Servlet Container über­ tragen wird. Falls diese Übertragung nicht innerhalb eines gesicherten Netzwerkbereiches Bundesamt für Sicherheit in der Informationstechnik Seite 88 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests erfolgt (Aufteilung auf separaten Tomcat Rechner und MySQL Rechner), ist das Risiko des Mitlesens von Passwortinformationen zu berücksichtigen. 5.1.1.1.7 T5.3: HTTP Connector, FORM-Authentisierung, JNDI Realm Zunächst erfolgt eine Aktivierung der JNDI Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei. Anschließend wird Tomcat neu gestartet. Der Zugriff mit dem Benutzer invaliduser und dem Passwort invalidpassword auf die simple_info1a Anwendung führte zur Ablehnung des Logins ohne Protokollierung der Fehlermeldung in $CATALINA_HOME/logs/catalina-<datum>.log und Ausgabe der FehlerWebseite http://tomcathost:8080/simple_info1a/error.jsp im Webbrowser. Auch ein Zugriffsversuch mit dem für eine andere Rolle eingetragenen Benutzer jndiuser2 und dem zugehörigen gültigen Passwort vmware führte ebenso zu einer Ablehnung des Logins mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser. Ein nachfolgender Zugriff mit dem Benutzer jndiuser1 und dem Passwort vmware auf die simple_info1a Anwendung wurde erfolgreich und gleichfalls ohne Logdateieintrag durch­ geführt. Zu beachten ist bei der Verwendung des FORM-Authentisierungsverfahrens, dass Benutzername und -passwort im Klartext über die HTTP-Verbindung (Tomcat-Frontend) übertragen werden und somit auf dem Weg zwischen dem Webbrowser und dem HTTPConnector von Tomcat abgehört werden kann (analog zum vorigen Test T5.1). Bei der Nachverfolgung des Netzwerkverkehrs des Tomcat Servlet Containers mit dem OpenLDAPServer (Port 389) konnte festgestellt werden, dass das vom Benutzer zur Authentisierung eingegebene Passwort an den OpenLDAP-Server zur dortigen Überprüfung übertragen wird. Falls diese Übertragung nicht innerhalb eines gesicherten Netzwerkbereiches erfolgt (Aufteilung auf separaten Tomcat Rechner und OpenLDAP Rechner), ist das Risiko des Mitlesens von Passwortinformationen zu berücksichtigen. 5.1.1.1.8 T6: HTTPS Connector, Client Zertifikat Authentisierung, Memory Realm Zunächst erfolgt eine Aktivierung der Memory Realm Authentisierungskonfiguration in der $CATALINA_HOME/conf/server.xml Konfigurationsdatei und ein Restart von Tomcat. Weiterhin wird für die Webanwendungen simple_info1a (freigegeben für die Rolle user1) und simple_info2 (freigegeben für die Rolle user2) in der jeweiligen WEB-INF/web.xml Konfigurationsdatei die Authentisierungsmethode von BASIC auf CLIENT-CERT umgestellt. In der $CATALINA_HOME/conf/tomcat-users.xml Datei sind die beiden Zertifikat-gebunde­ nen Benutzer eingetragen, für die entsprechende Client-Zertifikate im Webbrowser vorhanden sein müssen, um die jeweilige Webanwendung aufrufen zu können. Listing 28: Ergänzte Benutzer mit Client Zertifikat Authentisierung in tomcat_users.xml <user username="CN=memuser1, OU=Testlab, O=BSITomcat ITC-Sec, L=Bonn, ST=NRW, C=DE" password="null" roles="user1"/> <user username="CN=memuser2, OU=Testlab, O=BSITomcat ITC-Sec, L=Bonn, ST=NRW, C=DE" password="null" roles="user2"/> Seite 89 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers In Verbindung mit der CLIENT-CERT Authentisierung erfolgt keine Auswertung der unter password eingetragenen Werte (wie dies bei der BASIC-Authentisierung der Fall wäre), sodass hier beliebige Werte eingetragen sein können. Bei einem Zugriff auf eine geschützte Webseite ohne HTTPS-Verbindung (z. B. http://tomcathost:8080/simple_info1a/ bzw. http://tomcathost:8080/simple_info2/) und damit ohne Austausch von Zertifikatinformationen wird der Zugriff mit der Fehlermeldung „HTTP Status 400 – No client certificate chain in this request“ verweigert. Beim HTTPS-Zugriff auf die Webseite mit einem gültigen aber unpassenden Zertifikat (https://tomcathost:8443/simple_info1a/ mit Zertifikat für eine Rollenzuordnung user2 bzw. https://tomcathost:8443/simple_info2/ mit Zertifikat für eine Rollenzuordnung user1) wird der Zugriff mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ verweigert. Beim HTTPS-Zugriff mit einem für die jeweilige Webseite passenden Zertifikat (https://tomcathost:8443/simple_info1a/ mit Zertifikat für eine Rollenzuordnung user1 bzw. https://tomcathost:8443/simple_info2/ mit Zertifikat für eine Rollenzuordnung user2) ist ein Zugriff möglich. Zu beachten ist hierbei, dass durch die Zwischenspeicherung von für die Authentisierung benötigen Informationen im Webbrowser beim Wechsel in eine andere Rolle der Webbrowser neu gestartet werden muss. Die in der HTTPS-Anfrage übertragenen Zertifikatinformationen können mit der in jeder der betrachteten Webanwendungen installierten JSP-Datei request_data.jsp abgefragt werden (z. B. https://tomcathost:8443/simple_info1a/request_data.jsp). 5.1.1.1.9 T7: AJP1.3 Connector, BASIC-Authentisierung, Memory Realm Die Vorgehensweise ist wie bei Test T1 mit geänderter URL http://tomcathost:80/simple_info1/confidential.jsp, um den Zugriff auf die simple_info1 Anwendung über den vorgeschalteten Apache Webserver mit mod_jk – AJP1.3 durchzuführen. Sowohl bei der Nachverfolgung des HTTP-Netzwerkverkehrs zwischen Webbrowser und Apache Webserver (Frontend) als auch des AJP-Netzwerkverkehrs zwischen dem Apache Webserver (mod_jk Connector Backend) und Tomcat konnten Benutzername und Passwort mitgelesen werden, was bei einer Kommunikation über unsichere Netzwerke zu berücksichtigen ist. Ansonsten sind die Ergebnisse mit denen des Tests T1 vergleichbar. 5.1.1.1.10 T8: AJP1.3 Connector, DIGEST-Authentisierung, Memory Realm Die Vorgehensweise ist wie bei Test T4 mit geänderter URL http://tomcathost:80/simple_user2/, um den Zugriff auf die simple_user2 Anwendung über den vorgeschalteten Apache Webserver mit mod_jk – AJP1.3 durchzuführen. Auch hier konnten wie in Test T7 Benutzername und Passwort im HTTP- wie im AJPNetzwerkverkehr mitgelesen werden. Ansonsten sind die Ergebnisse mit denen des Tests T4 vergleichbar. Bundesamt für Sicherheit in der Informationstechnik Seite 90 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 5.1.1.1.11 T9: AJP1.3 Connector, FORM-Authentisierung, Memory Realm Die Vorgehensweise ist wie bei Test T5.1 mit geänderter URL http://tomcathost:80/simple_user1a/, um den Zugriff auf die simple_user1a Anwendung über den vorgeschalteten Apache Webserver mit mod_jk – AJP1.3 durchzuführen. Auch hier konnten wie in Test T7 Benutzername und Passwort im HTTP- wie im AJPNetzwerkverkehr mitgelesen werden. Ansonsten sind die Ergebnisse mit denen des Tests T5.1 vergleichbar. 5.1.1.1.12 T10: AJP1.3 / SSL Connector, Client Zertifikat Authentisierung, Memory Realm Die Vorbereitungen für Test T10 sind analog zu denen von Test T6. Zusätzlich ist für diesen Test der Apache Webserver mit dem Kommando /opt/httpd-2.0.54/bin/apachectl -f /opt/httpd-2.0.54/conf/httpd.conf -DSSL zu starten. Die Zugriffe erfolgen jetzt über den Apache Webserver mit den URLs http://tomcathost:80/simple_info1a/ bzw. https://tomcathost:443/simple_info1a/ (und analog für die zweite Webanwendung). Die beim Zugriff über den Apache Webserver mit mod_jk sowie dem Tomcat AJP13Connector auf Tomcat erzielten Ergebnisse ähneln denen des Tests T6. 5.1.1.2 Ergebnisse zu Test2 Zum Test von Single Sign On (SSO) werden wiederum die zuvor verwendeten BeispielWebanwendungen (simple_info1, simple_info1a, simple_info2) verwendet. Damit kann nach einer Authentisierung als Benutzer mit der Rollenzuordnung user1 überprüft werden, ob • ohne Aktivierung der SSO-Valve für jede Applikation eine separate Anmeldung erforderlich ist. • bei Aktivierung der SSO-Valve eine Freigabe für alle Ressourcen mit einer Freigabe für die angemeldete Rolle ohne separate Anmeldung erfolgt ist. Für die SSO Tests werden zunächst für alle Webanwendungen die BASIC-Authentisierung eingestellt (in der Datei WEB-INF/web.xml der jeweiligen Webanwendung). 5.1.1.2.1 T11: HTTP Connector, BASIC-Authentisierung, Memory Realm Test ohne Aktivierung des SSO-Valve Ohne Aktivierung des SSO-Valve erfolgt zunächst ein Zugriff auf die allgemein freigegebene Webseite http://tomcathost:8080/simple_info1. Über den dort vorhandenen URL wird die Folgeseite http://tomcathost:8080/simple_info1/confidential.jsp aufgerufen, für die zunächst ein Browser-Popup-Fenster zur HTTP-Authentisierung geöffnet wird. Nach erfolgreicher Ein­ gabe von Benutzer memuser1 und Passwort vmware wird diese Seite dann gleichfalls angezeigt. Seite 91 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info1a erfordert eine erneute Authentisierung. Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info2 erfordert eine Authentika­ tion mit dem Benutzer memuser2 und Passwort vmware. Wird die Authentisierung mit der zuvor verwendeten Benutzer memuser1 / Passwort vmware Kombination versucht, so erhält man die Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser zurück. Test mit Aktivierung des SSO-Valve Es erfolgt nach der Aktivierung des SSO-Valve (zusätzlicher Eintrag <Valve className=“org.apache.catalina.authenticator.SingleSignOn“/> in der <Host>-Section der Datei $CATALINA_HOME/conf/server.xml, s. [Moczar] S. 657) ein Zugriff auf die allgemein freigegebene Webseite http://tomcathost:8080/simple_info1. Über den dort vorhandenen URL wird die Folgeseite http://tomcathost:8080/simple_info1/confidential.jsp aufgerufen, für die zunächst ein Browser-Popup-Fenster zur HTTP-Authentisierung geöffnet wird. Nach erfolgreicher Eingabe von Benutzer memuser1 und Passwort vmware wird diese Seite dann gleichfalls angezeigt. Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info1a erwartungsgemäß keine erneute Authentisierung. erfordert jetzt Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info2 wird unmittelbar mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser quittiert. Ein erneutes Login-Fenster wird hier – im Gegensatz zum Test ohne SSO – nicht angezeigt. Der Webbrowser verbleibt also im Kontext der zuvor authentisierten Rolle user1, für den die Webanwendung simple_info2 nicht freigegeben ist, was zur festgestellten Abweisung führt. Nach Abschluss des SSO-Tests wird die $CATALINA_HOME/conf/server.xml wieder entfernt. eingefügte SSO-Valve-Zeile in 5.1.1.2.2 T12: HTTP Connector, DIGEST-Authentisierung, Memory Realm Zur Durchführung der Tests mit DIGEST-Authentisierung wird in den drei Anwendungen (simple_info1, simple_info1a, simple_info2) in der Tomcat-Konfigurationsdatei WEBINF/web.xml die Authentisierungsmethode von <auth-method>BASIC</auth-method> auf <auth-method>FORM</auth-method> umgestellt (s. [Moczar], S. 316 ff.). Die Testdurchführung und die dabei gewonnenen Ergebnisse sind mit denen aus Test T11 vergleichbar. 5.1.1.2.3 T13.1: HTTP Connector, FORM-Authentisierung, Memory Realm Zur Durchführung der Tests mit FORM-Authentisierung werden in den drei Anwendungen (simple_info1, simple_info1a, simple_info2) in der Tomcat-Konfigurationsdatei WEBINF/web.xml jeweils die Einträge innerhalb des <login-config> Abschnitts ergänzt und die Bundesamt für Sicherheit in der Informationstechnik Seite 92 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Authentisierungsmethode von <auth-method>BASIC</auth-method> method>FORM</auth-method> umgestellt (s. [Moczar], S. 316 ff.): auf <auth- Listing 29: Ergänzung in den Konfigurationsdateien WEB-INF/web.xml <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> Test ohne Aktivierung des SSO-Valve Ohne Aktivierung des SSO-Valve erfolgt zunächst ein Zugriff auf die allgemein freigegebene Webseite http://tomcathost:8080/simple_info1. Über den dort vorhandenen URL wird die Folgeseite http://tomcathost:8080/simple_info1/confidential.jsp aufgerufen, für die zunächst die automatisch die zur Anwendung gehörige Authentisierungs-Webseite http://tomcathost:8080/simple_info1/login.jsp geöffnet wird. Nach erfolgreicher Eingabe von Benutzer memuser1 und Passwort vmware wird diese Seite dann gleichfalls angezeigt. Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info1a erfordert eine erneute Authentisierung mit der der neuen Applikation entsprechenden Authentisierungs-Webseite http://tomcathost:8080/simple_info1a/login.jsp. Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info2 erfordert eine Authentisierung mit dem Benutzer memuser2 und Passwort vmware über die automatisch geöffnete und zur Anwendung gehörige Authentisierungs-Webseite http://tomcathost:8080/simple_info2/login.jsp. Wird die Authentisierung mit der zuvor verwendeten Benutzer memuser1 / Passwort vmware Kombination versucht, so erhält man die Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser zurück. Hinweis: Wird eine komplett ungültige Benutzer / Passwort Kombination verwendet, so erscheint die unter <form-error-page> angegebene Fehlerseite der jeweiligen Anwendung, z. B. http://tomcathost:8080/simple_info2/error.jsp. Wurde bei der Anmeldung eine gültige Kombination von Benutzer / Passwort verwendet, wobei die diesem Benutzer zugeordneten Rollen nicht auf diejenigen passen, für die die Anwendung freigegeben wurden, erhält man hingegen die Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser zurück. Es ist evtl. noch weiter zu untersuchen, ob sich hieraus Angriffsszenarien ableiten lassen, da über die HTTP-Fehlermeldung indirekt bestätigt wurde, dass die verwendete Benutzer / Passwort Kombination in einem anderen Webanwendungskontext gültig sein könnte. Test mit Aktivierung des SSO-Valve Es erfolgt nach der Aktivierung des SSO-Valve durch den zusätzlichen Eintrag <Valve className=“org.apache.catalina.authenticator.SingleSignOn“/> in der <Host>-Section der Datei $CATALINA_HOME/conf/server.xml, s. [Moczar] S. 657, ein Zugriff auf die allgemein freigegebene Webseite http://tomcathost:8080/simple_info1. Über den dort vorhandenen URL wird die Folgeseite Seite 93 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers http://tomcathost:8080/simple_info1/confidential.jsp aufgerufen, für die zunächst die Authentisierung-Webseite http://tomcathost:8080/simple_info1/login.jsp automatisch geöffnet wird. Nach erfolgreicher Eingabe von Benutzer memuser1 und Passwort vmware wird diese Seite dann gleichfalls angezeigt. Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info1a erfordert jetzt erwar­ tungsgemäß keine erneute Authentisierung mehr, da hierfür die gleiche Rollenfreigabe vorliegt wie in der vorigen Applikation. Ein Wechsel auf die Webseite http://tomcathost:8080/simple_info2 wird unmittelbar mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser quittiert, da die Anmeldung in der für die beiden vorigen Applikationen benötigten Rolle erfolgreich durchgeführt wurde, diese Rolle jedoch nicht für die aktuelle Anwendung zugelassen ist. Nach Abschluss des SSO-Tests wird die $CATALINA_HOME/conf/server.xml wieder entfernt. eingefügte SSO-Valve-Zeile in 5.1.1.2.4 T13.2: HTTP Connector, gemischte BASIC- und FORM-Authentisierung, Memory Realm Im folgenden Test erfolgt die Authentisierung der Webanwendungen simple_info1 und simple_info2 mit BASIC-Authentisierung und simple_info1a mit FORM-Authentisierung. Test ohne Aktivierung des SSO-Valve Der erste Test beginnt mit dem Aufruf der per BASIC-Authentisierung gesicherten Webseite http://tomcathost:8080/simple_info1/confidential.jsp, wo die HTTP-Authentisierungsabfrage per Browser-Popup-Fenster durchgeführt wird (Benutzer memuser1 / Passwort vmware). Anschließend kann nach erneuter Authentisierung auf die per FORM-Authentisierung gesicherte Webseite http://tomcathost:8080/simple_info1a zugegriffen werden. Auch der Zugriff auf die nur für eine andere Rolle freigegebene Webseite http://tomcathost:8080/simple_info2 ist erst nach erneuter HTTP-Authentisierung per Browser-Popup-Fenster möglich. Das gleiche Resultat von jeweils individueller Authentisierung je Applikation erhält man durch geänderte Aufrufreihenfolge der Webseiten (im zweiten Test: http://tomcathost:8080/simple_info1a, http://tomcathost:8080/simple_info1/confidential.jsp und http://tomcathost:8080/simple_info2, im dritten Test http://tomcathost:8080/simple_info2, http://tomcathost:8080/simple_info1/confidential.jsp und http://tomcathost:8080/simple_info1 ). Test mit Aktivierung des SSO-Valve Es erfolgt zunächst die Aktivierung des SSO-Valve durch den zusätzlichen Eintrag <Valve className=“org.apache.catalina.authenticator.SingleSignOn“/> in der <Host>-Section der Datei $CATALINA_HOME/conf/server.xml, s. [Moczar] S. 657, und ein Neustart von Tomcat. Bundesamt für Sicherheit in der Informationstechnik Seite 94 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Der erste Test beginnt mit dem Aufruf der per BASIC-Authentisierung gesicherten Webseite http://tomcathost:8080/simple_info1/confidential.jsp, wo die HTTP-Authentisierungsabfrage per Browser-Popup-Fenster durchgeführt wird (Benutzer memuser1 / Passwort vmware). Anschließend kann ohne weitere Authentisierung auf die per FORM-Authentisierung gesicherte Webseite http://tomcathost:8080/simple_info1a zugegriffen werden, nicht jedoch auf die nur für eine andere Rolle freigegebene Webseite http://tomcathost:8080/simple_info2. Hier wird die Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser zurück gegeben. Im zweiten Test wird zuerst die FORM-Authentisierung in der Reihenfolge der Abfragen http://tomcathost:8080/simple_info1a, http://tomcathost:8080/simple_info1/confidential.jsp und schließlich http://tomcathost:8080/simple_info2 durchgeführt und das gleiche erwartete Verhalten erzielt. Im dritten Test wird nach einer HTTP-Authentisierung als Benutzer memuser2 / Passwort vmware per Browser-Popup-Fenster über die BASIC-Authentisierung in Verbindung mit der Webseite http://tomcathost:8080/simple_info2 der Zugriff auf die beiden anderen gesicherten Webanwendungen mit Rückgabe der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser erwartungsgemäß blockiert. Nach Abschluss des SSO-Tests wird die $CATALINA_HOME/conf/server.xml wieder entfernt. eingefügte SSO-Valve-Zeile in 5.1.1.2.5 T14: HTTPS Connector, Client Zertifikat Authentisierung, Memory Realm Zum Test werden die beiden Webanwendungen simple_info1 (mit BASIC-Authentisierung) und simple_info1a (mit CLIENT-CERT-Authentisierung) verwendet. Es erfolgt zunächst die Aktivierung des SSO-Valve durch den zusätzlichen Eintrag <Valve className=“org.apache.catalina.authenticator.SingleSignOn“/> in der <Host>-Section der Datei $CATALINA_HOME/conf/server.xml, s. [Moczar] S. 657, und ein Neustart von Tomcat. Zuerst erfolgt ein Zugriff mit HTTP-Authentisierung als Benutzer memuser1 / Passwort vmware auf die geschützte Webseite https://tomcathost:8443/simple_info1/confidential.jsp durchgeführt. Es folgt ein Zugriff auf die für die gleiche Rolle freigegebene Webseite https://tomcathost:8443/simple_info1a/index.jsp, der korrekt und ohne weitere Authenti­ sierung zugelassen wird. Ein Zugriff auf die für eine andere Rolle freigegebene Webseite https://tomcathost:8443/simple_info2/index.jsp wird hingegen mit Rückgabe der Fehlermel­ dung „HTTP Status 403 – Access to the requested resource has been denied“ im Web­ browser erwartungsgemäß blockiert. Im zweiten Versuch erfolgte zuerst ein Zugriff mit HTTP-Authentisierung als Benutzer memuser1 / Passwort vmware auf die geschützte Webseite http://tomcathost:8080/simple_info1/confidential.jsp. Es folgt ein Zugriff auf die für die gleiche Rolle freigegebene Webseite http://tomcathost:8080/simple_info1a/index.jsp, der korrekt und ohne weitere Authentisierung zugelassen wird. Seite 95 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Es konnte festgestellt werden, dass beim Zugriff auf die per BASIC-Authentisierung geschützte Webanwendung simple_info1 ein beliebiges gültiges Zertifikat im Rahmen der erforderlichen Client-Authentisierung des HTTPS-Verbindungsaufbaus vorgelegt werden kann, ohne dass die Verbindung abgewiesen wird. Wird dann nach erfolgreicher HTTPAuthentisierung in die durch CLIENT-CERT-Authentisierung geschützte Webanwendung simple_info1a gewechselt, so ist kein gültiges Zertifikat erforderlich, da die Authentisierung bereits erfolgreich per HTTP-Authentisierung durchgeführt wurde. Falls beide Bereiche derselben Rolle zugeordnet sind, ist der Zugang in einen Webanwendungsbereich, der durch eine stärkere CLIENT-CERT-Authentisierung geschützt ist, auf diese Weise über den SSOValve, wegen der schwachen HTTP-Authentisierung möglich. Die überprüften Zugriffs­ szenarien sind in den folgenden Abbildungen aufgezeichnet: Abbildung 5.1.: Zugriffsszenario beginnend mit Webanwendung simple_info1 und HTTP-Erstzugriff Beim in Abbildung 5.1 dargestellten Aufruf des geschützten Bereichs von Webanwendung simple_info1 erfolgt eine HTTP-Authentisierung, deren Ergebnis auch zum Wechsel in die für die gleiche Rolle freigegebene Webanwendung simple_info1a verwendet wird. Ein Wechsel in die für eine andere Rolle freigegebene Webanwendung simple_info2 wird hingegen abgewiesen. Beim Wechsel in den HTTPS-Bereich ist in der eingestellten HTTPS-Konfigura­ tion ein Client-Zertifikat vorzulegen. Dies hat aber offenbar im o. g. Zugriffsszenario keine weitergehende Bedeutung bei der Authentisierung. Trotz der Verwendung des Zertifikats für einen Benutzer mit Berechtigung für die Rolle user2 ist es nicht möglich, aus der Webanwendung simple_info1a (HTTPS) zur Webanwendung simple_info2 (HTTPS) zu wechseln (unterer horizontaler Pfeil). Bundesamt für Sicherheit in der Informationstechnik Seite 96 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Abbildung 5.2.: Zugriffsszenario beginnend mit Webanwendung simple_info1 und HTTPS-Erstzugriff Der in Abbildung 5.2 dargestellten Fall des Zugriffs auf die Webanwendung simple_info1 keine Client-Zertifikat-Authentisierung erfolgt, genügt auch hier bei der erstmaligen HTTPSVerbindung die Vorlage eines beliebigen gültigen Zertifikats (hier das für die Rolle user2), das aber auch hier offenbar nicht weiter ausgewertet wird, da nach einer erfolgreichen HTTP-Authentisierung der Zugriff auf die Webseiten der Applikation simple_info1a möglich sind. Abb. 5.3.: Zugriffsszenario beginnend mit Webanwendung simple_info1a und HTTPS-Erstzugriff Seite 97 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Beginnt die Zugriffssequenz wie in Abb. 5.3 dargestellt mit der durch CLIENT-CERT Authentisierung geschützten Webanwendung simple_info1a, so muss ein dafür gültiges Client-Zertifikat vorgelegt werden. Nachfolgende Zugriffe auf Webseiten der durch BASICAuthentisierung geschützten Webanwendung simple_info1 sind dann durch das SSO-Valve ohne weitere Authentisierung möglich. Ein Zugriff auf Webseiten der Webanwendung simple_info2 wird erwartungsgemäß mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser abgewiesen. 5.1.1.2.6 T15: AJP1.3 Connector, BASIC-Authentisierung, Memory Realm Die Ergebnisse in Test 15 sind mit denen aus Test 11 vergleichbar. Hierbei wurden jedoch die URLs http://tomcathost/simple_info1, http://tomcathost/simple_info1a bzw. http://tomcathost/simple_info2 verwendet (ohne Angabe der Portnummer :8080). 5.1.1.2.7 T16: AJP1.3 Connector, DIGEST-Authentisierung, Memory Realm Die Ergebnisse in Test 16 sind mit denen aus Test 12 vergleichbar. Hierbei wurden jedoch die URLs http://tomcathost/simple_info1, http://tomcathost/simple_info1a bzw. http://tomcathost/simple_info2 verwendet (ohne Angabe der Portnummer :8080). 5.1.1.2.8 T17.1: AJP1.3 Connector, FORM-Authentisierung, Memory Realm Die Ergebnisse in Test 17.1 sind mit denen aus Test 13.1 vergleichbar. Hierbei wurden jedoch die URLs http://tomcathost/simple_info1, http://tomcathost/simple_info1a bzw. http://tomcathost/simple_info2 verwendet (ohne Angabe der Portnummer :8080), um die Verbindung zum Tomcat Servlet Container über den Apache Webserver und das mod_jkModul zu testen. 5.1.1.2.9 T17.2: AJP Connector, gemischte BASIC- und FORM-Authentisierung, Memory Realm Die Ergebnisse in Test 17.2 sind mit denen aus Test 13.2 vergleichbar. Hierbei wurden jedoch die URLs http://tomcathost/simple_info1, http://tomcathost/simple_info1a bzw. http://tomcathost/simple_info2 verwendet (ohne Angabe der Portnummer :8080), um die Verbindung zum Tomcat Servlet Container über den Apache Webserver und das mod_jkModul zu testen. 5.1.1.2.10 T18: AJP1.3 / SSL Connector, Client Zertifikat Authentisierung, Memory Realm Die Vorbereitungen für Test T18 sind analog zu denen von Test T14. Zusätzlich ist für diesen Test der Apache Webserver mit dem Kommando /opt/httpd-2.0.54/bin/apachectl -f /opt/httpd-2.0.54/conf/httpd.conf -DSSL zu starten. Die Zugriffe erfolgen jetzt über den Apache Webserver mit den URLs http://tomcathost:80/simple_info1a/ bzw. https://tomcathost:443/simple_info1a/ (und analog für die zweite Webanwendung). Bundesamt für Sicherheit in der Informationstechnik Seite 98 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Die beim Zugriff über den Apache Webserver mit mod_jk sowie dem Tomcat AJP13Connector auf Tomcat erzielten Ergebnisse sind mit denen des Tests T14 vergleichbar. Einzig bei Zugriffen auf HTTPS-Webseiten erfolgt im Unterschied zu Test T14 eine doppelte Abfrage des zu verwendenden Client-Zertifikats. 5.1.1.3 Ergebnisse zu Test3 Zum Test der Berücksichtigung von Änderungen in der Authentisierungsdatenbank wird die Applikation simple_info2 verwendet, die über die beiden Webseiten http://tomcathost/simple_info2/index.jsp und http://tomcathost/simple_info2/confidential.jsp (in Verbindung mit dem AJP Connector bzw. in Verbindung mit dem HTTP Connector unter zusätzlicher Angabe der Portnummer :8080 in der URL). 5.1.1.3.1 T19.1: HTTP Connector, BASIC-Authentisierung, Memory Realm Nach einer Erstverbindung zu http://tomcathost:8080/simple_info2/index.jsp und der erforderlichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem Browser-Popup-Fenster wird das Passwort in der Datei $CATALINA_HOME/conf/tomcatusers.xml mit einem Texteditor modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen. Da die neue Passwortinfor­ mation von Tomcat nicht übernommen wurde, war der zweite Zugriff möglich. Im zweiten Test wird statt eines Texteditors die Tomcat admin Webanwendung zur Änderung des Passwortes verwendet, nachdem die Erstverbindung nach http://tomcathost:8080/simple_info2/index.jsp mit der erforderlichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem Browser-Popup-Fenster geöffnet wurde. Wird nach der Passwortänderung auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen, so erscheint erneut ein Browser-Popup-Fenster zur Authentisierung. Hier ist jetzt das neu gesetzte Passwort einzugeben, um auf die Webseite zugreifen zu können. Im Gegensatz zum ersten Test übernimmt Tomcat die per admin Webanwendung geänderte Passwortinformation sofort. 5.1.1.3.2 T19.2: HTTP Connector, BASIC-Authentisierung, JDBC Realm Nach einer Erstverbindung zu http://tomcathost:8080/simple_info2/index.jsp und der erfor­ derlichen HTTP-Authentisierung mit Benutzer jdbcuser2 / Passwort vmware in einem Browser-Popup-Fenster wird das Passwort in der MySQL-Datenbank modifiziert: Listing 30: Kommandos zur Passwort-Änderung in der MySQL-Datenbank mysql> use authority; mysql> update users set user_pass = “<neues_passwort>“ where user_name = “jdbcuser2“; Anschließend wird über http://tomcathost:8080/simple_info2/confidential.jsp auf die zweite Webseite zugegriffen. Hierzu werden die geänderten Authentisierungsinformationen in einem Browser-Popup-Fenster abgefragt. Somit übernimmt Tomcat die geänderten Passwortinformationen sofort. Nach Durchführung des Tests wird das Passwort in der Datenbank für weitere Tests wieder auf den ursprünglichen Zustand zurück gesetzt. Seite 99 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.1.1.3.3 T19.3: HTTP Connector, BASIC-Authentisierung, JNDI Realm Nach einer Erstverbindung zu http://tomcathost:8080/simple_info2/index.jsp und der erforderlichen HTTP-Authentisierung mit Benutzer jndiuser2 / Passwort vmware in einem Browser-Popup-Fenster wird das Passwort in der LDAP-Datenbank mit dem LDAP-Browser gq modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen. Hierzu werden die geänderten Authentisierungsinformationen in einem Browser-Popup-Fenster abgefragt. Somit übernimmt Tomcat die geänderten Passwortinformationen sofort. 5.1.1.3.4 T20: HTTP Connector, DIGEST-Authentisierung, Memory Realm Nach einer Erstverbindung zu http://tomcathost:8080/simple_info2/index.jsp und der erforderlichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem Browser-Popup-Fenster wird das Passwort in der Datei $CATALINA_HOME/conf/tomcatusers.xml mit einem Texteditor modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen. Da die neue Passwortinfor­ mation von Tomcat nicht übernommen wurde, war der zweite Zugriff möglich. Im zweiten Test wird statt eines Texteditors die Tomcat admin Webanwendung zur Änderung des Passwortes verwendet, nachdem die Erstverbindung nach http://tomcathost:8080/simple_info2/index.jsp mit der erforderlichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem Browser-Popup-Fenster geöffnet wurde. Wird nach der Passwortänderung auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen, so erscheint erneut ein Browser-Popup-Fenster zur HTTP-Authentisierung. Hier ist jetzt das neu gesetzte Passwort einzugeben, um auf die Webseite zugreifen zu können. Im Gegensatz zum ersten Test übernimmt Tomcat die per admin Webanwendung geänderte Passwortinformation sofort. 5.1.1.3.5 T21: HTTP Connector, FORM-Authentisierung, Memory Realm Zur Durchführung der Tests mit FORM-Authentisierung werden der Tomcat-Konfigurations­ datei $CATALINA_HOME/webapps/simple_info2/WEB-INF/web.xml jeweils die Einträge innerhalb des <login-config> Abschnitts ergänzt und die Authentisierungsmethode von <auth-method>BASIC</auth-method> auf <auth-method>FORM</auth-method> umgestellt (s. [Moczar], S. 316 ff.). Listing 31: Ergänzung in der Konfigurationsdatei der Webanwendung WEB-INF/web.xml <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> Nach einer Erstverbindung zu http://tomcathost:8080/simple_info2/index.jsp und der erforderlichen Authentisierung mit Benutzer memuser2 / Passwort vmware in der automatisch aufgerufenen Webseite http://tomcathost:8080/simple_info2/login.jsp wird das Passwort in der Datei $CATALINA_HOME/conf/tomcat-users.xml mit einem Texteditor modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen. Da die neue Passwortinfor­ mation von Tomcat nicht übernommen wurde, war der zweite Zugriff möglich. Bundesamt für Sicherheit in der Informationstechnik Seite 100 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Im zweiten Test wird statt eines Texteditors die Tomcat admin Webanwendung zur Änderung des Passwortes verwendet, nachdem die Erstverbindung nach http://tomcathost:8080/simple_info2/index.jsp mit der erforderlichen Authentisierung mit Benutzer memuser2 / Passwort vmware in der automatisch aufgerufenen Webseite http://tomcathost:8080/simple_info2/login.jsp geöffnet wurde. Wird nach der Passwortänderung auf die zweite Webseite http://tomcathost:8080/simple_info2/confidential.jsp zugegriffen, so ist diese im Gegensatz zur BASIC-Authentisierung ohne weitere Authentisierung möglich. Die per admin Webanwendung geänderte Passwortinformation werden somit nicht sofort verwendet. 5.1.1.3.6 T22: HTTPS Connector, Client Zertifikat Authentisierung, Memory Realm Nach der Erstverbindung zu https://tomcathost:8443/simple_info2/ werden die Rollenzuord­ nungen der beiden Zertifikat-gebundenen Benutzer in der Datei $CATALINA_HOME/conf/tomcat_users.xml vertauscht (roles: user1 ↔ user2). Listing 32: Änderung in der Tomcat-Benutzer-Konfigurationsdatei tomcat_users.xml <user username="CN=memuser1, OU=Testlab, O=BSITomcat ITC-Sec, L=Bonn, ST=NRW, C=DE" password="null" roles="user1"/> <user username="CN=memuser2, OU=Testlab, O=BSITomcat ITC-Sec, L=Bonn, ST=NRW, C=DE" password="null" roles="user2"/> Anschließend erfolgt ein Zugriff auf die gleichfalls für die ursprüngliche Rolle freigegebene Webseite https://tomcathost:8443/simple_info2/confidential.jsp. Bei einer Änderung mit einem Texteditor werden im Test die Modifikationen der Zugriffs­ berechtigungen erst mit einem Neustart von Tomcat wirksam, sodass der Zugriff auf die zweite Webseite nicht abgewiesen wird. Bei einer Änderung über die admin Webanwendung ist die Änderung im Test hingegen sofort wirksam, sodass der zweite Zugriff mit einer Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser abgewiesen wird, da die im Webbrowser gespeicherten Kontext- (Session) und Authentikationsinformationen nun nicht mehr zu den geänderten Einstellungen passen. 5.1.1.3.7 T23.1: AJP1.3 Connector, BASIC-Authentisierung, Memory Realm Nach einer Erstverbindung zu http://tomcathost/simple_info2/index.jsp und der erforder­ lichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem BrowserPopup-Fenster wird das Passwort in der Datei $CATALINA_HOME/conf/tomcat-users.xml mit einem Texteditor modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen. Da die neue Passwortinformation von Tomcat nicht übernommen wurde, war der zweite Zugriff möglich. Im zweiten Test wird statt eines Texteditors die Tomcat admin Webanwendung zur Änderung des Passwortes verwendet, nachdem die Erstverbindung nach http://tomcathost/simple_info2/index.jsp mit der erforderlichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem Browser-Popup-Fenster geöffnet wurde. Wird nach der Passwortänderung auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen, so erscheint erneut ein BrowserSeite 101 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Popup-Fenster zur HTTP-Authentisierung. Hier ist jetzt das neu gesetzte Passwort einzugeben, um auf die Webseite zugreifen zu können. Im Gegensatz zum ersten Test übernimmt Tomcat die per admin Webanwendung geänderte Passwortinformation sofort. 5.1.1.3.8 T23.2: AJP1.3 Connector, BASIC-Authentisierung, JDBC Realm Nach einer Erstverbindung zu http://tomcathost/simple_info2/index.jsp und der erforder­ lichen HTTP-Authentisierung mit Benutzer jdbcuser2 / Passwort vmware in einem BrowserPopup-Fenster wird das Passwort in MySQL-Datenbank modifiziert: Listing 33: Kommandos zur Passwort-Änderung in der MySQL-Datenbank mysql> use authority; mysql> update users set user_pass = “<neues_passwort>“ where user_name = “jdbcuser2“; Anschließend wird auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen. Hierzu werden die geänderten Authentisierungsinformationen in einem BrowserPopup-Fenster abgefragt. Somit übernimmt Tomcat die geänderten Passwortinformationen sofort. Nach Durchführung des Tests wird das Passwort in der Datenbank für weitere Tests wieder auf den ursprünglichen Zustand zurück gesetzt. 5.1.1.3.9 T23.3: AJP1.3 Connector, BASIC-Authentisierung, JNDI Realm Nach einer Erstverbindung zu http://tomcathost/simple_info2/index.jsp und der erforderlichen HTTP-Authentisierung mit Benutzer jndiuser2 / Passwort vmware in einem Browser-Popup-Fenster wird das Passwort in der LDAP-Datenbank mit dem LDAP-Browser gq modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen. Daraufhin werden die geänderten Authentisierungsinformationen in einem Browser-Popup-Fenster abgefragt. Mit den überschriebenen Authentisierungsinformationen ist ein Zugriff nicht mehr möglich. 5.1.1.3.10 T24: AJP1.3 Connector, DIGEST-Authentisierung, Memory Realm Zur Durchführung der Tests mit DIGEST-Authentisierung wird in der Tomcat-Konfigurations­ datei $CATALINA_HOME/webapps/simple_info2/WEB-INF/web.xml die Authentikationsme­ thode von <auth-method>BASIC</auth-method> auf <auth-method>FORM</auth-method> umgestellt und Tomcat neu gestartet. Nach einer Erstverbindung zu http://tomcathost/simple_info2/index.jsp und der erforder­ lichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem BrowserPopup-Fenster wird das Passwort in der Datei $CATALINA_HOME/conf/tomcat-users.xml mit einem Texteditor modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen. Da die neue Passwortinformation von Tomcat nicht übernommen wurde, war der zweite Zugriff möglich. Im zweiten Test wird statt eines Texteditors die Tomcat admin Webanwendung zur Änderung des Passwortes verwendet, nachdem die Erstverbindung nach http://tomcathost/simple_info2/index.jsp mit der erforderlichen HTTP-Authentisierung mit Benutzer memuser2 / Passwort vmware in einem Browser-Popup-Fenster geöffnet wurde. Wird nach der Passwortänderung auf die zweite Webseite Bundesamt für Sicherheit in der Informationstechnik Seite 102 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests http://tomcathost/simple_info2/confidential.jsp zugegriffen, so erscheint erneut ein BrowserPopup-Fenster zur HTTP-Authentisierung. Hier ist jetzt das neu gesetzte Passwort einzugeben, um auf die Webseite zugreifen zu können. Im Gegensatz zum ersten Test übernimmt Tomcat die per admin Webanwendung geänderte Passwortinformation sofort. 5.1.1.3.11 T25: AJP1.3 Connector, FORM-Authentisierung, Memory Realm Zur Durchführung der Tests mit FORM-Authentisierung werden in der TomcatKonfigurationsdatei $CATALINA_HOME/webapps/simple_info2/WEB-INF/web.xml die Einträge innerhalb des <login-config> Abschnitts ergänzt und die Authentisierungsmethode von <auth-method>BASIC</auth-method> auf <auth-method>FORM</auth-method> umgestellt (s. [Moczar], S. 316 ff.) und Tomcat neu gestartet. Listing 34: Ergänzung in der Konfigurationsdatei der Webanwendung WEB-INF/web.xml <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> Nach einer Erstverbindung zu http://tomcathost/simple_info2/index.jsp und der erforderlichen Authentisierung mit Benutzer memuser2 / Passwort vmware in der automatisch aufgerufenen Webseite http://tomcathost/simple_info2/login.jsp wird das Passwort in der Datei $CATALINA_HOME/conf/tomcat-users.xml mit einem Texteditor modifiziert. Anschließend wird auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen. Da die neue Passwortinformation von Tomcat nicht übernommen wurde, war der zweite Zugriff möglich. Im zweiten Test wird statt eines Texteditors die Tomcat admin Webanwendung zur Änderung des Passwortes verwendet, nachdem die Erstverbindung nach http://tomcathost/simple_info2/index.jsp mit der erforderlichen Authentisierung mit Benutzer memuser2 / Passwort vmware in der automatisch aufgerufenen Webseite http://tomcathost/simple_info2/login.jsp geöffnet wurde. Wird nach der Passwortänderung auf die zweite Webseite http://tomcathost/simple_info2/confidential.jsp zugegriffen, so ist diese im Gegensatz zur BASIC-Authentisierung ohne weitere Authentisierung möglich. Die per admin Webanwendung geänderte Passwortinformation werden somit nicht sofort verwendet. Somit entsprechen die Ergebnisse denen aus Test T21. 5.1.1.3.12 T26: AJP1.3 / SSL Connector, Client Zertifikat Memory Realm Test T26 wird analog zu Test T22 durchgeführt, wobei https://tomcathost:443/simple_info2/ https://tomcathost:443/simple_info2/confidential.jsp verwendet werden. Authentisierung, jetzt die URLs bzw. Das Verhalten entspricht im Fall der Änderung der Authentisierungsinformationen per Texteditor demjenigen aus Test22. Seite 103 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Nach einer Änderung mit der admin Webanwendung hingegen wird der Zugriff auf die zweite Webseite nicht sofort mit einer Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser abgewiesen sondern es erfolgt eine erneute Abfrage eines Client-Zertifikates. Wenn dies zu den geänderten Autorisierungsinformationen passt, ist eine Fortsetzung der Web-Session möglich. Wird hingegen das für den ersten Zugriff verwendete Zertifikat, das nach der Änderung nun nicht mehr zu den Autorisierungsinformationen passt, vorgelegt, so wird der Zugriff mit der Fehlermeldung „HTTP Status 403 – Access to the requested resource has been denied“ im Webbrowser abgewiesen. 5.1.2 Funktionale Tests für die Zugriffskontrolle Für die drei Möglichkeiten der Zugriffskontrolle in Tomcat sind die im folgenden aufgelisteten unterschiedlichen Tests vorgesehen. 5.1.2.1 Tests der Zugriffsrechte auf dem Niveau der Java Virtual Machine Wird Tomcat ohne Java Security Manager gestartet, so können Webanwendungen u. a. • Tomcat beenden, • einen neuen Prozess erzeugen, • einen Netzwerk-Socket öffnen und darüber Daten übertragen, • auf das Dateisystem mit den Rechten des Tomcat zugreifen sowie • auf interne Tomcat-Komponente (Java Pakete, Classes) zugreifen, die mit erhöhten Rechten laufen. Aus diesen Gründen sollte Tomcat in produktiven Umgebungen immer mit einer Java Security Policy gestartet werden. Als Ausgangsbasis für die Tests dient die Java Security Policy, die mit Tomcat mitgeliefert und in den Konfigurationsdateien catalina.policy und catalina.properties definiert wird. Die Test-Webanwendungen (JSP oder Servlet, je nachdem, welche Fähigkeit benötigt wird) werden für die einzelnen Tests erstellt. Im Test wird überprüft, ob die oben genannten Möglichkeiten bei eingeschalteter Default Security Policy für die entsprechende TestWebanwendung nur entsprechend der Dokumentation des Tomcat möglich sind: Bundesamt für Sicherheit in der Informationstechnik Seite 104 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Test Nr. T 27 T 28 T 29 T 30 T 31 T 32 Durchführung der Tests Beschreibung Tomcat beenden möglich? Einen neuen Prozess erzeugen möglich? Einen Netzwerk-Socket öffnen und darüber Daten übertragen möglich? Das Lesen / Schreiben / Ausführen / Löschen einer Datei40 innerhalb des Verzeichnisses der Webanwendung möglich? Das Lesen / Schreiben / Ausführen / Löschen einer Datei außerhalb des Verzeichnisses der Webanwendung möglich? Zugriff auf Tomcat-eigene Komponenten möglich? (Java-Pakete mit Namen wie sun.*, org.apache.catalina.*, ...) erwartetes Bemerkung Resultat Nein Nein Nein Nur Lesen41 (laut Dokumentation möglich) Nein Nein (laut Vorgaben aus der Datei catalina.proper­ ties) Tabelle 4: Funktionale Tests der Zugriffskontrolle auf dem Niveau der Java Virtual Machine 5.1.2.1.1 T27 Tomcat beenden Es wird ein Servlet definiert, welches i. W. die folgende Zeile enthält: java.lang.System.exit(9); Bei eingeschalteter Security Policy wird der Aufruf des Servlets mit HTTP-Status 500 quittiert (500 bedeutet laut HTTP-Protokoll Server-interner Fehler). Beim Backtrace erscheint im Browser deutlich der Eingriff des Security Managers von Java: The server encountered an internal error () that prevented it from fulfilling this request. java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkExit(SecurityManager.java:744) java.lang.Runtime.exit(Runtime.java:88) java.lang.System.exit(System.java:868) Der Backtrace ist tatsächlich umfangreicher und wird in den folgenden Tests nur noch um den konstanten Teil verkürzt dargestellt: javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419) org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:133) javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 40 41 Die Zugriffsrechte werden auf Dateisystem-Ebene so gesetzt, dass der Tomcat Prozess die erforderlichen Rechte hat. Der Zugriff soll auf Ebene der Anwendung verweigert werden, während das Betriebssystem ihn zulassen würde. Im Feinkonzept stand hier „Ja“. Jedoch werden sowohl in der Tomcat-Dokumentation in http://tomcat.apache.org/tomcat5.5-doc/security-manager-howto.html als auch in der Datei catalina.policy lediglich Leserechte aufgeführt. Seite 105 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:585) org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243) java.security.AccessController.doPrivileged(Native Method) javax.security.auth.Subject.doAsPrivileged(Subject.java:517) org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275) org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161) java.security.AccessController.doPrivileged(Native Method) filters.ExampleFilter.doFilter(ExampleFilter.java:101) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:585) org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243) java.security.AccessController.doPrivileged(Native Method) javax.security.auth.Subject.doAsPrivileged(Subject.java:517) org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275) org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:217) note The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 logs. 5.1.2.1.2 T28 neuen Prozess starten Dieser Fall ist deckungsgleich mit dem Versuch des Ausführens von Programmen in T30 und T31. Im Gegensatz zu externen Prozessen können Java-interne Threads sehr wohl von einer Webanwendung gestartet werden. Getestet wurde wie folgt: Listing 35: Datei webapps/WEB-INF/classes/TryThread.java public class TryThread implements Runnable { TryThread(long v, String comment) { } public void run() { try { java.lang.Thread.sleep(2000,0); throw new NullPointerException(); } catch (InterruptedException e) { // nothing } } } Ein Thread kann innerhalb eines Servlet wie folgt gestartet werden: TryThread x = new TryThread(1000,"Try it out"); new Thread(x).start(); In der Logdatei catalina.out erscheint daraufhin die vom Thread provozierte NullPointerException, als Nachweis der Programmausführung, während die Webanwendung erfolgreich die Webseite zum Browser liefert: Bundesamt für Sicherheit in der Informationstechnik Seite 106 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Exception in thread "Thread-33" java.lang.NullPointerException at TryThread.run(TryThread.java:9) at java.lang.Thread.run(Thread.java:595) java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Thread.java:1158) at TryExec.doGet(TryExex.java:51) 5.1.2.1.3 T29 Netzwerk-Socket öffnen und Daten übertragen Das Anlegen eines sogenannten passiven Sockets für einen Server auf Port 20000 wird mit einem Servlet getestet, das im Wesentlichen folgendes enthält: java.net.ServerSocket svs = new java.net.ServerSocket(20000); svs.close(); Bei eingeschalteter Security Policy wird der Aufruf des Servlets mit HTTP-Status 500 quittiert. Beim Backtrace erscheint im Browser der Eingriff des Security Managers von Java: java.security.AccessControlException: access denied (java.net.SocketPermission localhost:20000 listen,resolve) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkListen(SecurityManager.java:1120) java.net.ServerSocket.bind(ServerSocket.java:318) java.net.ServerSocket.<init>(ServerSocket.java:185) java.net.ServerSocket.<init>(ServerSocket.java:97) 5.1.2.1.4 T30.1 Lesen innerhalb des Bereichs der Web-Anwendung Vielfältige Lesezugriffe sind möglich, sowohl auf Dateien als auch auf das Dateisystem. Verschiedene Zugriffsversuche wurden getestet, zunächst einmal: import java.io.*; File f = new File("."); out.println(f.getAbsolutePath()); Bei eingeschalteter Security Policy wird der Aufruf des Servlets mit HTTP-Status 500 quittiert. Auch hier ist der Eingriff des Security-Managers von Java im Browser sichtbar, jedoch wurde beim Versuch, das mit „.“ bezeichnete, „aktuelle“ Verzeichnis aufzulösen, der Zugriff auf die Java Property user.dir verwehrt: java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285) java.lang.System.getProperty(System.java:627) java.io.UnixFileSystem.resolve(UnixFileSystem.java:118) java.io.File.getAbsolutePath(File.java:473) Folgende Zugriffsversuche wurden ebenfalls verwehrt: Seite 107 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers import java.io.*; File f = new File("index.html"); out.println(f.exists()); oder: import java.io.*; File f = new File("."); out.println(f.canRead()); mit der Fehlermeldung: java.security.AccessControlException: access denied (java.io.FilePermission . read) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkRead(SecurityManager.java:871) java.io.File.canRead(File.java:658) Offensichtlich verfügen Servlets über keinen vereinfachten Zugriff über relative Pfadnamen auf Dateien in ihrem jeweiligem Verzeichnis. Stattdessen funktioniert der Zugriff über den vollen Pfadnamen, beginnend mit „/“: import java.io.*; File f = new File("/opt/tomcat...webapps/.../index.html"); out.println(f.canRead()); Als Ergebnis wird der Wert „true“ ausgegeben und das folgende Servlet kann daher das erste Byte auslesen: import java.io.*; File f = new File("/opt/tomcat...webapps/.../index.html"); FileInputStream fis = new FileInputStream(f); out.println(fis.read()); fis.close(); Es erscheint 60, der ASCII-Code für das Zeichen „<“ vom öffnenden Tag des HTMLDokuments index.html. 5.1.2.1.5 T30.2 Schreiben innerhalb des Bereichs der Web-Anwendung Das Anlegen von neuen Dateien mit java.io.File.createNewFile wird zurückgewiesen. Dabei wird der vollständige Pfad benutzt, der beim Lesen erlaubt war: import java.io.*; File f = new File("/opt/tomcat...webapps/.../foobar"); out.println(f.createNewFile()); Bei eingeschalteter Security Policy wird der Aufruf des Servlets mit HTTP-Status 500 quittiert. Auch hier ist der Eingriff des Security-Managers von Java im Browser sichtbar: Bundesamt für Sicherheit in der Informationstechnik Seite 108 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests java.security.AccessControlException: access denied (java.io.FilePermission /opt/tomcat...webapps/.../foobar write) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkWrite(SecurityManager.java:962) java.io.File.createNewFile(File.java:849) Der Versuch des Anlegens einer neuen Datei über die Klasse java.io.FileOutputStream wird ebenfalls zurückgewiesen: import java.io.*; File f = new File("/opt/tomcat...webapps/.../foobar"); FileOutputStream fs = new FileOutputStream(f); fs.close(); Quittiert mit der gleichlautenden Fehlermeldung: java.security.AccessControlException: access denied (java.io.FilePermission /opt/tomcat...webapps/.../foobar write) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkWrite(SecurityManager.java:962) java.io.FileOutputStream.<init>(FileOutputStream.java:169) java.io.FileOutputStream.<init>(FileOutputStream.java:131) 5.1.2.1.6 T30.3 Löschen innerhalb des Bereichs der Web-Anwendung Das Löschen der vorhandenen Datei index.html wird zurückgewiesen. Dabei wird der vollständige Pfad benutzt, der beim Lesen erlaubt war: import java.io.*; File f = new File("/opt/tomcat...webapps/.../index.html"); out.println(f.delete()); Bei eingeschalteter Security Policy wird der Aufruf des Servlets mit HTTP-Status 500 quittiert. Auch hier ist der Eingriff des Security-Managers von Java im Browser sichtbar: java.security.AccessControlException: access denied (java.io.FilePermission /opt/jakartatomcat-5.5.9/webapps/.../index.html delete) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkDelete(SecurityManager.java:990) java.io.File.delete(File.java:869) Ähnlich verhält es sich mit dem Versuch, über java.io.File.deleteOnExit eine Zeitbombe (löschen beim beenden) einzufügen: import java.io.*; File f = new File("/opt/tomcat...webapps/.../index.html"); f.deleteOnExit(); Seite 109 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Quittiert wird hierbei mit der Fehlermeldung: java.security.AccessControlException: access denied (java.io.FilePermission /opt/jakartatomcat-5.5.9/webapps/.../index.html delete) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkDelete(SecurityManager.java:990) java.io.File.deleteOnExit(File.java:901) 5.1.2.1.7 T30.4 Ausführen innerhalb des Bereichs der Web-Anwendung Das Ausführen von Programmen wird zurückgewiesen. Beim Test wird ein vollständiger Pfad benutzt, wie er beim Lesen erlaubt war. Das Programm /bin/true wurde dazu in das Verzeichnis webapps/.../WEB-INF/classes/ kopiert. java.lang.Runtime.getRuntime().exec("/opt/jakarta-tomcat-5.5.9/webapps/xyztests/WEBINF/classes/true"); Quittiert wird hierbei mit der Fehlermeldung: java.security.AccessControlException: access denied (java.io.FilePermission /opt/jakartatomcat-5.5.9/webapps/xyztests/WEB-INF/classes/true execute) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkExec(SecurityManager.java:779) java.lang.ProcessBuilder.start(ProcessBuilder.java:447) java.lang.Runtime.exec(Runtime.java:591) java.lang.Runtime.exec(Runtime.java:429) java.lang.Runtime.exec(Runtime.java:326) TryExec.doGet(TryExec.java:71) 5.1.2.1.8 T31 Lesen / Schreiben / Löschen / Ausführen außerhalb der Web-Anwendung Es wird zunächst ein Servlet definiert, welches versucht das Vorhandensein der Datei index.html einer Nachbar-Webanwendung abzufragen: File f = new File("/opt/jakarta-tomcat-5.5.9/webapps/jsp-examples/index.html"); out.println(f.exists()); Bei eingeschalteter Security Policy wird der Aufruf des Servlets mit HTTP-Status 500 quittiert (500 bedeutet laut HTTP-Protokoll Server-interner Fehler). Beim Backtrace erkennt man im Browser deutlich den Eingriff des Security Managers von Java: java.security.AccessControlException: access denied (java.io.FilePermission /opt/jakartatomcat-5.5.9/webapps/jsp-examples/index.html read) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkRead(SecurityManager.java:871) java.io.File.exists(File.java:700) Ein Schreibversuch, diesmal ins Verzeichnis /tmp/, wird ebenfalls zurückgewiesen: File f = new File("/tmp/foobar"); Bundesamt für Sicherheit in der Informationstechnik Seite 110 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests FileOutputStream fs = new FileOutputStream(f); fs.close(); Die Fehlermeldung lautet bei allen Versuchen vergleichbar wie folgt: description The server encountered an internal error () that prevented it from fulfilling this request. exception java.security.AccessControlException: access denied (java.io.FilePermission /tmp/foobar write) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkWrite(SecurityManager.java:962) java.io.FileOutputStream.<init>(FileOutputStream.java:169) java.io.FileOutputStream.<init>(FileOutputStream.java:131) Der Versuch, das Programm /bin/true auszuführen, wird ebenfalls zurückgewiesen: java.lang.Runtime.getRuntime().exec("/bin/true"); Quittiert wird hierbei mit der Fehlermeldung: java.security.AccessControlException: access denied (java.io.FilePermission /bin/true execute) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkExec(SecurityManager.java:779) java.lang.ProcessBuilder.start(ProcessBuilder.java:447) java.lang.Runtime.exec(Runtime.java:591) java.lang.Runtime.exec(Runtime.java:429) java.lang.Runtime.exec(Runtime.java:326) TryExec.doGet(TryExec.java:70) 5.1.2.1.9 T32 Zugriff auf Tomcat-eigene Komponenten Es wird ein Servlet definiert, welches im Wesentlichen die folgende Zeile enthält: out.println(org.apache.catalina.realm.RealmBase.Digest("abc","def","0")); Bei eingeschalteter Security Policy wird der Aufruf des Servlets erwartungsgemäß mit HTTPStatus 500 quittiert. Auch hier ist der Eingriff des Security-Managers von Java im Browser sichtbar: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.realm) java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) java.security.AccessController.checkPermission(AccessController.java:427) java.lang.SecurityManager.checkPermission(SecurityManager.java:532) java.lang.SecurityManager.checkPackageAccess(SecurityManager.java:1512) sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265) java.lang.ClassLoader.loadClass(ClassLoader.java:251) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1247) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1181) Seite 111 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) Wird stattdessen auf eine öffentliche Konstante von org.apache.catalina zugegriffen, z. B. innerhalb von org.apache.catalina.realm.Constants, so wird der Zugriff erlaubt. public static final String FORM_ACTION = "/j_security_check"; Im Servlet steht: out.println(org.apache.catalina.realm.Constants.FORM_ACTION); Der Text /j_security_check erscheint im Browser. Möglicherweise wird aufgrund der Deklaration final der Wert in das compilierte Servlet übernommen, sodass vielleicht keine Referenz mehr auf das Paket catalina vorhanden ist. 5.1.2.2 Tests der Zugriffsrechte auf dem Niveau von Webanwendungen Diese Tests werden über den HTTP und den AJP1.3 Connector durchgeführt. Test Nr. T 33 T 34 T 35 TomcatBeschreibung erwartetes Resultat Connector HTTP und In der web.xml Datei einer Webanwendung wirdnicht möglich AJP eine einzelne JSP-Seite vor anonymen Zugriffen geschützt. Es wird untersucht, ob es möglich ist, ohne Authentisierung auf diese Datei zuzugreifen. HTTP und In der web.xml Datei einer Webanwendung wird nicht möglich AJP ein Verzeichnis vor anonymen Zugriffen geschützt. Es wird untersucht, ob es möglich ist, ohne Authentisierung auf Web-Ressourcen unterhalb dieses Verzeichnisses zuzugreifen. HTTP und In der web.xml Datei einer Webanwendung nicht möglich AJP werden einzelne HTTP Methoden (DELETE, PUT, GET, POST) vor anonymen Zugriffen geschützt. Es wird untersucht, ob es möglich ist, ohne Authentisierung mit den entsprechenden Methoden auf Web-Ressourcen zuzugreifen. Tabelle 5: Funktionale Tests der Zugriffskontrolle auf dem Niveau der Webanwendungen Die hier überprüften Mechanismen regeln den Zugriff auf dem Niveau der einzelnen Webanwendung und sind somit für alle Einsatzszenarien aus dem Feinkonzept [Tomcat Fein.] von Bedeutung. Da der Zugriff auf die Webanwendung beim Einsatzszenario 1 (mit HTTP Connector) prinzipiell anders ist als bei allen anderen Einsatzszenarien (mit AJP Connector), werden diese Tests für Einsatzszenario 1 und Einsatzszenario 2 wiederholt. Die Tests T33 und T34 werden in Verbindung mit der Webanwendung simple_info1 durchgeführt. Neben einer ungeschützten Startseite index.jsp verfügt die Webanwendung über zwei geschützte Webseiten confidential.jsp sowie subdir/moreinfo.jsp, die nur für Zugriffe von authentisierten Benutzern mit einer Rollenzuordnung user1 freigegeben sind. Bundesamt für Sicherheit in der Informationstechnik Seite 112 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Die geschützten Webseiten bzw. -verzeichnisse sind innerhalb der web.xml Datei dieser Webanwendung wie folgt festgelegt: Listing 36: Definition geschützter Bereiche in der Konfigurationsdatei der Webanwendung WEB-INF/web.xml <!-- Define a Security Constraint on this Application --> <security-constraint> <web-resource-collection> <web-resource-name>Simple_Info1 JSP Application</web-resource-name> <url-pattern>/confidential.jsp</url-pattern> <url-pattern>/subdir/</url-pattern> <url-pattern>/subdir/*</url-pattern> </web-resource-collection> <auth-constraint> <!-- NOTE: This role is not present in the default users file --> <role-name>user1</role-name> </auth-constraint> </security-constraint> 5.1.2.2.1 T33.1 HTTP Connector, Zugriff auf eine geschützte JSP-Seite Es erfolgt aus der allgemein freigegebenen Webseite http://tomcathost:8080/simple_info1 heraus ein Zugriff auf die nur für authentisierte Benutzer mit einer Rollenzuordnung user1 freigegebene Webseite http://tomcathost:8080/simple_info1/confidential.jsp. Ein BrowserPopup-Fenster öffnet sich, um eine HTTP-Benutzeranmeldung durchzuführen. Es existieren nun 4 mögliche Fälle: • Die HTTP-Authentisierung wird im Popup-Fenster mit Cancel abgebrochen. Tomcat gibt darauf hin die Fehlermeldung „HTTP Status 401: This request requires HTTP authentication ()“ im Browser zurück. Ein Zugriff auf die geschützte Webseite ist nicht möglich. • Wird in das Popup-Fenster ein ungültiger Benutzername und / oder ein ungültiges Passwort eingegeben, so wird die Authentisierung abgelehnt und das Popup-Fenster erneut geöffnet. Ein Zugriff auf die geschützte Webseite ist ohne erfolgreiche Authentisierung auch nach mehreren Fehlversuchen nicht möglich. • Die HTTP-Authentisierung wird im Popup-Fenster mit einer gültigen Benutzerken­ nung (Benutzer memuser2 / Passwort vmware) durchgeführt, die jedoch nicht über die benötigte Rollenzuordnung verfügt. Tomcat gibt darauf hin die Fehlermeldung „HTTP Status 403: Access to the requested resource has been denied“ im Browser zurück. Ein Zugriff auf die geschützte Webseite ist nicht möglich. • Die HTTP-Authentisierung wird im Popup-Fenster mit einer gültigen Benutzerken­ nung (Benutzer memuser1 / Passwort vmware) durchgeführt, die über die benötigte Rollenzuordnung verfügt. Tomcat gibt darauf die angeforderte Webseite wie erwartet zurück. Seite 113 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.1.2.2.2 T33.2 AJP13 Connector, Zugriff auf eine geschützte JSP-Seite Es erfolgt aus der allgemein freigegebenen Webseite http://tomcathost/simple_info1 heraus ein Zugriff auf die nur für authentisierte Benutzer mit einer Rollenzuordnung user1 freigegebene Webseite http://tomcathost/simple_info1/confidential.jsp. Ein Browser-PopupFenster öffnet sich, um eine HTTP-Benutzeranmeldung durchzuführen. Es existieren nun 4 mögliche Fälle: • Die HTTP-Authentisierung wird im Popup-Fenster mit Cancel abgebrochen. Tomcat gibt darauf hin die Fehlermeldung „HTTP Status 401: This request requires HTTP authentication ()“ im Browser zurück. Ein Zugriff auf die geschützte Webseite ist nicht möglich. • Wird in das Popup-Fenster ein ungültiger Benutzername und / oder ein ungültiges Passwort eingegeben, so wird die Authentisierung abgelehnt und das Popup-Fenster erneut geöffnet. Ein Zugriff auf die geschützte Webseite ist nicht möglich. • Die HTTP-Authentisierung wird im Popup-Fenster mit einer gültigen Benutzerken­ nung (Benutzer memuser2 / Passwort vmware) durchgeführt, die jedoch nicht über die benötigte Rollenzuordnung verfügt. Tomcat gibt darauf hin die Fehlermeldung „HTTP Status 403: Access to the requested resource has been denied“ im Browser zurück. Ein Zugriff auf die geschützte Webseite ist nicht möglich. • Die HTTP-Authentisierung wird im Popup-Fenster mit einer gültigen Benutzerken­ nung (Benutzer memuser1 / Passwort vmware) durchgeführt, die über die benötigte Rollenzuordnung verfügt. Tomcat gibt darauf die angeforderte Webseite zurück. 5.1.2.2.3 T34.1 HTTP Connector, Zugriff auf ein geschütztes Verzeichnis Im Rahmen dieses Tests werden zur Überprüfung des Zugriffsschutzes Zugriffe auf die geschützte URL http://tomcathost:8080/simple_info1/subdir sowie auf die zur gleichen Web­ anwendung gehörige URL http://tomcathost:8080/simple_info1/subdir/moreinfo.jsp durch­ geführt. Die beim Test erzielten Ergebnisse entsprechen denen aus Test T33.1, d. h. ein Zugriff ist nur nach erfolgreicher vorheriger Authentisierung möglich. 5.1.2.2.4 T34.2 AJP13 Connector, Zugriff auf ein geschütztes Verzeichnis Dieser Test nutzt Zugriffe auf die geschützten URLs http://tomcathost/simple_info1/subdir sowie http://tomcathost/simple_info1/subdir/moreinfo.jsp. Die beim Test erzielten Ergebnisse entsprechen denen aus Test T33.2, d. h. ein Zugriff ist nur nach erfolgreicher vorheriger Authentisierung möglich. 5.1.2.2.5 T35 Schutz einzelner HTTP-Methoden vor anonymen Zugriffen Zur Durchführung von Test T35 wird zunächst die Webseite simple_info1/request_data.jsp, die bislang ohne weiteren Zugriffsschutz konfiguriert war, mit einer entsprechenden Zugriffsrestriktion in der Konfigurationsdatei simple_info1/WEB-INF/web.xml versehen. Abgebildet ist in Listing 5.10 der Endzustand, die <http-method> Zeilen werden nach jedem Teiltest schrittweise ergänzt: Bundesamt für Sicherheit in der Informationstechnik Seite 114 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Listing 37: Spezifikation des HTTP-Methoden-basierten Zugriffsschutzes in der Konfigura­ tionsdatei der Webanwendung WEB-INF/web.xml ... <!-- Define a Security Constraint on this Application --> <security-constraint> <web-resource-collection> <web-resource-name>Simple_Info1 JSP Application</web-resource-name> <url-pattern>/confidential.jsp</url-pattern> <url-pattern>/subdir/</url-pattern> <url-pattern>/subdir/*</url-pattern> </web-resource-collection> <web-resource-collection> <web-resource-name>Simple_Info1 HTTP Access Auth Check</web-resource-name> <url-pattern>/request_data.jsp</url-pattern> <http-method>GET</http-method> <http-method>HEAD</http-method> <http-method>PUT</http-method> <http-method>POST</http-method> <http-method>DELETE</http-method> </web-resource-collection> <auth-constraint> <!-- NOTE: This role is not present in the default users file --> <role-name>user1</role-name> </auth-constraint> </security-constraint> ... Bei den nun folgenden Zugriffsversuchen auf die URL http://tomcathost:8080/simple_info1/request_data.jsp (Tomcat HTTP-Connector) bzw. http://tomcathost:80/simple_info1/request_data.jsp (via Apache Webserver mit mod_jk auf Tomcat mit AJP-Connector) per Webbrowser bzw. telnet wurde der Zugriff der Reihe nach per GET, HEAD, PUT, POST und DELETE Methode auf die betreffende URL im jeweils ersten Zugriff (ohne zugehörige Zeile <http-method>) erlaubt und beim jeweils zweiten Zugriff (nun mit zugehöriger Zeile <http-method>) ohne vorherige Authentisierung mit der Fehlermeldung HTTP 401 Unauthorized blockiert. Als Beispiel für die Zugriffstests ist das Protokoll der Direktzugriffe auf den Tomcat HTTPConnector vor und nach Einfügung der Zeile <http-method>GET</http-method> in die Konfigurationsdatei web.xml hier mit eingefügt, der zunächst die hinterlegte Webseite korrekt zurück gibt: Listing 38: Ausgaben beim Zugriffstest ohne Zugriffsbeschränkung debian-host1:/opt/jakarta-tomcat-5.5.9/logs# telnet localhost 8080 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. GET /simple_info1/request_data.jsp HTTP/1.0 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=FFE7DC47922C502F1A8DE4D6334F2268; Path=/simple_info1 Content-Type: text/html;charset=ISO-8859-1 Content-Length: 367 Date: Thu, 03 Nov 2005 13:57:44 GMT Connection: close <html> Seite 115 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers <head> <title> Display HTTP Request Data </title> </head> <body> <h1>Request = <br /> GET localhost.localdomain: 8080 HTTP/1.0 </h1> <hr /> <h2><font color=red>Request header entries:</font></h2> <hr /> <h2><font color=red>Request parameters:</font></h2> <hr /> <h2><font color=red>Request attributes:</font></h2> <hr /> </body> </html> Connection closed by foreign host. Nach Einfügung der Zeile <http-method>GET</http-method> in die web.xml-Konfigurations­ datei der Webanwendung wird der Zugriff beim erneuten Versuch blockiert: Listing 39: Ausgaben beim Zugriffstest mit Zugriffsbeschränkung debian-host1:/opt/jakarta-tomcat-5.5.9/logs# telnet localhost 8080 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. GET /simple_info1/request_data.jsp HTTP/1.0 HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 Pragma: No-cache Cache-Control: no-cache Expires: Thu, 01 Jan 1970 01:00:00 CET WWW-Authenticate: Basic realm="Simple_Info1 Realm" Content-Type: text/html;charset=utf-8 Content-Length: 952 Date: Thu, 03 Nov 2005 13:58:18 GMT Connection: close <html><head><title>Apache Tomcat/5.5.9 - Error report</title><style><!--H1 {fontfamily:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;fontsize:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {fontfamily:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 401 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>This request requires HTTP authentication ().</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/5.5.9</h3></body></html>Connection closed by foreign host. Bundesamt für Sicherheit in der Informationstechnik Seite 116 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Das gleiche Verhalten zeigt sich so auch bei den anderen HTTP-Zugriffsmethoden (HEAD, PUT, POST, DELETE), unabhängig davon ob die Verbindung direkt zum Tomcat HTTPConnector oder via Apache Webserver mit mod_jk und Tomcat mit AJP-Connector aufgebaut wurde. Im letzten Fall ändert sich die Anweisung zum Aufbau der HTTPVerbindung in telnet tomcathost 80: • Ohne die Zeile zur Zugriffsbeschränkung wird die Anfrage ohne Authentisierung mit einem HTTP-Status 200 OK akzeptiert. Bei der vorliegenden Konfiguration werden allerdings keine Datei per PUT erzeugt, keine Informationen aus der POST-Anfrage ausgewertet und keine Löschoperation aus der DELETE-Anfrage heraus durchgeführt. • Mit der Zugriffsbeschränkung wird die Anfrage mit einer Authentisierungsanforderung („HTTP-Status 401 Unauthorized“) unter Angabe des für die Authentisierung zu verwendenden Authentisierungs-Realm zurückgewiesen. Da neben den getesteten HTTP-Zugriffsmethoden noch weitere existieren, z. B. OPTIONS, TRACE, CONNECT und außerdem für WebDAV die Methoden PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, s. a. [RFC2518], wurde im Tomcat-Quelltext nachgeprüft, dass prinzipiell beliebige HTTP-Zugriffsmethoden definiert werden können. Diese können dann als Zeile <http-method>...</http-method> in die Konfigurationsdatei WEB-INF/web.xml in den Bereich <web-resource-collection> der Webanwendung eingefügt werden. Beim Zugriff auf das zugehörige und per <url-pattern>...</url-pattern> definierte URL-Pattern wird nun eine Überprüfung auf Zulässigkeit per Zeichenkettenvergleich der HTTP-Methode und den spezifizierten Methoden, die eine Authentisierung erfordern, durchgeführt. Wichtig ist hierbei, dass immer ein zugehöriges URL-Pattern, für das die Einschränkung gelten soll, definiert sein muss. Hinweis: Bei der Verwendung der <http-method> Direktiven ist zu beachten, dass nur für in der Liste aufgeführte Zugriffsmethoden eine Authentisierung erforderlich ist. Für die nicht genannten Zugriffsmethoden ist ein Zugriff ohne Authentisierung möglich, sofern diese nicht auf anderem Weg erzwungen wird. Diese Zugriffsmethoden sind somit nicht blockiert. Hinweis: im Test T35 werden lediglich die Filtermöglichkeiten seitens Tomcat untersucht. Der Apache Webserver bietet darüber hinaus eine Beschränkung der HTTP-Zugriffsmethoden (GET, PUT, POST, DELETE, ...) in Verbindung mit der <Limit>-Direktive, die allerdings nicht Gegenstand der hier vorgenommenen Untersuchungen ist. Beim Apache Webserver wurden für diesen Test keine Restriktionen gesetzt. 5.1.2.3 Tests der Zugriffsrechte auf dem Niveau von Valves Für diese Tests wird ein Request Filter Valve auf Host-Ebene definiert. Dieses soll die Anfragen an alle Webanwendungen des Hosts auf Basis der IP-Adresse oder des Host­ namens regeln. Beispielsweise wird durch die folgenden Einträge im Host-Bereich der server.xml-Datei ein „Remote Address Filter“ eingerichtet: Listing 40: Request Filter Valve Ergänzung in der Tomcat-Konfigurationsdatei server.xml <Host name="localhost" ...> ... Seite 117 (von 187) Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192.168.1.*"/> ... </Host> Dieser Eintrag verbietet Anfragen von bestimmten IP-Adressen bzw. IP-Adressbereichen. Die Wirkungsweise des Filter Valves würde die gleiche sein, wenn es auf der Ebene der Webanwendung definiert wäre. Anders wäre dann die Reichweite, eben nur für diese spezifische Webanwendung, statt für den gesamten Tomcat Server. Valves werden von der Tomcat-Engine verwaltet, d. h. von einem hohen Niveau in der Tomcat-Architektur. Die Tomcat-Engines bekommen Nachrichten von Connectoren, bevor diese an ein Servlet oder JSP geleitet werden und umgekehrt. Die Filter Valves leiten Nachrichten abhängig vom Inhalt, aber unabhängig vom Installationskontext des Valves weiter bzw. nicht weiter. Deshalb ist eine Überprüfung des Valves auf dem Niveau des Hosts ausreichend, um die Sicherheitsfunktionalität zu testen. Tabelle 6 zeigt die verschiedenen Filter, die durch diese Tests überprüft werden. Bei allen Tests wird versucht, von verschiedenen Maschinen aus auf eine von Tomcat verwaltete Webanwendung zuzugreifen. Test Nr. TomcatConnector T 36 HTTP und AJP T 37 HTTP und AJP T 38 HTTP und AJP T 39 HTTP und AJP Beschreibung: Konfiguration des Valves erwartetes Resultat: Zugriff vom Client / von anderen Maschinen Anfragen der IP-Adresse des Clientsnicht möglich / möglich sollten verboten sein. („Remote Address Filter“) Anfragen der IP-Adresse des Clientsmöglich / nicht möglich sollten erlaubt sein. („Remote Address Filter“) Anfragen mit dem Hostnamen des Clientsnicht möglich / möglich sollten verboten sein. („Remote Address Filter“) Anfragen mit dem Hostnamen des Clientsmöglich / nicht möglich sollten erlaubt sein. („Remote Address Filter“) Tabelle 6: Funktionale Tests der Zugriffskontrolle auf dem Niveau von Valves Diese Tests werden sowohl für die Konfiguration mit dem HTTP Connector (stand-alone, Einsatzszenario 1) als auch für die Konfiguration mit dem AJP Connector durchgeführt. Prinzipiell könnte es zwischen den zwei Connectoren Unterschiede in den übertragenen Informationen zum Client-System geben. Zunächst wird die IP-Adresse des VMware-Hostsystems bigmama durch den Eintrag in der <Host> Deklaration innerhalb von $CATALINA_HOME/conf/server.xml vom Zugriff ausge­ schlossen. Listing 41: IP-Address Filter Eintrag in der Tomcat-Konfigurationsdatei server.xml <Valve className=“org.apache.catalina.valves.RemoteAddrValve“ deny=“192.168.118.1“ /> Bundesamt für Sicherheit in der Informationstechnik Seite 118 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Hinweis: Im Verlauf der Tests wurde festgestellt, dass zwar Wildcard-Character in der IPAdresse verwendet werden dürfen (z. B. 192.168.118.*), die Verwendung der alternativen Notation 192.168.118.0/24 jedoch nicht zum Ausschluss der entsprechenden IP-Adressen führt. Dies könnte in Verbindung mit dem Ausschluss von IP-Adressbereichen, die kein vollständiges Oktett umfassen, z. B. für ein Subnetz 192.168.118.0/26 für den Adressbereich 192.168.118.0 ... 192.168.118.63, zu Problemen führen, da in diesem Fall einzelne IPAdressen, durch Komma separiert in der deny-Liste, aufgeführt werden müssten. Hinweis: Die verwendbaren Wildcard-Character und Regular-Expressions bei der Definition der IP-Adressen sind u. U. abweichend von den üblicherweise im Kontext von Shell-Pro­ grammierung gebräuchlichen. Tomcat verwendet die Jakarta Regexp Bibliothek, eine Beschreibung der damit verwendbaren regulären Ausdrücke findet sich in [Jakarta Regexp]. 5.1.2.3.1 T36.1 HTTP Connector, verbotene Anfragen mit IP-Adresse des Clients Der Aufruf der Webseite http://192.168.118.101:8080/simple_info1 mit einem Webbrowser vom VMware-Hostsystem bigmama aus führt zu einer leeren Webseite. Ein direkter Aufruf der Applikation mit telnet führt zu folgendem Ergebnis: zunächst wird ein Redirect ausgelöst, wobei der folgende Zugriff auf das dabei angegebene Ziel nicht zugelassen wird. Listing 42: Ausgaben beim Test des Zugriffs eines blockierten Clients (HTTP Connector) bigmama> telnet 192.168.118.101 8080 Trying 192.168.118.101... Connected to 192.168.118.101. Escape character is '^]'. GET /simple_info1 HTTP/1.0 HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: http://192.168.118.101:8080/simple_info1/ Date: Thu, 20 Oct 2005 22:14:35 GMT Connection: close Connection closed by foreign host. bigmama> telnet 192.168.118.101 8080 Trying 192.168.118.101... Connected to 192.168.118.101. Escape character is '^]'. GET /simple_info1/ HTTP/1.0 HTTP/1.1 403 Forbidden Server: Apache-Coyote/1.1 Date: Thu, 20 Oct 2005 22:17:38 GMT Connection: close Connection closed by foreign host. 5.1.2.3.2 T36.2 AJP13 Connector, verbotene Anfragen mit IP-Adresse des Clients Der Aufruf der Webseite http://192.168.118.101/simple_info1 mit einem Webbrowser vom VMware-Hostsystem aus führt zu einer leeren Webseite. Ein direkter Aufruf der Applikation Seite 119 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers mit telnet führt zu folgendem Ergebnis: zunächst wird ein Redirect ausgelöst, wobei der Zugriff auf das dabei angegebene Ziel nicht zugelassen wird. Listing 43: Ausgaben beim Test des Zugriffs eines blockierten Clients (AJP13 Connector) bigmama> telnet 192.168.118.101 80 Trying 192.168.118.101... Connected to 192.168.118.101. Escape character is '^]'. GET /simple_info1 HTTP/1.0 HTTP/1.1 302 Moved Temporarily Date: Thu, 20 Oct 2005 22:14:52 GMT Server: Apache/2.0.54 (Unix) mod_jk/1.2.14 Location: http://127.0.0.1/simple_info1/ Connection: close Content-Type: text/plain Connection closed by foreign host. bigmama> telnet 192.168.118.101 80 Trying 192.168.118.101... Connected to 192.168.118.101. Escape character is '^]'. GET /simple_info1/ HTTP/1.0 HTTP/1.1 403 Forbidden Date: Thu, 20 Oct 2005 22:18:18 GMT Server: Apache/2.0.54 (Unix) mod_jk/1.2.14 Connection: close Content-Type: text/plain Connection closed by foreign host. 5.1.2.3.3 T37 Erlaubte Anfragen mit IP-Adresse des Clients Für die Tests in T37 wird zunächst die IP-Adresse des VMware-Hostsystems bigmama durch den Eintrag in der <Host> Deklaration innerhalb von $CATALINA_HOME/conf/server.xml für den Zugriff zugelassen. Listing 44: IP-Address Filter Eintrag in der Tomcat-Konfigurationsdatei server.xml <Valve className=“org.apache.catalina.valves.RemoteAddrValve“ allow=“192.168.118.1“ /> 5.1.2.3.4 T37.1 HTTP Connector, erlaubte Anfragen mit IP-Adresse des Clients Der Aufruf der Webseite http://192.168.118.101:8080/simple_info1 mit einem Webbrowser vom VMware-Hostsystem aus führt zur gewünschten Webseite. Ein Aufruf vom lokalen Host, auf dem der Tomcat Servlet Container läuft, führt zu einer leeren Webseite. Analog zum vorigen Test T36.1 führt ein direkter Aufruf der Applikation vom lokalen Host aus mit telnet zu folgendem Ergebnis: zunächst wird ein Redirect ausgelöst, wobei der Zugriff auf das dabei angegebene Ziel nicht zugelassen wird. Bundesamt für Sicherheit in der Informationstechnik Seite 120 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 5.1.2.3.5 T37.2 AJP13 Connector, erlaubte Anfragen mit IP-Adresse des Clients Der Aufruf der Webseite http://192.168.118.101/simple_info1 mit einem Webbrowser vom VMware-Hostsystem aus führt zur gewünschten Webseite. Ein Aufruf vom lokalen Host, auf dem der Tomcat Servlet Container läuft, führt zu einer leeren Webseite. Analog zum vorigen Test T36.2 führt ein direkter Aufruf der Applikation vom lokalen Host aus mit telnet zu folgendem Ergebnis: zunächst wird ein Redirect ausgelöst, wobei der Zugriff auf das dabei angegebene Ziel nicht zugelassen wird. 5.1.2.3.6 T38 / T 39 HTTP bzw. AJP13 Connector, verbotene / erlaubte Anfragen mit Hostname des Clients Zum Test der auf Hostnamen basierenden Zugriffssteuerung ist eine funktionsfähige Domain Name Service (DNS) Infrastruktur erforderlich, da Tomcat die Hostnamen anhand der in den Paket-Headern befindlichen IP-Adressen bestimmt. Beim Reverse DNS Lookup sind die Anfragen an den DNS-Server im Netzwerkverkehr mitlesbar. Anhand des vom DNS-Server zurückgegebenen Hostnamens des anfragenden Webclients wird mit dem Suchmuster bestimmt, ob ein Zugriff auf die Webseite zugelassen oder abgelehnt werden muss. Eine Beschreibung der Konfiguration eines hierfür geeigneten DNS-Servers wird in Abschnitt 3.8 gegeben. Zum Test wurde ein DNS-Server auf der virtuellen Maschine installiert, die gleichzeitig als Webserver- und Tomcat-Host dient. Auf diesem DNS-Server wurden folgende Definitionen vorgenommen: • Domäne: external.de (192.168.118.64/26) • • Host: bigmama, IP-Adresse 192.168.118.1 Domäne: bsitomcat.de (192.168.118.128/26) • Host: template, IP-Adresse 192.168.118.100 • Host: tomcathost, IP-Adresse 192.168.118.101 Für die Zugriffstests werden durch den Eintrag <Valve className=“org.apache.catalina.valves.RemoteHostValve“ **** allow/deny declaration *** /> in der <Host> Deklaration innerhalb von $CATALINA_HOME/conf/server.xml die verbotenen bzw. zugelassenen Hosts bzw. Domänen eingetragen (s. Tabelle 7). Nach Änderung dieses Eintrags ist Tomcat jeweils neu zu starten. Es wurden folgende Testergebnisse Webanwendung mit den URLs • bei Zugriffen auf die simple_info1 Tomcat http://tomcathost.bsitomcat.de:8080/simple_info1/ bzw. Seite 121 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests • Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers http://localhost:8080/simple_info1/ für einen Direktzugriff auf Tomcat über den HTTP-Connector sowie • http://tomcathost.bsitomcat.de:80/simple_info1/ bzw. • http://localhost:80/simple_info1/ für einen Zugriff über den Apache Webserver in Verbindung mit dem mod_jk-Modul sowie dem Tomcat AJP-Connector erzielt: Bundesamt für Sicherheit in der Informationstechnik Seite 122 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers *** allow / deny declaration *** für das RemoteHostValve (in $CATALINA_HOME/conf/server.xml) Durchführung der Tests Zugriff über bigma templ tomcat Port (Tomcat ma.exte ate.bs host.bs Connector) rnal.de itomc itomcat at.de .de deny=“.*\.external\.de“ 8080 (HTTP) 403 200 200 localho st (auf tomcat host), s. u. 200 allow=“.*\.external\.de“ 80 (AJP) 8080 (HTTP) 403 200 200 403 200 403 200 403 deny=“.*\.bsitomcat\.de“ 80 (AJP) 8080 (HTTP) 200 200 403 403 403 403 403 200 allow=“.*\.bsitomcat\.de“ 80 (AJP) 8080 (HTTP) 200 403 403 200 403 200 200 403 80 (AJP) 403 200 200 403 Tabelle 7: Tests der Hostnamen-basierten Zugriffskontrolle (Reverse DNS Lookup ist verfügbar) Die dem HTTP Status Code entsprechenden Einträge in der Tabelle haben dabei die folgende Bedeutung: • 200: die Webseite konnte korrekt abgerufen werden („HTTP Status 200 Success“) • 403: ein Zugriff auf die Webseite wurde blockiert („HTTP Status 403 Forbidden“) Insgesamt konnten keine Abweichungen vom erwarteten Verhalten festgestellt werden. Bei Zugriffen von der virtuellen Maschine aus, auf der Tomcat selbst läuft, ist folgende Unterscheidung zu beachten: • Wird dort die Webseite http://localhost:8080/simple_info1/ aufgerufen, so erfolgt die Kommunikation in beide Richtungen (vom / zum Tomcat- bzw. Webserver) über die IP-Adresse 127.0.0.1 (localhost), die keiner der im DNS-Server eingetragenen Domänen angehört. Somit wird sie bei der Sperrung der lokalen Domäne bsitomcat.de auch nicht blockiert. • Wird hingegen die Webseite http://tomcathost.bsitomcat.de:8080/simple_info1/ aufgerufen, so wird die Kommunikation über die dem Server zugeordnete IP-Adresse 192.168.118.101 (tomcathost) abgewickelt. Hierzu kann bei der DNS-Abfrage (Reverse DNS Lookup) für den Webclient eine Domänenzuordnung nach bsitomcat.de vorgenommen werden. Diese Besonderheiten wurden durch Mitlesen des Netzwerkverkehrs zwischen Webbrowser und Webserver sowie dessen Kommunikation mit dem DNS-Server verifiziert. Hinweis: Die verwendbaren Wildcard-Character und Regular-Expressions bei der Definition der Host- oder Domänennamen sind u. U. abweichend von den üblicherweise im Kontext von Shell-Programmierung gebräuchlichen, sodass bei Verwendung Letzerer möglicher­ weise unerwartete Ergebnisse erzielt werden können. Insbesondere bei der Definition von deny-Regeln ist mit entsprechender Vorsicht vorzugehen. Tomcat verwendet die Jakarta Regexp Bibliothek, eine Beschreibung der Ausdrücke findet sich in [Jakarta Regexp]. Neben dem regulären Verhalten wurde auch noch der Fall untersucht, dass der DNS Server für ein Reverse DNS Lookup nicht zur Verfügung steht. Dieser Fall kann eintreten, wenn Seite 123 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers beispielsweise die für den Tomcat Server eingestellten DNS Server z. B. auf Grund von Netzwerkproblemen nicht erreichbar sind. Im vorliegenden Test wurde einfach der lokale DNS-Server auf tomcathost mit dem Kommando /etc/init.d/bind9 stop angehalten. Bei diesem Test wurden die in Tabelle 8 gezeigten Ergebnisse erzielt, wobei das korrekte Verhalten bei Verfügbarkeit des DNS-Server aus dem vorigen Test zum Vergleich mit aufgenommen wurde. In der Tabelle wurden durch die unterstrichenen Einträge die Stellen markiert, bei denen abweichendes Verhalten gegenüber den gewählten RemoteHostValve-Einstellungen auf Grund fehlenden Reverse DNS Lookups festzustellen ist. Die Tabelleneinträge entsprechen wiederum dem HTTP Status Code der Antworten von Tomcat (s. S. 123). Bei den Einträgen mit dem HTTP Status Code 200 wird die angeforderte Webseite zurück gegeben, beim HTTP Status Code 403 erfolgt eine Fehlermeldung. Zusammenfassend lässt sich feststellen, dass im Fall der Nicht-Verfügbarkeit des DNS Servers für ein Reverse DNS Lookup und damit der Namensauflösung zur IP-Adresse der HTTP-Anfrage folgendes Verhalten auftritt: • bei grundsätzlicher Zugriffserlaubnis: d. h. es werden alle Anfragen beantwortet, die nicht per deny Regel blockiert werden. Da zur IP-Adresse der Anfrage kein Hostbzw. Domänenname gefunden wird, kann nicht positiv mit einer deny Regel verglichen werden und es erfolgt somit die Beantwortung aller Anfragen. Und dies, obwohl der der IP-Adresse zugeordnete Host- oder Domänenname in der deny Regel für einen Zugriff auf die Web-Ressourcen möglicherweise nicht freigegeben ist und somit zu einer Abweisung hätte führen müssen. • bei grundsätzlichem Zugriffsverbot : d. h. es werden keine Anfragen beantwortet, die nicht per allow Regel zugelassen werden. Da zur IP-Adresse der Anfrage kein Hostbzw. Domänenname gefunden wird, kann nicht positiv mit einer allow Regel verglichen werden und es erfolgt keine Beantwortung der Anfrage. Dies führt zu einer Abweisung aller Anfragen, obwohl möglicherweise der der IP-Adresse zugeordnete Host- oder Domänenname in der allow Regel freigegeben ist. Bundesamt für Sicherheit in der Informationstechnik Seite 124 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers *** allow / deny declaration *** für das RemoteHostValve (in $CATALINA_HOME/conf/server.xml) deny=“.*\.external\.de“ allow=“.*\.external\.de“ deny=“.*\.bsitomcat\.de“ allow=“.*\.bsitomcat\.de“ Durchführung der Tests Zugriff über Revers bigm tomcat localho Port (Tomcat e DNS- ama.e host.bs st (auf Connector) Lookup xtern itomcat tomcat verfügb al.de .de host), ar s. u. 8080 (HTTP) Ja 403 200 200 Nein 200 200 200 80 (AJP) Ja 403 200 200 8080 (HTTP) Nein Ja 200 200 200 403 200 403 Nein 403 403 403 80 (AJP) Ja 200 403 403 8080 (HTTP) Nein Ja 403 200 403 403 403 200 Nein 200 200 200 80 (AJP) Ja 200 403 200 8080 (HTTP) Nein Ja 200 403 200 200 200 403 Nein 403 403 403 Ja 403 200 403 Nein 403 403 403 80 (AJP) Tabelle 8: Tests der Hostnamen-basierten Zugriffskontrolle in Abhängigkeit von der Verfügbarkeit von Reverse DNS Lookup 5.1.2.4 Protokollierung Ziel des Tests ist es zu prüfen, ob und wie System-Ereignisse, beispielsweise Meldungen mit Informationen, Fehlern oder Warnungen, sowie webanwendungsspezifische Client Anfragen protokolliert werden. Für den Test werden zwei Arten von Protokollierungen eingerichtet: 1. Protokollierung durch eine <Logger>-Komponente 2. Protokollierung durch ein AccessLogValve Beide Protokollierungsarten werden für Testzwecke auf dem Niveau der Catalina Engine eingestellt und werden daher die maximale Reichweite haben. Die <Logger>-Komponente wird mit den Default-Einstellungen eingerichtet und maximale „verbosity“ („debug“, Niveau 4) der Protokollierung in eine Datei („FileLogger“) besitzen. Für das Access Log Valve wird die Default-Einstellung für das Format der Protokolldatei („common“) übernommen. Die in Tabelle 9 zusammengefassten Tests bestehen im Wesentlichen aus einer Kontrolle des Umfangs und der Struktur der erstellten Protokolldateien. Seite 125 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Test Nr. T 40 TomcatBeschreibung Connector HTTP und Kontrolle der Protokolldatei für eine AJP <Logger>-Komponente T 41 HTTP und Kontrolle der Protokolldatei für ein AccessLogValve AJP Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers erwartetes Resultat protokollierte Information entsprechend der Dokumentation dargestellt protokollierte Information entsprechend der Dokumentation dargestellt Tabelle 9: Übersicht über die funktionalen Sicherheitstests der Protokollierung Zur Durchführung der Tests werden verschiedene Anfragen für Ressourcen von ClientBrowsern an Tomcat gesendet. Zudem wird z. B. der Tomcat-Server heruntergefahren oder es werden bestimmte Webanwendungen angehalten, um die Protokollierung der System­ ereignisse zu untersuchen. Da die zwei Connectoren (HTTP, AJP) im Prinzip unterschiedliche Information vom Client nach Tomcat übertragen könnten, werden diese Tests für beide Connectoren durchgeführt. 5.1.2.4.1 T40 Kontrolle der Log-Datei für eine <Logger>-Komponente Durch Änderungen in der Architektur von Tomcat 5.5 im Vergleich zu den Vorgängerver­ sionen wird die früher vorhandene <Logger>-basierte Protokollierung nicht mehr unterstützt. Eine versuchsweise Aktivierung durch Einbringung einer <Logger>-Definition in der Konfigu­ rationsdatei $CATALINA_HOME/conf/server.xml führte zu einer „ClassNotFound Exception“ beim Start von Tomcat. Statt dessen erfolgt die Protokollierung per java.util.logging Paket, dessen Konfiguration in der Datei $CATALINA_HOME/common/class/logging.properties festgelegt wird. In den unter $CATALINA_HOME/logs erzeugten Protokolldateien können wichtige System­ ereignisse wie • Tomcat gestartet / beendet, • Webanwendung gestartet / beendet, • Aktualisierung von laufenden Webanwendungen, z. B. nach Änderungen in den Konfigurationsdateien der Webanwendungen, • Fehlermeldungen, z. B. bei der Übersetzung von Servlets währende einer HTTP(S)/AJP-Benutzeranfrage oder fehlenden Klassen / jar-Archiven, aus entsprechend programmierten Fehlerausgaben der Servlets nachvollzogen werden. Zugriffe von Benutzern auf Webanwendungen werden hiermit nicht protokolliert. Dies ist vielmehr die Aufgabe der separat zu spezifizierenden AccessLogValve. Bundesamt für Sicherheit in der Informationstechnik Seite 126 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 5.1.2.4.2 T41 Protokollierung mit Access Log Valve Zur Feststellung der überhaupt mit den Standard Pattern Codes protokollierbaren Informationen wird zunächst unter Verwendung aller Pattern Codes die maximal mögliche Protokollierungstiefe eingestellt42: <Valve className="org.apache.catalina.valves.AccessLogValve" prefix="accLogValve_##_" pattern="%t %a %A %b %B %h %H %l %m %p %q %r %s %S %u %U %v %D %T" suffix=".txt"> </Valve> Die Reihenfolge ist – mit Ausnahme der Zugriffszeit (%t) – einfach alphabetisch gewählt. Dieser Eintrag wird in der Konfigurationsdatei $CATALINA_HOME/conf/server.xml je einmal auf <Host>-Ebene (## = host) und einmal auf <Engine>-Ebene (## = engine) definiert, wobei durch die unterschiedlichen Protokolldateien eine Unterscheidbarkeit der Einträge für den Test gewährleistet wird. Nach einigen Testzugriffen auf Tomcat konnte bei einem Vergleich beider generierter LogDateien festgestellt werden, dass sich die Einträge außer in der Bearbeitungszeit der einzelnen Anfragen nicht unterscheiden. Der Unterschied der Bearbeitungszeit-Einträge ist dadurch hervorgerufen, dass auf <Engine>-Niveau zusätzliche Zeit zur Auswahl des (virtuellen) Hosts zur Abarbeitung der Anfragen benötigt wird. Der Umfang der mit­ geschriebenen Protokollinformationen entspricht den in der Dokumentation angegebenen Werten. Nach Änderung des Protokollierungspattern-Eintrages auf “common“ (entspricht der Stan­ dardeinstellung ohne Angabe eines Protokollierungspattern) bzw. “combined“ und Restart von Tomcat werden nur noch die jeweils in der Tomcat-Dokumentation angegebenen Werte in der Protokolldatei erfasst. Auch hierbei sind keine Unterschiede (evtl. mit Ausnahme der Bearbeitungszeit) in Abhängigkeit von der Schnittstelle, über die die Anfrage bei Tomcat eingetroffen ist, feststellbar. Eine Unterscheidung, über welche Schnittstelle die Anfrage bei Tomcat eingetroffen ist (HTTP/HTTPS-Connector, AJP-Connector), ist lediglich über die protokollierten PortInformation (%p) und deren Zuordnung zu den eingestellten Connector-Port-Zuweisungen in der Konfigurationsdatei $CATALINA_HOME/conf/server.xml möglich. Es erfolgt sowohl eine Protokollierung der erfolgreichen Zugriffe, als auch derjenigen die z. B. mangels vorhandener Webseite bzw. Applikation (HTTP-Return-Code 404) oder wegen nicht ausreichender Zugriffsberechtigungen abgebrochen wurden (HTTP-Return-Code 401 oder 403). 5.1.2.5 Zuverlässigkeit der Dienstleistung Bei diesem Test wird eine Konfiguration für Hochverfügbarkeit eingerichtet. Diese entspricht Einsatzszenario 3: 42 Neben den Standard Pattern Codes können weitere gemäß der Apache Syntax definiert werden (s. [Apache mod_log]) wie %{###}i zur Abfrage des HTTP(S) Header Attributs ###, %{###}c für Cookie-Informationen, %{###}r für das Attribut ### im ServletRequest und %{###}s für Attribut ### der HTTP-Session, die hier nicht weiter untersucht werden. Da mit diesen noch detailliertere Informationen aus den HTTP(S)-Anfragen mit protokolliert werden könnten, können hiermit Datenschutz-relevante Punkte berührt werden. Seite 127 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Zwei identische Tomcat-Instanzen in einer Load-Balancing-Konfiguration hinter einem Apache-Server mit mod_jk. • „Sticky Sessions“ • Speicherung der Sessiondaten in einem externen NFS-Dateisystem mit dem „Persistent Session Manager“ Danach werden die Tests aus Tabelle 10 durchgeführt. Test Nr. T 42 TomcatConnector AJP T 43 AJP Beschreibung erwartetes Resultat Test des automatischen Failovers Übernahme einer Session ohne beim Ausfall einer Tomcat-Instanz Verlust der Sessiondaten Test der „Persistent Sessions“ beim Beim anschließenden Neustart Runterfahren beider Tomcatkein Verlust der Sessiondaten Instanzen. Tabelle 10: Übersicht über die funktionalen Sicherheitstests der Zuverlässigkeit der Dienstleistung 5.1.2.5.1 T42 Failover beim Ausfall einer Tomcat-Instanz Gemäß Dokumentation43 wird eine Web-Anwendung zunächst so konfiguriert, dass der PersistentManager zum Speichern von Session-Daten im Dateisystem zum Einsatz kommt. Als Anwendung ist SessionExample aus den Demos zu Tomcat geeignet. Folgende Konfigurationsdatei wird benötigt: Listing 45: Einsatz von Persistent Sessions per Datei webapps/servlets-examples/METAINF/context.xml <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleBackup="1" maxIdleSwap="2" maxInactiveInterval="1800" saveOnRestart="true"> <Store className="org.apache.catalina.session.FileStore" directory="/tmp/tomcat" checkInterval="10"/> </Manager> </Context> Die Parameter maxIdleSwap usw. sind extrem klein gewählt, damit Tomcat die SessionDaten schnell in den persistenten Speicher überträgt. Diese Werte erleichtern die Tests, sind für den Produktivbetrieb jedoch ungeeignet. Laut Dokumentation sollte das Element <distributable> für die Webanwendung noch wie folgt gesetzt werden: 43 http://tomcat.apache.org/tomcat-5.5-doc/config/manager.html Bundesamt für Sicherheit in der Informationstechnik Seite 128 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Listing 46: Ergänzung webapps/servlets-examples/WEB-INF/web.xml um <distributable> <web-app> <display-name>Servlet 2.4 Examples</display-name> <description> Servlet 2.4 Examples. </description> <distributable/> Wenige Sekunden nach dem ansprechen der URL http://tomcathost/servletsexamples/servlet/SessionExample wird im Verzeichnis /tmp/tomcat/ die Datei 6A3FDD31BCF6C6399BAC938F97C8AA8D.session erzeugt. Diese enthält im „Serializable“ genannten standardisierten binären Format von Java die im Browser angegebenen Parameter und Wertepaare. Diese Nummer entspricht dem Wert des Cookies, das unter dem Namen JSESSIONID und dem Pfad /servlets-examples im Browser abgelegt wird. Anhand dieses Cookies wird die Session identifiziert. sessions.id 6A3FDD31BCF6C6399BAC938F97C8AA8D sessions.created Tue Jan 17 11:02:36 CET 2006 sessions.lastaccessed Tue Jan 17 11:10:29 CET 2006 sessions.data foo = bar zot = grr javax.security.auth.subject = Betreff: bar = zot Im Browser erscheint ein Formular zur Eingabe weiterer Wertepaare. Bei Änderung wird die Datei aktualisiert, was sowohl am Datum als auch am Inhalt sichtbar wird. Wird eine Instanz vom Tomcat abgebrochen, so wird bei weiteren Zugriffen nach einiger Verzögerung die zweite Instanz von Tomcat aufgerufen. Anhand des im Browser gespeicherten Cookies und des von beiden Instanzen erreichbaren Pfades /tmp/tomcat/ ist auch der zweite Tomcat in der Lage die gleichen Inhalte wie zuvor anzuzeigen. Session-ID und sämtliche Wertepaare bleiben erhalten. 5.1.2.5.2 T43 Persistente Sessions beim Herunterfahren Es wird die gleiche Konfiguration wie bei T42 verwendet. Die Zeile saveOnRestart="true" stellt sicher, dass etwaig gespeicherte Session-Daten beim normalen Beenden von Tomcat gespeichert und beim Neustart geladen werden. Sofern der Browser den Cookie behalten hat, bzw. gar nicht erst geschlossen wurde, stehen die Session-Daten unter der URL http://tomcathost/servlets-examples/servlet/SessionExample wieder zur Verfügung. Die Dokumentation zum PersistentManager erwähnt, dass dieser nicht für den Produktiv­ betrieb geeignet ist. In der Tat bietet das Abspeichern in Dateien mehrere Hürden, die mit serialisiertem, atomaren und konsistenten Zugriffsmöglichkeiten von Datenbanken gemeistert werden. Seite 129 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.1.2.6 Verschlüsselung Bei diesem Test werden die Möglichkeiten des Clients in Bezug auf Veränderungen in der SSL-Verschlüsselung untersucht. Eine Webanwendung wird mit einem Security Constraint eingerichtet, welches eine Verschlüsselung verlangt („Confidential“). Danach wird von einem Client aus versucht, verschiedene Merkmale der SSL-Verschlüsselung zu beeinflussen (Tabelle 11). Test Nr. T 44 TomcatConnector HTTP und AJP T 45 HTTP und AJP T 46 HTTP und AJP Beschreibung erwartetes Resultat Client versucht, ein Cipher nicht möglich „NULL“ zu verlangen und so die Verschlüsselung abzuschalten Client versucht, ein unbekannt schwaches Cipher (z. B. 40 Bit EXPORT) zu verlangen Client versucht, eine unbekannt Veränderung der SSLVersion-Nr. (2.0, 3.0) zu verlangen Bemerkung sollte von Tomcat abgefangen werden, zumindest beim HTTP Connector diesbezüglich keine Dokumentation bekannt diesbezüglich keine Dokumentation bekannt Tabelle 11: Übersicht über die funktionalen Sicherheitstests der Verschlüsselung Die SSL-Kommunikation des Clients mit dem AJP-Connector erfolgt über das Produkt Apache Webserver / mod_ssl, wobei die SSL-Verschlüsselung nicht durch den Tomcat Server durchgeführt wird. Daher werden SSL-basierte Untersuchungen ausschließlich am SSL/HTTP-Connector des Tomcat-Servers durchgeführt. 5.1.2.6.1 T44 SSL mit Null-Cipher Bei diesem Test wurde geprüft, ob der SSL-Connector des Tomcat Servers auch eine SSLVerbindung ohne Verschlüsselung (-cipher NULL) akzeptiert. Der SSL-Connector des Tomcat-Servers wurde entsprechend der Installationsanleitung in diesem Dokument konfiguriert. Die Anfrage des Clients wurde mit folgendem Script T44_request.sh abgesendet: #!/bin/bash echo -e "GET /simple_info1/index.jsp HTTP/1.0\r\n\r\n"|openssl s_client \ -connect localhost:8443 \ -cipher NULL \ -debug \ -quiet Die Benutzung dieses Skripts war erfolgreich. Eine SSL-Verbindung zwischen dem Client openssl und dem Server kam zustande, obwohl eine Verschlüsselung nicht statt fand (cipher: NULL-SHA). Nachfolgend wird ein Ausschnitt der Protokollierung der SSL-Verbindung dargestellt. Bundesamt für Sicherheit in der Informationstechnik Seite 130 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests ... --SSL handshake has read 1501 bytes and written 235 bytes --New, TLSv1/SSLv3, Cipher is NULL-SHA Server public key is 1024 bit SSL-Session: Protocol : TLSv1 Cipher : NULL-SHA Session-ID: 4387774D6BAB4F85DE47DBA6A248BDC24629029862680D61B02A7D3B2EC9BF11 Session-ID-ctx: Master-Key: 033B3FF05B5DDD3400BBC1793DEC5C6F2D570780707885209F65BE2B568F3F6B 838A233F7112E01FC1E02C5B3E48EBB6 Key-Arg : None Start Time: 1132951373 Timeout : 300 (sec) Verify return code: 19 (self signed certificate in certificate chain) --- 5.1.2.6.2 T45 SSL mit schwacher Verschlüsselung Bei diesem Test wurde geprüft, ob der SSL-Connector des Tomcat Servers auch eine SSLVerbindung mit schwacher Export-Verschlüsselung (-cipher EXP-RC4-MD5) akzeptiert. Wiederum wurde ein Skript T45request.sh aufgesetzt, mit dem der Test durchgeführt wurde: #!/bin/bash echo -e "GET /simple_info1/index.jsp HTTP/1.0\r\n\r\n"|openssl s_client \ -connect localhost:8443 \ -cipher EXP-RC4-MD5 \ -debug \ -quiet Der Client konnte erfolgreich eine SSL-Verbindung mit dem SSL-Connector des Tomcat Servers aufbauen. Nachfolgend der Auszug aus dem Verbindungsprotokoll. ... --New, TLSv1/SSLv3, Cipher is EXP-RC4-MD5 Server public key is 1024 bit SSL-Session: Protocol : TLSv1 Cipher : EXP-RC4-MD5 Session-ID: 438777935665009A73A93E8AF1D577FA419B49A2DDE1F657129C6DF0AEDE86B2 Session-ID-ctx: Master-Key: AD6D4A2B416ACED072534EB7FF74F592A67B325E389D72E89E2DF10EB6F14C72 A4AD5DC0CAD23EAD180CD3EF29CB9DA5 Key-Arg : None Start Time: 1132951443 Timeout : 300 (sec) Verify return code: 19 (self signed certificate in certificate chain) ... 5.1.2.6.3 T46 SSLv2, SSLv3 oder TLS Bei diesem Test wurde geprüft, ob der SSL-Connector des Tomcat Servers auch eine SSLVerbindung mit anderen Verbindungsstandards (SSLv2, SSLv3, TLS) akzeptiert, obwohl als Protokoll in der Konfiguration des SSL Connectors TLS festgelegt war. Für den Test wurde folgendes Skript T46request.sh verwendet: #!/bin/bash Seite 131 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers echo -e "GET /simple_info1/index.jsp HTTP/1.0\r\n\r\n"|openssl s_client \ -connect localhost:8443 \ -ssl2 \ -debug \ -quiet Neben diesem Skript, welches Client-seitig SSLv2 verwendet, wurde das gleiche Skript auch mit der Option SSLv3 angewendet. Die Ergebnisse der Anfragen sind in nachfolgender Tabelle dargestellt: VerschlüsselungsProtokoll TLS SSLv2 SSLv3 Ergebnis Erfolgreich Nicht erfolgreich Erfolgreich Tabelle 12: Ergebnisse von T46 Obwohl als Protokoll TLS konfiguriert war, hat der SSL-Connector des Tomcat-Servers auch SSLv3 zugelassen. Zusammenfassung von T44, T45 und T46 Ein wie in der hier enthaltenen Installationsanleitung S. 36 konfigurierter SSL Connector des Tomcat Servers akzeptiert beliebige, unter anderem auch unsichere Verschlüsselungsmodi. Er akzeptiert darüber hinaus auch das Verschlüsselungsprotokoll SSLv3, obwohl TLS konfiguriert war. In der Dokumentation des Tomcat Servers44 wird erwähnt, dass durch die Konfigurations­ option ciphers definiert werden kann, welche Verschlüsselungsalgorithmen der SSL Connector zulassen soll. Es werden jedoch keine Beispiele für gültige Begriffe (der Verschlüsselungsalgorithmen) aufgezählt. Es wurden versuchsweise mehrere Begriffe aus dem RFC 3268 (Verschlüsselungsalgo­ rithmen für TLS) sowie einer SUN JSSE Dokumentation45 als VerschlüsselungsalgorithmusBezeichnungen für die Konfigurationsoption ciphers ausprobiert. Wurden ausschließlich unbekannte Namen oder Namen mit Tippfehlern angegeben, hat der Server jedoch so reagiert, als sei die Konfigurationsoption ciphers gar nicht in der Konfiguration vorhanden. Dieses Verhalten, gepaart mit dem Fehlen einer diesbezüglichen Fehlermeldung, ist aus Sicherheitsgründen nicht akzeptabel. Zu groß ist das Risiko einer Fehlkonfiguration und die Abhängigkeit von den genauen Namen der verwendeten Version der JSSE. Es folgt die Liste der von JSSE bzw. Tomcat unterstützten Angaben zur Option ciphers in unserer Testumgebung. Diese Liste wurde durch Instrumentieren von Tomcat anhand der Funktion getSupportedCipherSuites der Klasse java.net.ServerSocket ermittelt. Man beachte, dass openssl andere Namen verwendet und meldet. Listing 47: mögliche Angaben zu ciphers in conf/server.xml (mit JSSE/JDK 1.5.0) SSL_RSA_WITH_RC4_128_MD5 SSL_RSA_WITH_RC4_128_SHA 44 45 http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html Appendix A Bundesamt für Sicherheit in der Informationstechnik Seite 132 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests TLS_RSA_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_DES_CBC_SHA SSL_DHE_RSA_WITH_DES_CBC_SHA SSL_DHE_DSS_WITH_DES_CBC_SHA SSL_RSA_EXPORT_WITH_RC4_40_MD5 SSL_RSA_EXPORT_WITH_DES40_CBC_SHA SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA SSL_RSA_WITH_NULL_MD5 SSL_RSA_WITH_NULL_SHA SSL_DH_anon_WITH_RC4_128_MD5 TLS_DH_anon_WITH_AES_128_CBC_SHA SSL_DH_anon_WITH_3DES_EDE_CBC_SHA SSL_DH_anon_WITH_DES_CBC_SHA SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA TLS_KRB5_WITH_RC4_128_SHA TLS_KRB5_WITH_RC4_128_MD5 TLS_KRB5_WITH_3DES_EDE_CBC_SHA TLS_KRB5_WITH_3DES_EDE_CBC_MD5 TLS_KRB5_WITH_DES_CBC_SHA TLS_KRB5_WITH_DES_CBC_MD5 TLS_KRB5_EXPORT_WITH_RC4_40_SHA TLS_KRB5_EXPORT_WITH_RC4_40_MD5 TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 Der Tomcat HTTP/SSL-Connector auf Port 8443 wurde nun mit dem Parameter ciphers=“SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA“ versehen. In diesem Fall (und in mehreren anderen Fällen, in denen Algorithmusnamen der obigen Liste verwendet wurden) verhielt sich der Tomcat SSL Connector wie erwartet, d. h. er hat nur die Algorithmen zugelassen, die auch konfiguriert waren. Zusammenfassend lässt sich feststellen, dass keine Dokumentation existiert, die eine sichere und nachvollziehbare Konfiguration des SSL-Connectors von Tomcat möglich macht. Zudem startet der Tomcat Server trotz unbekannter Verschlüsselungsmodi ohne Fehlermeldung und verhält sich somit anders als konfiguriert. Bewertung Es ist daher davon abzuraten, den SSL-Connector von Tomcat 5 als Netzwerkschnittstelle für sicherheitskritische Anwendungen zu verwenden. Seite 133 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Empfehlung Für das Tomcat-Entwicklungsprojekt ist zu empfehlen, dass eine Konfiguration des TomcatSSL-Connectors analog zur Konfiguration von mod_ssl ermöglicht wird. Darüber hinaus sollten die Konfigurationsoptionen für den SSL-Connector dokumentiert werden. 5.1.2.7 Datenschutz Beim Thema Datenschutz geht es um Informationen, die Tomcat protokolliert. Zuerst werden die Ergebnisse des Tests T 40 und T 41 (oben) noch einmal aus Sicht des Datenschutzes betrachtet. So werden die Default-Einstellungen von Tomcat im Hinblick auf den Daten­ schutz überprüft. Test Nr. T 47 TomcatConnector HTTP und AJP T 48 HTTP und AJP Beschreibung erwartetes Resultat Ergebnisse des Tests T 40 wahrscheinlich und T 41 analysieren unter keine dem Gesichtspunkt datenschutz­ „Datenschutz“ relevanten Aspekte Einstellung der unbekannt Protokollierung (Access Log Valve) mit einer maximalen Protokollierungstiefe; Durchführung von Anfragen für Ressourcen von ClientBrowsern an Tomcat Bemerkung Vermutlich ist die Speicherung einiger benutzerorientierter Informationen (z. B. „remote logical user name“ oder „user session ID“) für den Datenschutz von Bedeutung Tabelle 13: Übersicht über die funktionalen Sicherheitstests zum Datenschutz Danach wird der Test bei der „maximalen Protokollierung“ wiederholt. Hierbei werden z. B. alle die für den Datenschutz relevanten „patterns“ im Access Log Valve eingeschaltet. Die so erstellten Protokolldateien werden im Hinblick auf den Datenschutz analysiert. Da die zwei Connectoren (HTTP, AJP) im Prinzip unterschiedliche Information vom Client nach Tomcat übertragen können, wird der Test für beide Connectoren durchgeführt. Hinweis: bei der Verwendung des Tomcat Servlet Containers in Verbindung mit dem Apache Webserver über mod_jk-AJP-Connector bzw. mod_proxy-HTTP-Connector ist zu beachten, dass neben der Protokollierung durch Tomcat auch der Apache Webserver selbst Protokolldaten mit möglicherweise datenschutzrechtlich relevanten Informationen generieren kann. Dies ist bei einer Konfiguration des Apache Webservers zu berücksichtigen, wird aber im Rahmen dieser Untersuchungen nicht weiter betrachtet. 5.1.2.7.1 T47 / T48 Datenschutz-bezogene Analyse der Ergebnisse aus Tests T40 und T41 Die Analyse der Protokolldateien und der verwendbaren Protokollformat-Optionen hat zum Ergebnis geführt, dass die Erzeugung von für den Datenschutz relevanten Informationen je nach Einstellung der Log-Funktionen nicht ausgeschlossen werden kann. Bundesamt für Sicherheit in der Informationstechnik Seite 134 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Bei der Verwendung des “combined“ Log-Konfigurationspattern oder z. B. in Verbindung mit den “%u“ oder “%{Referer}i“ Protokollierungsformat-Optionen können Informationen wie der Name eines authentisierten Benutzers oder die zuvor besuchte Webseite in die Log-Dateien mit aufgenommen werden. Letzteres kann insbesondere dann von Bedeutung sein, wenn in den URLs auch weiter gehende Informationen, wie Parameter für den vorherigen HTTPRequest in der Form ...?param1=value1&param2=value2&... die beispielsweise in Verbindung mit HTML-Formularabfragen verwendet werden, kodiert sind. Da keine allgemeinen Annahmen über die hierbei vorkommenden Informationen getroffen werden können, muss zunächst davon ausgegangen werden, dass es sich hierbei um für den Datenschutz relevante Informationen handeln könnte, was zu entsprechenden Konsequenzen im Umgang mit den Log-Dateien führt. Analoges gilt für Cookie-Informationen, die bei der Protokollierung aufgezeichnet werden können und möglicherweise gleichfalls sensible Informationen enthalten. In der Standardeinstellung mit dem Log-Pattern “common“ werden diese Informationen nicht mit protokolliert. Für die Protokollierung der Tomcat Ereignisse per java.util.logging Mechanismen kann festgestellt werden, dass in der Standardeinstellung (entsprechend dem Log-Pattern “common“) zunächst keine datenschutzrechtlich relevanten Informationen erfasst werden. Es ist aber möglich, dass die in Tomcat laufenden Webanwendungen selbst interne Zustände über diesen Logging-Mechanismus protokollieren, wobei u. U. auch datenschutzrechtlich relevante Informationen betroffen sein könnten. Da dies aber abhängig von der konkreten Webanwendung ist, kann hier keine allgemeine Feststellung getroffen werden. Wie bereits oben erwähnt betrifft die Protokollierung nicht nur den Jakarta Tomcat Servlet Container alleine. Da dieser in den meisten Fällen in Verbindung mit einem vorgeschalteten Webserver (z. B. Apache) verwendet werden wird und der Webserver über eigene Protokol­ lierungsfunktionalität verfügt, gelten die gemachten Hinweise analog für dessen Protokol­ lierung. 5.1.2.8 Minimale Rechtevergabe Die Einsatzumgebung wird so geändert, dass Tomcat unter einem eigenen Benutzerkonto mit eingeschränkten Rechten (z. B. ohne Login-Shell) läuft. Danach werden Anfragen für Ressourcen von Client-Browsern an Tomcat gesendet und das ordnungsgemäße Funktio­ nieren der Engine beurteilt. Test Nr. T 49 TomcatConnector HTTP und AJP Beschreibung Ausführung von Tomcat als nicht-privilegierter Benutzer; Sendung von Anfragen für Ressourcen von ClientBrowsern an Tomcat. erwartetes Resultat ordnungs­ gemäßes Funktioniere n Bemerkung Betrieb sollte laut Dokumentation möglich sein Tabelle 14: Übersicht über die funktionalen Sicherheitstests zur minimalen Rechtevergabe Dieser Test ist für die Tomcat-Engine selbst von Bedeutung und ist daher unabhängig von den verschiedenen Konfigurationen der einzelnen Einsatzszenarien. Jedoch ist es denkbar, dass die zwei Connectoren unterschiedlich auf die veränderten Rechte der Tomcat-Engine Seite 135 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers reagieren. Deswegen ist es sinnvoll, den Test mit beiden Connectoren durchzuführen (HTTP, AJP). 5.1.2.8.1 T49 Ausführung von Tomcat als nicht-privilegierter Benutzer Zur Vorbereitung des Tests werden vor dem Starten von Tomcat sämtliche Dateien und Verzeichnisse unterhalb von $CATALINA_HOME dem neu erzeugten Benutzer tomcat und der neu erzeugten Gruppe tomcat zugewiesen, um eventuell benötigte Schreib- (LogDateien!) und Leseberechtigungen für den Tomcat-Prozess zu erhalten: Listing 48: Zuweisung der Tomcat Dateien an einen unprivilegierten Benutzer groupadd -g 150 tomcat useradd -c “Tomcat“ -g 150 -u 150 -d /opt/jakarta-tomcat-5.5.9 -s /bin/bash tomcat find /opt/jakarta-tomcat-5.5.9 -exec chown tomcat:tomcat {} \; Nun kann unter diesem neuen Benutzer Tomcat wie üblich gestartet werden: su – tomcat bin/catalina start Sowohl direkt über den HTTP(S)-Connector als auch über den AJP13-Connector (via Apache), ergaben sich bei den nachfolgenden Zugriffstests (über HTTP und HTTPS) keine Unterschiede im Verhalten gegenüber der Tomcat-Installation unter dem root Benutzer. Im realen Einsatz würde Tomcat nicht per Startkommando aus einer Shell sondern wahrscheinlich eher über ein Startup-Skript während des Boot-Vorgangs gestartet. In diesem Fall könnte auf eine Login-Shell bei der Einrichtung des unprivilegierten Benutzers verzichtet werden. Bei der Einrichtung des Benutzers tomcat könnte statt -s /bin/bash entweder -s /bin/false oder -s /bin/nologin46 verwendet werden, was zu einer Erhöhung der Sicherheit beitragen würde. 5.2 Penetrationstests - Vorgehensweise Die Penetrationstests dienen dazu festzustellen, ob Tomcat durch Protokoll verletzenden oder unerwarteten Netzwerkverkehr in seinem Programmablauf beeinflusst werden kann. 5.2.1 Angriffsszenarien Bei diesen Tests wird der Netzwerkverkehr gezielt mittels entsprechender Werkzeuge manipuliert. Dabei wird das Verhalten des zu testenden Systems (Tomcat bzw. Apache mit mod_jk) überwacht. Die Vorgehensweise besteht dabei aus den folgenden Schritten: 1. Aufzeichnung des protokollkonformen Netzwerkverkehrs, 46 falls dieses Skript in der Linux-Installation vorhanden ist und ein benötigt wird. Bundesamt für Sicherheit in der Informationstechnik syslog-Logging der nicht zugelassenen Login-Versuche Seite 136 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 2. Veränderung des protokollkonformen Netzwerkverkehrs und dessen Einspielung nach der Veränderung und 3. Auswertung der Protokolldateien und Kontrolle der angegriffenen Dienste. Es werden zwei prinzipiell unterschiedliche Angriffsszenarien betrachtet: • Angriffe eines Web Clients mit nicht konformen HTTP-Paketen bzw. mit nicht erwarteten HTTP-Header-Feldern (überlange Felder, Java Skript Code) oder • Angriffe von einer Web Anwendung bei eingeschalteter Standard Java Security Policy gegen einen davor stehenden Apache-Server bzw. gegen das AJPProtokoll (mod_jk) mittels übergroßer HTTP-Header (Cookies, etc.). Im Folgenden werden die Angriffe nach den verwendeten Tomcat-Connectoren unter­ schieden • HTTP-Connector: Angriffe von einem HTTP-Client • AJP-Connector ohne SSL-Client-Authentisierung: Angriffe von HTTP-Client und Angriffe einer Web Anwendung • AJP-Connector mit SSL Client Authentisierung: Angriffe eines Web-Clients mit nicht konformen SSL-Zertifikaten. Die Durchführung dieser Angriffe wird in den drei folgenden Kapiteln erläutert. Anmerkung: Für den HTTPS-Connector sind keine Angriffe vorgesehen, da die verwendete SSL-Implementierung von den Standard Java Klassen durchgeführt werden und sich die Angriffe auf HTTP-Ebene nicht unterscheiden. 5.2.2 Beispielanwendungen Für die Angriffe war vorgesehen, Beispielanwendungen anzugreifen, um eine möglichst realistische Abbildbarkeit der Tests zu gewährleisten. Es sollten insbesondere WebAnwendungen angegriffen werden, welche HTTP-Sessions verwenden und über Authen­ tisierungs- und Autorisierungsfunktionen verfügen. Es wurden die unten dargestellten Angriffe gegen eine derartige Beispielanwendung (webgoat aus dem OWASP Projekt) durchgeführt. Seite 137 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.3 HTTP-Connector: Angriffe von einem HTTP-Client Abbildung 5.4: Angriffe auf den HTTP-Connector des Tomcat-Servers Die Verwendung des HTTP- oder SSL-Connectors eines Tomcat-Servers als direkte Schnitt­ stelle zu Anwendern, deren HTTP-/HTTPS-Anfragen maliziöse Inhalte besitzen können (Abbildung 5.4), ist in vielen Punkten gegenüber einer mehrstufigen Architektur (Abbildung 5.5) mit Nachteilen versehen. 1. Performanz: der HTTP-/SSL-Connector des Tomcat-Servers verfügt nicht über die vielfältigen Einstellmöglichkeiten des Apache Webservers, mit denen Ressourcen eines Servers optimal für die Anfragen von Anwendern ausgenutzt werden können. 2. Schutz vor schädlichen Übergabeparametern: Filternde Sicherheitsmodule wie z. B. mod_security des Apache Webservers sind nicht für den Tomcat-Server erhältlich. 3. Fehlende Diversifikation von Schutzmechanismen: Wird der HTTP-/SSL-Connector des Tomcat-Servers falsch konfiguriert, so kann dies direkt die Kompromittierbarkeit von sensiblen Web-Inhalten (z. B. des Source-Code von JSPs) oder die Angreifbar­ keit der Management-Schnittstelle bedeuten. Wird ein filternder Apache Webserver „vor“ den Tomcat-Server geschaltet, so ist die Fehlkonfiguration mit weniger Sicher­ heitsrisiken verbunden. Vom Einsatz der hier beschriebenen Webanbindung, einer Architektur wie in Abbildung 5.4, wird aufgrund der beschriebenen Probleme abgeraten. Der prinzipiellen Vorteile einer mehrstufigen Architektur mit Tomcat-Server und vorgeschaltetem Apache Webserver kommt besonders in sicherheitsrelevanten Umgebungen zum Tragen und sollte dort nur so eingesetzt werden. Aus diesem Grund werden Angriffsszenarien gegen eine Architektur wie in Abbildung 5.4 hier nicht weiter untersucht (vgl. auch [Tomcat Fein.]). Bundesamt für Sicherheit in der Informationstechnik Seite 138 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 5.4 AJP-Connector ohne SSL-Client-Authentisierung Die am weitesten verbreitete Architekturvariante beim Betrieb des Tomcat Application Servers ist die Vorschaltung eines Webservers mit einem Modul mod_jk, welches die Verbindung zwischen Webserver und Tomcat-Server ermöglicht. Abbildung 5.5: Angriffe mit maliziösen HTTP-Inhalten 5.4.1 Angriffe eines maliziösen HTTP-Clients Bei den Tests mit dem AJP-Connector ohne Authentisierung mit SSLClient-Zertifikaten werden die Werte mehrerer HTTP-Parameter vom HTTP-Client in den Anfragen variiert. 5.4.1.1 Vorgehensweise Für die Durchführung und Dokumentation der Tests wurde eine einheitliche Vorgehensweise angewendet (siehe Abbildung 5.6). Seite 139 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Für alle Testfälle T66 bis T81 Angriffsprogramm T**webfuzz.c editieren Angriffsprogramm T**webfuzz.c compilieren catalina.out leeren localhost-10-**.log leeren mod_jk.log leeren Jakarta Tomcat Server neu starten Apache Web Server neu starten Netzwerksniffer starten Angriffsprogramm starten: ./T**webfuzz localhost 80 > T**_HTTP_fuzz.txt Netzwerkmitschnitt abspeichern als T**_ethereal_dump.dmp mod_jk.log abspeichern als T**_mod_jk.log catalina.out abspeichern als T**_catalina.out localhost-10-**.log abspeichern als T**_localhost.out Abbildung 5.6: Vorgehensweise HTTP-Client-Angriffe Bundesamt für Sicherheit in der Informationstechnik Seite 140 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Ein Beispiel für die SPIKE-Angriffsprogramme, mit denen die maliziösen HTTP-Anfragen gestellt wurden, ist im Abschnitt Installation bereits beschrieben worden. 5.4.1.2 Bewertungskriterien Um festzustellen, ob die Angriffe Hinweise auf Schwachstellen des Untersuchungs­ gegenstandes geben, wurden folgende Zustände / Protokolldateien untersucht: • Ist die angesprochene Web-Anwendung nach den Angriffen noch benutzbar? • Enthält die Protokolldatei des mod_jk Hinweise auf eine temporäre NichtVerfügbarkeit der Web-Anwendung? • Enthalten die Protokolldateien des Tomcat-Servers Fehlermeldungen oder sogar Java Stack Traces? • Enthält der HTTP-Reply des Tomcat-Servers HTTP-Meldungen wie „HTTP Status 500 (Internal Server Error)“ oder „HTTP Status 503 (Service Temporarily Unavailable)“? • Enthält der HTTP-Reply des Tomcat-Servers den Source-Code der angefragten Java Server Page? (Source Code Disclosure) Seite 141 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.4.1.3 Ergebnis Die nachfolgende Tabelle gibt eine Übersicht über die Testergebnisse. Test Nr. Testbeschreibung HTTP-Anfrage T 50 HTTP Methode T 51 URI T 52 HTTP Version T 53 Query String HTTP-Header T 54 Accept T 55 Accept-charset T 56 Authorization T 57 Connection T 58 Content-Type T 59 Content-Length Resultat T 60 T 61 T 62 T 63 OK OK OK FEHLER Bemerkung OK OK OK OK OK OK OK OK OK FEHLER Content-Length:<Leerzeichen> führt zu Fehlerzustand im Tomcat-Server Cookie Cookie2 Referer Host • Host: localhostSelect "DAV:displayname" from scope()“ • Host: C:localhost • Host: Select "DAV:displayname" from scope() führen zu Fehlerzustand im Tomcat-Server T 64 T 65 Unknown User-Agent OK OK Tabelle 15: Ergebnisse der Tests T66 bis T81 Schwachstelle in T75 Das Fehlen des Übergabeparameters im HTTP-Header Content-Length führte zu schwer­ wiegenden Fehlerzuständen im Tomcat-Server. Nachfolgende HTTP-Anfrage und -Antwort war mit einer gleichzeitigen Fehlermeldung in der Protokolldatei catalina.out verbunden. Listing 49: HTTP-Anfrage: POST /webgoat/attack HTTP/1.1 Host: 192.168.179.128 Bundesamt für Sicherheit in der Informationstechnik Seite 142 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,* /*;q=0.0 Accept-Language: en-us,en;q=0.0 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.0 Connection: close Referer: http://192.168.179.128/webgoat/attack Cookie: JSESSIONID=F7F97CD94DB5137AE94EA6FFF3D145E9 Authorization: Basic bWVtd2FkbWluOnZtd2FyZQ== Content-Type: application/x-www-form-urlencode Content-Length: person=bla Listing 50: HTTP-Antwort: HTTP/1.1 503 Service Temporarily Unavailable Date: Wed, 30 Nov 2005 21:10:25 GMT Server: Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7e mod_jk/1.2.14 Content-Length: 446 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>503 Service Temporarily Unavailable</title> </head><body> <h1>Service Temporarily Unavailable</h1> <p>The server is temporarily unable to service your request due to maintenance downtimVariablesize= 5 Listing 51: Korrespondierende Fehlermeldung in catalina.out: 30.11.2005 22:10:25 org.apache.jk.common.HandlerRequest invoke SCHWERWIEGEND: Error decoding request java.lang.NumberFormatException at org.apache.tomcat.util.buf.Ascii.parseInt(Ascii.java:145) at org.apache.tomcat.util.buf.ByteChunk.getInt(ByteChunk.java:491) at org.apache.tomcat.util.buf.MessageBytes.getInt(MessageBytes.java:687) at org.apache.jk.common.HandlerRequest.decodeHeaders(HandlerRequest.java:686) at org.apache.jk.common.HandlerRequest.decodeRequest(HandlerRequest.java:510) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:363) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 30.11.2005 22:10:25 org.apache.jk.common.ChannelSocket processConnection WARNUNG: processCallbacks status 2 30.11.2005 22:10:25 org.apache.jk.common.HandlerRequest invoke SCHWERWIEGEND: Error decoding request java.lang.NumberFormatException at org.apache.tomcat.util.buf.Ascii.parseInt(Ascii.java:145) at org.apache.tomcat.util.buf.ByteChunk.getInt(ByteChunk.java:491) at org.apache.tomcat.util.buf.MessageBytes.getInt(MessageBytes.java:687) at org.apache.jk.common.HandlerRequest.decodeHeaders(HandlerRequest.java:686) Seite 143 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers at org.apache.jk.common.HandlerRequest.decodeRequest(HandlerRequest.java:510) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:363) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 30.11.2005 22:10:25 org.apache.jk.common.ChannelSocket processConnection WARNUNG: processCallbacks status 2 30.11.2005 22:10:25 org.apache.jk.common.HandlerRequest invoke SCHWERWIEGEND: Error decoding request java.lang.NumberFormatException at org.apache.tomcat.util.buf.Ascii.parseInt(Ascii.java:145) at org.apache.tomcat.util.buf.ByteChunk.getInt(ByteChunk.java:491) at org.apache.tomcat.util.buf.MessageBytes.getInt(MessageBytes.java:687) at org.apache.jk.common.HandlerRequest.decodeHeaders(HandlerRequest.java:686) at org.apache.jk.common.HandlerRequest.decodeRequest(HandlerRequest.java:510) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:363) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 30.11.2005 22:10:25 org.apache.jk.common.ChannelSocket processConnection WARNUNG: processCallbacks status 2 Aus der identifizierten Schwachstelle konnten keine Sicherheitsrisiken abgeleitet werden. Mit dem durchgeführten Angriff konnte weder die Verfügbarkeit des Tomcat-Servers beeinträchtigt werden noch konnten interne bzw. vertrauliche Daten (z. B. Der Source-Code der angesprochenen JSP) veröffentlicht werden. Schwachstelle in T79 Bestimmte Übergabeparameter im HTTP-Header Host führten zu schwerwiegenden Fehlerzuständen im Tomcat-Server. Nachfolgende HTTP-Anfrage und -Antwort war mit einer gleichzeitigen Fehlermeldung in der Protokolldatei catalina.out verbunden: Listing 52: HTTP-Anfrage: POST /webgoat/attack HTTP/1.1 Host: Select "DAV:displayname" from scope() User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,* /*;q=0.0 Accept-Language: en-us,en;q=0.0 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.0 Connection: close Referer: http://192.168.179.128/webgoat/attack Cookie: JSESSIONID=9885AC16C6E36559C7751D07CC8395C3 Authorization: Basic bWVtd2FkbWluOnZtd2FyZQ== Content-Type: application/x-www-form-urlencode Bundesamt für Sicherheit in der Informationstechnik Seite 144 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Content-Length: Durchführung der Tests 12 person=bla Listing 53: HTTP-Antwort: HTTP/1.1 503 Service Temporarily Unavailable Date: Wed, 30 Nov 2005 23:24:43 GMT Server: Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7e mod_jk/1.2.14 Content-Length: 468 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>503 Service Temporarily Unavailable</title> </head><body> <h1>Service Temporarily Unavailable</h1> <p>The server is temporarily unable to service your request due to maintenance downtimVariablesize= 21 Listing 54: Korrespondierende Fehlermeldung in catalina.out: 01.12.2005 00:24:43 org.apache.jk.common.HandlerRequest invoke SCHWERWIEGEND: Error decoding request java.io.CharConversionException: Invalid char in port: 41 at org.apache.jk.common.HandlerRequest.parseHost(HandlerRequest.java:762) at org.apache.jk.common.HandlerRequest.decodeRequest(HandlerRequest.java:516) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:363) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 01.12.2005 00:24:43 org.apache.jk.common.ChannelSocket processConnection WARNUNG: processCallbacks status 2 01.12.2005 00:24:43 org.apache.jk.common.HandlerRequest invoke SCHWERWIEGEND: Error decoding request java.io.CharConversionException: Invalid char in port: 41 at org.apache.jk.common.HandlerRequest.parseHost(HandlerRequest.java:762) at org.apache.jk.common.HandlerRequest.decodeRequest(HandlerRequest.java:516) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:363) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 01.12.2005 00:24:43 org.apache.jk.common.ChannelSocket processConnection WARNUNG: processCallbacks status 2 01.12.2005 00:24:43 org.apache.jk.common.HandlerRequest invoke SCHWERWIEGEND: Error decoding request java.io.CharConversionException: Invalid char in port: 41 at org.apache.jk.common.HandlerRequest.parseHost(HandlerRequest.java:762) at org.apache.jk.common.HandlerRequest.decodeRequest(HandlerRequest.java:516) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:363) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678) Seite 145 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) 01.12.2005 00:24:43 org.apache.jk.common.ChannelSocket processConnection WARNUNG: processCallbacks status 2 Durch weitere Tests wurde herausgefunden, dass bereits die Zeichenkette „Host: x:y“ im HTTP-Header ausreicht, um den Fehlerzustand im Tomcat auszulösen. Aus der identifizierten Schwachstelle konnten keine Sicherheitsrisiken abgeleitet werden. Mit dem durchgeführten Angriff konnte weder die Verfügbarkeit des Tomcat-Servers beeinträchtigt werden noch konnten interne / vertrauliche Daten (z. B. der Source-Code der angesprochenen JSP) veröffentlicht werden. 5.4.2 Angriffe einer maliziösen Web-Anwendung Bei den Tests mit dem AJP-Connector (ohne SSL-Client-Zertifikate) werden die Werte einiger HTTP-Header von den Web Anwendungen in den Antworten variiert. Hinweis: Der Test wird auf die HTTP-Header beschränkt, die von Servlets bzw. JSPs modifiziert werden können. 5.4.2.1 Vorgehensweise Gesamtablauf Für die Durchführung und Dokumentation der Tests wurde eine einheitliche Vorgehensweise angewendet (siehe Abbildung 5.7). Bundesamt für Sicherheit in der Informationstechnik Seite 146 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Abbildung 5.7: Vorgehensweise Angriffe mit maliziöser Web-Anwendung Seite 147 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Maliziöse Anwendung Ein Beispiel einer Web-Anwendung, welche maliziöse HTTP-Header erzeugt, wird nachfolgend dargestellt: import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class T82 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String malstring=""; Vector v = null; if (v == null) { try{ BufferedReader br = new BufferedReader(new FileReader("/opt/jakarta -tomcat-5.5.9/webapps/malservlet/WEB-INF/classes/datei.txt")); v = new Vector(); while(br.ready()) v.add(br.readLine()); }catch(Exception e){} } Random r = new Random(); malstring= (String)v.get(r.nextInt(v.size())); response.setContentType("text/html"); PrintWriter out = response.getWriter(); response.addHeader("Date", malstring); out.println("<html>"); out.println("<head>"); String title = "Example_Title"; out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<a href=\"../helloworld.html\">"); out.println("<img src=\"../images/code.gif\" height=24 " + "width=24 align=right border=0 alt=\"view code\"></a>"); out.println("<a href=\"../index.html\">"); out.println("<img src=\"../images/return.gif\" height=24 " + "width=24 align=right border=0 alt=\"return\"></a>"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } } In diesem Beispiel wird der Header Date mit schadhaften Inhalten gefüllt. Die Java-Funktion, mit der die schadhaften response.addHeader("Date", malstring). HTTP-Header gesetzt werden, ist Aus den vorangegangenen Tests, bei denen mit SPIKE schadhafte HTTP-Anfragen gestellt wurden, sind die von SPIKE erzeugten schadhaften Zeichenketten herausgefiltert und in der Datei /opt/jakarta-tomcat-5.5.9/webapps/malservlet/WEB-INF/classes/datei.txt gesammelt worden. Bundesamt für Sicherheit in der Informationstechnik Seite 148 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Abbildung 5.8 zeigt den Ablauf der schadhaften Web-Anwendung, welche auf eine HTTPAnfrage eine HTTP-Antwort zurückgibt, in der ein HTTP-Header mit schadhaftem Inhalt gefüllt ist. Abbildung 5.8: Ablaufschema der schadhaften Web-Anwendung Abfrageskript Um zweitausend mal die maliziöse Web-Anwendung anzufragen und dabei zweitausend mal einen anderen maliziösen Wert im HTTP-Header zu verarbeiten, wurde folgendes Skript benutzt. #!/bin/bash i=0 while ( [ $i -le 2000 ] ) ; do echo -e "GET /malservlet/T82 HTTP/1.0 \r\n\r\n"|nc localhost 80 i=$[ i+1 ]; done Je nach Testfall wurde T82 durch T83, T84, etc. ersetzt. 5.4.2.2 Bewertungskriterien Um festzustellen, ob die Angriffe Hinweise auf Schwachstellen des Untersuchungsgegen­ standes geben, wurden folgende Zustände / Protokolldateien untersucht: • Ist die angesprochene Web-Anwendung nach den Angriffen noch benutzbar? • Enthält die Protokolldatei des mod_jk Hinweise auf eine temporäre Nicht-Verfügbar­ keit der Web-Anwendung? Seite 149 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Enthalten die Protokolldateien des Tomcat-Servers Fehlermeldungen oder sogar Java Stack Traces? • Enthält der HTTP-Reply des Tomcat-Servers HTTP-Meldungen wie „HTTP 500 (Internal Server Error)“ oder „HTTP 503 (Service Temporarily Unavailable)“? 5.4.2.3 Ergebnis Die nachfolgende Tabelle gibt eine Übersicht über die Testergebnisse. Test Nr. Testbeschreibung T 66 Date Resultat OK T 67 Last-Modified OK T 68 T 69 T 70 T 71 T 72 T 73 Content-Type WWW-Authenticate Etag Expires Set-Cookie Set-Cookie2 OK OK OK OK OK OK Bemerkung Feld kann nicht mit beliebigen Inhalten gefüllt werden. Feld kann nicht mit beliebigen Inhalten gefüllt werden. Tabelle 16: Testergebnisse T82 bis T89 Bei den Feldern Date und Last-Modified war es nicht möglich, den Inhalt des jeweiligen Feldes auf beliebige Werte zu setzen. Jeder Versuch, den Inhalt anders zu füllen als mit einer positiven Zahl (Anzahl Millisekunden seit dem 1.1.1970 0:00 Uhr) ergibt als Ausgabe das aktuelle Datum (z. B. „Date: Tue, 25 Oct 2005 16:23:38 GMT“) oder den 1.1.1970 („LastModified: Thu, 01 Jan 1970 00:00:00 GMT“). Es konnten keine Schwachstellen identifiziert werden. 5.5 AJP Connector mit SSL Client Authentisierung Abbildung 5.14 zeigt den Versuchsaufbau, bei dem vom Client Anfragen mit maliziösen Inhalten an den Apache Webserver gesendet und Zertifikatsinhalte an den Tomcat-Server weitergeleitet wurden. Abbildung 5.9: Angriffe mit maliziösen SSL Client Zertifikaten Bundesamt für Sicherheit in der Informationstechnik Seite 150 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Bei den Tests mit dem AJP-Connector mit Authentisierung über SSL-Client-Zertifikate wurde versucht, Schwachstellen im mod_jk und in der AJP-Schnittstelle des Tomcat-Servers zu finden, ohne vorgelagerte Komponenten wie den Apache Webserver oder mod_ssl durch die Tests zu beeinflussen. Es wurde versucht Fehler im Apache oder in mod_ssl zu vermeiden, die womöglich dazu geführt hätten, dass die maliziösen Übergabeparameter gar nicht bis mod_jk oder zum TomcatServer gelangt wären. Zuerst wurde die Funktionsweise des Gesamtsystems bei Verwendung von SSL-Client- Zertifikaten analysiert, um einzelne Angriffe planen zu können. 5.5.1 Funktionsweise des Systems Überblick Abbildung 5.10 zeigt noch einmal die Funktionsweise, mit der der Datenfluss analysiert wurde. Abbildung 5.10: Ablauf bei Authentisierung mit SSL Client-Zertifikat Erzeugung des SSL-Client-Zertifikats Die Erzeugung eines SSL-Client-Zertifikats wurde bereits in im Abschnitt 4.7.4 erläutert. Verarbeitung in mod_ssl Das Modul mod_ssl innerhalb des Apache Webservers, welches den Zugriff auf den Server über SSL implementiert, wurde so konfiguriert, dass ein solcher Zugriff nur erlaubt wird, wenn ein HTTPS-Client ein Client-Zertifikat einer anerkannten CA vorweist. Hierfür wurden folgende Konfigurationsparameter in der Datei ssl.conf gesetzt: SSLVerifyClient require SSLCACertificateFile /root/bsitomcat_ca/ssl/ca/ca.pem Seite 151 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers SSLVerifyDepth 1 SSLOptions +StdEnvVars +ExportCertData +FakeBasicAuth Die Option SSLVerifyClient require sorgt dafür, dass SSL-Verbindungsaufbauten ohne jegliches SSL Client-Zertifikat abgelehnt werden. Die Option SSLCACertificateFile bestimmt, dass die Client-Zertifikate auf eine Signatur der CA geprüft werden, dessen öffentlicher Schlüssel im Zertifikat in der angegebenen Datei enthalten ist. Clients mit Zertifikaten, die nicht von dieser CA signiert wurden, sollen dabei abgelehnt werden. Die Option SSLVerifyDepth 1 bestimmt, dass nur eine Zertifizierungsebene geprüft wird. Ein Client-Zertifikat, welches nicht von der anerkannten CA, sondern von einer anderen CA ausgestellt worden ist, wird damit nicht akzeptiert, selbst wenn der öffentliche Schlüssel dieser anderen CA von der anerkannten CA signiert wurde. In der Option SSLOptions sorgt der Parameter +ExportCertData dafür, dass der Webserver die Inhalte des SSL-Client-Zertifikats an mod_jk weitergibt. Ist diese Option nicht aktiv, so werden die Inhalte des Client-Zertifikats nicht an mod_jk und somit nicht an den TomcatServer weitergegeben. Die anderen Parameter der Option SSLOptions sind für die Authentisierung per SSL-Client-Zertifikat nicht relevant und werden hier nicht näher erläutert. Verarbeitung in mod_jk Das Modul mod_jk gibt die übergebenen Zertifikatsinhalte ungefiltert an den AJP-Connector des Tomcat-Servers weiter. Verarbeitung im AJP-Connector Die Komponente mod_jk übergibt ein vom HTTP-Client abgesendetes SSL-Client-Zertifikat über das AJP-Protokoll dem AJP-Connector im Tomcat. Der folgende Netzwerkmitschnitt zeigt dabei, dass das Zertifikat als Ganzes, d. h. noch nicht in einzelne Komponenten aufgeteilt, übergeben wird. Bundesamt für Sicherheit in der Informationstechnik Seite 152 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Abbildung 5.11: Mitschnitt des AJP-Protokolls mit Ethereal Die vorige Abbildung zeigt die Anzahl der Netzwerkpakete, die zwischen mod_jk bzw. dem Apache Webserver und dem AJP-Connector des Tomcat-Servers bei einer einfachen HTTP(S)-Anfrage entstehen. Die Anfrage lautet beispielhaft: "GET /simple_info1/index.jsp HTTP/1.0\r\n\r\n" Seite 153 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abbildung 5.12: Inhalt des AJP-Netzwerkmitschnitts Welche Inhalte bei diesem Datentransfer fließen, ist in der folgenden Abbildung zu sehen. Der Webserver bzw. mod_jk übergibt dem AJP-Connector des Tomcat-Servers das SSLClient-Zertifikat (umrahmt von „BEGIN CERTIFICATE“ und „END CERTIFICATE“), eine Information über den Verschlüsselungsalgorithmus („DHE-RSA-AES256-SHA“) sowie die SSL Session-ID („@08D320A8...“). Zertifikatsauswertung im Tomcat Der folgende Source Code der Datei request_data.jsp zeigt, wie die Zertifikatsinhalte ausgewertet werden. Listing 55: Datei request_data.jsp <html> <%@ page language="java" import="java.security.cert.*,java.lang.reflect.*"%> <head> <title> Display HTTP Request Data </title> </head> <body> <% java.util.Enumeration attNames = request.getAttributeNames(); java.util.Enumeration paramNames = request.getParameterNames(); java.util.Enumeration hdrNames = request.getHeaderNames(); %> <h1>Request = <br /> <%= request.getMethod() %> <%= request.getServerName() %>: Bundesamt für Sicherheit in der Informationstechnik Seite 154 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests <%= request.getServerPort() %> <%= request.getProtocol() %> </h1> <hr /> <h2><font color=red>Request header entries:</font></h2> <% while (hdrNames.hasMoreElements()) { String name = (String) hdrNames.nextElement(); String value = request.getHeader(name); out.println("<b>" + name + "</b>: " + value + "<br />"); } %> <hr /> <h2><font color=red>Request parameters:</font></h2> <% while (paramNames.hasMoreElements()) { String name = (String) paramNames.nextElement(); String value = request.getParameter(name); out.println("<b>" + name + "</b>: " + value + "<br />"); } %> <hr /> <h2><font color=red>Request attributes:</font></h2> <% while (attNames.hasMoreElements()) { String name = (String) attNames.nextElement(); Object value = request.getAttribute(name); out.println("<b>" + name + "</b>: " + value + "<br />"); // check, if name contains "X509Certificate" i.e. // we have certificate(s) in our current entry int x509index = name.indexOf("X509Certificate"); if (x509index > 1) { int i; // there can more than one certificates be encoded // in the current attribute X509Certificate certs[] = (X509Certificate[])request.getAttribute(name); for(i=0; i<certs.length; i++) { // display all relevant information out.println("#####<b>certificate[" + i + "]</b>#####" + "<ul>" + "<li/><i>SubjectDN</i>: " + certs[i].getSubjectDN() + "<li/><i>IssuerDN</i>: " + certs[i].getIssuerDN() + "<li/><i>SerialNumber</i>: " + certs[i].getSerialNumber() + "<li/><i>Signature</i>: " + certs[i].getSignature() + "<li/><i>NotBefore</i>: " + certs[i].getNotBefore() + "<li/><i>NotAfter</i>: " + certs[i].getNotAfter() + "<li/><i>Version</i>: " + certs[i].getVersion() + "<li/><i>SigAlgorithm</i>: " + certs[i].getSigAlgName() + "<li/><i>SigAlgParmams</i>: " + certs[i].getSigAlgParams() + "<li/><i>KeyUsageExt</i>: " + certs[i].getKeyUsage() + "</ul>"); } } }%> <hr /> </body> </html> Seite 155 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Die oben abgebildete JSP-Datei bekommt als Parameter ein Array von X509-Zertifikaten übergeben (Typ X509Certificate[]), welches es einzeln mit Methoden der JSSE auswertet. Die Methoden getSubjectDN(), getSerialNumber(), getSigAlgParams() usw. der Klasse java.security.cert.X509Certificate werden dabei von SUN (JSSE 5 innerhalb des JDK 5) zur Verfügung gestellt, sind also nicht Bestandteil von Tomcat. 5.5.2 Angriffe Ausgehend von der oben geschilderten Analyse der Funktionsweise wurden für die Penetrationstests folgende Schlussfolgerungen getroffen: • Das Modul mod_jk decodiert / analysiert das vom Web Browser übergebene X509codierte Client-Zertifikat nicht. Angriffe durch ungewöhnliche Zeichenketten im Common Name (CN) oder Distinguished Name (DN) des Zertifikats können somit in mod_jk keine unerwarteten Effekte verursachen. • auf Ebene des AJP-Connectors wird das Zertifikat ebenfalls nicht decodiert, womit ungewöhnliche Zeichenketten in den Zertifikatsattributen auch hier keine unerwar­ teten Effekte auslösen können. • Für die Auswertung / Verarbeitung der Zertifikatsinhalte werden JSSE-Klassen von SUN verwendet, die nicht Bestandteil von Tomcat sind. Diese sind also nicht Gegenstand unserer Untersuchung. Die verbleibenden Angriffsmöglichkeiten bestehen darin, die Länge des X509-Zertifikats variabel zu gestalten, um somit eventuelle Puffergrenzen in mod_jk oder im AJP-Connector des Tomcat-Servers zu überschreiten. Da die einzelnen Felder eines X509-Zertifikats nur 64 Zeichen lang sein können [ISIS MTT] (mehr wird vom eingesetzten Werkzeug openssl auch nicht unterstützt), aber beliebig viele Attribute für OU (Organisation Unit) erlaubt sind, wurde die Gesamtlänge des SSL-ClientZertifikats dadurch beeinflusst, dass wenige oder viele OU-Attribute gesetzt wurden. Somit konnten Zertifikatslängen bis zu 200KB erzeugt werden (übliche Länge: etwa 1KB). 5.5.2.1 Testfälle Es wurden die folgenden vier Tests durchgeführt. Test Nr. Testbeschreibung T 74.1 Client-Zertifikat mit 4389 Byte Länge (10 OUAttribute) T 90.2 Client-Zertifikat mit 4393 Byte (100 OU-Attribute) T 90.3 Client-Zertifikat mit 33643 Byte (1000 OU-Attribute) T 90.4 Client-Zertifikat mit 196147 Byte (6000 OUAttribute) Erwartetes Resultat OK OK OK OK Tabelle 17: Übersicht über die Penetrationstests, AJP-Connector mit Authentisierung über SSLClient-Zertifikate Bundesamt für Sicherheit in der Informationstechnik Seite 156 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Eine Erzeugung von noch längeren SSL-Client-Zertifikaten scheiterte am verwendeten Werkzeug openssl, welches bei wesentlich mehr als 6000 OU-Attributen mit einer Fehler­ meldung abbrach. Das Skript, mit dem die Client-Zertifikate erzeugt wurden, wurde bereits im Abschnitt 4.7.4 gezeigt. Es wurde nur dadurch erweitert, dass statt eines OU-Attributswertes mehrere angegeben wurden: Listing 56: Ergänzung zum Skript setup_client_cert.sh ... #-------------------------------------------------------------# Create a client certificate request: malstring=`/usr/bin/perl -e'print "/OU=Organisation1"x100'` openssl req -new \ -newkey rsa:2048 \ -nodes \ -out ${CLIENT_DIR}/${CLIENT}.req \ -keyout ${CLIENT_DIR}/${CLIENT}.key \ -subj "/CN=${CLIENT}${malstring}/L=Bonn/ST=NRW/C=DE/emailAddress=${CLIENT}@bsitomcat.de/O=BSITomc at ITC-Sec" ... Seite 157 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.5.2.2 Vorgehensweise In Abbildung 5.13 ist die Vorgehensweise bei der Durchführung der Angriffe dargestellt. Abbildung 5.13: Vorgehensweise bei SSL-Zertifikats-Authentisierung Bundesamt für Sicherheit in der Informationstechnik Seite 158 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests 5.5.2.3 Bewertungskriterien Um festzustellen, ob die Angriffe Hinweise auf Schwachstellen des Untersuchungsgegen­ standes geben, wurden folgende Zustände / Protokolldateien untersucht: • Ist die angesprochene Web-Anwendung nach den Angriffen noch benutzbar? • Enthält die Protokolldatei des mod_jk Hinweise auf eine temporäre Nicht-Verfügbar­ keit der Web-Anwendung? • Enthalten die Protokolldateien des Tomcat-Servers Fehlermeldungen oder sogar Java Stack Traces? • Enthält der HTTP-Reply des Tomcat-Servers HTTP-Meldungen wie „HTTP 500 (Internal Server Error)“ oder „HTTP 503 (Service Temporarily Unavailable)“? 5.5.2.4 Ergebnis Die nachfolgende Tabelle gibt eine Übersicht über die Testergebnisse. Test Nr. Testbeschreibung T 90.1 T 90.2 T 90.3 Client-Zertifikat mit 4389 Byte Länge (10 OU-Attribute) Client-Zertifikat mit 4393 Byte (100 OU-Attribute) Client-Zertifikat mit 33643 Byte (1000 OU-Attribute) Erwartetes Resultat OK Bemerkungen OK Fehler Fehlerzustand in mod_jk: ajp_marshal_into_msgb::jk_ajp_co mmon.c (490): failed appending the SSL certificates Keine HTTP-Antwort Netzwerkdump zeigt, dass nicht das ganze SSL-Zertifikat von mod_jk zum Tomcat übertragen wird. T 90.4 Kein Eintrag in den Logs des Tomcat-Servers. Keine Vollendung des SSLVerbindungsaufbaus. Client-Zertifikat mit 196147 Byte Fehler (6000 OU-Attribute) Tabelle 18: Ergebnisse der Tests mit SSL Client-Zertifikat Fehler in Test T90.3 Bei der Verwendung von 1000 OU-Attributen im Client-Zertifikat trat ein Fehler auf, der im mod_jk.log dokumentiert wurde: [Fri Oct 28 17:49:1130514593 2005] Seite 159 (von 187) [error] ajp_marshal_into_msgb::jk_ajp_common Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers .c (490): failed appending the SSL certificates [Fri Oct 28 17:49:1130514593 2005] [info] ajp_service::jk_ajp_common.c (1662): Creating AJP message failed, without recovery [Fri Oct 28 17:49:1130514593 2005] bsi_ajp13_1 www.example.com 0.000482 [Fri Oct 28 17:49:1130514593 2005] [info] jk_handler::mod_jk.c (1964): Abortin g connection for worker=bsi_ajp13_1 In der HTTP-Anwort des Webservers kann man erkennen, dass der Webserver die HTTPSAnfrage nicht verarbeiten kann: Listing 57: HTTP-Antwort des Webservers HTTP/1.1 413 Request Entity Too Large Date: Fri, 28 Oct 2005 15:38:40 GMT Server: Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7e mod_jk/1.2.14 Content-Length: 474 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>413 Request Entity Too Large</title> </head><body> <h1>Request Entity Too Large</h1> The requested resource<br />/simple_info1/index.jsp<br /> does not allow request data with GET requests, or the amount of data provided in the request exceeds the capacity limit. <hr> <address>Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7e mod_jk/1.2.14 Server at www.example.com Port 443</address> </body></html> Der Test T90.3 ergab keine sicherheitsrelevanten Hinweise. Fehler in Test T90.4 Bei der Verwendung von 6000 OU-Attributen im Client-Zertifikat ist die SSL-Verbindung zwischen openssl als Client und dem Webserver bzw. mod_ssl abgebrochen worden. Der openssl-Client hat dabei folgende Fehlermeldung ausgegeben: depth=1 /CN=BSITomcat ITC-Sec CA/L=Bonn/ST=NRW/C=DE/[email protected] /O=BSITomcat ITC-Sec Certification Authority verify return:1 depth=0 /CN=tomcathost/L=Bonn/ST=NRW/C=DE/[email protected]/O=BSITomcat ITC-Sec verify return:1 write:errno=32 Im Netzwerkmitschnitt kann man erkennen, dass die SSL-Verbindung zwar aufgebaut, dann aber sofort wieder abgebaut wird (Abbildung 5.12). Bundesamt für Sicherheit in der Informationstechnik Seite 160 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Abbildung 5.14: Netzwerkmitschnitt von Test T90.4 Der als T904_ethereal_dump.dmp abgespeicherte Netzwerkmitschnitt wurde mit tcpflow analysiert. Dabei zeigte sich, dass das TCP-Paket des openssl-Clients an den Webserver nur 1353 der 6000 OU-Attribute enthält und danach abrupt endet. Offensichtlich ist der Funktionsmangel in openssl begründet und nicht in mod_jk oder Tomcat. Der Test T90.4 ergab keine sicherheitsrelevanten Hinweise. 5.6 Quellcode-Analysen Ziel der Quellcode-Analyse ist es, sicherheitsrelevante Programmierfehler in Tomcat zu finden. Solche Fehler könnten auf Schwächen in der Implementierung, z. B. Pufferüberläufe, Race Conditions und unsichere System-Calls oder auf Schwächen in der Architektur selbst, wie fehlerhafte Zugriffskontrolle durch falsch definierte Rollen basieren. Der Fokus wird hierbei auf den Quellcode gerichtet, der Eingaben von nicht vertrauens­ würdigen Quellen entgegen nimmt oder der Sicherheitsfunktionen des Tomcat bereitstellt. Die Quellcode Analyse besteht dabei aus zwei Teilen. 5.6.1 Automatische Überprüfung des Quellcodes Für die automatische Analyse des C-Quell-Codes wurden die Werkzeuge flawfinder und splint eingesetzt. Beide entstammen dem Bereich der Open Source. Das bekannte Programm rats ist dagegen nicht frei erhältlich. Es wird auch nicht weiter benötigt, weil es sich mit den Fähigkeiten von flawfinder überschneidet. Ähnliches gilt für ITS4, das wohl berühmteste von allen. Da es in durchgeführten Analysen von den anderen Programmen übertroffen wird, besitzt es nunmehr eher historischen Charakter. Seite 161 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Für die automatische Analyse des Java-Quell-Code wurde das Werkzeug findbugs47 eingesetzt. Es hat gegenüber anderen Werkzeugen wie pmd48 den Vorteil, dass es sich weniger auf syntaktische Elemente beschränkt. Vielmehr berücksichtigt es auch Besonderheiten der objektorientierten Programmierung (OOP). So nimmt es beispielsweise auch Prüfungen an der Vererbungshierarchie vor. Es wird hierbei der Quellcode von Tomcat der in Java programmiert ist, sowie der Apacheseitige AJP-Connector mod_jk, der in C programmiert ist, analysiert. Die Ergebnisse der Analysewerkzeuge werden gesichtet und bezüglich ihrer Sicherheits­ relevanz priorisiert. Jedes der genannten Werkzeuge liefert eine Liste von Meldungen. Einige davon bedürfen keiner weiteren Prüfung, z. B. beim Erkennen einer unbenutzten Variable. Für Sicherheits­ analysen jedoch gilt, dass jede Meldung, die relevant sein könnte, im Quelltext erst mal geprüft werden muss. Der Grund ist, die Werkzeuge sind nicht gut genug, um die Fehler mit Bestimmtheit fest zu stellen. Die Zahl der Falschmeldungen wie „möglicher Fehler“ oder „mögliche gefährliche Verwendung von ...“ machen leider den allergrößten Teil der Meldungen aus. Dennoch sind solche Werkzeuge nützlich, denn sie zeigen Bereiche im Quelltext, in denen beispielsweise Puffer variabler Länge verwendet werden. Solche Bereiche können dann manuell untersucht werden. Das bedeutet, die Werkzeuge dienen vor allem der Orientierung während eines Software Reviews. Folgendes Beispiel zeigt dieses Zusammenspiel. Flawfinder moniert jedes Vorkommen von strlen(), darunter: mod_jk.c:1044: [1] (buffer) strlen: Does not handle strings that are not \0-terminated (it could cause a crash if unprotected). In den allermeisten Fällen ist die Verwendung von strlen() unproblematisch, jedoch zeigt das manuelle Sichten des Umfelds dieser Funktion, dass eine ungeschützte Speicherallokation vorkommt, die bei Speichermangel zum Absturz des Apache führen kann: static void request_log_transaction(request_rec * r, jk_server_conf_t * conf) { [...] strs = apr_palloc(r->pool, sizeof(char *) * (format->nelts)); strl = apr_palloc(r->pool, sizeof(int) * (format->nelts)); items = (request_log_format_item *) format->elts; for (i = 0; i < format->nelts; ++i) { strs[i] = process_item(r, &items[i]); } 5.6.2 Manuelle Überprüfung des Quellcodes Das Ergebnis der automatischen Überprüfung wird durch eine manuelle Sichtung des Quellcodes ergänzt. Ausgesuchte Softwareteile werden gesichtet und auf das 47 48 http://findbugs.sourceforge.net/ http://pmd.sourceforge.net/ Bundesamt für Sicherheit in der Informationstechnik Seite 162 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Vorhandensein von Schwachstellen geprüft. Beschreibungen der Sicherheitslücken und der daraus resultierenden Bedrohungen werden mit Beispielen aufgezeigt. Es wird nicht geprüft, ob gefundene Schwachstellen auch ausnutzbar sind. Die Vorgehensweise der manuellen Prüfung unterscheiden sich bei C und Java. Bei der Programmiersprache C kann eine Datei bzw. Modul untersucht werden, in dem sie linear von oben bis unten durchgesehen wird. Favorisiert wird dabei eine Bottom-UpAnalyse. Dieser Ansatz setzt einen Aufbau der Datei voraus, der für die Programmiersprache Pascal üblich ist. Hier ist es nämlich nahezu erforderlich Vorwärtsreferenzen zu vermeiden. Dies bedeutet, Prozeduren weiter unten im Quelltext nutzen die Unterprozeduren weiter oben im Quelltext. Der Vorteil dieser Vorgehensweise liegt darin, dass kaum falsche Annahmen über kleine Hilfsfunktionen gebildet werden, z. B. ob NULL als Parameter erlaubt ist oder nicht. Beim Betrachten der kleinen Unterprozedur kann also ein sofortiger Abgleich zwischen dem bisher aufgebauten Wissen aus früheren Prozeduren, Dokumentationen und Codes stattfinden. Das Wissen über die Funktionsweise des Code wird dabei inkrementell aufgebaut und validiert. Schreitet man bei der Analyse fort, so gelangt man zu den Prozeduren weiter unten in der Datei und kennt die Einsatzbedingungen sowie Nebeneffekte der darin aufgerufenen, bereits analysierten Prozeduren bestens. Wer dagegen die Analyse zuerst mit den übergeordneten Prozeduren beginnen würde, müsste viele Annahmen über die darin aufgerufenen Prozeduren und Module bilden. Das menschliche Gehirn ist aber nicht besonders geeignet im Zurücknehmen von falschen Annahmen. Die oben geschilderte Vorgehensweise ist für viele Programmiersprachen anwendbar, darunter Ada, Lisp und C++. Für formale Sprachen mit Möglichkeiten bis hin zum Beweisen von Programmeigenschaften wie bei B oder VDM ist auch der umgekehrte Ansatz denkbar, also von oben (abstrakt) nach unten (detailliert). Er wird, wie in der Mathematik auch üblich, so praktiziert. Speziell bei Java Java hingegen gibt es Hürden bei der Analyse: 1. Der Quellcode liegt seltenst in der für das Review idealen Pascal-ähnlichen Form vor. In Tomcat sind ausreichend Beispiele zu finden, wo Variablen an beliebiger Stelle innerhalb einer Datei definiert werden. Stellenweise referenzieren Methoden Variablen, die erst weiter unten im Quellcode definiert werden. Darüber hinaus werden Hilfsfunktionen gerne ans Dateiende verlagert. Diese Tendenz wird durch den Einsatz von grafischen Benutzer­ oberflächen (IDE) vermutlich verstärkt, weil individuelle Methoden per Mausklick angesprungen werden und der logische Aufbau der Datei dadurch in den Hintergrund gerät. 2. Es kommt erschwerend immer wieder vor, dass konzeptuell zusammengehörige Funktionalitäten sich wegen objektorientierter Vererbungshierarchien über mehrere Klassen und damit auch Dateien verteilen. Wer Java analysiert, wird daher zwangsläufig zwischen Methoden hin und herspringen, die über mehrere Dateien verteilt sind. Ein Beispiel dafür liefert die Hierarchie JSSE14SocketFactory → JSSESocketFactory → ServerSocketFactory (vgl. T92). Hier wird das Verarbeiten der Konfigurationsattribute auf zwei Dateien verteilt, während die Attribute selbst aus einer dritten Datei stammen. Seite 163 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 3. Viele APIs von Java durchdringt der Wunsch nach möglichst großer Austauschbarkeit von Komponenten. Dieser bewirkt leider, dass eine Funktionalität stets indirekt aufgerufen wird, oftmals über Konfigurationsdateien statt direkt erkennbar im Code. Dies erzeugt eine Vielzahl von Interfaces und Adapterklassen. Damit wächst der Bedarf an Schnittstellen anpassenden Klassen enorm. Die Zahl der Methoden steigt, weil viele nur für die Schnittstellenanpassung nach beiden Seiten hin benötigt werden. Gemeint sind mit letzterem bzgl. eines Moduls die Schnittstelle „angebotenen Leistung“ und die Schnittstelle zu den dafür benötigten anderen Modulen. In der Sprache der Entwickler reflektiert sich dies durch Metaphern im Bereich der Klempnerei, z. B. Adapter, Connectoren oder Valves kanalisieren Informationen, die von Modulen verarbeitet werden. Die wenigsten Werkzeuge sind in der Lage, Datenflussanalysen über mehrere Funktionen hinweg durchzuführen. Dazu wäre auch das Erkennen von Protokollen oder Traces nötig, was im allgemeinen sehr schwierig und noch Gegenstand von Forschungsarbeiten ist. Mit Protokollen oder Traces ist im Rahmen der Programmanalyse die Aufrufreihenfolge von Methoden eines Objekts oder eines abstrakten Datentyps gemeint. Daraufhin könnte die festgestellte Reihenfolge mit einer spezifizierten Reihenfolge verglichen werden. Der Begriff Methode bezieht sich nicht nur auf objektorientierte Programmierung (OOP). Auch für C kann modelliert werden, dass beispielsweise für Objekte vom Typ FILE* gilt: fopen() → ... → fclose(), d. h. auf den Konstruktor (fopen) muss das Schließen der Datei (fclose) folgen. Ansätze davon sind in der verschiedenen Werkzeuge enthalten. So erkennt splint die Aufrufe von malloc() und kann unter Umständen melden, wenn ein Speicher nicht freigegeben wird. Findbugs enthält eine einfach Regel, die auch ohne Datenflussanalyse implementiert werden könnte. Ein Konstruktor sollte sämtliche Instanzenvariablen initialisieren. Leider wird bei der OOP oftmals von diesem eleganten Modell abgewichen. Stattdessen müssen bestimmte Methoden, typischerweise init, set o. ä. genannt, aufgerufen werden, bevor die meisten Methoden des Objekts angesprochen werden dürfen und das Objekt sinngemäß voll initialisiert ist. Ein Beispiel soll das verdeutlichen: Listing 58: Eine Warnung von Findbugs zu möglicherweise uninitialisierten Variablen: Field not initialized in constructor: org.apache.jk.common.JkInputStream.mc JkInputStream.java Listing 59: Quellcodeauszug zur Klasse org.apache.jk.common.JkInputStream49: /** Must be called when the stream is created */ public void setMsgContext( MsgContext mc ) { this.mc=mc; } Aus verschiedenen Gründen war es nicht möglich, den MsgContext bereits dem Konstruktor mitzuteilen. Erst nachdem der Wert nachgeliefert wurde, kann das Objekt zum Lesen benutzt werden. Obiges Listing zeigt, dass das API diese Anforderung erwähnt. 49 Datei jakarta-tomcat-connectors/jk/java/org/apache/jk/common/JkInputStream.java Bundesamt für Sicherheit in der Informationstechnik Seite 164 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Der maschinelle Nachweis, dass setMsgContext stets vor anderen Methoden dieser Klasse aufgerufen wird, ist alles andere als trivial. Das Entwurfsmuster Factory bietet hierzu eine saubere, aber leider aufwändige Lösung an: die Trennung der Zustände „teilweise initialisiert“ und „voll initialisiert“ wird durch zwei verschiedene Objekttypen bzw. -klassen erreicht. Die Factory stellt den ersten Zustand dar und speichert einige Eigenschaften, die anschließend beim Individualisieren an das daraufhin voll initialisierte Objekt der getrennten Klassen weitergegeben wird. Durch die getrennten Klassen kann kein Zugriff auf ein uninitialisiertes Objekt erfolgen. Positiv ist bei Java gegenüber C zu vermerken, dass die Sprache und die Ausführung der Bytecodes auf einer JVM besser definiert sind. Auch gibt es kein Pointer Aliasing, das Analysen erschweren würde. Dies hat zur Folge, dass Java oder JVM-basierte Systeme gerne in kleinen sicherheitsrelevanten Anwendungen, z. B. bei Chipkarten eingesetzt werden. Bei kleinen Anwendungen mit maximal zweitausend Zeilen Code werden formale Beweismethoden praktikabel und bereits eingesetzt. 5.6.3 Umfang der Quellcode-Analyse Der Fokus der automatischen Überprüfung wird bei Quellcode in C (z. B. mod_jk) auf die Suche nach potentiellen Pufferüberläufen und Format-String-Schwächen gerichtet. Es werden die Quellcode-Teile des Tomcat, die Verschlüsselungsfunktionen und Authenti­ sierungsfunktionen bereitstellen, manuell gesichtet und auf Sicherheitsprobleme hin untersucht. Bei der Verschlüsselung werden die Schnittstellen zu JSSE untersucht. Die SSLImplementierung von Java selbst ist nicht Bestandteil der Untersuchung. Weiterhin werden die Programmteile von Tomcat untersucht, die Authentisierungsfunktionen bereitstellen. Die externen Softwarekomponenten, z. B. JDBC-Schnittstellen zu Datenbanken, JavaKomponenten wie JNDI oder JAAS, die bei den entsprechenden Authentisierungsmethoden verwendet werden, sind jedoch nicht Gegenstand der Untersuchung. Falls die früher durchgeführten Tests wesentliche Abweichungen von den Sicherheitszielen oder fehlerhafte Sicherheitsfunktionen von Tomcat identifiziert haben, werden die entsprechenden Teile des Quellcodes in dieser Phase natürlich genauer betrachtet. Um das Ergebnis der Analyse vorwegzunehmen - Fehler und Inkonsistenzen wurden zwar gefunden, aber keine solchen, die die Sicherheitsziele gefährden. Die gefundenen Fehler wurden bzw. werden den Entwicklern mitgeteilt, meist in der Form von Bugmeldungen. Deren Bearbeitungsstand kann in sog. Bugtracker-Systemen online50 nachgesehen werden. Die folgenden Tabelle fasst die Tests bezüglich des Quellcodes zusammen: Test Nr. Testbeschreibung T 75 T 76 50 Automatische Quellcode Überprüfung auf Pufferüberlauf und Format String Schwächen Manuelle Sichtung des Quellcodes: Schnittstellen zu JSSE (SSL) Erwartetes Resultat unbekannt Bemerkungen flawfinder und splint für C, findbugs für Java unbekannt http://bugzilla.apache.org/ darin Produkt Tomcat 5 auswählen, dazu die Komponente JK oder Catalina Seite 165 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Test Nr. Testbeschreibung T 77 T 78 Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Erwartetes Resultat unbekannt Bemerkungen Manuelle Sichtung des Quellcodes: Authentisierungsmethoden Manuelle Sichtung des unbekannt Quellcodes vorher identifizierter Probleme Tabelle 19: Übersicht über die Quellcode Analysen 5.6.3.1.1 T91/T94 Automatische und manuelle Prüfung des Quellcode Es ist sinnvoll, automatische und manuelle Prüfung zu verbinden, da die Ergebnisse der mechanischen Werkzeuge stets manuell begutachtet werden müssen. Dies liegt in den vielfältigen Einschränkungen der Analysefähigkeit der Werkzeuge, aber auch in den Grenzen der automatischen Programmanalyse begründet. Flawfinder ist zum Aufspüren von Fehlern zu Pufferüberläufen ganz brauchbar. Eine Anwendung auf die Datei mod_jk.c ließ aufgrund der geringen Anzahl der Warnungen vermuten, die Autoren dieses Moduls haben das Werkzeug bereits selbst eingesetzt. Eine Suche in Mailinglisten, Kommentaren im Code oder den Änderungsvermerken in den ChangeLog ergab dazu jedoch keinen Hinweis. Listing 60: Statistiken von Flawfinder zu mod_jk.c: Flawfinder version 1.26, (C) 2001-2004 David A. Wheeler. Number of dangerous functions in C/C++ ruleset: 158 Examining mod_jk.c mod_jk.c:243: [2] (buffer) char: Statically-sized arrays can be overflowed. Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. [...] mod_jk.c:2691: [1] (buffer) strlen: Does not handle strings that are not \0-terminated (it could cause a crash if unprotected). Hits = 13 Lines analyzed = 2736 in 1.34 seconds (3252 lines/second) Physical Source Lines of Code (SLOC) = 1856 Hits@level = [0] 0 [1] 9 [2] 4 [3] 0 [4] 0 [5] 0 Hits@level+ = [0+] 13 [1+] 13 [2+] 4 [3+] 0 [4+] 0 [5+] 0 Hits/KSLOC@level+ = [0+] 7.00431 [1+] 7.00431 [2+] 2.15517 [3+] 0 [4+] 0 [5+] Minimum risk level = 1 Not every hit is necessarily a security vulnerability. There may be other security vulnerabilities; review your code! 0 Obiges Listing enthält die erste und letzte Meldung von Flawfinder zur Datei mod_jk.c. Flawfinder fügt jeder Meldung einen Sicherheitslevel hinzu. Jede solche Meldung oder zumindest die der höchsten Level kann anschließend manuell auf Falschmeldungen geprüft werden. Feststellung: jk_error_exit() formatiert die Fehlermeldungstext im printf()-Stil über apr_pvsprintf() aus der Bibliothek APR von Apache, übergibt den formatierten String jedoch an ap_log_error(), welches wiederum eine printf()-Formatierung durchführt. Nach der ersten Bundesamt für Sicherheit in der Informationstechnik Seite 166 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Formatierung übrig gebliebene oder entstandene %-Zeichen würden beim zweiten Mal zu Fehlverhalten führen. Derzeit wird jk_error_exit() nur mit der Text "Memory Error" aufgerufen, der Fehler kommt also nicht zum Tragen. Ganz anders würde es sich verhalten, wenn beliebige Texte zum Einsatz kämen. Während der Projektlaufzeit wurde von anderer Stelle ein ähnlicher Fehler in der libgda für GNOME gefunden, der zu einer CERT-Meldung51 und sofortigem Security Patches führte. Leider erkennt keines der eingangs beschriebenen und auch der für die Tests verwendeten Werkzeuge eine solche Doppelformatierung automatisch. Feststellung: Die Funktion jk_log()52 implementiert unzureichende Vorkehrungen gegen einen Pufferüberlauf. Die gefundenen Fehler sind jedoch wahrscheinlich nicht ausnutzbar. Detailiertere Beschreibung: 1. In folgender Codezeile muss die Puffergröße entsprechend der bereits enthaltenen Zeichen reduziert werden, es sollte also HUGE_BUFFER_SIZE – used heißen: used += snprintf(&buf[used], HUGE_BUFFER_SIZE/*-used fehlt hier!*/, "%s (%d): ", 2. Das Mitzählen der benutzten Zeichen über used += snprintf(...,limit,...) ist ebenfalls problematisch, weil POSIX spezifiziert, dass der Rückgabewert der Funktionen snprintf(), vsnprintf() usw. beliebig größer als der übergebene Grenzwert wird, wenn der Puffer nicht groß genug ist. Der Rückgabewert ist die Größe, die benötigt worden wäre, um den Text vollständig zu formatieren. Als Folge würde der Wert von BUFFER_SIZE - used negativ bzw. aus Sicht von snprintf() eher enorm groß, da diese Funktionen mit natürlichen Zahlen (unsigned long) anstelle von vorzeichen­ behafteten Zahlen (int oder long) arbeiten. Die Grenzwertüberprüfung wird damit effektiv außer Kraft gesetzt. Außerdem verweist &buf[used] bei darauf folgenden Aufrufen auf ungültigen Speicher! 3. Die Funktion verwendet return nicht nur als letzte Zeile, so dass der auf bestimmten Systemen (NETWARE) mit malloc() allokierte Speicher dann nicht freigegeben wird. Trotz dieser Fehler vermuten wir, dass die Funktion kaum missbraucht werden kann, da der Überlauf nur durch überlange Dateinamen ausgelöst werden kann, die im Code fest eincompiliert sind, so dass für diese der verwendete Puffer (8KB) groß genug sein müsste. Feststellung: In mod_jk werden die Rückgabewerte der Funktionen von APR zur Speicher­ allokation wie z. B. apr_palloc() nur stellenweise abgefragt. Ein systematisches Abfragen ist nicht zwanghaft, denn APR53 stellt ebenfalls einen Callback zur Verfügung, der bei Speichermangel aufgerufen werden könnte: pool->abort_fn(APR_ENOMEM); Dazu müsste dieser jedoch gesetzt werden. Wer darf diesen setzen und welche Möglichkeiten bieten sich dann in C (wo könnte der Code hin springen, um die aktuelle 51 52 53 http://cvs.gnome.org/bonsai/cvsview2.cgi?diff_mode=context&whitespace_mode=show&subdir=libgda/libgda&command=D IFF_FRAMESET&file=gda-log.c&rev1=1.12&rev2=1.13&root=/cvs/gnome Datei jakarta-tomcat-connectors-1.2.14.1-src/jk/native/common/jk_util.c Datei apr_pools.c der Bibliothek APR, ebenfalls in Apache enthalten Seite 167 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Funktion zu beenden)? Sprachen mit Exception Handling haben es hier wesentlich einfacher. Feststellung: mod_jk enthält einen Ersatz für die Funktion vsnprintf(), der zur Anwendung kommt, wenn diese im Betriebssystem nicht enthalten ist. Dies wird aber beim Compilieren und nicht zur Laufzeit festgestellt. Diese Ersatzfunktion ruft Funktionen von POSIX inkorrekt auf, so dass die erwünschte Funktionalität nicht sichergestellt werden kann. Linux-Systeme sind davon nicht betroffen, weil die darin verwendete glibc diese Funktion bereits seit Jahren zur Verfügung stellt. Listing 61: vsnprintf-Ersatz in jk_util.c: #if !defined(HAVE_VSNPRINTF) && !defined(HAVE_APR) static FILE *f = NULL; static int vsnprintf(char *str, size_t n, const char *fmt, va_list ap) { int res; if (f == NULL) f = fopen("/dev/null", "w"); if (f == NULL) return -1; setvbuf(f, str, _IOFBF, n); res = vfprintf(f, fmt, ap); if (res > 0 && res < n) { res = vsprintf(str, fmt, ap); } return res; } #endif Die Abweichungen von POSIX sind gemäß Manpage zu setvbuf wie folgt beschrieben: 1. „You must make sure that both buf and the space it points to still exist by the time stream is closed, which also happens at program termination.“. Der übergebene Puffer str hat aber eine ganz kurze Lebensdauer und die Datei wird erst bei Programmende (exit) geschlossen. 2. „The setvbuf function may only be used after opening a stream and before any other operations have been performed on it.“ Die Datei in der globalen Variable f wird jedoch offen gehalten, die Funktion bei jedem Logvorgang erneut aufgerufen, also nach dem vorigem Schreiben eines Logeintrags. Feststellung: Aus Sicht eines Code-Reviews wäre es wünschenswert, stellenweise Änderungen am Code vorzunehmen, die die Lesbarkeit erhöhen. Diese Feststellung betrifft die Sicherheit nur indirekt sollte aber für das Review als Sicherheitsmaßnahme beachtet werden: • die Funktion ws_write() in mod_jk verwendet sowohl eine Variable Namens r als auch einen Feldnamen gleichen Namens. Bundesamt für Sicherheit in der Informationstechnik Seite 168 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests • Funktionen in mod_jk verwenden beispielsweise wiederum in ws_write() eine Variable Namens l, die leicht mit der Zahl 1 zu verwechseln ist . • Die Datei HandlerRequest.java54 definiert sowohl SC_A_SSL_KEYSIZE als auch SC_A_SSL_KEY_SIZE identisch an weit auseinander liegenden Stellen im Code. • Namensgleiche Instanzenvariablen innerhalb einer Klassenhierarchie sind stets problematisch und sollten vermieden werden. Findbugs moniert diese zu recht: MF: Class org.apache.jk.common.JkMX defines field that obscures superclass field org.apache.jk.core.JkHandler.mserver Class defines field that obscures a superclass field This class defines a field with the same name as a visible instance field in a superclass. This is confusing, and may indicate an error if methods update or access one of the fields when they wanted the other. Feststellung: Bei der Fehlerbehandlung in Java wird teilweise inkonsistent geloggt: Die verwendeten Loglevel können von Modul zu Modul voneinander abweichen. Wünschenswert wäre ein Logging oberhalb des Level „debug“. Der Level „debug“ sollte im Betrieb nicht eingesetzt werden, auch wenn die Administratoren über Fehler informiert werden müssen. Die meisten Module, mit Ausnahme von catalina/Realm/RealmBase.java, tun dies richtig und loggen auf Ebene „warn“ oder „error“. Folgender Shell-Befehl liefert dazu eine Übersicht: egrep -n --after-context=2 -e '\bcatch\b' */*.java Im folgenden Beispiel wäre es vermutlich sinnvoll, den Fehler bei der Namensauflösung nicht bloß auf Level „debug“ zu loggen: Listing 62: Auszug aus JkCoyoteHandler.java55: // If remoteHost not set by JK, get it's name from it's remoteAddr if( req.remoteHost().isNull()) { try { req.remoteHost().setString(InetAddress.getByName( req.remoteAddr().toString()). getHostName()); } catch(IOException iex) { if(log.isDebugEnabled()) log.debug("Unable to resolve "+req.remoteAddr()); } } Zusammenfassung: Die Fundstellen sollten umgeschrieben werden, selbst wenn nicht jede sicherheitskritisch ist oder wahrscheinlich gar nicht für einen Angriff ausgenutzt werden kann. Zum Teil handelt es sich um klassische Fehler, wie sie in C Programmen immer wieder vorkommen und Angriffe über Buffer-Overflow ermöglichen. Diese Programmfehler wurden in den Apache Bugtracker56 eingegeben, so dass diese nach und nach von den Entwicklern behoben werden dürften. 54 55 56 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/HandlerRequest.java jakarta-tomcat-connectors/jk/java/org/apache/jk/server/JkCoyoteHandler.java http://bugzilla.apache.org/ Seite 169 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 5.6.3.1.2 T92 Manuelle Sichtung der Schnittstelle zu JSSE (SSL) JSSE bzw. SSL kommt in Tomcat an zwei Stellen zum Einsatz: 1. als Authentisierungsmöglichkeit (vgl. T6). 2. innerhalb des HTTP-Connectors Im ersten Fall wird JSSE nur indirekt benutzt. Der Zugriffsschutz wird in der Datei SSLAuthenticator.java57 innerhalb der Komponente Catalina implementiert. SSL kommt darin indirekt zum Einsatz, indem das Zertifikat des Clients angefordert wird (z. B. über das AJPProtokoll) und der darin angegebene Name zur Prüfung an das für die aktuelle URL konfigurierte Realm übergeben wird. Der HTTPS-Connector muss dagegen letztendlich SSL einsetzen. In der Datei SSLImplementation.java58 wird JSSE nur dann ausgewählt, wenn das Paket org.apache.tomcat.util.net.puretls.PureTLSImplementation nicht gefunden wird. JSSE wird also nur alternativ benutzt. In JSSEImplementation.java wird anschließend zwischen der JSSE ab dem SDK-1.4 (JSSE14) oder einem älteren JSSE (JSSE13) unterschieden. Letztlich aber spielen alle Dateien im Verzeichnis tomcat/util/net/ und insbesondere tomcat/util/net/jsse zusammen. Dort wird die durch javax.net.ssl standardisiert angebotene Funktionalität angesprochen, um sowohl die Verbindung über einen SSL-Socket aufzubauen, zu verwalten aber auch um daraus die Zertifikatsinformation zu gewinnen. Die Dateien JSSE14SocketFactory.java und JSSESocketFactory.java setzen die Optionen aus der Konfigurationsdatei server.xml um. Die Prüfung des Codes offenbarte bis auf eine Ausnahme (s. u.) keine Sicherheitsmängel. Es werden aber folgende Abweichungen von der Dokumentation, dem Dokument „SSL Configuration HOW-TO“59, festgestellt: Feststellung: Es gibt zwei undokumentierte Attribute in den zwei Dateien: „truststoreAlgorithm“ (Default-Wert: wie beim Attribut „algorithm“) für den Zugriff auf den Truststore und „keyAlias“ für den Zugriff auf Keystores. Beim Abgleich zwischen Code und Dokumentation muss berücksichtigt werden, dass die eine Datei60 einige Abweichungen von der ansonsten 1:1-Übereinstimmung zwischen XMLAttribut in server.xml und dem Code einführt. Darunter sind auch „sslProtocol“ für „protocol“, „clientAuth“ statt „clientauth“ oder „keystorePass“ für „keypass“ zu finden. Dies liegt vermutlich in der Historie begründet. Die Erkenntnisse aus T45 und T46 veranlassten eine vertiefte Analyse des Umgangs mit den Attributen „ciphers“ und „protocol“: Festellung: Beim Umgang mit den erlaubten Algorithmen (enabledCiphers) wird zwar zwischen der ungesetzten Option und der leeren Schnittmenge erlaubter (enabled) und möglicher (supported) Algorithmen unterschieden. Leider werden unerkannte Namen von Algorithmen, beispielsweise durch Tippfehler, ohne jegliche Meldung ignoriert. Ist die Schnittmenge leer, wird setEnabledCipherSuites nicht zur Begrenzung aufgerufen. Tomcat verhält sich dann so, als wäre die Option gar nicht angegeben worden. 57 58 59 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/authenticator/SSLAuthenticator.java jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/SSLImplementation.java http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html oder jakarta-tomcat-catalina/webapps/docs/ssl-howto.xml im Quelltext 60 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/connector/Connector.java Bundesamt für Sicherheit in der Informationstechnik Seite 170 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Die Ursache dafür liegt womöglich in der Methode set EnabledCipherSuites61 des JSSE, für die spezifiziert ist, dass der Wert NULL anstelle eines Feldes von Namen nicht angenommen wird. Offen bleibt dabei, ob eine leeres Feld (im Sinne von new String[0]) zur notwendigen Zurückweisung sämtlicher Kommunikation auf dem betroffenen Socket führen wird. U. U. könnte bei leerer Menge auch sofort ein Ausnahmezustand (Exception) erzeugt werden. Eine andere Erklärung ist denkbar. Die folgenden Funktionen aus zwei getrennten Dateien behandeln den Fall enabledCiphers=null unterschiedlich. Für die erste bedeutet dieser Fall, wie im Kommentar erklärt, dass keine gültige Angabe erkannt wurde. Die zweite Funktion dagegen behandelt den Fall, als wäre keine Angabe vorhanden, dass also keine Einschränkung besteht. Listing 63: Auszug aus JSSESocketFactory.java zu getEnabledCiphers: * @return Array of SSL cipher suites to be enabled, or null if none of the * requested ciphers are supported */ protected String[] getEnabledCiphers(String requestedCiphers, String[] supportedCiphers) { Listing 64: Auszug aus JSSESocketFactory.java zu enabledCiphers: private void initServerSocket(ServerSocket ssocket) { [...] if (enabledCiphers != null) { socket.setEnabledCipherSuites(enabledCiphers); } Feststellung: Völlig ähnlich verhält sich der Code in JSSE14SocketFactory62 bei der Verarbeitung der Angaben zu „protocol“ bzw. zu „sslProtocol“. Die Funktion setEnabledProtocols wird nur aufgerufen, wenn sich unter den konfigurierten Protokollen ein unterstütztes Protokoll befindet. Dies wird mit getSupportedProtocols geprüft. Ist die Schnittmenge leer, findet keine Einschränkung statt. Alle unterstützten Protokolle sind dann anwendbar. Dieses Verhalten betrachten wir als schweren Fehler wider die Erwartungskonformität von Tomcat. 1. Nicht erkannte Protokolle muss Tomcat in Fehlermeldungen aufzeigen. 2. Wird kein einziges gültiges Protokoll erkannt, muss sämtliche Kommunikation abgewiesen werden, oder alternativ Tomcat gar nicht erst starten. 5.6.3.1.3 T93 Manuelle Sichtung der Authentisierungsmethoden Bei der Sichtung der Authentisierungsmethoden wurden keine sicherheitsrelevante Fehler entdeckt. Folgende Abweichungen von der Dokumentation sind dabei jedoch aufgefallen. 61 62 javax.net.ssl.SSLSocket.setEnabledCipherSuites Datei jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java Seite 171 (von 187) Bundesamt für Sicherheit in der Informationstechnik Durchführung der Tests Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Der Tomcat-Container, genannt Catalina, zentralisiert die verfügbaren Authentisierungs­ methoden im Paket org.apache.catalina.Realm, das den Dateien des Verzeichnisses catalina/realm/*.java entspricht. Dort liegen die Dateien MemoryRealm.java, JDBCRealm.java, JNDIRealm.java, JAASRealm.java, DataSourceRealm.java, die die gleichnamigen Klassen definieren, sowie einige Zusatzklassen wie die Datei RealmBase.java, die Gemeinsamkeiten dieser Mechanismen durch Vererbung kapselt. Die Vielfalt der Realms ist verwirrend. Sie bieten laut Dokumentation („Realm Configuration HOW-TO“63 zu Tomcat) folgende Möglichkeiten: Name MemoryRealm UserDataBaseRealm JDBCRealm JNDIRealm JAASRealm DataSourceRealm Datenquelle XML-Datei (veraltet?) XML-Datei als globale Ressource (z. B. tomcat-users.xml) JDBC-Datenquelle (relationale Datenbank) LDAP, über JNDI JAAS, darüber wiederum je nach Provider64 als Quelle eine XMLDatei, X500, Unix-Login, NTLM oder Kerberos JDBC-Datenquelle über JNDI Tabelle 20: Namen der Realm und deren Einsatzmöglichkeiten Feststellung: UserDataBaseRealm wurde in die Tabelle mit aufgenommen, obwohl es im HOW-TO nicht erwähnt wird, weil es im Quellcode verwendet wird. JAASRealm wird im HOW-TO zwar erwähnt, fehlt aber in der getrennten Datei mit Beispielen zur Konfiguration65. Das Logging dieser Module wird im HOW-TO so dokumentiert, dass die auszugebende Informationen über die Logkomponente des Containers ausgegeben werden (engl. „Debugging and exception messages logged by a Realm will be recorded by the logging configuration associated with the container for the realm: its surrounding Context, Host, or Engine.“). Auf Ebene des Code wird dies wie folgt erreicht: Listing 65: Übernehmen der Logkomponente des umgebenden Containers: this.containerLog = container.getLogger(); [...] if(! validated ) { if (containerLog.isTraceEnabled()) { containerLog.trace(sm.getString("realmBase.authenticateFailure", username)); } return null; } if (containerLog.isTraceEnabled()) { containerLog.trace(sm.getString("realmBase.authenticateSuccess", username)); } Feststellung: Der JNDIRealm fasst das Ergebnis der Authentisierung in einem eigenen Log zusammen. Der Container wird dazu nicht benutzt. Die Logmeldungen zu diesem Modul müssen daher anders als die Dokumentation erwarten lässt ab- und zugeschaltet werden. 63 64 65 http://tomcat.apache.org/tomcat-5.5-doc/realm-howto.html oder lokal http://localhost:8080/tomcat-docs/realm-howto.html oder im Quelltext jakarta-tomcat-5.5.9-src/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/ Die aufgeführten Möglichkeiten entsprechen denen des Sun-Providers, vgl. Package com.sun.security.auth im JavaSDK der Firma Sun. Datei webapps/docs/config/realm.xml Bundesamt für Sicherheit in der Informationstechnik Seite 172 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Durchführung der Tests Feststellung: Die Module MemoryRealm und JAASRealm weichen ebenfalls von der im HOW-TO beschriebenen Vorgabe ab und definieren eine eigene Komponente wie folgt: Listing 66: eigene Logkomponente in MemoryRealm und JAASRealm: private static Log log = LogFactory.getLog(MemoryRealm.class); [...] if (validated) { if (log.isDebugEnabled()) log.debug(sm.getString("memoryRealm.authenticateSuccess", username)); return (principal); } else { if (log.isDebugEnabled()) log.debug(sm.getString("memoryRealm.authenticateFailure", username)); return (null); }; Feststellung: MemoryRealm loggt den Erfolg oder Misserfolg der Authentisierung lediglich auf Debug-Ebene, d. h. zu niedrig für den normalen Betrieb eines Webservers. Diese Inkonsistenz zu den anderen Verfahren ist nicht weiter kritisch, denn grundsätzlich ist das zentrale Logging anhand einer AccessLogValve vorzuziehen (vgl. T41). Insbesondere lässt sich dann das Format festlegen und somit einfacher der maschinellen Auswertung der Log­ dateien zuführen als die individuellen Logmeldungen der einzelnen Komponenten. Positiv aufgefallen ist in JDBCRealm die Verwendung von PreparedStatement. Diese sind nicht anfällig gegen die üblichen Methoden der SQL-Injection, sofern sie in den unteren Schichten tatsächlich implementiert und nicht emuliert werden. Dann werden zur Laufzeit nämlich keine SQL-Abfragen aus Zeichenketten zusammengebaut, sondern grob gesehen Parameter an fertige SQL-Prozeduren übergeben und diese aufgerufen. Wenn PreparedStatement dagegen lediglich emuliert wird, gibt es keine Vorteile, sondern sogar Geschwindigkeitseinbußen gegenüber einfachen SQL-Abfragen. Dies ist uns in einem früheren Projekt mit Microsoft-SQL aufgefallen. Seite 173 (von 187) Bundesamt für Sicherheit in der Informationstechnik Empfehlungen und Maßnahmen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 6. Empfehlungen und Maßnahmen Nachfolgend sollen einige Empfehlungen gegeben werden, die zur Erhöhung der Sicherheit beim Betrieb des Jakarta Tomcat Servlet Containers dienen können. Diese ersetzen nicht die grundlegenden Sicherheitsrichtlinien einer IT-Umgebung bzw. das IT-Sicherheitskonzept einer Behörde oder eines Unternehmens. Eine Grundlage für Sicherheitsrichtlinien oder ITSicherheitskonzepte sollten immer die Sicherheitsempfehlungen und Maßnahmen des ITGrundschutzhandbuchs des BSI sein. Die in diesem Kapitel aufgeführten Empfehlungen und Maßnahmen sollen diese spezifizieren und ergänzen. Hinweis: Die verwendete Reihenfolge gibt keine Information über eine Priorisierung. 6.1 Allgemeine Maßnahmen bzw. Maßnahmen auf Betriebssystemebene 6.1.1 Dateiberechtigungen und -zuordnung Da die untersuchten Anwendungen (Apache Webserver, Jakarta Tomcat Servlet Container, mod_jk Connector Modul) standardmäßig mit relativ offenen Berechtigungen installiert werden, mit Lese- bzw. Ausführrechten für die Gruppe root und für world, sollte zur Verbesserung der Sicherheit von restriktiveren Berechtigungen Gebrauch gemacht werden, z. B. Entzug der Lese- bzw. Ausführungsberechtigungen für world. Die Einschränkung der Dateiberechtigungen ist insbesondere für die ausführbaren Programme oder Shell-Skripts sowie für die Konfigurationsdateien wichtig, um unbefugte Ausführung von Programmen oder Einsichtnahme in die Konfigurationsinformationen, die möglicherweise auch Passwörter oder andere sensible Informationen enthalten könnten, zu unterbinden. Weiterhin empfiehlt sich für eine mögliche separate Administration der Anwendungen diese unterschiedlichen Nutzern / Gruppen, z. B. www für den Apache Webserver Administrator und tomcat für den Tomcat Administrator, zuzuordnen. Der Apache Webserver muss wegen der Belegung von privilegierten Ports, HTTP: Port 80 bzw. HTTPS: Port 443 bei Standardbelegung, nach wie vor durch den Nutzer root gestartet werden. Dies kann aber beispielsweise durch den Start der Anwendungen beim Booten des Systems geschehen oder ein Nutzer kann über das sudo Kommando die Rechte eines Administrators erlangen und damit die Berechtigung zum Starten / Anhalten der Apache Applikationen bekommen. Nach der Belegung der privilegierten Ports kann der Apache Webserver, unter Verwendung der Apache USER und GROUP Direktiven, in einen nicht-privilegierten Benutzer-Modus wechseln. Neben den untersuchten Anwendungen sind gleichfalls restriktive Dateiberechtigungen und -zuordnungen bei den verwendeten Diensten wie LDAP bzw. bei einer Hintergrunddaten­ bank, die zur Benutzerauthentisierung und -autorisierung verwendet wir, zu setzen. Hier ist sicherzustellen, dass sensitive Informationen wie Passwörter durch Unbefugte weder gelesen noch modifiziert werden können. Zu berücksichtigen sind dabei sowohl die Betriebs­ systemebene, wo die Dateiberechtigungen entsprechend zu setzen sind, als auch die Dienste selbst, die über Mechanismen zum Schutz sensitiver Informationen verfügen. Dies sind beispielsweise: • Access-Control Lists (ACLs) in der Konfigurationsdatei /etc/ldap/slapd.conf für eine Zugriffssteuerung innerhalb von OpenLDAP bei der Realisierung einer OpenLDAPbasierten JNDI Realm Authentisierung Bundesamt für Sicherheit in der Informationstechnik Seite 174 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Empfehlungen und Maßnahmen der SQL GRANT Befehl zur Freigabe von Lese- bzw. ggf. Modifikationsoperationen der Nutzerinformationen in der MySQL-Datenbank bei der Realisierung einer MySQLbasierten JDBC Realm Authentisierung. Hinweis: Je nachdem welcher Dienst Sicherheitsmechanismen Anwendung finden. verwendet wird, können auch andere 6.1.2 Passworte für die Benutzer / Webanwendung Zum Schutz vor unberechtigten Zugriffen sollten die üblichen Regeln für die Verwendung von Passworten angewendet werden. Dies betrifft beispielsweise die Charakterisierung der Passworte, wie Mindestlänge, Anforderungen an die zu verwendenden Zeichenklassen, Wechselhäufigkeit, etc., die den in der IT-Umgebung geltenden Richtlinien entsprechen muss. Neben einzelnen Benutzerkonten sind hiervon auch Webanwendungen betroffen, insbesondere auch die Tomcat-Management-Applikationen admin und manager, die, soweit sie auf dem betreffenden System, durch die weit reichenden Konfigurationsmöglichkeiten für andere Webanwendungen besonders zu schützen sind. Nach Möglichkeit sollten die Passworte einmal durch die betriebssystemspezifischen Schutz­ mechanismen (Dateizugriffsbeschränkungen) und andererseits durch die Vermeidung der Speicherung im Klartext, d. h. stattdessen die Verwendung von Passwort-Hashwerten geschützt werden, um eine Kenntnisnahme durch Unbefugte zu verhindern. Dies gilt insbesondere für Passworte in Verbindung mit der Benutzung von Datenbanken, z. B. für Webanwendungen oder die Tomcat-Authentisierung, die nur von Programmen (Daemons) selbst, nicht aber von Benutzern verwendet werden und deshalb u. U. keinem regelmäßigen Passwortwechsel unterworfen sind. Die zu schützenden Benutzer- und Passwortinformationen in Verbindung mit dem Tomcat Servlet Container befinden sich bei Verwendung von Memory Realm Authentisierung in der Datei $CATALINA_HOME/conf/tomcat-users.xml bzw. bei Verwendung von JDBC Realm oder JNDI Realm Authentisierung in einer separaten Datenbank, die für Authentisierungs­ zugriffe durch Tomcat verwendbar, aber vor anderen Benutzern zugriffsgeschützt sein sollten. 6.1.3 Passwort des JAVA Zertifikatspeichers Zur Überprüfung von Zertifikaten verwendet JAVA und somit auch der in JAVA geschriebene Tomcat Servlet Container den JAVA Zertifikatspeicher, der in der Datei ${JAVA_HOME}/jre/lib/security/cacerts abgelegt ist. Da somit die dort abgelegten Zertifikate66 eine zentrale Rolle bei der Sicherheit besitzen, wird empfohlen, das Standard­ passwort changeit des Zertifikatspeichers direkt nach dessen Installation, die im Rahmen der Installation des JAVA SDKs erfolgt, neu zu setzen. Alternativ können in Tomcat die Zertifikate der die Client-Zertifikate signierenden Certification Authorities (CAs), im Tomcat-Zertifikatspeicher abgelegt werden, der mit den zusätzlichen Optionen truststoreFile und ggf. truststorePass in der <Connector>-Deklaration der Konfigurationsdatei $CATALINA_HOME/conf/server.xml spezifiziert wird. Auch dieser In der JAVA Standard-Installation sind dies im Wesentlichen Root-CA-Zertifikate. Bei der Nutzung von SSL-Client Authentisierung oder Client-Zertifikat-Authentisierung in Verbindung mit dem Apache Webserver oder Tomcat können dies darüber hinaus auch selbst erzeugte oder von einer Certification Authority (CA) signierte Server-Zertifikate sein. 66 Seite 175 (von 187) Bundesamt für Sicherheit in der Informationstechnik Empfehlungen und Maßnahmen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers gegebenenfalls verwendete Zertifikatspeicher ist entsprechend durch ein ausreichend sicher gewähltes Passwort gegen unbefugte Manipulationen zu schützen. 6.1.4 Host-basierte Firewall (netfilter / iptables) Über eine host-basierte Firewall kann eine explizite Freigabe der Kommunikationsports erfolgen, die entweder direkt, z. B. von extern angesprochen werden können oder die der Kommunikation des Apache Webservers mit dem / den Jakarta Tomcat Servlet Containern über das Connector-Modul mod_jk dienen. Auf diese Weise kann der Rechner mit dem darauf laufenden Webserver, dem Servlet-Container und der Webanwendungen gegen Zugriffe mit nicht freigegebenen Protokollen geschützt werden. Insbesondere bei auf mehreren Rechnern verteilten Systemen, z. B. der Apache Webserver auf einem Rechner und der Jakarta Tomcat Servlet Container zur Lastverteilung auf anderen Rechnern, ist auf eine sorgfältige Abbildung der benötigten Kommunikationspfade für die FirewallKonfiguration zu achten. Nur durch aufmerksame Administration der Firewall werden die für die Anwendungen benötigten, Rechner übergreifenden Kommunikationspfade zwischen den Servern im Netz nicht behindert und dennoch unzulässige Kommunikationspfade wirksam unterbunden. 6.1.5 Gesicherte Kommunikation Sollen verschiedene Softwarekomponenten, die selbst keine Verschlüsselung zur Erhöhung der Abhörsicherheit und zum Schutz der übertragenen Daten anbieten, miteinander über ein ungeschütztes Netzwerk abgesichert kommunizieren, so kommen zum Schutz der Kommuni­ kation beispielsweise virtuelle private Netzwerk (VPN) Techniken oder Port-Forwarding über verschlüsselte Verbindungen in Frage. Im Fall von VPNs wird zwischen den beteiligten Hosts bzw. der an der Grenze zum ungesicherten Netzwerken befindlichen Firewall ein verschlüsselter Tunnel aufgebaut. Diese Tunnels können beispielsweise mit Hilfe von IPsec-Verschlüsselung [RFC2401] realisiert werden. Neben einem Schutz des Datenverkehrs vor unbefugtem Abhören durch die Verschlüsselung kann die gegenseitige Authentisierung der beiden an den Tunnelenden befindlichen Hosts auch genutzt werden, um die Berechtigung der Nutzung des aufgebauten Tunnels durch die Kommunikationspartner sicher zu stellen. Beim Port-Forwarding per Secure Shell (SSH) hingegen wird statt einer direkten Kontaktaufnahme des Clients mit dem Server über ungeschützte Netzwerkbereiche hinweg der Netzwerkverkehr von der Client-Maschine durch einen SSH-Tunnel auf die ServerMaschine an den eigentlichen Server-Port weiter geleitet. Somit wird beispielsweise der Server-Port eines Datenbankservers virtuell auf den Client transferiert und dort für die Anwendung, in diesem Fall Tomcat, nutzbar gemacht. Details zur Installation von SSH basiertem Port-Forwarding finden sich auch [Barret]. Bedeutung hat die Absicherung der Kommunikation insbesondere bei der Übertragung sensibler Informationen wie • Authentisierungsinformationen, die • zwischen dem Webserver, mit mod_jk / mod_proxy Modul und Tomcat, mit AJP / HTTP Connector oder Bundesamt für Sicherheit in der Informationstechnik Seite 176 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Empfehlungen und Maßnahmen zwischen Tomcat und einer per JDBC- bzw. JNDI-Schnittstelle angebundene Datenbank, ausgetauscht werden und • im Bereich der Webanwendungen bei den zwischen dem Web-Frontend und den Hintergrundapplikationen ausgetauschten Informationen, z. B. Kreditkartennummern, Kennwörter, PINs und TANs, Personen bezogene Daten oder andere schützenswerte Informationen. 6.1.6 Eingeschränkte Laufzeitumgebung (chroot) Eine weitere Abschottung der Anwendung vom übrigen System kann durch die Verwendung von eingeschränkten Umgebungen erfolgen. Ein Nachteil ist hierbei jedoch der mit der teilweisen mehrfach Installation von Dateien / Anwendungen verbundene SpeicherMehraufwand, der sowohl auf der Betriebssystemebene der Host-Maschine, als auch innerhalb von chroot-Umgebungen benötigt wird. Ziel der Verwendung einer chrootUmgebung ist die Separierung der darin laufenden Programme von den übrigen auf der Maschine laufenden Anwendungen durch eine eingeschränkte Umgebung, in der nur die für diese Anwendungen benötigten Softwareprogramme verfügbar sind. Bei einem eventuellen Einbruch auf Grund beispielsweise einer Sicherheitslücke in der Webanwendung, ist es einem erfolgreichen Angreifer so nur innerhalb der beschränkten Umgebung möglich Zugriff auf Programme und Daten zu nehmen. 6.1.7 Nutzung von erweiterten Zugriffsschutzmechanismen unter SELinux Bei der Nutzung künftiger Debian Linux Varianten mit Unterstützung von SELinux (Security Enhanced Linux) bieten sich Möglichkeiten zur detaillierten Spezifikation von Zugriffs- und Ausführungsberechtigungen einzelner Programme und Anwendungen. Diese ermöglichen es beispielsweise die Zugriffsmöglichkeiten von Web-Diensten auf Dateien oder Programme weit gehend einzuschränken und damit die Sicherheit dieser Dienste zu erhöhen. Da in der aktuellen Betriebssystemplattform Debian 3.1 Sarge, die auch für die Tests verwendet wurde, noch kein vollständiger SELinux-Support integriert ist, können derzeit noch keine konkreten Vorgaben für einen sicheren Betrieb gemacht werden. Weiter gehende Informationen zum Themenkomplex SELinux finden sich beispielsweise in [NSA SELinux] bzw. [McCarty] und für die nächste, als unstable gekennzeichnete Debian Linux Version Sid in [Debian SELinux]. 6.2 Maßnahmen beim Apache Webserver Neben den allgemeinen Richtlinien zum sicheren Betrieb des Apache Webservers wie die Ausführung unter einem non-root Benutzer, der Vergabe entsprechend restriktiver Zugriffsberechtigungen, etc., sollten hier spezifische Maßnahmen genutzt werden, die bei der Verbindung des Apache Webservers, ergänzt durch das Connector-Modul mod_jk, mit dem Jakarta Tomcat Servlet Container zum Einsatz kommen können. Seite 177 (von 187) Bundesamt für Sicherheit in der Informationstechnik Empfehlungen und Maßnahmen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 6.2.1 Zugriffsberechtigungen Durch eine restriktive Vergabe der Zugriffsberechtigungen sowohl auf Betriebssystemebene, bei Dateien oder Verzeichnissen, als auch bei den Zugriffsregeln auf die bereitgestellten Web-Ressourcen, die in der Apache Webserver Konfigurationsdatei httpd.conf festgelegt werden, sollte eine unautorisierte Einsicht in die auf dem Webserver befindlichen Dateien / Verzeichnisse verhindert werden. Hiervon sind betroffen: • Webanwendungen (z. B. Servlets, JSPs, CGI-Programmdateien) • Konfigurationsdateien der Webanwendungen • Dateien / Verzeichnisse von Hintergrundapplikationen (z. B. Datenbanken, o. ä.) Der Apache Webserver bietet die Möglichkeit der Filterung von eintreffenden Anfragen bezüglich der IP-Adresse oder den Host- bzw. Domänennamen, sowie bezüglich der verwendbaren HTTP-Zugriffsmethoden (GET, POST, PUT, DELETE, HEAD, ... per <Limit> Direktive). So können unerwünschte Anfragen heraus gefiltert werden und gelangen gar nicht bis zum Tomcat Servlet Container um dort Schadfunktionen auszulösen. 6.2.2 Watchdog-Funktionalität Es kommt vor, dass komplexe Anwendung wie Tomcat einfach hängen bleiben, ohne abzustürzen und ohne dass in den Logdateien etwas ersichtlich ist. Dennoch reagiert der Webserver auf keine Anfrage mehr. Aus diesem Grund ist es ratsam, nicht nur mittels ping die Funktionsfähigkeit der Netzwerkkarte des Rechners zu testen, sondern regelmäßig über den Apache bis zum Tomcat einen Zugriff über HTTP(S) auszuführen. Der getestete Bereich ist dann viel größer als bei ping. Am sinnvollsten paart man dies mit einer Kurzprüfung der Zugangsberechtigungen. Ansonsten kann es recht kompliziert werden, eine gültige Anfrage automatisch an die Webanwendung zu schicken. Ein illegaler Zugriff dagegen testet die Funktionalität von einem wichtigen Teil der Webanwendung und sollte einfach zu automatisieren sein. Um eine möglichst tiefe Testschleife durch das System zu ziehen, sollte der illegale Zugriff idealerweise erst spät abgelehnt werden, also beispielsweise von einem Servlet selbst anstelle eines AccessValve in Tomcat oder im Apache. 6.3 Maßnahmen beim Jakarta Tomcat Servlet Container 6.3.1 Installation unter einem Tomcat Benutzer Um ein root Login zur Konfiguration von Tomcat und den Webanwendungen zu verhindern, sollten Tomcat, dessen Konfigurationsdateien und ggf. die Webanwendungen unter einem eigenen Linux-Benutzerkonto eingerichtet werden. Zusätzlich sollten die Web-Applikationen unter anderen Benutzerkonten als der Tomcat-Benutzer eingerichtet werden, so sind ent­ sprechende Berechtigungen für den Tomcat-Benutzer auf die Dateien der Webanwendungen einstellbar. Solange nur lesend auf die Dateien zugegriffen werden muss, genügen entsprechende Leseberechtigungen. Müssen von den Servlets lokale Dateien angelegt bzw. modifiziert werden, so sind ggf. entsprechende Schreibberechtigungen vorzusehen. Bundesamt für Sicherheit in der Informationstechnik Seite 178 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Empfehlungen und Maßnahmen 6.3.2 Shutdown-Port Zur Vermeidung von Denial-of-Service (DoS) Angriffen sollte auf die Freigabe eines Ports zum Herunterfahren des Jakarta Tomcat Servlet Containers verzichtet werden, da für das Herunterfahren lediglich die Kenntnis der dafür konfigurierten Zeichenkette erforderlich ist und eine weiter gehende Authentisierung zur Feststellung der Berechtigung zum Herunter­ fahren nicht erfolgt. Zwar ist gemäß der Tomcat Dokumentation das Herunterfahren durch eine Kontaktierung des Ports nur vom lokalen Host, auf dem der Jakarta Tomcat Servlet Container selbst auch läuft, möglich, jedoch kann jeder auf diesem Host eingeloggte Nutzer mit Kenntnis der Shutdown-Zeichenkette das Herunterfahren durch das Kommando telnet localhost 8005 sowie der anschließenden Eingabe dieser Shutdown-Zeichenkette initiieren. Vielmehr sollte auf die übliche Methode der Verwendung von System-Startup-Skripts (unter /etc/init.d) zurückgegriffen werden, um Tomcat zu starten bzw. zu beenden. Diese Skripts können durch entsprechend berechtigte Nutzer, ggf. über die Verwendung des sudo Kommandos, ausgeführt werden. Somit ist die Nutzung von Shutdown-Port und -String nicht notwendig, um den Tomcat Servlet Container durch berechtigte Benutzer herunter zu fahren. 6.3.3 Logging Beim Produktiveinsatz des Jakarta Tomcat Servlet Containers ist zu überprüfen, welche LogInformationen für den Betrieb und zur Fehlersuche tatsächlich benötigt werden, um übermäßigen Ressourcen-Verbrauch hinsichtlich CPU-Leistung oder Speicherplatzbedarf zu vermeiden. Das Logging kann unterschieden werden nach • dem Logging auf der Ebene der Betriebszustände von Tomcat auf der Stufe der Tomcat-Engine, der virtuellen Hosts, etc.. Hierunter fällt z. B. das Hoch- oder Herunterfahren von Tomcat oder Webanwendungen, die Änderung der Konfiguration oder die Aktualisierung von Webanwendungen oder die Protokollierung von Fehlern zur Laufzeit. • dem Logging der Zugriffe auf die bereitgestellten Webanwendungen mit Informationen über den anfragenden Webclient, den Benutzer, die angefragte Webanwendungsressource, etc.. Während beim Debugging umfangreiche Log-Informationen zur Fehlersuche und -behebung sinnvoll sein können, sollten im Produktivsystem die debug Attribute auf 0 gesetzt sein und das AccessLogValve nur bei Bedarf eingesetzt werden. Weiterhin ist zu beachten, dass je nach Detaillierungsgrad der Protokollierung u. U. datenschutzrechtlich relevante Informationen gewonnen werden könnten. Insbesondere in Verbindung mit der Protokollie­ rung der Zugriffe, wobei z. B. Benutzernamen oder Cookie-Informationen festgehalten werden können sind datenschutzrechtliche Belange zu beachten. Daraus resultierend sind natürlich die Log-Dateien entsprechend zu behandeln. Maßnahmen für den Zugriffsschutz und Beschränkung der Verwendungs- / Auswertungsmöglichkeit sind dann auf jeden Fall umzusetzen. Wird das AccessLogValve eingesetzt, so werden wesentliche Informationen über den Zugriff auf Tomcat bereits mit den Log-Pattern pattern=“common“ erfasst, welche sich aus den folgenden Einzel-Log-Pattern kombiniert: %h: Host, auf dem der Web-Client (z. B. Webbrowser) läuft Seite 179 (von 187) Bundesamt für Sicherheit in der Informationstechnik Empfehlungen und Maßnahmen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers %l: Entfernter logischer Benutzername per identd ermittelt (immer „-“) %u: Authentisierter entfernter Benutzername, ansonsten „-“ %t: Datum und Uhrzeit im Common Log Format %r: Erste Zeile der HTTP Anfrage (HTTP Methode und URI) %s: HTTP Status Code %b: Zahl der zurückgeschickten Bytes (ohne HTTP Header), „-“ für 0 Bytes Wird das Log-Pattern pattern=“combined“ selektiert, so werden zusätzlich die Werte Referer und User-Agent des HTTP Headers protokolliert, wobei die zum Wert Referer gespeicherten Informationen für den Datenschutz relevante Inhalte umfassen könnte, wie beispielsweise in der URL des vorigen Zugriffs eingebettete Authentisierungsinformationen. Erfolgreiche bzw. fehlgeschlagene Zugriffe werden unterscheidbar durch den HTTP Status Code protokolliert. Zur Vermeidung von Speicherplatzüberläufen sollten ggf. angelegte Log-Dateien in den üblichen logrotate-Mechanismus einbezogen sowie nach einer gewissen Speicherzeit, üblicherweise in der Größenordnung von Tagen bis Wochen und ggf. nach einer vorherigen Archivierung, von den Systemen gelöscht werden (siehe auch [IT-GSHB]). Datenschutzrechliche Vorgaben müssen hierbei ggf. beachtet werden. 6.3.4 Manager und Admin Webanwendungen Sofern die manager bzw. admin Webanwendungen zur Administration von Tomcat verwen­ det werden, sollten diese zur Vermeidung von unerwünschten Zugriffen, die die Gefahr einer Manipulation der Konfiguration bergen, durch eine Filterung der berechtigten RemoteAdressen beim Zugriff auf diese Webanwendungen geschützt werden. Hierzu wird ein RemoteAddrValve in den zu den Applikationen gehörigen Konfigurationsdateien $CATALINA_HOME/conf/Catalina/localhost/manager.xml bzw. $CATALINA_HOME/conf/Catalina/localhost/admin.xml eingefügt: <Valve className=“org.apache.catalina.valves.RemoteAddrValve“ allow=“127.0.0.1,192.168.*.*“ /> Hierbei sind unter allow die für den Zugriff zugelassenen Adressen entsprechend anzupassen. Hierin sind durch Kommata getrennte Listeneinträge mit IP-Adressen, ggf. mit Wildcard-Zeichen einzufügen. Die Konfiguration entsprechender URL-Sperrlisten im vorgelagerten Apache-Webserver (Anwendungsszenarien 2 – 6) reichen, falls diese überhaupt aktiviert sind, unter Umständen nicht aus, wenn ein Direktzugriffe über den HTTP(S)-Connector von Tomcat beispielsweise aus dem lokalen Netzwerk heraus möglich ist. Werden diese beiden Administrationswerkzeuge überhaupt nicht verwendet, so sollten sie aus Sicherheitsgründen nicht installiert sein. Bundesamt für Sicherheit in der Informationstechnik Seite 180 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Empfehlungen und Maßnahmen Hinweis: Wird zur Administration der Tomcat-Konfiguration die admin Webanwendung verwendet, so gehen eventuell manuell in die Konfigurationsdateien eingetragene XMLKommentare verloren. 6.3.5 Zugriffsbeschränkungen Eine Festlegung von Beschränkungen bezüglich der für Zugriffe auf den Tomcat-Server oder dessen Webanwendungen freigegebenen oder gesperrten Hosts, Web-Domänen oder Subnetze kann in der Konfigurationsdatei $CATALINA_HOME/conf/server.xml vorgenommen werden. Dies geschieht unter Verwendung des RemoteAddrValve, mittels IPAdressen oder des RemoteHostValve, mithilfe von Host- oder (Sub-)Domänennamen. Bei Nutzung von Wildcard-Characters ist die teilweise von der üblichen Shell-Syntax abweichende Verwendung zu beachten, die von der Nutzung der Jakarta Regexp Bibliothek [Jakarta Regexp] bei der Analyse der IP-Adressen oder Host-Namen herrührt. Bei der Verwendung von RemoteHostValve ist ein funktionsfähiges Reverse DNS Lookup zur Gewinnung des Hostnamens aus der IP-Adresse des die Anfrage stellenden Webclients zwingend erforderlich, möchte man keine Sicherheits- oder Verfügbarkeitsprobleme riskieren. Ist eine Namensauflösung zur vorliegenden IP-Adresse nicht möglich, so greifen die Default-Regeln: • bei den deny Regeln: Alle Anfragen außer von den in den deny Regeln genannten Hosts bzw. Domänen werden beantwortet. Dies kann zu einer Beantwortung von Anfragen führen, obwohl der der IP-Adresse zugeordnete Host- oder Domänenname in der deny Regel für einen Zugriff auf die Web-Ressourcen nicht freigegeben ist und birgt somit ein potenzielles Sicherheitsrisiko. • bei den allow Regeln: Alle Anfragen außer den in den allow Regeln genannten Hosts bzw. Domänen werden abgewiesen. Dies kann zu einer Abweisung von Anfragen führen, obwohl der der IP-Adresse zugeordnete Host- oder Domänenname in der allow Regel freigegeben ist. In diesem Fall wäre der Web-Service für Zugriffe nicht verfügbar. Für einen sicheren Betrieb sollte also ein lokaler DNS-Server zur Verfügung stehen, um in jedem Fall ein Reverse DNS Lookup zu ermöglichen, der zumindest die Namensauflösung der in den deny oder allow Regeln des RemoteHostValves vorkommenden Host- oder Domänennamen durch ein Caching erlaubt, selbst wenn die im Internet befindlichen DNSServer temporär nicht erreichbar sein sollten. In der Konfigurationsdatei WEB-INF/web.xml einer jeden Webanwendung besteht die Möglichkeit zur Anforderung einer Authentisierung beim Zugriff auf einzelne Teile oder die gesamten der Webanwendungen, ggf. auch noch mit Beschränkung der Anforderung der Authentisierung auf die Nutzung einzelner HTTP-Zugriffsmethoden, wie GET, HEAD, PUT, POST oder DELETE mit der <http-method> Direktive. Hierbei ist zu beachten, dass in dem Fall für nicht genannte HTTP-Zugriffsmethoden keine Authentisierung erforderlich ist und diese nicht etwa ganz gesperrt sind. 6.3.6 Tests der Konfiguration Anwendungen mit vielfältigen Konfigurationseinstellungen wie Apache oder Tomcat bieten erfahrungsgemäß Raum für irrtümliche Fehlkonfigurationen. Zurückgewiesene aber erlaubte Zugriffe befugter Benutzer werden bekanntlich schnell genug geprüft und bei Zurückweisung Seite 181 (von 187) Bundesamt für Sicherheit in der Informationstechnik Empfehlungen und Maßnahmen Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers gemeldet. Daher ist besonders zu testen, was zurückgewiesen werden soll. Besonders Ausschlussregeln (z. B. zurückzuweisende IP-Adressen oder schwache Verschlüsselungs­ algorithmen) sollten dabei getestet werden. Ansonsten wiegt man sich in Scheinsicherheit. 6.3.7 Verschlüsselte Verbindung (SSL) Zum Schutz der Kommunikation zwischen dem Webbrowser und dem Webserver kann eine Nutzung der SSL-Funktionen des Apache Webservers wie Ent- / Verschlüsselung sowie ggf. Authentisierung bei unverschlüsselter Verbindung Apache Webserver / Connector Modul mit Tomcat auf der lokalen Plattform erfolgen. Wird Tomcat als Standalone Webserver verwendet (Szenario 1 in [Tomcat Fein.]), so besteht auch hier die Möglichkeit der Verwendung von verschlüsselten Verbindungen mit dessen HTTPS-Connector. Entsprechende Konfigurationen sind in der $CATALINA_HOME/conf/server.xml Datei vorzunehmen. Es sind dies die Bereitstellung eines <Connector>s mit der Deklaration der Attribute scheme="https" secure="true" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="<passwort>"> sowie die Installation eines Server-Zertifikats zur Identifikation des Tomcat Servers im Webbrowser des Nutzers. Die Installation des, ggf. von einer Certification Authority signierten, Server-Zertifikats in das angegebene keystoreFile erfolgt mit dem Java-Werkzeug keytool. Wird die SSL-Verbindung zusammen mit CLIENT-CERT Authentisierung verwendet, so ist zusätzlich, damit eine Client-Zertifikatprüfung erfolgen kann, das CA-Zertifikat der für die Signatur der Client-Zertifikate verantwortlichen Certification Authority (CA) einzustellen. Dies erfolgt wiederum mit dem Java-Werkzeug keytool in den • globalen JAVA-Zertifikatspeicher ($JAVA_HOME/jre/lib/security/cacerts) bzw. in den • Tomcat-Zertifikatspeicher, der mit den zusätzlichen Optionen truststoreFile und ggf. dem dafür benötigten Passwort unter truststorePass in der <Connector>-Deklaration der Konfigurationsdatei $CATALINA_HOME/conf/server.xml spezifiziert wird. Weiterhin ist zu berücksichtigen, dass ohne weitere Maßnahmen die Authentisierungsinfor­ mationen bei der Nutzung von JDBC Realm- bzw. JNDI Realm-basierter Authentisierung im Klartext übermittelt werden können. Dies kommt zum Tragen: • bei Verwendung des HTTP-Connectors (Anwendungsszenario 1 aus [Tomcat Fein.]) zwischen Tomcat und der Datenbank bzw. dem LDAP-Server, • bei Verwendung des AJP-Connectors (Anwendungsszenarien 2 - 6 aus [Tomcat Fein.]) darüber hinaus auch zwischen Apache / mod_jk und Tomcat, Bundesamt für Sicherheit in der Informationstechnik Seite 182 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers • Empfehlungen und Maßnahmen wenn zwischen dem Web-Client (Browser) und dem Apache Webserver (bei Nutzung des AJP-Connectors) bzw. dem Jakarta Tomcat Servlet Container (bei direkter Nutzung des HTTP-Connectors) kein HTTPS verwendet wird. 6.3.8 Anbindung einer Datenbank per JDBC Wird Tomcat zur Authentisierung von Benutzeranfragen per JDBC mit einer Datenbank die die benötigten Informationen wie Benutzernamen, Passworte, Rollenzuordnungen, etc. enthält verbunden, so besteht bei Nutzung eines gültigen in der Datenbank abgelegten Benutzernamens das Problem einer unverschlüsselten Übertragung von Referenzpass­ worten aus der Datenbank zur Authentisierung in Tomcat. Die Informationen können bei der Übermittlung zwischen Datenbank und Tomcat im Netzwerkverkehr mitgelesen werden, was zum Ausspionieren von Benutzernamen und den zugehörigen Passworten missbraucht werden kann. Zur Abhilfe sollten die in Abschnitt 6.1.5 gegebenen Hinweise besondere Berücksichtigung finden. 6.3.9 Anbindung einer Datenbank per JNDI Wird Tomcat zur Authentisierung von Benutzeranfragen per JNDI mit einer LDAP-Datenbank verbunden, so erfolgt die Übertragung des vom Benutzer verwendeten Benutzernamens und des zugehörigen Passwortes an den LDAP-Server zur Durchführung der Authentisierung unverschlüsselt. Diese Informationen können bei der Übermittlung zwischen Tomcat und LDAP-Server im Netzwerkverkehr mitgelesen werden, was zur Erlangung von Benutzer­ namen und den zugehörigen Passworten missbraucht werden kann. Auch hier sollten zur Abhilfe die in Abschnitt 6.1.5 gegebenen Hinweise besondere Berück­ sichtigung finden 6.3.10 Single-Sign-On In Verbindung mit aktiviertem Single-Sign-On (SSO-Valve) wird, gewissermaßen nach dem Prinzip „eine Rolle – eine Authentisierungsmethode“, zur Erzielung einer möglichst hohen Sicherheit empfohlen, eine Vermischung von unterschiedlichen Authentisierungsmethoden für einzelne Rollen zu vermeiden. Dies bedeutet, dass beispielsweise auf die für die Rolle roleA freigegebenen Webanwendungen app1 und app2 nicht über BASIC-Authentisierung (app1) und CLIENTCERT-Authentisierung (app2) zugegriffen werden können soll, da ansonsten das schwächere der beiden Authentisierungsverfahren (BASIC-Authentisierung) für beide Anwendungen genutzt wird. Hierbei würde zuerst eine Anmeldung an app1 per HTTPAuthentisierung und anschließender Wechsel zu app2 erfolgen, die wegen SSO dann ohne weitere Authentisierung ist. Das Sicherheitsniveau der Gesamtanwendung würde somit auf das der schwächsten Authentikation reduziert. Seite 183 (von 187) Bundesamt für Sicherheit in der Informationstechnik Weitere Punkte / Bugs / Verbesserungsmöglichkeiten Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers 7. Weitere Punkte / Bugs / Verbesserungsmöglichkeiten • Spracheinstellungen – Loginformationen: Die Logdaten werden in der vorliegenden Installation (Standard-Spracheinstellung: Deutsch) z. T. gemischt Deutsch und Englisch aufgezeichnet, was evtl. zu Problemen beim Suchen nach Textmustern für die Bewertung der Logeinträge führen könnte. • Verbesserung der Beschreibung der Tomcat Dokumentation im Hinblick auf die CLIENT-CERT Authentisierung, ggf. aus den hier gewonnenen Ergebnissen. Folgende Fragen sollten dort beantwortet sein: wie müssen die Zertifikate beschaffen sein, wo sind die CA-Zertifikate zur Prüfung der Client-Zertifikate zu installieren, wie erfolgt die Rollenzuordnung zwischen DN (Distinguished Name) im Zertifikat und einer Rolle für den Zugriff auf eine Tomcat-Webanwendung • Korrektur der Fehler bzgl. der Optionen zu SSL und TLS (s. T44-T46) und Verbesserung der diesbezüglichen Auswahlmöglichkeiten in der Dokumentation. Bundesamt für Sicherheit in der Informationstechnik Seite 184 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Abkürzungen 8. Abkürzungen ACL AJP API APR CA CD CPU DBMS DNS DoS DVD GB HTTP IPsec JAAS JDBC JNDI JSP JSSE LDAP LCD MB NAT OOP SCSI SDK SGID SSH SSL SSO SQL SUID TLS VM VPN XML Seite 185 (von 187) Access Control List Apache JServ Protocol Application Programming Interface Apache Portable Runtime Certification Authority Compact Disc Central Processing Unit DataBase Management System Domain Name Service Denial of Service Digital Versatile Disc Giga Byte HyperText Transfer Protocol Internet Protocol Security Java Authentication and Authorization Service Java Database Connectivity Java Naming and Directory Interface Java Server Pages Java Secure Socket Extension Lightweight Directory Access Protocol Liquid Crystal Display Mega Byte Network Address Translation objektorientierte Programmierung Small Computer System Interface Software Development Kit Set Group Identity Secure Shell Secure Sockets Layer Single Sign On Structured Query Language Set User Identity Transport Layer Security Virtual Machine Virtual Private Network EXtended Markup Language Bundesamt für Sicherheit in der Informationstechnik Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Wichtige Shell-Variablen, Verzeichnisse und Dateien 9. Wichtige Shell-Variablen, Verzeichnisse und Dateien Um eine verbesserte Lesbarkeit bei der Bezeichnung von Dateien und Verzeichnissen zu erhalten, wird im Text eine Notation unter Verwendung von Shell-Variablen benutzt. Hiermit lässt sich außerdem eine bessere Übertragbarkeit der Angaben in andere Systemumgebungen realisieren, die die Softwarepakete an anderer Stelle installiert haben. Tomcat (Version 5.5.9) $CATALINA_HOME $CATALINA_HOME/bin/catalina.sh $CATALINA_HOME/conf/server.xml $CATALINA_HOME/conf/tomcat-users.xml $CATALINA_HOME/logs $CATALINA_HOME/webapps $CATALINA_HOME/conf/workers.properties Wurzelverzeichnis der Tomcat-Installation (Testumgebung: /opt/jakarta-tomcat-5.5.9) Tomcat Startscript Tomcat Konfiguration Tomcat Benutzerdefinition (Memory Realm) Tomcat Log-Verzeichnis Verzeichnis der Tomcat Webanwendungen Konfiguration der AJP-Schnittstelle zwischen Apache und Tomcat Apache Webserver (Version 2.0.54) $HTTPD_HOME $HTTPD_HOME/bin/apachectl $HTTPD_HOME/conf/httpd.conf $HTTPD_HOME/conf/ssl.conf $HTTPD_HOME/conf/workers.properties Wurzelverzeichnis der Apache-Installation, äquivalent zur an manchen Stellen verwendeten Variable $APACHE_INSTALL (Testumgebung: /opt/httpd-2.0.54) Apache Startscript Apache Konfiguration SSL-Konfiguration Apache Konfiguration der AJP-Schnittstelle zwischen Apache und Tomcat (Soft-Link auf die gleichnamige Konfigurationsdatei in der TomcatInstallation, s. o.) JAVA SDK (Version 1.5.0_05) $JAVA_HOME $JRE_HOME $JAVA_HOME/jre/lib/security/cacerts Bundesamt für Sicherheit in der Informationstechnik Wurzelverzeichnis der Java-SDK-Installation (Testumgebung: /opt/jdk1.5.0_05) Wurzelverzeichnis der Java-RuntimeEnvironment Installation ($JAVA_HOME/jre) Datei mit den Zertifikaten der Certification Authorities (CAs) Seite 186 (von 187) Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers Referenzen 10. Referenzen [Barret] Daniel J. Barret, Richard E. Silverman, SSH: The Secure Shell – The Definitive Guide, O'Reilly, 2001 [BSI GSHB] IT-Grundschutzhandbuch, Bundesamt für Sicherheit in der Informationstechnik, 2004, http://www.bsi.bund.de/gshb/index.htm [Darwin] Ian E. Darwin, Jason Brittain, Tomcat – The Definitive Guide, OReilly, Inc., 2003 [Moczar] Lajos Moczar, Tomcat 5 – Einsatz in Unternehmensanwendungen mit JSP und Servlets, Addison Wesley, 2005 [McCarty] Bill McCarty, SELinux – NSA's OpenSource Security Enhanced Linux, O'Reilly, 2004 [Tomcat Fein.] Sicherheitsuntersuchung des Apache Jakarta Tomcat Servlet Containers – Feinkonzept, 2005 [Viega] John Viega, Matt Messier, Pravir Chandra, Network Security with OpenSSL, O'Reilly, 2002 10.1 Web-Referenzen (Stand 30.11.2005) [Apache mod_log] Apache Module mod_log_config Documentation, http://httpd.apache.org/docs/2.0/mod/mod_log_config.html [Debian SELinux] SELinux for Distributions – Debian Distribution, http://selinux.sourceforge.net/distros/debian.php3 [Jakarta Regexp] Jakarta Regexp 1.4 API, Class RE, http://jakarta.apache.org/regexp/apidocs/org/apache/regexp/RE.html [NSA SELinux] National Security Agency – Central Security Service, Security-Enhanced Linux, http://www.nsa.gov/selinux/ [RFC2401] IETF, RFC 2401 Security Architecture for the Internet Protocol, ftp://ftp.rfc-editor.org/in-notes/rfc2401.txt, 1998 [RFC2518] IETF, RFC 2518 HTTP Extensions for Distributed Authoring – WEBDAV, ftp://ftp.rfc-editor.org/in-notes/rfc2518.txt, 1999 [Sun JSP] Sun Microsystems, Java Server Pages Specification (Version 2.0), http://java.sun.com/products/jsp/docs.html [Sun Servlets] Sun Microsystems, Java Servlets Specification (Version 2.4), http://java.sun.com/products/servlet/reference/api/index.html [ISIS MTT] Core Specification (Version 1.1), http://www.teletrust.de/fileadmin/files/ISISMTT_Core_Specification_v1.1.pdf Seite 187 (von 187) Bundesamt für Sicherheit in der Informationstechnik