基於SpringBoot的WEB API項目的安全設計

SpringBoot的開箱即用功能,大大降低了上手一個WEB應用的門檻,友好的REST接口支持,在SpringCloud微服務體系中可編程性大大提高,本篇基於一個面向企業調用方用戶的WEB API項目,基於SpringBoot來構建,簡單看下接口的安全性模塊設計。

主要藉助於基於AOP技術來進行接口的安全防護,在SpringBoot下直接引入spring-boot-starter-aop即可使用。

1、在Pom中引入AOP配置

 org.springframework.boot spring-boot-starter-aop

2、編寫對應處理類即可,通過@Order(n)設置合法的校驗順序。如LogAspect

@Aspect@Order(1)@Componentpublic class LogAspect { private Logger logger=Logger.getLogger(LogAspect.class); @Pointcut("execution(public * com.wey.say.api.*.* (..))") public void apiLogAspect() { }  @Before("apiLogAspect()") public void dobefore(JoinPoint joinPoint) { RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = sra.getRequest(); // 使用log4j的MDC及NDC特性,識別請求方的IP及調用資料,輸出到日誌中 MDC.put("uri", request.getRequestURI()); NDC.push(request.getRemoteAddr()); // 記錄下請求內容 logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); NDC.pop(); NDC.remove(); MDC.get("uri"); MDC.remove("uri"); } @AfterReturning(returning = "ret", pointcut = "apiLogAspect()") public void doAfterReturning(Object ret) throws Throwable { // 處理完請求,返回內容 logger.info("RESPONSE : " + ret); }

下面進入此係統關鍵的安全設計模塊,由於是面向企業級接口調用用戶,與面向大眾的接口稍微有些不同,分為以下幾個方面。

  • 1、詳細日誌記錄,凡請求過來均進行記錄,便於後期識別非法請求的防範依據

參考上文中實現方式,可以再細化。進行日誌的收集分析,後期分析接口的調用頻率等進一步需求。

  • 2、白名單限制,僅接受特定系統的請求響應,調用方的IP地址需要在本系統中報備,否則無法調用。

不採用黑名單機制,主要原因在於未知的IP量太大,只能採用允可的方式,成本最小,效果也最好。

  • 3、調用方身份合法性驗證,即便是白名單用戶,也需要進行驗證,確保用戶真正合法。主要驗證此請求是否確實來自於某一調用法,而非偽造的用戶請求。

常見做法:為調用方設置一個唯一標識和一個密鑰,接口到請求時校驗這兩者的合法性。

  • 4、基於HmacSHA1算法進行請求參數完整性驗證,主要用於檢測傳輸過程中參數是否被篡改。

也可以採用的簡單的MD5驗籤,效率更高。

  • 5、防重放攻擊,即可通過了前4個步驟,不排除利用合法請求,暴力調用的情況。在驗證過程中增加時間戳項目,校驗調用時間是否在允許範圍內,比如1分鐘之內。(案例:QQ第三方登陸在校驗調用時間與服務時間時,時間差合理範圍內,即便不一致,也可以使用)

CSRF的問題必須要重視,可以進行很強大的重放攻擊。當然還有其它的如DOS攻擊等。

可藉助Guava中對應RateLimiter模塊功能,也可藉助Redis高效響應機制自己設計,以調用方id+接口名稱為KEY,設置接口調用上限即可,按天實時更新數據增量。

基於SpringBoot的WEB API項目的安全設計

以上基本上可以算是個完整的安全防範過程,當然還是需要藉助運維手段,在外層進行安全防範,比如WAF等,也可以在更高級處進行防範,比如網關接入層。


分享到:


相關文章: