spring boot:actuator的安全配置:使用spring security做ip地址限制(spring boot 2.3.2)


一,actuator有哪些環節要做安全配置?

     actuator是應用廣泛的監控工具,

     但在生產環境中使用時,需要做嚴格的安全保障,

     避免造成信息泄露等嚴重的安全問題

    

     actuator可以采取的安全措施包括以下:

    ip地址: 只允許來自ip地址白名單上的訪問(用security)

    路徑:使用自定義的訪問路徑,不要使用默認的actuator路徑

    用戶的權限:只有登錄用戶有相應的權限才可以訪問(用security)

    內容:只打開自己需要的endpoint,

             只暴露自己需要的endpoint

    

說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest

         對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/

說明:作者:劉宏締 郵箱: 371125307@qq.com

 

二,演示項目的相關信息

1,項目地址

https://github.com/liuhongdi/actuator

 

2, 項目功能說明:

         演示了actuator+spring security的安全配置

 

3,項目結構;如圖:

 

 

三,配置文件說明

 1,pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--actuator begin-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- spring security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

說明:ip地址的限制需要用到spring security

 

2,application.properties

#路徑映射
management.endpoints.web.base-path=/lhdmon
#允許訪問的ip列表
management.access.iplist = 127.0.0.1,192.168.1.100,192.168.2.3/24,192.168.1.6
#指定端口
#management.server.port=8081
#關閉默認打開的endpoint
management.endpoints.enabled-by-default=false
#需要訪問的endpoint在這里打開
management.endpoint.info.enabled=true
management.endpoint.health.enabled=true
management.endpoint.env.enabled=true
management.endpoint.metrics.enabled=true
management.endpoint.mappings.enabled=true
#sessions需要spring-session包的支持
#management.endpoint.sessions.enabled=true

#允許查詢所有列出的endpoint
management.endpoints.web.exposure.include=info,health,env,metrics,mappings
#顯示所有健康狀態
management.endpoint.health.show-details=always

 

 

四,java代碼說明

1,SecurityConfig.java

@Configuration
@EnableWebSecurity
 public class SecurityConfig extends WebSecurityConfigurerAdapter {


     @Value("${management.access.iplist}")
     private String iplist;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //得到iplist列表
        String iprule = "";
        //hasIpAddress('10.0.0.0/16') or hasIpAddress('127.0.0.1/32')
        String[] splitAddress=iplist.split(",");
        for(String ip : splitAddress){
            if (iprule.equals("")) {
                iprule = "hasIpAddress('"+ip+"')";
            } else {
                iprule += " or hasIpAddress('"+ip+"')";
            }
        }
        String actuatorRule = "hasAnyRole('ADMIN','DEV') and ("+iprule+")";

        //login和logout
        http.formLogin()
                .defaultSuccessUrl("/home/session")
                .failureUrl("/login-error.html")
                .permitAll()
                .and()
                .logout();

        //匹配的頁面,符合限制才可訪問
        http.authorizeRequests()
                .antMatchers("/lhdmon/**").access(actuatorRule)
                .antMatchers("/goods/**").hasAnyRole("ADMIN","DEV");

        //剩下的頁面,允許訪問
        http.authorizeRequests().anyRequest().permitAll();
    }

    @Autowired
    public  void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        //添加兩個賬號用來做測試
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("lhdadmin")
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles("ADMIN","USER")
                .and()
                .withUser("lhduser")
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles("USER");
    }
 }

說明:配置文件中的ip需要我們用代碼解析后添加到訪問限制

       另外添加了兩個不同role的賬號供測試用

 

2,HomeController.java

@RestController
@RequestMapping("/home")
public class HomeController {

    //查看ip地址
    @GetMapping("/ip")
    public String ip(HttpServletRequest request) {
       String ip = request.getRemoteAddr();
       return ip;
    }

    //session詳情
    @GetMapping("/session")
    @ResponseBody
    public String session() {
        HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
        Enumeration e   =   session.getAttributeNames();
        String s = "";
        while( e.hasMoreElements())   {
            String sessionName=(String)e.nextElement();
            s += "name="+sessionName+";<br/>";
            s += "value="+session.getAttribute(sessionName)+";";
        }
        return s;
    }
}

說明:打印session,為的是能看到當前登錄用戶的role信息

 

五,測試效果

1,用有權限用戶訪問:

http://127.0.0.1:8080/lhdmon

跳轉到:

 

 用lhdadmin 123456登錄

 

 

 

 登錄后可以看到actuator的endpoints

查看session:

 

 

2,用無權限的賬號訪問:

用lhduser 123456登錄:session信息中可以看到 

 

 可以看到角色信息,不包含被授權訪問的'ADMIN','DEV'

 

 

3,測試切換到ip地址列表之外的ip訪問:

 

 即使用正確有權限的賬號登錄后也無法訪問

 

六,查看spring boot的版本

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.2.RELEASE)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM