Saturday, April 14, 2007

Java security policy

最近沒什麼心情寫 blog。以前來看我 blog 的人好像有一部分是因為一些 Java 的 post ,雖然已經不算靠 Java 在吃飯了,不過我偶爾還是會去看 tw.bbs.comp.lang.java,就把先前一篇回答別人的 post 拿來充版面吧。

其實一直想把自己對 Java/Windows 上有關 PKI/Security 相關的技術整理一下的…

==== 其實你看的資料裡面提到 policy file 是有其用意的,這是 java security 的一環。不過一般來說,如果你只是要讓 applet 可以存取 client 的檔案,那就照著精華區 (ptt) 做就行了。

基本上,java 在執行時分成兩種 mode ,一種是有 security manager (-Djava.security.manager),另一種就就是沒有 security manager。一般你在自己電腦上執行時就是沒有 secuirty manager 的模式,在這個模式下所執行的程式沒有任何限制,想幹嘛就幹嘛,像存取檔案,開 socket 都可以。

但如果你在 secuirty manager 模式下執行時,就要看 secuirty manager 允許你幹嘛你才能幹嘛。而在 browser 下執行 java (也就是在 browser 下執行 applet) 時就是在 security manager 下執行。而你怎麼知道 secuirty manager 允許你幹哪些事呢,簡單來說就是看 policy file 來設定 (複雜來說也可以用程式的方式來做動態而精細的設定)。除非你特別指定,不然預設使用的 policy file 就是 <jre_home>/lib/security/java.policy 這個檔案詳細的說明可以看這篇

以下再來解釋 browser 執行 applet 預設的行為。如果你都沒改動預設的 policy 的話 ,預設的情況是:
  • 首先,jre 本身的程式當然是要幹嘛就可以幹嘛。
  • 再來,你放在 <jre_home>/lib/ext 下的程式也是要幹嘛可以幹嘛 (所以把程式放這個地方要小心)
  • 至於其他的程式,除了一般無關痛癢的動作 (像是取得 java 版本,os 版本,當然一般的 memery cpu 也都可以),其他的動作通通不行 (存取檔案不行,亂開 socket 不行等等)。至於哪些可以,看 policy 就知道。
可是在 browser 下這樣的安全性就很不方便了,所以 java 給 broswer 的 plugin 實作中,在拒絕之前會先判斷一下,如果要執行的程式沒有 sign 過,那就完全不行了,如果要執行的程式有 sign 過,那就會看看用來 sign 的憑證是不是你所信任的,然後不管信不信任都會 pop 個視窗要使用者同意執行。如果使用都同意,那就允許執行。以此來看,不管 code 是用什麼憑證來 sign,都逃不過那個 pop 的視窗,頂多有信任的憑證顯示的訊息會好看點。

那要怎麼讓他不 pop 那個訊息? 就必需變動執行端 (client 端) 的 secuirt manager 的設定 (簡單說也就是 policy 的設定)。你可以做個實驗,把上面說的預設的 policy file 改一下,把
 grant { 
下加一行
      permission java.security.AllPermission; 
存檔,再執行任何 applet,你想幹麼都不會有任何訊息出來煩你了。玩完要改回來,不然上網亂逛超危險哦。

雖然 java secuirty 很冷門,不過當練功也是不錯,會一些比較少人會的東西。如果有興趣多了解,請參考 Java Security (Java 安全防護),看完就沒有任何秘密了。

0 comments:

Post a Comment