資安JAVA(三一): Access Control (1)

來源:John Melton's Weblog
標題:YEAR OF SECURITY FOR JAVA – WEEK 31 – ACCESS CONTROL (1)
作者:John Melton
What is it and why should I care?

存取控制(Access control),又稱做使用者授權(Authorization),是身分鑑別成功之後的下一步驟。存取控制的流程是以使用者身分為基礎決定資源的存取權限。假設使用者身分已經被確認,之後才能決定是否讓使用者存取特定資源。

存取控制是系統中最容易被利用的,通常存取控制的實作都存在一些問題,控制點沒有完全覆蓋應用程式,留下許多漏洞形成資安隱憂。

存取控制的問題可以用不同的存取控制模型 MAC、DAC、RBAC 來解決。然而,Web應用程式有一些特別的地方,接下來我將介紹不同之處在哪。

What should I do about it?

Note: 目前已經有許多業界最佳實務可以應用(例如:不依據客戶端資訊來做存取控制、採取最小權限原則、集中化存取控制、易於改變政策的存取控制機制等等),但我不打算介紹他們,如果有興趣,可以看最下面的參考資料。

看過注意事項後,我想介紹的觀念是─依「功能」來限制使用者的行為。任何造訪網站的使用者都應該分類,不同類別的使用者可以接觸的功能也不同。

JAVA中最熱門的框架就是 Struts 1 。你只要用很簡單的方式就能設定角色和允許行為,程式碼如下:

<action name="..." path="..." roles="...">
...
</action>


J2EE 早就有相關的機制(角色 roles 和安全限制 security constraints)可以達到同樣的效果。但比起 Struts 1 更複雜,需要較多的調整成本。

最近,Spring 框架接手 Acegi 專案後,更名為 Spring Security。新框架的核心功能專注的是授權 Authorization 。

除此之外有許多框架也能做到相同效果。使用他們時請注意兩個重點,特性( feature )和功能( function )管理。

  • 特性管理就是管理某些目的相同的重要功能。以 SpringMVC 為例,你也許需要 TradeController 來控制所有 Trade 特性。特定使用者或群組若不需要使用到,就能將 Trade 特性獨立出來,方便管理。
  • 功能管理就是控制單一功能的使用,例如 tradeShares(),決定特定使用者能否存取單一功能。

而實作時請注意以下兩點:

  1. 如果你只能選擇特性管理或功能管理,請以功能管理為主─能夠針對性的設定對你比較好。
  2. 如果你兩者都有使用,請小心繼承問題。我見過最有彈性的作法是讓功能繼承特性(相關功能的集合)。但前提是功能本身沒有使用者群組的限制,不然就會有義大利麵般的合併問題。反而讓你安全性打了折扣。

依照系統特性和功能的使用者群組限制是良好存取控制的第一步。接下來還有其他很好的想法跟大家分享。

參考資料
———–
https://www.owasp.org/index.php/Category:Access_Control
https://www.owasp.org/index.php/Guide_to_Authorization
https://www.owasp.org/index.php/Access_Control_Cheat_Sheet


———–———–
資安Java: 上一篇 || 下一篇
———–———–

留言

這個網誌中的熱門文章

資安JAVA(十):X-Content-Type-Options

資安JAVA(十一):X-XSS-Protection

資安JAVA(四):Session Cookie HTTPOnly Flag