1. 程式人生 > >java 安全訪問策略

java 安全訪問策略

策略     Java安全體系結構的真正好處在於,它可以對程式碼授予不同層次的信任度來部分地訪問系統。     Microsoft提供了ActiveX控制元件認證技術,它和Java的認證技術相類似,但是ActiveX控制元件並不在沙箱中執行。這樣,使用了ActiveX,一系列移動程式碼要麼是被完全信任的,要麼是完全不被信任的。     版本1.2的安全體系結構的主要目標之一就是使建立(以簽名程式碼為基礎的)細粒度的訪問控制策略的過程更為簡單且更少出錯。     在版本1.2的安全體系結構中,對應於整個Java應用程式的一個訪問控制策略是由抽象類java.security.Policy的一個子類的單個例項所表示的。     安全策略是一個從描述執行程式碼的屬性集合到這段程式碼所擁有的許可權的對映。在版本1.2的安全體系結構中,描述執行程式碼的屬性被總稱為程式碼來源。一個程式碼來源是由一個java.security.CodeSource物件表示的,這個物件中包含了一個java.net.URL,它表示程式碼庫和代表了簽名者的零個或多個證書物件的陣列。證書物件是抽象類java.security.cert.Certificate的子類的一個例項,一個Certificate物件抽象表示了從一個人到一個公鑰的繫結,以及另一個為這個繫結作擔保的人(以前提過的證書機構)。CodeSource物件包含了一個Certificate物件的陣列,因為同一段程式碼可以被多個團體簽名(擔保)。這個簽名通常是從JAR檔案中獲得的。     許可權是用抽象類java.security.Permission的一個子類的例項表示的。一個Permission物件有三個屬性:型別、名字和可選的操作。     在Policy物件中,每一個CodeSource是和一個或多個Permission物件相關聯的。和一個CodeSource相關聯的Permission物件被封裝在java.security.PermissionCollection的一個子類例項中。 策略檔案
    java.security.Policy是一個抽象類,具體Policy子類的實現細節之一就是該子類的例項怎樣知道策略應該是什麼。子類可以採取多種方法,例如對一個已序列化的Policy物件進行並行化,從資料庫中抽取策略,或者從檔案中讀取策略。由Sun提供的在Java 1.2平臺下的具體Policy子類採用了最後一種方法:在一個ASCII策略檔案中用上下文無關方法描述安全策略。     一個策略檔案包括了一系列grant子句,每一個grant子句將一些許可權授給一個程式碼來源。 策略檔案例子policyfile.txt: Java程式碼  收藏程式碼
  1. keystore "ijvmkeys"
    ;  
  2. grant signedBy "friend" {  
  3.     permission java.io.FilePermission "question.txt""read";  
  4.     permission java.io.FilePermission "answer.txt""read";  
  5. };  
  6. grant signedBy "stranger" {  
  7.     permission java.io.FilePermission "question.txt""read";  
  8. };  
  9. grant codeBase "file:${com.artima.ijvm.cdrom.home}/security/ex2/*"
     {  
  10.     permission java.io.FilePermission "question.txt""read";  
  11.     permission java.io.FilePermission "answer.txt""read";  
  12. };  
  說明:     keystore "ijvmkeys"子句說明金鑰別名儲存在名為ijvmkeys的keystore檔案中。     第1個grant子句將授予由別名為“friend”的實體簽名的所有程式碼兩個許可權。被授予的許可權是:讀取question.txt、answer.txt檔案的許可權。因為這個grant子句中沒有提到程式碼庫,所以由friend簽名的程式碼可以來自任何程式碼庫。     第2個grant子句只授予了讀取question.txt檔案的許可權。     第3個grant子句將兩個許可權授予所有從一個特定目錄中裝載的程式碼。這個grant子句沒有指明任何簽名者,所以,這個程式碼可以是被任何人簽名的,或者是未被簽名的。 保護域     當類裝載器將型別裝入Java虛擬機器時,它們將為每個型別指派一個保護域。保護域定義了授予一段特定程式碼的所有許可權。(一個保護域對應策略檔案中的一個或多個grant子句。)裝載入Java虛擬機器的每一個型別都屬於一個且僅屬於一個保護域。

  訪問控制器     類java.security.AccessController提供了一個預設的安全策略執行機制,它使用棧檢查來決定潛在不安全的操作是否被允許。這個訪問控制器不能被例項化,它不是一個物件,而是集合在單個類中的多個靜態方法。AccessController的最核心方法是它的靜態方法checkPermission(),這個方法決定一個特定的操作能否被允許。     如果你安裝了具體安全管理器,其實最終是由這個AccessController來決定一個潛在不安全的方法是否否被允許。     每一個棧幀代表了由當前執行緒呼叫的某個方法,每一個方法是在某個類中定義的,每一個類又屬於某個保護域,每個保護域包含一些許可權。因此,每個棧幀間接地和一些許可權相關。 1)implies()方法     為了決定由傳遞給AccessController的checkPermission()方法的Permission物件所代表的操作,是否包含在(或隱含在)和呼叫棧中的程式碼相關聯的許可權中,AccessController利用了一個名為implies()的重要方法。這個implies()方法是在Permission類以及PermissionCollection類和ProtectionDomain類中宣告的。 Java程式碼  收藏程式碼
  1. import java.security.Permission;  
  2. import java.io.FilePermission;  
  3. import java.io.File;  
  4. // On CD-ROM in file security/ex1/Example1.java
  5. class Example1 {  
  6.     publicstaticvoid main(String[] args) {  
  7.         char sep = File.separatorChar;  
  8.         // Read permission for "/tmp/f"
  9.         Permission file = new FilePermission(sep + "tmp" + sep + "f""read");  
  10.         // Read permission for "/tmp/*", which
  11.         // means all files in the /tmp directory 
  12.         // (but not any files in subdirectories
  13.         // of /tmp)
  14.         Permission star = new FilePermission(sep + "tmp" + sep + "*""read");  
  15.         boolean starImpliesFile = star.implies(file);  
  16.         boolean fileImpliesStar = file.implies(star);  
  17.         // Prints "Star implies file = true"
  18.         System.out.println("Star implies file = " + starImpliesFile);  
  19.         // Prints "File implies star = false"
  20.         System.out.println("File implies star = " + fileImpliesStar);  
  21.     }  
  22. }  
  2)棧檢查示例     下面幾節將給出幾個示例,說明AccessController執行棧檢查的方法。     基於深入理解Java虛擬機器讀書筆記之:第3章 安全(2)的程式碼示例,增加一個類:
Java程式碼  收藏程式碼
  1. import com.artima.security.doer.Doer;  
  2. import java.io.FileReader;  
  3. import java.io.CharArrayWriter;  
  4. import java.io.IOException;  
  5. publicclass TextFileDisplayer implements Doer {  
  6.     private String fileName;  
  7.     public TextFileDisplayer(String fileName) {  
  8.         this.fileName = fileName;  
  9.     }  
  10.     publicvoid doYourThing() {  
  11.         try {  
  12.             FileReader fr = new FileReader(fileName);  
  13.             try {  
  14.                 CharArrayWriter caw = new CharArrayWriter();  
  15.                 int c;  
  16.                 while ((c = fr.read()) != -1) {  
  17.                     caw.write(c);  
  18.                 }  
  19.                 System.out.println(caw.toString());  
  20.             }  
  21.             catch (IOException e) {  
  22.             }  
  23.             finally {  
  24.                 try {  
  25.                     fr.close();  
  26.                 }  
  27.                 catch (IOException e) {  
  28.                 }  
  29.             }  
  30.         }  
  31.         catch (IOException e) {  
  32.         }  
  33.     }  
  34. }  
這個類的doYourThing()方法作用是顯示一個文字檔案的內容。 3)一個回答“是”的棧檢查     在第一個棧檢查示例中,先來看一個Example2a應用程式: Java程式碼  收藏程式碼
  1. import com.artima.security.friend.Friend;  
  2. import com.artima.security.stranger.Stranger;  
  3. // This succeeds because everyone has permission to
  4. // read answer.txt
  5. class Example2a {  
  6.     publicstaticvoid main(String[] args) {  
  7.         TextFileDisplayer tfd = new TextFileDisplayer("question.txt");  
  8.         Friend friend = new Friend(tfd, true);  
  9.         Stranger stranger = new Stranger(friend, true);  
  10.         stranger.doYourThing();  
  11.     }  
  12. }  
    當TextFileDisplayer的doYourThing()方法建立了一個新的FileReader物件時,FileReader的構造器建立了一個新的FileInputStream,FileInputStream的構造器檢查是否已經安裝了一個安全管理器。在現在這個例子中,已經安裝了具體安全管理器,因此,FileInputStream的構造器呼叫了具體安全管理器的checkRead()方法。這個checkRead()方法例項化了一個新的、代表讀檔案question.txt許可權的FilePermission物件,並將這個物件傳給具體安全管理器的checkPermission()方法,這個checkPermission()方法又把這個物件傳遞給AccessController的checkPermission()方法。AccessController()的checkPermission()方法執行了棧檢查,確定這個執行緒是否有權開啟並讀取檔案question.txt。

  Example2a中的棧檢查:所有棧幀都有許可權     呼叫棧的每一個棧幀用由多個元素組成的一行表示。保護域表示了這個棧幀所關聯的保護域。最右邊的箭頭,說明了當一個AccessController的checkPermission()方法檢查每一個棧幀是否有權執行被請求的操作時,它的行進方向。在箭頭的左邊是數字,每個棧幀對應一個。棧的頂顯示在圖的最底端。     FRIEND、STRANGER和CDROM三個保護域和policyfile.txt檔案中的grant子句相對應,BOOTSTRAP保護域代表賦予所有由啟動類裝載器裝載的程式碼的許可權,在該保護域中的程式碼被賦予了java.lang.AllPermission,該許可權允許做任何事。     執行示例程式碼(注:附件cdrom.zip的security/ex2目錄下的ex2a.bat檔案): java -Djava.security.manager -Djava.security.policy=policyfile.txt -Dcom.artima.ijvm.cdrom.home=D:\cdrom -cp .;jars/friend.jar;jars/stranger.jar Example2a     執行結果: Too what extent does complexity threaten security? 4)一個回答“不”的棧檢查     下面一個棧檢查的例子,是沒有許可權情況下的棧檢查。 Java程式碼  收藏程式碼
  1. import com.artima.security.friend.Friend;  
  2. import com.artima.security.stranger.Stranger;  
  3. // This fails because the Stranger code doesn't have
  4. // permission to read file question.txt
  5. class Example2b {  
  6.     publicstaticvoid main(String[] args) {  
  7.         TextFileDisplayer tfd = new TextFileDisplayer("answer.txt");  
  8.         Friend friend = new Friend(tfd, true);  
  9.         Stranger stranger = new Stranger(friend, true);  
  10.         stranger.doYourThing();  
  11.     }  
  12. }  
      本例子與上個例子的區別僅僅是將TextFileDisplayer的引數question.txt替換為answer.txt。     在這個例子中,檢查過程並沒有真正到達棧幀1,當AccessController到達棧幀2時,它發現棧幀2的doYourThing()方法屬於Stranger類的程式碼,而這個類沒有讀取answer.txt檔案的許可權。AccessController的checkPermission()方法丟擲了一個AccessControllerException異常。

  Example2b中的棧檢查:棧幀2沒有許可權     執行示例程式碼(注:附件cdrom.zip的security/ex2目錄下的ex2b.bat檔案): java -Djava.security.manager -Djava.security.policy=policyfile.txt -Dcom.artima.ijvm.cdrom.home=D:\cdrom -cp .;jars/friend.jar;jars/stranger.jar Example2b     執行結果: Exception in thread "main" java.security.AccessControlException: access denied ( java.io.FilePermission answer.txt read)         at java.security.AccessControlContext.checkPermission(Unknown Source)         at java.security.AccessController.checkPermission(Unknown Source)         at java.lang.SecurityManager.checkPermission(Unknown Source)         at java.lang.SecurityManager.checkRead(Unknown Source)         at java.io.FileInputStream.<init>(Unknown Source)         at java.io.FileInputStream.<init>(Unknown Source)         at java.io.FileReader.<init>(Unknown Source)         at TextFileDisplayer.doYourThing(TextFileDisplayer.java:19)         at com.artima.security.friend.Friend.doYourThing(Friend.java:45)         at com.artima.security.stranger.Stranger.doYourThing(Stranger.java:45)         at Example2b.main(Example2b.java:18) 5)doPrivileged()方法     有的時候,呼叫棧較上層(更靠近棧頂)的程式碼可能希望執行一段程式碼,而這段程式碼在呼叫棧的較下層是不允許執行的。     為了使可信的程式碼執行較不可靠的程式碼操作(這段不可靠的程式碼位於呼叫棧的較下層且沒有執行這個操作的許可權),AccessController類過載了四個名為doPrivileged()的靜態方法。     當呼叫doPrivileged()方法時,就像呼叫其他任何方法一樣,都會將一個新的棧幀壓入棧。在由AccessController執行的棧檢查中,一個doPrivileged()方法呼叫的棧幀標識了檢查過程的提前終止點。如果和呼叫doPrivileged()的方法相關聯的保護域擁有執行被請求操作的許可權,AccessController將立即返回。這樣這個操作就被允許,即使在棧下層的程式碼可能沒有執行這個操作的許可權。     看一看Friend的doPrivileged()的呼叫過程例子: Java程式碼  收藏程式碼
  1. import com.artima.security.friend.Friend;  
  2. import com.artima.security.stranger.Stranger;  
  3. // This succeeds because Friend code executes a
  4. // doPrivileged() call. (Passing false as
  5. // the second arg to Friend constructor causes
  6. // it to do a doPrivileged().)
  7. class Example2c {  
  8.     publicstaticvoid main(String[] args) {  
  9.         TextFileDisplayer tfd = new TextFileDisplayer("answer.txt");  
  10.         Friend friend = new Friend(tfd, false);  
  11.         Stranger stranger = new Stranger(friend, true);  
  12.         stranger.doYourThing();  
  13.     }  
  14. }  
 

  Example2c中的棧檢查:在棧幀3停止     與前兩個例子的呼叫棧區別在於Example2c的呼叫棧有兩個另外的棧幀:棧幀4代表了doPrivileged()呼叫,棧幀5代表了PrivilegedAction物件的run()呼叫。     當AccessController到達棧幀4時,它發現了一個doPrivileged()呼叫。因此,AccessController又進行了一個檢查:它檢查由棧幀3代表的程式碼,也就是呼叫了doPrivileged()的程式碼,是否有讀取檔案answer.txt的許可權。因為棧幀3是與FRIEND保護域相關聯的,而FRIEND保護域擁有讀取檔案question.txt的許可權,所以AccessController的checkPermission()方法正常返回。     執行示例程式碼(注:附件cdrom.zip的security/ex2目錄下的ex2c.bat檔案): java -Djava.security.manager -Djava.security.policy=policyfile.txt -Dcom.artima.ijvm.cdrom.home=D:\cdrom -cp .;jars/friend.jar;jars/stranger.jar Example2c     執行結果: Complexity threatens security to a significant extent. The more complicated a security infrastructure becomes, the more likely parties responsible for configuring security will either make mistakes that open up security holes or avoid using the security infrastructure altogether. 5)doPrivileged()的一個無效使用     有一點很重要,必須理解,那就是一個方法不能授予它自己比它現在已經用doPrivileged()呼叫所得到的許可權更多的許可權。通過呼叫doPrivileged(),一個方法僅僅能使用它現在已經被授予的許可權。     作為一個doPrivileged()的無效使用的例子: Java程式碼  收藏程式碼
  1. import com.artima.security.friend.Friend;  
  2. import com.artima.security.stranger.Stranger;  
  3. // This fails because even though Stranger does
  4. // a doPrivileged() call, Stranger doesn't have
  5. // permission to read question.txt. (Passing
  6. // false as second arg to Stranger constructor
  7. 相關推薦

    java 安全訪問策略

    策略     Java安全體系結構的真正好處在於,它可以對程式碼授予不同層次的信任度來部分地訪問系統。     Microsoft提供了ActiveX控制元件認證技術,它和Java的認證技術相類似,但是ActiveX控制元件並不在沙箱中執行。這樣,使用了ActiveX,一

    Silverlight 中的通訊安全訪問策略

    Silverlight 支援使用 HTTP/HTTPS (System.Net.WebClient 等) 和 Socket (System.Net.Sockets) 兩種方式訪問遠端伺服器,但基於安全原因,對這些網路訪問制定了嚴格的安全策略。1. HTTP/HTTPS 訪問

    Java安全--安全管理器與訪問許可權(一)

    1.定義當類被載入到虛擬機器中,校驗器檢查通過,Java平臺的第二種安全機制就會啟動,這個機制就是安全管理器,它是控制具體操作是否允許執行的操作。它的安全策略建立了程式碼來源和訪問許可權集之間的對映關係。jdk8中的許可權類(直接或者間接實現Permission抽象類)下圖顯

    java-web檔案上傳下載,可解決多個安全訪問問題

    檔案上傳下載,可解決多個安全訪問問題。這個是上年老師教給我們的一個方法,這裡當做筆記記錄一下。說明:對於檔案上傳,瀏覽器在上傳的過程中是將檔案以流的形式提交到伺服器端的,如果直接使用Servlet獲取上傳檔案的輸入流然後再解析裡面的請求引數是比較麻煩,所以一般選擇採用apac

    配置ssh遠程訪問策略

    .net cin 不能 onf host conf 規則 inux 一個 假如有兩個域,一個是example.com(172.25.0.0/16),一個是my133t.org(172.24.0.0/16) 要求:從域group3.example.com能ssh遠程訪問兩個虛

    java訪問修飾符

    addclass ext pri post span 沒有 pretty pub () 較之c++ 中 public,proctected, private 三種訪問控制, java多了默認訪問控制。 java中四種訪問控制權限 簡單描寫敘述為一下四

    java web訪問權限控制

    logs mage cnblogs lin 管理 控制 java blog png 權限管理有很多種方式,這裏我總結一種相對較容易理解的權限控制方式。 也就是用戶對應角色,角色對應功能模塊 例如你的功能包括商城、活動、優惠券這幾大模塊,對應的就是存儲相應模塊下有想應權限的用

    基於CORS的GeoServer跨域訪問策略

    由於 pro sse servlet 頭信息 targe 腳本 org web.xml GeoServer的跨域訪問問題,有多種解決方法,本文介紹一種基於CORS的GeoServer跨域訪問方法。 CORS簡介 CORS是一個W3C標準,全稱是"跨域資源共享"(Cros

    Java 設計模式—策略模式

    ember edm 等級 dia span private edi concrete tin   在閻宏博士的《JAVA與模式》一書中開頭是這樣描述策略(Strategy)模式的:   策略模式屬於對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的

    ASA防火墻利用Object對象/Object-group對象組簡化訪問策略配置

    思科asa以下的內容還是基於之前的ASA網絡拓撲:DMZ ZONE IP地址:192.168.10.100的主機作為NTP服務器提供時間同步服務,NTP服務器能夠和INTERNETNTP服務器同步時間配置訪問策略:object network ntp-server1 fqdn ntp.ubuntu.com o

    android黑科技系列——Android中新型安全防護策略

    應該 nat term 反編譯 packages 名稱 文章 訪問 多說 一、前言 最近有一個同學,發給我一個設備流量訪問檢測工具,但是奇怪的是,他從GP上下載下來之後安裝就沒有數據了,而在GP上直接安裝就可以。二次打包也會有問題。所以這裏就可以判斷這個app應該是有簽名

    Java訪問控制符

    缺省 package span ron 不能訪問 訪問權限 protect private 變量 private: 只有類內部能看到,其他任何地方都不可見。子類也只能通過父類的方法來訪問private的變量; default: 類內部能訪問,同一package內能直接訪問。

    Java DB訪問之 JDBC

    ack not dst exists throw line null mon select 項目說明 項目采用 maven 組織 ,jdbc 唯一的依賴就是 mysql-connector-java pom 依賴如下: <dependency&g

    Java DB 訪問之 mybatis mapper xml 配置方式

    exist nal div align ransac rep pre java db jdb 1 項目說明 項目采用 maven 組織 ,jdbc 唯一的依賴就是 mysql-connector-java pom 依賴如下: mysql 數據連接 : mysql

    Tomcat搭建web,提供JAVA頁面訪問

    內容 apache coyote 算法 alias store reads accep ase 二.配置tomcat(嚴格區分大小寫)虛擬主機,實現搭建多web1.修改配置文件vim /usr/local/tomcat/conf/server.xml<Host nam

    java安全框架shiro(一)

    out util tor sub pass java string 框架 AI 第一個簡單的案例 ,通過讀取.ini文件的方式模擬登陸, 1.通過Factory工廠的getInstance()方法來獲取SecurityManager的實例,實例化Factory需要一個ini

    Java設計模式----------策略模式

    用戶 無法 提交 main 遊戲 抽象 可能 測試類 ide 以下內容來自HeadFIrst設計模式一書和http://www.cnblogs.com/xrq730/p/4906313.html的博文,作為自己的學習筆記總結如下。 HeadFirst設計模式一書在開篇就

    本地java訪問websphere的JNDI

    java websphere JNDI # 問題1、獲取數據源時報錯 # javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an a

    十二.HTTPS網站安全訪問實踐

    crt perm 發送數據 address 輸出信息 style 通過 server1 指定 期中集群架構-第十二章-HTTPS安全證書訪問連接實踐配置========================================= 01:網絡安全涉及的問題: ①

    java安全退出程序------關閉鉤子

    java鉤子 java安全退出 測試代碼: public class TestHook { public static boolean hookFlag = false; public static void main(String[] args) { Thread shutDownTh