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