Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-29860

SSH Auth Breaks with "No Password" error from ActiveDirectoryUnixAuthenticationProvider

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Critical Critical

      Our Jenkins instance is chef managed, meaning a process runs on the box every 30 minutes that enforces certain configuration options in Jenkins. It does this by executing jenkins-cli commands. The Jenkins cli authenticates using SSH keys. The ssh key in question is associated with a user that is a full admin on the master. This user is also in our AD since we use the active-directory plugin for authentication. This has been working fine for a long time. (I think we stood this box up in January 2015).

      As of 1500 EDT on Aug 3, we started seeing the below error in our Jenkins logs. From the time the error occur until we restart Jenkins, all attempts to use the jenkins-cli by this user fail, effectively disabling our chef management.

      Initially this was happening about once a day, it is now typically occurring within one to two hours after a the last corrective restart. However this may simply be due to our more aggressive restarting as soon as we see the error.

      The initial error only appears once in the log, after that each subsequent authentication attempt results in a different error, also shown below. The jenkins-cli, for its part, returns the cryptic error reported in JENKINS-22346, which we have come to understand as an authentication failure.

      The only notable changes made in this timeframe were the addition of the extensible-choice-parameter and nodelabelparameter plugins which were added on the 4th and 6th of August respectively.

      Initial Error that Initiates the Problem

      Aug 07, 2015 4:56:25 PM hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider retrieveUser
      WARNING: Credential exception trying to authenticate against **REDACTED** domain
      org.acegisecurity.BadCredentialsException: Empty password
        at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.retrieveUser(ActiveDirectoryUnixAuthenticationProvider.java:254)
        at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.retrieveUser(ActiveDirectoryUnixAuthenticationProvider.java:219)
        at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.retrieveUser(ActiveDirectoryUnixAuthenticationProvider.java:163)
        at org.acegisecurity.providers.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:122)
        at org.acegisecurity.providers.ProviderManager.doAuthentication(ProviderManager.java:200)
        at org.acegisecurity.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:47)
        at jenkins.security.BasicHeaderRealPasswordAuthenticator.authenticate(BasicHeaderRealPasswordAuthenticator.java:55)
        at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:79)
        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:67)
        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
        at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
        at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:168)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
        at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
        at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
        at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
        at org.eclipse.jetty.server.Server.handle(Server.java:370)
        at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
        at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949)
        at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011)
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
        at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668)
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
        at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
      

      Error seen on Subsequent cli authentication attempts

      Aug 07, 2015 5:01:36 PM hudson.TcpSlaveAgentListener$ConnectionHandler run
      INFO: Accepted connection #9 from /127.0.0.1:48680
      Exception in thread "Thread-1234" org.acegisecurity.userdetails.UsernameNotFoundException: Authentication was successful but cannot locate the user information for 
        at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.retrieveUser(ActiveDirectoryUnixAuthenticationProvider.java:295)
        at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.retrieveUser(ActiveDirectoryUnixAuthenticationProvider.java:219)
        at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.retrieveUser(ActiveDirectoryUnixAuthenticationProvider.java:163)
        at hudson.plugins.active_directory.AbstractActiveDirectoryAuthenticationProvider.loadUserByUsername(AbstractActiveDirectoryAuthenticationProvider.java:53)
        at jenkins.security.ImpersonatingUserDetailsService.loadUserByUsername(ImpersonatingUserDetailsService.java:32)
        at hudson.model.User.impersonate(User.java:309)
        at org.jenkinsci.main.modules.cli.auth.ssh.SshCliAuthenticator.authenticate(SshCliAuthenticator.java:44)
        at hudson.cli.CliManagerImpl$2.run(CliManagerImpl.java:109)
      

          [JENKINS-29860] SSH Auth Breaks with "No Password" error from ActiveDirectoryUnixAuthenticationProvider

          Kenneth Baltrinic added a comment - - edited

          A little more information on this issue:

          • Apparently when this issue occurs it only affects the given user. Our tests show that other users having configured ssh keys are able to continue to use the CLI with ssh auth.
          • This is only affecting SSH Auth, the affected user is able to use the CLI if we switch to username/password auth.
          • We have tried various things short of restarting the service in order to resolve this issue (removing and re-assigning the public SSH key for the user in Jenkins, disabling and re-enabling AD auth in Jenkins, etc.) None of that seems to work. A 'soft' restart (a restart initiated from the plugin-update page) does work.

          Kenneth Baltrinic added a comment - - edited A little more information on this issue: Apparently when this issue occurs it only affects the given user. Our tests show that other users having configured ssh keys are able to continue to use the CLI with ssh auth. This is only affecting SSH Auth, the affected user is able to use the CLI if we switch to username/password auth. We have tried various things short of restarting the service in order to resolve this issue (removing and re-assigning the public SSH key for the user in Jenkins, disabling and re-enabling AD auth in Jenkins, etc.) None of that seems to work. A 'soft' restart (a restart initiated from the plugin-update page) does work.

          Jesse Glick added a comment -

          Not sure why this was assigned to me.

          Jesse Glick added a comment - Not sure why this was assigned to me.

          jglick Perhaps assigning to you is not the best approach but it is unassigned and I don't know who it should best be assigned to. However this is becoming a significant operation issue for us and not being assigned to anyone, no one seems to be looking at it. I was hoping you would at least be able to assign it to the right person.

          Kenneth Baltrinic added a comment - jglick Perhaps assigning to you is not the best approach but it is unassigned and I don't know who it should best be assigned to. However this is becoming a significant operation issue for us and not being assigned to anyone, no one seems to be looking at it. I was hoping you would at least be able to assign it to the right person.

          Jesse Glick added a comment -

          You can consider contracting with a commercial support provider, such as my employer.

          Jesse Glick added a comment - You can consider contracting with a commercial support provider, such as my employer.

          I believe this issue might happen because somehow there is a defined user internally with a/several space/s as name. Something like:

          http://<JENKINS_URL>/user/%20/configure

          This user might have the same SSH Key than the Chef user you are using. I am able to re-produce the issue you are facing when this happen.

          You can check if there are several users with the same SSH Key with the Groovy script below executing in http://<JENKINS_URL>/script

          import hudson.model.User
          import hudson.model.UserProperty
          import org.jenkinsci.main.modules.cli.auth.ssh.*
          
          User rootUser = User.get("<CHEF_USER>");
          UserPropertyImpl userRootProperty = rootUser.getProperty(UserPropertyImpl.class);
            
          allUsers = User.getAll();
                      allUsers.each { user ->
                          UserPropertyImpl userProperty = user.getProperty(UserPropertyImpl.class);
                        	if (userProperty!=null && userProperty.authorizedKeys==userRootProperty.authorizedKeys) {
                          	println "User $rootUser has the same SSH key than $user"
                        	}
                      }
          

          Félix Belzunce Arcos added a comment - I believe this issue might happen because somehow there is a defined user internally with a/several space/s as name. Something like: http://<JENKINS_URL>/user/%20/configure This user might have the same SSH Key than the Chef user you are using. I am able to re-produce the issue you are facing when this happen. You can check if there are several users with the same SSH Key with the Groovy script below executing in http://<JENKINS_URL>/script import hudson.model.User import hudson.model.UserProperty import org.jenkinsci.main.modules.cli.auth.ssh.* User rootUser = User.get( "<CHEF_USER>" ); UserPropertyImpl userRootProperty = rootUser.getProperty(UserPropertyImpl.class); allUsers = User.getAll(); allUsers.each { user -> UserPropertyImpl userProperty = user.getProperty(UserPropertyImpl.class); if (userProperty!= null && userProperty.authorizedKeys==userRootProperty.authorizedKeys) { println "User $rootUser has the same SSH key than $user" } }

          kbaltrinic confirmed me privately that the issue here was a phantom user. The script above can help other users to find the phantom user. I created https://issues.jenkins-ci.org/browse/JENKINS-32534 and did the pull request below to fix the issue on the corresponded jenkins module.

          https://github.com/jenkinsci/ssh-cli-auth-module/pull/3

          Félix Belzunce Arcos added a comment - kbaltrinic confirmed me privately that the issue here was a phantom user. The script above can help other users to find the phantom user. I created https://issues.jenkins-ci.org/browse/JENKINS-32534 and did the pull request below to fix the issue on the corresponded jenkins module. https://github.com/jenkinsci/ssh-cli-auth-module/pull/3

            fbelzunc Félix Belzunce Arcos
            kbaltrinic Kenneth Baltrinic
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: