web-dev-qa-db-fra.com

Configurer la sécurité des terminaux de l'actionneur

Les ordinateurs d'extrémité Spring Boot Actuator sont par défaut protégés par la sécurité http de base.

Peut-on changer pour utiliser Spring Security? J'ai correctement configuré Spring Security et l’utilise pour protéger mes autres pages.

J'ai essayé security.basic.enabled: false et en ajoutant .antMatchers("/manage/**").hasRole("ADMIN") dans mes demandes d'autorisation (notez que j'utilise une URL différente en tant que racine pour les ordinateurs d'extrémité), mais cela n'a pas aidé . Je continue de recevoir un journal d'authentification http de base, qui n'est pas configuré par les utilisateurs. le AuthenticationManager.

Une idée?

EDIT - fournissant plus de détails -

Mon application.Java ressemble à:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends WebMvcConfigurerAdapter {


    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/app").setViewName("app/index");
        registry.addViewController("/app/login").setViewName("app/login");
    }

    @Bean
    public ApplicationSecurity applicationSecurity() {
        return new ApplicationSecurity();
    }

    @Order(Ordered.LOWEST_PRECEDENCE - 8)
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            // @formatter:off
            auth.inMemoryAuthentication()
                .withUser("test1")
                    .password("test1pw")
                    .roles("USER", "ADMIN")
                    .and()
                .withUser("test2")
                    .password("test2pw")
                    .roles("USER");
            // @formatter:on
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // @formatter:off
            http
                .csrf()
                    .disable()
                .authorizeRequests()
                    .antMatchers("/app/login").permitAll()
                    .antMatchers("/app/**").hasRole("USER")
                    .antMatchers("/manage/**").hasRole("ADMIN")
                    .and()
                .formLogin()
                    .loginPage("/app/login")
                    .failureUrl("/app/login?error")
                    .defaultSuccessUrl("/app")
                    .permitAll()
                    .and()
                .logout()
                    .logoutUrl("/app/logout")
                    .logoutSuccessUrl("/app/login?logout");
            // @formatter:on
        }

        @Override
        public void configure(WebSecurity web) throws Exception {
            // @formatter:off
            web
                .ignoring()
                    .antMatchers("/assets/**");
            // @formatter:on
        }
    }
}

Dans mon application.yml j'ai aussi:

management:
  context-path: /management

Notez que sa configuration est identique à celle du guide que vous avez mentionné.

Maintenant, ce que je souhaiterais - ou aimerais configurer - est que les points de terminaison/gérer comme la santé, les mappages, etc. soient protégés avec les utilisateurs du AuthenticationManager personnalisé.

J'ai également essayé d'ajouter management.security.enabled=false et cela désactive en effet l'authentification, par exemple. /manage/mappings. Le problème, c’est que j’ai dit explicitement à Spring Security de protéger ces urls via:

@Override
protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        .authorizeRequests()
            .antMatchers("/app/login").permitAll()
            .antMatchers("/app/**").hasRole("USER")
            .antMatchers("/manage/**").hasRole("ADMIN")

mais ça ne marche pas. Notez que les autres joueurs autorisés travaillent… .. Je me demande s’il ya quelque chose à faire dans le calendrier/l’ordre. J'ai copié @Order(Ordered.LOWEST_PRECEDENCE - 8) à partir de l'exemple mais je ne sais pas pourquoi - 8 est utilisé.

Pour approfondir un peu plus, j'ai aussi exécuté l'exemple ( https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web- method-security ) moi-même et je constate le même comportement dans l'exemple d'application . La sécurité de gestion semble totalement indépendante des utilisateurs user et admin configurés dans l'authentification en mémoire de l'exemple.

12
Marcel Overdijk

Peut-on changer pour utiliser Spring Security?

C’est est Spring Security (que pensez-vous que nous utiliserions de plus?). Si vous souhaitez simplement conserver les règles de sécurité par défaut et personnaliser la variable AuthenticationManager, elle ne devrait fonctionner que si vous utilisez la variable AuthenticationManagerBuilder comme recommandé par l'équipe de sécurité Spring. Le exemple de méthode sécurisée a le comportement que vous recherchez, vous pouvez donc copier le modèle de configuration à partir de cet emplacement. Si vous souhaitez remplacer la stratégie d’authentification par défaut du démarrage, l’essentiel est d’obtenir la valeur AuthenticationManager configurée dans une GlobalAuthenticationConfigurerAdaptercomme dans l’exemple .

Vous pouvez désactiver la sécurité de gestion avec management.security.enabled=false (en supposant que Spring Security se trouve sur le chemin d'accès aux classes). Il est mentionné dans le guide de l'utilisateur , mais n'hésitez pas à proposer des clarifications.

3
Dave Syer

Je dirais qu'il est parfois plus facile d'exclure la configuration automatique du composant Spring Boot et d'effectuer une configuration à partir de zéro si vous avez un cas très spécifique. Dans ce cas, vous pouvez utiliser:

@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})

Ou simplement ManagementWebSecurityConfiguration.Java si vous souhaitez conserver le reste de la configuration de Boot Security. Et puis vous pourriez utiliser quelque chose comme ça:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration {

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {

    private final SecurityProperties securityProperties;

    @Autowired
    AuthenticationSecurity(SecurityProperties securityProperties) {
        this.securityProperties = securityProperties;
    }

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        // configuration
    }
}

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    private SecurityProperties security;

    @Autowired
    protected ApplicationSecurity(SecurityProperties security) {
        this.security = security;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // you configuration
    }


}

}

Comme vous pouvez le voir, j’ai réutilisé les propriétés de sécurité dans ce cas afin d’éviter de créer les miennes.

1
Przemek Nowak