У меня есть задача внедрить аутентификацию в SonarQube с помощью SAML из Azure AD.
Мы используем SonarQube 8.9.6 LTS с openjdk 11.0.14 OpenJDK Runtime Environment build 11.0.14+9 на Ubuntu 20.04.
Я установил параметры из Azure (идентификатор приложения, идентификатор поставщика, вход SAML, сертификат X.509, добавлены правильные группы и т. д.)
Я также импортировал сертификат в связку ключей Java.
Тест конфигурации, выполненный на стороне Azure, прошел успешно, однако, когда я пытаюсь войти в систему с помощью SAML, я получаю
Вы не авторизованы для доступа к этой странице. Пожалуйста, свяжитесь с администратором.
И следующая ошибка записывается в файле web.log SonarQube.
2022.03.09 10:44:26 WARN web[AX9qdufcVwzEhwilAADF][o.s.s.a.AuthenticationError] Не удалось получить IdentityProvider для ключа 'saml2'
java.lang.IllegalArgumentException: поставщик удостоверений saml2 не существует или не включен
в org.sonar.server.authentication.IdentityProviderRepository.getEnabledByKey(IdentityProviderRepository.java:54)
в org.sonar.server.authentication.AuthenticationFilter.resolveProviderOrHandleResponse(AuthenticationFilter.java:54)
в org.sonar.server.authentication.OAuth2CallbackFilter.doFilter(OAuth2CallbackFilter.java:66)
на org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:139)
в org.sonar.server.authentication.DefaultAdminCredentialsVerifierFilter.doFilter(DefaultAdminCredentialsVerifierFilter.java:89)
на org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:139)
в org.sonar.server.plugins.PluginsRiskConsentFilter.doFilter(PluginsRiskConsentFilter.java:77)
на org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:139)
на org.sonar.server.platform.web.MasterServletFilter.doFilter(MasterServletFilter.java:108)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
на org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:81)
на org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:68)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
на org.sonar.server.platform.web.CacheControlFilter.doFilter(CacheControlFilter.java:76)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
на org.sonar.server.platform.web.SecurityServletFilter.doHttpFilter(SecurityServletFilter.java:76)
на org.sonar.server.platform.web.SecurityServletFilter.doFilter(SecurityServletFilter.java:48)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
на org.sonar.server.platform.web.RedirectFilter.doFilter(RedirectFilter.java:58)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
на org.sonar.server.platform.web.RequestIdFilter.doFilter(RequestIdFilter.java:66)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
на org.sonar.server.platform.web.RootFilter.doFilter(RootFilter.java:62)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
в org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:109)
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:194)
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
в ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:256)
в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364)
на org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:624)
в org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1651)
в org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
в java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
в java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
на java.base/java.lang.Thread.run(Thread.java:829)
Я проверил трафик SAML, и вот что он показывает:
â¬â¹<samlp:AuthnRequest
AssertionConsumerServiceURL="https://ComapnyDomain.org/oauth2/callback/saml"
Destination="https://CompanyDomain.org/oauth2/callback/saml2"
ID="ONELOGIN_masked" IssueInstant="2022-03-09T08:45:23Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0"
xmlns:saml="урна:оазис:имена:tc:SAML:2.0:утверждение"
xmlns:samlp="урна:оазис:имена:tc:SAML:2.0:протокол">
saml:Issuerhttps://CompanyDomain.org</saml:Issuer><samlp:NameIDPolicy AllowCreate="true"
Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/></samlp:AuthnRequest>