Jenkins Configuration LDAP
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>
Votre avis
Current user rating: 82/100 (4 votes)
|
|
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 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>
Où PASSWORD_MANAGER_CRYPTED
est remplacé par le mot de passe encrypté du compte défini dans managerDN
pour se connecté à l'annuaire LDAP.
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