JVM系列之沙箱安全機(jī)制筆記
1.沙箱機(jī)制的概念
Java安全模型的核心就是Java沙箱(sandbox)。沙箱機(jī)制就是將Java代碼限定只能在虛JVM虛擬機(jī)中特定的運(yùn)行范圍,并且嚴(yán)格限制代碼對本地系統(tǒng)資源訪問,通過這樣的方式來保證對Java代碼的有效隔離,防止對本地操作系統(tǒng)造成破壞。
2.沙箱的作用
主要限制系統(tǒng)資源(CPU、內(nèi)存、文件系統(tǒng)、網(wǎng)絡(luò))的訪問。不同級別的沙箱對系統(tǒng)資源訪問的限制也有差異。
3.本地代碼和遠(yuǎn)程代碼
Java的執(zhí)行程序分為:本地代碼和遠(yuǎn)程代碼。,本地代碼:默認(rèn)視為可信任的,可以訪問一切本地資源。遠(yuǎn)程代碼:被看作是不受信的。對于授信的本地代碼,對于非授信的遠(yuǎn)程代碼在早期的Java實(shí)現(xiàn)中,安全依賴于沙箱(Sandbox)機(jī)制。
4.沙箱安全機(jī)制模型
4.1 JDK1 .0安全模型
JDK1 .0安全模型本地代碼可以訪問系統(tǒng)資源,遠(yuǎn)程代碼無法訪問系統(tǒng)資源,比如用戶希望遠(yuǎn)程代碼訪問本地系統(tǒng)的文件時候,就無法實(shí)現(xiàn)。
4.2 JDK1 .1安全模型
JDK1 .1 安全模型版本中,針對安全機(jī)制做了改進(jìn),增加了受信任安全策略,允許用戶指定代碼對本地資源的訪問權(quán)限
4.3 JDK1 .2安全模型
JDK1 .2安全模型改進(jìn)了安全機(jī)制,增加了代碼簽名。不論本地代碼或是遠(yuǎn)程代碼,統(tǒng)一按照用戶的安全策略設(shè)定,由類加載器加載到虛擬機(jī)中權(quán)限不同的運(yùn)行空間,從而來實(shí)現(xiàn)差異化的代碼執(zhí)行權(quán)限控制。
4.4 目前最新的安全模型
目前最新的安全模型引入了域 (Domain) 的概念。JVM虛擬機(jī)會把所有代碼加載到不同的系統(tǒng)域和應(yīng)用域,系統(tǒng)域部分專門負(fù)責(zé)與關(guān)鍵資源系統(tǒng)進(jìn)行交互,而每個應(yīng)用域部分則通過系統(tǒng)域的部分代理來對各種需要的資源進(jìn)行精細(xì)劃分然后可以進(jìn)行訪問。JVM虛擬機(jī)中不同的受保護(hù)域 (Protected Domain)對應(yīng)不一樣的權(quán)限 (Permission)。存在于不同域中的類文件就擁有了它所包含應(yīng)用域所有可訪問資源之和。
5.沙箱安全機(jī)制的基本組件
5.1 字節(jié)碼校驗(yàn)器(bytecode verifier)
確保lava類文件遵循lava語言規(guī)范。這樣可以幫助Java程序?qū)崿F(xiàn)內(nèi)存保護(hù)。但并不是所有的類文件都會經(jīng)過字節(jié)碼校驗(yàn),比如核心類。
5.2 類裝載器(class loader)
防止惡意代碼去干涉善意的代碼,比如:雙親委派機(jī)制
守護(hù)了被信任的類庫邊界;
將代碼歸入保護(hù)域,確定了代碼的權(quán)限范圍可以進(jìn)行哪些資源操作
5.3 存取控制器(access controller)
存取控制器可以控制核心API對操作系統(tǒng)的存取權(quán)限,用戶可以設(shè)定控制策略。
5.4 安全管理器(security manager)
安全管理器主要是核心API和操作系統(tǒng)之間的主要接口。比如實(shí)現(xiàn)權(quán)限控制,比存取控制器優(yōu)先級高。
5.5 安全軟件包(security package) :
java.security下的類和擴(kuò)展包下的類,允許用戶為應(yīng)用增加所需要安全特性:安全提供者、消息摘要、數(shù)字簽名keytools、加密、鑒別。