Jenkins Configuration LDAP

De EjnTricks

Cet article présente la configuration d'un annuaire LDAP dans Jenkins. Attention, lors de l'activation de l'annuaire LDAP, le compte adminbistrateur par défaut peut devenir inutilisable, si celui ci n'est pas déclaré dans l'annuaire. L'administration de Jenkins devient donc impossible. Si le cas se produit, il est possible de donner temporairement tous les droits au compte anonyme. Pour cela, il faut éditer le fichier config.xml de Jenkins, contenant la définition des permissions. Dans le cadre de cette installation sous Tomcat, le fichier se trouve dans le répertoire /usr/share/tomcat6/.jenkins. La modification du compte administrateur se situe dans la section authorizationStrategy.

  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationStrategy">
    <permission>hudson.model.Hudson.Administer:admin</permission>
    <permission>hudson.model.Hudson.Read:anonymous</permission>
    <permission>hudson.model.Item.Read:anonymous</permission>
  </authorizationStrategy>

Il est alors possible de la modifier temporairement ainsi:

  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationStrategy">
    <permission>hudson.model.Hudson.Administer:admin</permission>
    <permission>hudson.model.Hudson.Administer:admin</permission>
<!--
    <permission>hudson.model.Hudson.Read:anonymous</permission>
    <permission>hudson.model.Item.Read:anonymous</permission>
-->
  </authorizationStrategy>

Hand-icon.png Votre avis

Current user rating: 82/100 (4 votes)

 You need to enable JavaScript to vote


Icon-Configuration-Settings.png Déclaration annuaire

Une fois l'annuaire LDAP installé, il faut le déclarer au niveau de jenkins, avec un compte administrateur. Ceci s'effectue dans la section Administrer Jenkins → Configurer la sécurité globale. Il faut alors sélectionner l'option LDAP. Les valeurs saisies, dans le cadre de cet article, sont en relation avec l'installation faite de OpenLDAP sur un serveur Ubuntu.

Paramètre Valeur
Server 192.168.1.32

Le mieux serait de donner un nom de serveur.

DN racine dc=ejnserver,dc=fr
Base pour la recherche d'utilisateurs ou=people
Filtre pour la recherche d'utilisateurs uid={0}
Base pour la recherche de groupes  
DN du gestionnaire cn=admin,dc=ejnserver,dc=fr
Mot de passe du gestionnaire Mot de passe du compte cn=admin,dc=ejnserver,dc=fr sur l'annuaire.

Les attributs utilisés pour le mapping des utilisateurs sont classiques.


Configuration-icon.png Configuration manuelle

La configuration du serveur LDAP sur l'interface se retrouve dans le fichier config.xml, dans le répertoire /usr/share/tomcat6/.jenkins, et peut être modifiée manuellement. Cela n'est absolument pas recommandé, mais permet de comprendre un peu mieux comment sont stockées les informations. Pour les paramètres indiqués dans cet article, la configuration se retrouve dans la section securityRealm.

  <securityRealm class="hudson.security.LDAPSecurityRealm">
    <server>192.168.1.32</server>
    <rootDN>dc=ejnserver,dc=fr</rootDN>
    <inhibitInferRootDN>false</inhibitInferRootDN>
    <userSearchBase>ou=people</userSearchBase>
    <userSearch>uid={0}</userSearch>
    <managerDN>cn=admin,dc=ejnserver,dc=fr</managerDN>
    <managerPassword>PASSWORD_MANAGER_CRYPTED</managerPassword>
  </securityRealm>

PASSWORD_MANAGER_CRYPTED est remplacé par le mot de passe encrypté du compte défini dans managerDN pour se connecté à l'annuaire LDAP.


Warning-icon.png Configuration Iptables

Dans le cadre de la mise en place de restriction Iptables, si l'adresse IP du serveur, même en local, n'est pas autorisée à accéder à l'annuaire, il deviendra impossible de s'authentifier. L'interface affichant le message d'erreur Identification invalide. Merci d'essayer à nouveau. et les messages suivants seront présent dans la log catalina.out:

INFO: Login attempt failed
org.acegisecurity.AuthenticationServiceException: Unable to connect to LDAP server; nested exception is javax.naming.CommunicationException: 192.168.1.32:389 
[Root exception is java.net.ConnectException: Connection refused]; nested exception is org.acegisecurity.ldap.LdapDataAccessException:
Unable to connect to LDAP server; nested exception is javax.naming.CommunicationException: 192.168.1.32:389
[Root exception is java.net.ConnectException: Connection refused]
        at org.acegisecurity.providers.ldap.LdapAuthenticationProvider.retrieveUser(LdapAuthenticationProvider.java:238)
        at org.acegisecurity.providers.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:119)
        at org.acegisecurity.providers.ProviderManager.doAuthentication(ProviderManager.java:195)
        at org.acegisecurity.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:45)
        at org.acegisecurity.ui.webapp.AuthenticationProcessingFilter.attemptAuthentication(AuthenticationProcessingFilter.java:71)
        at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:252)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at org.acegisecurity.ui.basicauth.BasicProcessingFilter.doFilter(BasicProcessingFilter.java:173)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at jenkins.security.ApiTokenFilter.doFilter(ApiTokenFilter.java:63)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
        at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:66)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
        at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:50)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
Caused by: org.acegisecurity.ldap.LdapDataAccessException: Unable to connect to LDAP server; nested exception is javax.naming.CommunicationException: 192.168.1.32:389
[Root exception is java.net.ConnectException: Connection refused]
        at org.acegisecurity.ldap.DefaultInitialDirContextFactory.connect(DefaultInitialDirContextFactory.java:189)
        at org.acegisecurity.ldap.DefaultInitialDirContextFactory.newInitialDirContext(DefaultInitialDirContextFactory.java:261)
        at org.acegisecurity.ldap.DefaultInitialDirContextFactory.newInitialDirContext(DefaultInitialDirContextFactory.java:241)
        at org.acegisecurity.ldap.LdapTemplate.execute(LdapTemplate.java:123)
        at org.acegisecurity.ldap.LdapTemplate.searchForSingleEntry(LdapTemplate.java:246)
        at org.acegisecurity.ldap.search.FilterBasedLdapUserSearch.searchForUser(FilterBasedLdapUserSearch.java:119)
        at org.acegisecurity.providers.ldap.authenticator.BindAuthenticator.authenticate(BindAuthenticator.java:71)
        at org.acegisecurity.providers.ldap.authenticator.BindAuthenticator2.authenticate(BindAuthenticator2.java:49)
        at org.acegisecurity.providers.ldap.LdapAuthenticationProvider.retrieveUser(LdapAuthenticationProvider.java:233)
        ... 34 more
Caused by: javax.naming.CommunicationException: 192.168.1.32:389 [Root exception is java.net.ConnectException: Connection refused]
        at com.sun.jndi.ldap.Connection.<init>(Connection.java:210)
        at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:118)
        at com.sun.jndi.ldap.LdapClientFactory.createPooledConnection(LdapClientFactory.java:46)
        at com.sun.jndi.ldap.pool.Connections.<init>(Connections.java:97)
        at com.sun.jndi.ldap.pool.Pool.getPooledConnection(Pool.java:114)
        at com.sun.jndi.ldap.LdapPoolManager.getLdapClient(LdapPoolManager.java:310)
        at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1572)
        at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2652)
        at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293)
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
        at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
        at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
        at javax.naming.InitialContext.init(InitialContext.java:223)
        at javax.naming.InitialContext.<init>(InitialContext.java:197)
        at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:82)
        at org.acegisecurity.ldap.DefaultInitialDirContextFactory.connect(DefaultInitialDirContextFactory.java:180)
        ... 42 more
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at com.sun.jndi.ldap.Connection.createSocket(Connection.java:352)
        at com.sun.jndi.ldap.Connection.<init>(Connection.java:187)
        ... 60 more