oss-admin security说明文档

oss-admin是一个比较特殊的应用,特殊在于除了系统本身的认证和授权之外,oss-admin作为一个监控和管理的其他系统的服务(也对自身进行监控和管理),会定时地去请求被监控系统的actuator 接口,这也需要做一些基本的认证和授权处理。比如,oss-admin请求本身的/health接口,就需要使用basic认证的方式去请求。本文档将从两方面说明oss-admin所涉及的所有security配置。

oss-admin actuator的basic authorization

默认spring boot应用,包括oss-admin,只要加入spring-boot-starter-security依赖后,就添加了basic authentication认证。actuator endpoints也会在该security的保护机制下。该配置由类AuthenticationManagerConfiguration创建,采用basic auth内存认证。但是在加入oss-admin的form表达认证后,actuator的basic auth内存认证就失效了。因此需要做好相应的处理。

oss-admin本身的认证和授权

作为一个管理系统,需要提供基本的认证和授权支持,来规范哪些用户对系统资源有查看权限,哪些用户对系统资源有修改权限。目前我们采用form表单内存认证的方式,创建了三个固定的用户,有两种角色USER,ADMIN。

注意事项

目前这种解决方案是临时的,actuator endpoints的security信息要同时在application .yml和以下WebSecurityConfig类中配置。因为admin系统自身在请求/health等接口时,要去系统properties中查找security.user.namesecurity.user .password。而认证时是读取的WebSecurityConfig类中定义的用户信息,所以目前两处需要保持一致。

security配置

包括部分actuator endpoints的basic auth认证和oss-admin的form表单认证。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {

    /**
     * Below config is a temporary solution to protect management endpoints.
     */
    http
        .authorizeRequests()
        .antMatchers("/health", "/env", "/metrics", "/jolokia", "/")
        .fullyAuthenticated().and()
        .httpBasic();
    http
      .csrf().disable()
      .authorizeRequests()
        .antMatchers("/", "/index.html").hasRole("USER")
        .antMatchers("/api/applications/**/env",
            "/api/applications/**/jolokia",
            "/api/applications/**/heapdump")
        .hasRole
        ("ADMIN")
        .anyRequest().permitAll()
        .and()
      .formLogin()
        .loginPage("/login")
        .permitAll()
        .and()
      .logout()
        .permitAll();
  }

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
        .withUser("user").password("123456").roles("USER", "ADMIN").and()
        .withUser("oss").password("123456").roles("USER").and()
        .withUser("admin").password("123456").roles("USER", "ADMIN");
  }
}

spring boot admin客户端security说明

作为spring boot admin的客户端,可能采用多种security机制,比如原生的spring security, oss的lib-security等。而所有要接入oss-admin的客户端应用,有一个共同的前提,对management endpoints的认证的用户名密码都是从应用的security.user.namesecurity .user.password这两个配置去获取,任何启用了security,又不设置该用户的都将接入oss-admin失败。因此对客户端有两个基本要求: 1. 配置security.user.namesecurity .user.password; 2. 第一点中配置的用户要能通过security的认证。(默认实现了WebSecurityConfigurerAdapter的配置类,security.user.namesecurity .user.password的配置用户将失效,不能通过security认证,参考oss-admin解决方法。)

basic authentication配置

通过security.user.namesecurity.user.password配置security,提供了最基本的安全认证,目前可以很容易接入spring boot admin。

oss lib-security

如果客户端使用该lib进行security配置,客户端必要的security配置,如果要接入oss-admin,同意需要配置security.user.namesecurity.user.password

spring security + basic authentication配置

参考oss-admin当前的配置方法, oss-admin添加了继承自WebSecurityConfigurerAdapter的security配置类,导致默认的security.user.namesecurity.user .password配置失效,所以要进行简单的处理,将失效的配置用户加入到新的security配置类中:

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    SecurityProperties.User user = securityProperties.getUser();
    auth
        .inMemoryAuthentication()
        .withUser(user.getName()).password(user.getPassword()).roles(user.getRole().get(USER_ROLE_FIRST_INDEX), user
        .getRole().get(USER_ROLE_SECOND_INDEX)).and()
        .withUser("admin").password("admin_pass").roles(USER_ROLE_NAME, ADMIN_ROLE_NAME).and()
        .withUser("oss").password("oss").roles(USER_ROLE_NAME);
  }

results matching ""

    No results matching ""