Inhaltsverzeichnis
Apache Tomcat 6 - LDAP-Authentifizierung JNDIRealm
Apache Tomcat stellt eine Umgebung zur Ausführung von Java-Code für Web-Server bereit. Es handelt sich um einen Servlet-Container, der mithilfe des JSP-Compilers Jasper JavaServer Pages in Servlets übersetzen und ausführt. Zusätzlich ist ein kompletter HTTP-Server integriert.
Die Nutzung einer Datei zur Authentifizierung von Benutzer, welche standardmäßig
/etc/tomcat6/tomcat-users.xml
ist, soll hier deaktiviert werden, um gegen einen
- LDAP-Server
zu authentifizieren.
Konfiguration: Tomcat
Nachfolgende Stellen innerhalb der Konfigurationsdatei des Apache Tomcat 6-Application Servers müssen daher auskommentiert bzw. ergänzt werden.
/etc/tomcat6/server.xml
Nachfolgende Stellen in der Konfigurationsdatei sollten nur auskommentiert werden, wie nachfolgend dargestellt (nur relevante Ausschnitte):
... <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <!-- Tachtler - DISABLED - --> <!-- <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> --> </GlobalNamingResources> ...
und
... <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <!-- Tachtler - DISABLED - --> <!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> --> ...
/etc/tomcat6/context.xml
Hier die komplette Konfigurationsdatei:
<?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Tachtler --> <!-- Enable LDAP authentication --> <Realm className="org.apache.catalina.realm.JNDIRealm" connectionName="cn=Ersatzauthentifizierer,dc=tachtler,dc=net" connectionPassword="geheim" connectionURL="ldap://ldap.dmz.tachtler.net:389" userPattern="uid={0},ou=People,dc=tachtler,dc=net" roleBase="ou=TomcatRoles,dc=tachtler,dc=net" roleName="cn" roleSearch="(uniqueMember={0})" /> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> </Context>
Konfiguration: LDAP-Server
Wie ein entsprechender LDAP-Server eingerichtet werden kann, kann unter folgendem Link innerhalb dieses DokuWiki's nachgelesen werden:
Gruppe hinzufügren
WICHTIG - Es ist erforderlich, dass der OpenLDAP-Server bzw. slapd
-Daemon/Dienst gestoppt wird !!!
Zuerst sollte eine Datei mit nachfolgend genannten Namen in nachfolgend genannten Verzeichnis erstellt werden:
/etc/openldap/ldif/TomcatRoles.ldif
Der Inhalt der Datei könnte folgendermaßen aussehen, wobei hier folgende Anforderungen erfüllt werden:
- Anlegen einer Gruppe mit dem Namen
TomcatRoles
- Anlegen einer „admin“ Rolle mit dem Mitglied
root
- Anlegen einer „login“ Rolle mit dem Mitglied
klaus
- Anlegen einer „manager“ Rolle mit den Mitgliedern
root
undklaus
dn: ou=TomcatRoles,dc=tachtler,dc=net objectClass: organizationalUnit objectClass: top ou: TomcatRoles dn: cn=admin,ou=TomcatRoles,dc=tachtler,dc=net objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=root,ou=People,dc=tachtler,dc=net dn: cn=login,ou=TomcatRoles,dc=tachtler,dc=net objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=klaus,ou=People,dc=tachtler,dc=net dn: cn=manager,ou=TomcatRoles,dc=tachtler,dc=net objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=root,ou=People,dc=tachtler,dc=net uniqueMember: uid=klaus,ou=People,dc=tachtler,dc=net
Dies kann mit folgendem Befehl durchgeführt werden:
# service slapd stop Stopping slapd: [ OK ]
Mit folgenden Befehlen werden nun die Daten aus der Datei
/etc/openldap/ldif/TomcatRoles.ldif
und
in den DIT Directory Information Tree eingestellt:
# slapadd -v -l /etc/openldap/ldif/TomcatRoles.ldif added: "ou=TomcatRoles,dc=tachtler,dc=net" (0000000c) added: "cn=admin,ou=TomcatRoles,dc=tachtler,dc=net" (0000000d) added: "cn=login,ou=TomcatRoles,dc=tachtler,dc=net" (0000000e) added: "cn=manager,ou=TomcatRoles,dc=tachtler,dc=net" (0000000f) _#################### 100.00% eta none elapsed none fast! Closing DB...
WICHTIG - Es ist erforderlich, dass der OpenLDAP-Server bzw. slapd
-Daemon/Dienst wieder gestartet wird !!!
Dies kann mit folgendem Befehl durchgeführt werden:
# service slapd start Starting slapd: [ OK ]
Zur Überprüfung ob das Anlegen der Gruppe korrekt funktioniert hat, kann folgender Befehl verwendet werden, welche die nachfolgende Ausgabe erzeugen sollte:
# ldapsearch -x -LLL -H ldap://ldap.dmz.tachtler.net -b "ou=TomcatRoles,dc=tachtler,dc=net" -W -D "cn=Ersatzauthentifizierer,dc=tachtler,dc=net" Enter LDAP Password: dn: ou=TomcatRoles,dc=tachtler,dc=net objectClass: organizationalUnit objectClass: top ou: TomcatRoles dn: cn=admin,ou=TomcatRoles,dc=tachtler,dc=net objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=root,ou=People,dc=tachtler,dc=net cn: admin dn: cn=login,ou=TomcatRoles,dc=tachtler,dc=net objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=klaus,ou=People,dc=tachtler,dc=net cn: login dn: cn=manager,ou=TomcatRoles,dc=tachtler,dc=net objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=root,ou=People,dc=tachtler,dc=net uniqueMember: uid=klaus,ou=People,dc=tachtler,dc=net cn: manager
Zugriffsrechte beschränken
Durch nachfolgende Abfrage, kann aufgelistet werden, welche Zugriffsrechte für die einzelnen im DIT Directory Information Tree enthaltenen Benutzerstrukturen bereits existieren, um diese Informationen als Grundlage für Anpassungen verwenden zu können:
# ldapsearch -W -x -D cn=config -b olcDatabase={-1}frontend,cn=config Enter LDAP Password: # extended LDIF # # LDAPv3 # base <olcDatabase={-1}frontend,cn=config> with scope subtree # filter: (objectclass=*) # requesting: ALL # # {-1}frontend, config dn: olcDatabase={-1}frontend,cn=config olcPasswordHash: {SSHA} objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: {-1}frontend olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Anonymo us,dc=tachtler,dc=net" read by anonymous auth by * none olcAccess: {1}to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none olcAccess: {2}to dn="cn=Ersatzauthentifizierer,dc=tachtler,dc=net" by self wr ite by dn="cn=Manager,dc=tachtler,dc=net" write by * none olcAccess: {3}to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self wr ite by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzauthentifiz iere,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtle r,dc=net" read by * none olcAccess: {4}to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzauthenti fizieren,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=ta chtler,dc=net"read by * none olcAccess: {5}to * by self write by dn.base="cn=manager,dc=tachtler,dc=net" write by * read olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 0 olcReadOnly: FALSE olcSchemaDN: cn=Subschema olcMonitoring: FALSE # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
Um Änderungen an diesen Zugriffsberechtigungen durchzuführen, sind zwei wesentliche Schritte notwendig:
- Löschen der eines Teils der aktuellen ACL-Konfiguration (Regel {5})
- Neuanlage der zukünftigen ACL-Konfiguration inklusive des vorher gelöschten Teils der alten ACL-Konfiguration (Regel {5})
WICHTIG - Die Konfigurationsdatei im und unterhalb des Verzeichnisses sollten NICHT direkt editiert werden !!!
Um Änderungen durchzuführen, soll eine Änderungsdatei im *.LDIF-Format erstellt werden.
Dazu soll im ersten Schritt ein Verzeichnis mit dem Name
/etc/openldap/ldif
erstellt werden (falls dieses nicht bereits vorhanden ist), was mit nachfolgendem Befehl durchgeführt werden kann:
# mkdir /etc/openldap/ldif
Die Besitzrechte sollten mit nachfolgenden Befehl angepasst werden:
# chown -R ldap.ldap /etc/openldap/ldif/
ebenfalls die Dateirechte, mit nachfolgendem Befehl:
# chmod -R 700 /etc/openldap/ldif/
Der Name der Konfigurationsdateien im *.LDIF-Format sollen hier
- /etc/openldap/ldif/frontend_acl_add_TomcatRoles.ldif
lauten und nachfolgende Inhalte haben
dn: olcDatabase={-1}frontend,cn=config delete: olcAccess olcAccess: {5} dn: olcDatabase={-1}frontend,cn=config add: olcAccess olcAccess: {5}to dn.regex="ou=TomcatRoles,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzauthentifizierer,dc=tachtler,dc=net" read by * none olcAccess: {6}to * by self write by dn.base="cn=manager,dc=tachtler,dc=net" write by * read
Durch nachfolgenden Befehl, wird die Konfigurationsdatei im *.LDIF-Format –>
/etc/openldap/ldif/frontend_acl_add_TomcatRoles.ldif
und
von der bestehenden OpenLDAP-Server bzw. slapd
-Daemon/Dienst-Konfiguration gelöscht bzw. zu der bestehenden OpenLDAP-Server bzw. slapd
-Daemon/Dienst-Konfiguration hinzugefügt:
# ldapmodify -W -x -D cn=config -f /etc/openldap/ldif/frontend_acl_add_TomcatRoles.ldif Enter LDAP Password: modifying entry "olcDatabase={-1}frontend,cn=config "
Eine Überprüfung, ob das Löschen und das Hinzufügen der zusätzlichen Konfigurationen erfolgreich war, kann mit nachfolgendem Befehl durchgeführt werden und sollte eine Ausgabe wie nachfolgend dargestellt, ausgeben:
# ldapsearch -W -x -D cn=config -b olcDatabase={-1}frontend,cn=config Enter LDAP Password: # extended LDIF # # LDAPv3 # base <olcDatabase={-1}frontend,cn=config> with scope subtree # filter: (objectclass=*) # requesting: ALL # # {-1}frontend, config dn: olcDatabase={-1}frontend,cn=config olcPasswordHash: {SSHA} objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: {-1}frontend olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Anonymo us,dc=tachtler,dc=net" read by anonymous auth by * none olcAccess: {1}to dn="cn=Manager,dc=tachtler,dc=net" by self write by * none olcAccess: {2}to dn="cn=Ersatzauthentifizierer,dc=tachtler,dc=net" by self wr ite by dn="cn=Manager,dc=tachtler,dc=net" write by * none olcAccess: {3}to dn.regex="cn=([^,]+),ou=Group,dc=tachtler,dc=net" by self wr ite by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzauthentifiz iere,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=tachtle r,dc=net" read by * none olcAccess: {4}to dn.regex="uid=([^,]+),ou=People,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzauthenti fizieren,dc=tachtler,dc=net" read by dn.exact,expand="uid=$1,ou=People,dc=ta chtler,dc=net"read by * none olcAccess: {5}to dn.regex="ou=TomcatRoles,dc=tachtler,dc=net" by self write by dn="cn=Manager,dc=tachtler,dc=net" write by dn="cn=Ersatzauthentifizierer ,dc=tachtler,dc=net" read by * none olcAccess: {6}to * by self write by dn.base="cn=manager,dc=tachtler,dc=net" write by * read olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 0 olcReadOnly: FALSE olcSchemaDN: cn=Subschema olcMonitoring: FALSE # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1