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,設置接口調用上限即可,按天實時更新數據增量。
以上基本上可以算是個完整的安全防範過程,當然還是需要藉助運維手段,在外層進行安全防範,比如WAF等,也可以在更高級處進行防範,比如網關接入層。
閱讀更多 混在軟件圈 的文章