Dies ist eine alte Version des Dokuments!
Spezielle LDAP Konfiguration
LDAP ohne Connection Pool
Gibt es Probleme bei der Verbindung mit dem LDAP-Server unter Verwendung eines Connection Pools, so kann man diesen mit folgenden Schritten deaktivieren.
Die aktuelle IdP-Version (3.2.1) basiert auf Ldaptive und benutzt standardmäßig eine sogenannte PooledConnectionFactory. Das heißt, dass eine definierte Anzahl an Verbindungen zum LDAP-Dienst aufrecht erhalten wird und Authentifizierungen sofort stattfinden können (Performance-Verbesserung).
Wenn diese Verbindung beendet wird, so registriert Shibboleth dies und baut selbstständig eine neue auf. Dies kann man über ein paar Parameter in conf/ldap.properties
steuern. In der Konfigurationsdatei sehen Sie die (auskommentierten) Standardeinstellungen und können sie bei Bedarf verändern.
- conf/ldap.properties
# LDAP pool configuration, used for both authn and DN resolution #idp.pool.LDAP.minSize = 3 #idp.pool.LDAP.maxSize = 10 #idp.pool.LDAP.validateOnCheckout = false #idp.pool.LDAP.validatePeriodically = true #idp.pool.LDAP.validatePeriod = 300 #idp.pool.LDAP.prunePeriod = 300 #idp.pool.LDAP.idleTime = 600 #idp.pool.LDAP.blockWaitTime = 3000 #idp.pool.LDAP.failFastInitialize = false
Es kann dazu kommen, dass die Verbindung zum LDAP-Server zwar erhalten bleibt, jedoch in einer definierten Zeit keine Antwort zurück kommt. Unter Umständen können sich Nutzer*innen dann nicht mehr am IdP einloggen.
Ein passender Eintrag in den Logfiles sieht wie folgt aus:
WARN [net.shibboleth.idp.authn.impl.ValidateUsernamePasswordAgainstLDAP:175] - Profile Action ValidateUsernamePasswordAgainstLDAP: Login by centreon produced exception org.ldaptive.LdapException: javax.naming.NamingException: LDAP response read timed out, timeout used:3000ms. at org.ldaptive.provider.ProviderUtils.throwOperationException(ProviderUtils.java:77) Caused by: javax.naming.NamingException: LDAP response read timed out, timeout used:3000ms. at com.sun.jndi.ldap.Connection.readReply(Connection.java:502)
Um den Connection-Pool abzuschalten, müssen lediglich zwei kleine Änderungen in der conf/authn/ldap-authn-config.xml
getätigt werden: Entfernen Sie das Wort „Pooled“ aus den class-Bezeichnungen und den connectionFactory-Referenzen und schon wird statt der PooledConnectionFactory die DefaultConnectionFactory benutzt.
- conf/authn/ldap-authn-config.xml
<!-- ... --> <!-- Authentication handler --> <bean id="authHandler" class="org.ldaptive.auth.BindAuthenticationHandler" p:connectionFactory-ref="bindConnectionFactory" /> <!-- <bean id="authHandler" class="org.ldaptive.auth.PooledBindAuthenticationHandler" p:connectionFactory-ref="bindPooledConnectionFactory" /> --> <bean id="bindPooledConnectionFactory" class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="bindConnectionPool" /> <bean id="bindConnectionPool" class="org.ldaptive.pool.BlockingConnectionPool" parent="connectionPool" p:connectionFactory-ref="bindConnectionFactory" p:name="bind-pool" /> <bean id="bindConnectionFactory" class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="bindConnectionConfig" /> <bean id="bindConnectionConfig" parent="connectionConfig" /> <!-- ... --> <!-- Bind Search Configuration --> <bean name="bindSearchAuthenticator" class="org.ldaptive.auth.Authenticator"> <constructor-arg index="0" ref="bindSearchDnResolver" /> <constructor-arg index="1" ref="authHandler" /> </bean> <bean id="bindSearchDnResolver" class="org.ldaptive.auth.SearchDnResolver" p:baseDn="%{idp.authn.LDAP.baseDN}" p:subtreeSearch="%{idp.authn.LDAP.subtreeSearch:false}" p:userFilter="%{idp.authn.LDAP.userFilter}" p:connectionFactory-ref="bindSearchConnectionFactory" /> <!-- <bean id="bindSearchDnResolver" class="org.ldaptive.auth.PooledSearchDnResolver" p:baseDn="%{idp.authn.LDAP.baseDN}" p:subtreeSearch="%{idp.authn.LDAP.subtreeSearch:false}" p:userFilter="%{idp.authn.LDAP.userFilter}" p:connectionFactory-ref="bindSearchPooledConnectionFactory" /> --> <bean id="bindSearchPooledConnectionFactory" class="org.ldaptive.pool.PooledConnectionFactory" p:connectionPool-ref="bindSearchConnectionPool" /> <bean id="bindSearchConnectionPool" class="org.ldaptive.pool.BlockingConnectionPool" parent="connectionPool" p:connectionFactory-ref="bindSearchConnectionFactory" p:name="search-pool" /> <bean id="bindSearchConnectionFactory" class="org.ldaptive.DefaultConnectionFactory" p:connectionConfig-ref="bindSearchConnectionConfig" /> <bean id="bindSearchConnectionConfig" parent="connectionConfig" p:connectionInitializer-ref="bindConnectionInitializer" /> <bean id="bindConnectionInitializer" class="org.ldaptive.BindConnectionInitializer" p:bindDn="%{idp.authn.LDAP.bindDN}"> <property name="bindCredential"> <bean class="org.ldaptive.Credential"> <constructor-arg value="%{idp.authn.LDAP.bindDNCredential}" /> </bean> </property> </bean> <!-- ... -->