java 安全訪問策略
-
keystore "ijvmkeys"
- grant signedBy "friend" {
- permission java.io.FilePermission "question.txt", "read";
- permission java.io.FilePermission "answer.txt", "read";
- };
- grant signedBy "stranger" {
- permission java.io.FilePermission "question.txt", "read";
- };
-
grant codeBase "file:${com.artima.ijvm.cdrom.home}/security/ex2/*"
- permission java.io.FilePermission "question.txt", "read";
- permission java.io.FilePermission "answer.txt", "read";
- };
訪問控制器 類java.security.AccessController提供了一個預設的安全策略執行機制,它使用棧檢查來決定潛在不安全的操作是否被允許。這個訪問控制器不能被例項化,它不是一個物件,而是集合在單個類中的多個靜態方法。AccessController的最核心方法是它的靜態方法checkPermission(),這個方法決定一個特定的操作能否被允許。 如果你安裝了具體安全管理器,其實最終是由這個AccessController來決定一個潛在不安全的方法是否否被允許。 每一個棧幀代表了由當前執行緒呼叫的某個方法,每一個方法是在某個類中定義的,每一個類又屬於某個保護域,每個保護域包含一些許可權。因此,每個棧幀間接地和一些許可權相關。 1)implies()方法 為了決定由傳遞給AccessController的checkPermission()方法的Permission物件所代表的操作,是否包含在(或隱含在)和呼叫棧中的程式碼相關聯的許可權中,AccessController利用了一個名為implies()的重要方法。這個implies()方法是在Permission類以及PermissionCollection類和ProtectionDomain類中宣告的。 Java程式碼
- import java.security.Permission;
- import java.io.FilePermission;
- import java.io.File;
- // On CD-ROM in file security/ex1/Example1.java
- class Example1 {
- publicstaticvoid main(String[] args) {
- char sep = File.separatorChar;
- // Read permission for "/tmp/f"
- Permission file = new FilePermission(sep + "tmp" + sep + "f", "read");
- // Read permission for "/tmp/*", which
- // means all files in the /tmp directory
- // (but not any files in subdirectories
- // of /tmp)
- Permission star = new FilePermission(sep + "tmp" + sep + "*", "read");
- boolean starImpliesFile = star.implies(file);
- boolean fileImpliesStar = file.implies(star);
- // Prints "Star implies file = true"
- System.out.println("Star implies file = " + starImpliesFile);
- // Prints "File implies star = false"
- System.out.println("File implies star = " + fileImpliesStar);
- }
- }
Java程式碼
- import com.artima.security.doer.Doer;
- import java.io.FileReader;
- import java.io.CharArrayWriter;
- import java.io.IOException;
- publicclass TextFileDisplayer implements Doer {
- private String fileName;
- public TextFileDisplayer(String fileName) {
- this.fileName = fileName;
- }
- publicvoid doYourThing() {
- try {
- FileReader fr = new FileReader(fileName);
- try {
- CharArrayWriter caw = new CharArrayWriter();
- int c;
- while ((c = fr.read()) != -1) {
- caw.write(c);
- }
- System.out.println(caw.toString());
- }
- catch (IOException e) {
- }
- finally {
- try {
- fr.close();
- }
- catch (IOException e) {
- }
- }
- }
- catch (IOException e) {
- }
- }
- }
- import com.artima.security.friend.Friend;
- import com.artima.security.stranger.Stranger;
- // This succeeds because everyone has permission to
- // read answer.txt
- class Example2a {
- publicstaticvoid main(String[] args) {
- TextFileDisplayer tfd = new TextFileDisplayer("question.txt");
- Friend friend = new Friend(tfd, true);
- Stranger stranger = new Stranger(friend, true);
- stranger.doYourThing();
- }
- }
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程式碼
- import com.artima.security.friend.Friend;
- import com.artima.security.stranger.Stranger;
- // This fails because the Stranger code doesn't have
- // permission to read file question.txt
- class Example2b {
- publicstaticvoid main(String[] args) {
- TextFileDisplayer tfd = new TextFileDisplayer("answer.txt");
- Friend friend = new Friend(tfd, true);
- Stranger stranger = new Stranger(friend, true);
- stranger.doYourThing();
- }
- }
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程式碼
- import com.artima.security.friend.Friend;
- import com.artima.security.stranger.Stranger;
- // This succeeds because Friend code executes a
- // doPrivileged() call. (Passing false as
- // the second arg to Friend constructor causes
- // it to do a doPrivileged().)
- class Example2c {
- publicstaticvoid main(String[] args) {
- TextFileDisplayer tfd = new TextFileDisplayer("answer.txt");
- Friend friend = new Friend(tfd, false);
- Stranger stranger = new Stranger(friend, true);
- stranger.doYourThing();
- }
- }
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程式碼
- import com.artima.security.friend.Friend;
- import com.artima.security.stranger.Stranger;
- // This fails because even though Stranger does
- // a doPrivileged() call, Stranger doesn't have
- // permission to read question.txt. (Passing
- // false as second arg to Stranger constructor
-
相關推薦
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