首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

深入 Java 虛擬機(三):安全機制演進——從沙箱到細粒度權限控制

     編輯:Java 綜合教學

網絡環境下的安全挑戰

代碼遠程下載執行帶來竊取、竄改、破壞、盜用資源風險。Java 採用**內建安全模型**,隨版本演進:

版本里程碑
JDK 1.0基本沙箱
JDK 1.1代碼簽名與認證
JDK 1.2細粒度訪問控制

基本沙箱三大基石

  1. Bytecode Verifier:驗證類文件格式、類型安全、堆棧平衡、無非法指針運算、無越界訪問
  2. Security Manager:運行時守門員,攔截敏感操作:
     • 文件/網路 I/O
     • 類載入器創建/操作
     • 執行緒/執行緒組操作
     • 本地庫載入 (JNI)
     • 進程啟動/終止 JVM
     • 視窗系統特權操作
  3. Class Loader:雙親委派模型隔離命名空間,防止惡意類冒充核心類 (java.lang.*)

JDK 1.1:代碼簽名與信任鏈

簽名流程

  1. 生成密鑰對:keytool -genkeypair
  2. 打包 JAR:jar cvf app.jar ...
  3. 簽名:jarsigner -keystore ks -signedjar signed.jar app.jar alias
      • 對 JAR 內容計算摘要 (SHA)
      • 私鑰加密摘要 → 數字簽名
      • 簽名 + 證書鏈寫入 JAR META-INF/

驗證流程

  1. 公開鑰解密簽名得摘要 A
  2. 重新計算 JAR 內容摘要 B
  3. A == B → 內容未被篡改、確由私鑰持有者簽名

信任策略

  • 完全信任:簽名者受信 → 擁有全部權限
  • 完全不信:無簽名/簽名驗證失敗 → 沙箱限制
  • **缺點**:非黑即白,缺乏中間地帶

JDK 1.2:細粒度權限架構

核心類結構


Policy (抽象)          →  具體實現如 FilePolicy
    │
    ├─ CodeSource              →  URL (代碼來源) + Certificate[] (簽名者)
    │
    └─ PermissionCollection    →  Permission[] (權限集合)
           │
           ├─ FilePermission    →  path, actions (read,write,delete,execute)
           ├─ SocketPermission  →  host:port, actions (connect,accept,listen,resolve)
           ├─ RuntimePermission →  name (exitVM, createClassLoader, ...)
           └─ ... (可自定義)

策略配置範例 (policy 文件)

grant codeBase "https://trusted.example.com/-" {
    permission java.io.FilePermission "/data/app/-", "read,write";
    permission java.net.SocketPermission "db.example.com:3306", "connect";
};

grant signedBy "duke" {
    permission java.util.PropertyPermission "user.dir", "read";
};

運行時權限檢查流程


// 應用代碼
File f = new File("/etc/passwd");
f.read();  // 內部呼叫 SecurityManager.checkRead("/etc/passwd")

// SecurityManager 默認實現
public void checkRead(String file) {
    checkPermission(new FilePermission(file, "read"));
}
public void checkPermission(Permission perm) {
    AccessController.checkPermission(perm);  // 委託給 AccessController
}

// AccessController
// 1. 取得當前調用鏈所有 ProtectionDomain
// 2. 從 Policy 查詢每個 Domain 的 PermissionCollection
// 3. 若所有 Domain 都隱含 perm → 通過,否則拋 AccessControlException

關鍵增強點

  • ProtectionDomain:將 CodeSource 與 Permission 綁定,支持同一代碼多簽名者
  • AccessController.doPrivileged:受信代碼暫時提升權限執行敏感操作,調用鏈中僅需該帧擁有權限
  • 自定義 Permission/Policy:業務可定義專屬權限類,納入統一管理

最佳實踐建議

  1. 生產環境**務必啟用 SecurityManager**:-Djava.security.manager
  2. 採用**最小權限原則**編寫 policy 文件,避免 grant AllPermission
  3. 第三方庫簽名驗證,建立內部信任鏈
  4. 定期審計 Policy 文件,移除過期/過寬授權

從粗糙沙箱到聲明式細粒度授權,Java 安全模型歷經三代演進,構建起「驗證→信任→授權」完整防線,為企業級應用安全奠基。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved