Im Apache Tomcat Applikation Servers werden Resourcen angelegt, welche mit einem Benutzernamen und Passwort hinterlegt sind. Diese werden in der Grundkonfiguration im Klartext angelegt. Bei einem eventuellen Einbruch in den Server sind so die Passwörter für zbsp. Datenbanken im Klartext lesbar.
Vorwort
Da im Internet bereits einiges beschrieben ist und ich mich nicht mit fremden Federn schmücken möchte, möchte ich auf das Tutorial von JDev.it hinweisen, welches ich für dieses Tutorial zu Hilfe genommen habe.
Apache Tomcat Benutzername und Passwort verschlüsseln
Für die Verwaltung des Applikationsservers steht einem Benutzer die „Manager App“ zur Verfügung. Um jedoch diese App benutzen zu können muss in der Datei tomcat-users.xml ein Benutzer eingerichtet werden.
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <user username="tomcat" password="tomcat" roles="tomcat, manager-gui"/> </tomcat-users>
Ich habe in der XML Datei alle Kommentare entfernt.
So, dass wie hier zu sehen ist der Benutzer „tomcat“ mit dem Passwort „tomcat“ und der Rolle „tomcat“ sowie „manager-gui“ eingerichtet ist.
Wenn man nun den Server neustartet, kann man sich mit diesen Daten anmelden.
Als nächsten werden wir nun das Passwort verschlüsseln, um hier eine Sicherheit zu schaffen.
Verschlüsseln von Passwörtern
Apache Tomcat wird mit einem Script ausgeliefert, welches Passwörter im Format „SHA-256“ verschlüsselt. Dieses Skript ist im %TOMCAT_HOME%\bin Ordner abgelegt und heißt für Windowsbenutzer „digest.bat“, Linuxbenutzer wählen hier die Datei „digest.sh“.
Wenn man also nun das Skript „digist.bat“ folgendermaßen ausführt
„digist.bat -a sha-256 tomcat >> pw.txt“ wird das übergebene Passwort verschlüsselt in der Datei „pw.txt“ abgelegt (nicht vergessen diese Datei zu löschen), nun müssen wir noch dieses Passwort in die Datei „tomcat-users.xml“ eintragen.
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <user username="tomcat" password="51b912f34ae18b4e5ad349f50bc6fdd8d9a605d09bab4f302a09c7f790854296" roles="tomcat, manager-gui"/> </tomcat-users>
Jetzt muss im Server noch konfiguriert werden das dieses Passwort entschlüsselt werden muss.
Vorher:
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
Nachher:
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" digest="sha-256"/>
Nun kann man sich in der Manager App mit dem Benutzernamen „tomcat“ anmelden und dem verschlüsselten Passwort „tomcat“.
Datenbankpasswörter verschlüsseln
Datenbanken sind besonders zu sichern, da hier bei einem eventuellen Einbruch der größte Schaden entstehen kann (löschen / verändern / stehlen von Daten).
Beispiel zum verschlüssen von Datenbankpasswörter
Hier nun ein Beispiel wie man ein Datenbankpasswort für eine Apache Derby Datenbank verschlüsselt.
Die Konfiguration (in der Datei context.xml) für eine Datenbank Ressource im Apache Tomcat sieht in meinem Beispiel wie folgt aus:
<Resource name="jdbc/derbyTest" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="testUser" password="testUserPassword" driverClassName="org.apache.derby.jdbc.EmbeddedDriver" url="jdbc:derby:d:/databases/derbyTestDb;create=true"/>
Hier ist wieder zuerkennen dass, das Passwort „testUserPassword“ im klartext steht.
Für das Verschlüsseln des Passwortes greife ich auf die Klassen „EncryptedDataSourceFactory“ und „Encryptor“ aus dem Tutorial Encrypting passwords in Tomcat zurück, welche ich hier bereitstellen möchte.
Als gepackte, lauffähige JAR Datei:
Und den Quellcode:
Nach dem Download wird die JAR Datei in den Order WEB-INF\lib kopiert.
Nun kann auf der Konsole mit dem Befehl
„java -jar encryptedDS.jar testUserPassword >> pw.txt“
das Passwort verschlüsselt werden.
Zum vereinfachten Kopieren des Passwortes wird dieses in der Datei „pw.txt“ abgelegt.
Nun muss die Ressource für die Datenbank wie folgt angepasst werden:
<Resource name="jdbc/derbyTest" factory="de.stefandraegersoftware.encryptedDS.EncryptedDataSourceFactory" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="testUser" password="9935eb8c2f50451106948315e8e172793071fbba7a6296ed5589db84e7cfb7dd" driverClassName="org.apache.derby.jdbc.EmbeddedDriver" url="jdbc:derby:d:/databases/derbyTestDb;create=true"/>
In dem Attribut „factory“ wird die Factory Klasse aus der JAR Datei angegeben, mit welcher das Passwort entschlüsselt werden kann.
Nach einem Serverneustart sollte diese Änderung aktiv sein.