天天看點

《Java安全編碼标準》一1.9 安全管理器

securitymanager?是java中定義安全政策的類。當一個程式在沒有安裝安全管理器的環境中運作時,它是不受限制的,它可以使用任何java api提供的類和方法。當使用安全管理器時,它會明确哪些不安全和敏感的操作是允許的。任何違反安全政策的操作都會導緻抛出securityexception異常,代碼可以向安全管理器查詢某些動作是否允許。同時,安全管理器可以控制受信的java api能夠執行的功能。當非受信的代碼不允許讀取系統類的時候,應該賦予這些類最低的權限,以防止特定包中的那些受信類被它們使用。而accessclassinpackage權限隻提供那些所需要的功能。

某一類應用中存在着一些預先設定好的安全管理器。applet安全管理器就能夠管理所有的java applet。它拒絕除了賦予重要權限的所有applet,以防止不經意的系統修改、資訊洩露以及使用者模拟。

安全管理器不僅僅隻限于對用戶端應用的保護。對于web伺服器,如tomcat和websphere,可以将安全管理器用來隔離servlets和jsp(java server page)代碼中出現的惡意木馬,以及保護敏感的系統資源,使其不能被随便通路。

對于在指令行狀态下運作的java應用,一個自定義的安全管理器會被設定一個特殊的辨別。同樣,也可以通過程式設計式的方法安裝一個安全管理器。這樣就可以建立一個預設的沙箱,通過安全政策來允許或者拒絕那些敏感操作。

在java 2平台之前,安全管理器是一個抽象類。在java 2平台之後,由于不作為抽象類出現,是以應用時不需要顯式重寫它的方法。如果程式設計式地建立安全管理器,代碼需要有運作态的權限來運作createsecuritymanager?方法,進而執行個體化安全管理器并且通過運作setsecuritymanager來安裝securitymanager。當已經安裝安全管理器時,将會檢查這些權限。當存在一個全局預設的安全管理器時,例如在虛拟宿主環境,或者在一個單獨的宿主環境中,需要用一個定制的安全管理器來代替預設的安全管理器,進而拒絕以前那些能夠通過的權限的情況。

安全管理器和accesscontroller類緊密相關。前者是一個通路控制中樞,而後者是通路控制算法的實際實作。安全管理器支援以下幾種情況:

提供後向相容性:曆史遺留的代碼通常包含許多定制化的安全管理器的實作,因為最開始安全管理器是被設計為抽象的。

設定自定義的政策:設計一個安全管理器的子類,以設定自定義的安全政策(例如,多層次、粗略或者細粒度的)。

在考慮實作和使用自定義的安全管理器的時候,對應于預設的安全管理器,在java security architecture specification[securityspec 2008]中提到:

定制一個安全管理器(通過設計它的子類)應當是最後的手段,并且需要特别謹慎,我們鼓勵在應用代碼中使用accesscontroller?。此外,一個定制的安全管理器,比如它會在調用标準的安全檢查之前做當天的時間檢查,它可以而且應該适當的利用accesscontrollerwhenever所提供的算法。

許多java se api在進行敏感操作之前會通過調用安全管理器來進行預設的檢查。例如,在調用者不具備讀檔案權限的時候,?java.io.fileinputstream的構造函數會抛出securityexception?異常。因為securityexception?是runtimeexception的子類,一些api方法的聲明并不需要聲明它們抛出runtimeexception異常,但是一些api方法不能這樣。例如,在java.io.filereader中就沒有聲明它會抛出securityexception?異常。除非在api方法文檔裡特别指明,否則應該避免依賴對安全管理器是否存在進行的檢查。