`

java安全管理器

    博客分类:
  • jvm
 
阅读更多

每个Java应用都可以有自己的安全管理器,它是防范恶意攻击的主要安全卫士。安全管理器通过执行运行阶段检查和访问授权,以实施应用所需的安全策略,从而保护资源免受恶意操作的攻击。实际上,安全管理器根据Java安全策略文件决定将哪组权限授予类。然而,当不可信的类和第三方应用使用JVM时,Java安全管理器将使用与JVM相关的安全策略来识别恶意操作。在很多情况下,威胁模型不包含运行于JVM中的恶意代码,此时Java安全管理器便不是必需的。当安全管理器检测到违反安全策略的操作时,JVM将引发AccessControlException或SecurityException。

    在Java应用中,安全管理器是由System类中的方法setSecurityManager设置的。要获得当前的安全管理器,可以使用方法getSecurityManager。

   java.lang.SecurityManager类包含了很多checkXXXX方法,如用于判断对文件访问权限的checkRead(String file)方法。这些检查方法调用SecurityManager.checkPermission方法,后者根据安全策略文件判断调用应用是否有执行所请求的操作权限。如果没有,将引发SecurityException。

    如果想让应用使用安全管理器和安全策略,可在启动JVM时设定-Djava.security.manager选项,还可以同时指定安全策略文件。如果在应用中启用了Java安全管理器,却没有指定安全策略文件,那么Java安全管理器将使用默认的安全策略,它们是由位于目录$JAVA_HOME/jre/lib/security中的java.policy定义的。

概念
策略(Policy)
    类装载器用Policy对象帮助它们决定,把一段代码导入虚拟机时应该给它们什么样的权限. 任何时候,每一个应用程序都只有一个Policy对象.
策略文件
    Sun的java1.2平台具体的Policy子类采用在一ASCII策略文件中用上下文无关文法描述安全策略.
    一个策略文件包括了一系列grant子句,每一个grant子句将一些权限授给一个代码来源。
保护域(ProtectionDomain)
    当类装载器将类型装入java虚拟机时,它们将为每一个类型指派一个保护域,保护域定义了授予
   一段特定的代码的所有权限.装载入java虚拟机的每一个类型都属于一个且仅属于一个保护域.
访问控制器(AccessController)
     implies()
          判断一个Permissioin对象的权限,是否隐含(imply)在另一个Permissioin对象的权限中。
    checkPermission()
         AccessController的核心方法,这个方法决定一个特定的操作能否被允许.
         它自顶向下检查栈,只要它遇到一个没有权限桢,它将抛出一个AccessControlException导常。
    doPrivileged()
         有的时候,调用栈较上层(更靠近栈顶)的代码可能希望执行一段代码,而这段代码在调用栈的较
         下层是不允许执行的。
          为了使可信的代码执行较不可靠的代码操作(这段不可靠的代码位于调用栈的较下层且没有执行
          这个操作的权限),AccessController类重载了四个名为doPrivileged()的静态方法.
          AccessController会忽略调用doPrivileged()方法的调用者的调用者的权限.
    Permission:
          权限是用抽象类java.security.Permission的一个子类的实例表示的.
    CodeSource:
         代码来源,包含代码库URL和签名者.
    Permissions:
        PermissionCollection(权限集合)的子类
        
装载时生成保护域的步骤:
1           根据指定的Policy文件生成一个Policy对象
2           生成CodeSource
3           用CodeSource在Policy中找到CodeSource对应的Permissions
4           用CodeSource和Permissons构造一个ProtectionDomain
5           把ProtectionDomain同这个类在方法区中的类数据联系起来(ClassLoader.defineClass()).
 
 
 运行权限检查:
如当前应用程序执行new FileInputStream(“a.txt”),java会检查当前代码有没有读”a.txt”的权限.
步骤:
1           调用SecurityManager.checkRead()方法
2           调用AccessControl.checkPermission()方法,执行栈检查

实现安全管理器步骤:

(1) 创建一个SecurityManager的子类;
(2) 覆盖一些方法。
import java.io.*;

public class TestSecurity
{
   public static void main(String args[])
   {
        try {
               System.setSecurityManager(new PasswordSecurityManager("123456"));
            } catch (SecurityException se) {
                System.out.println("SecurityManager already set!");
            }
        try {
            //DataInputStream fis = new DataInputStream(new FileInputStream("input.txt"));
            BufferedReader fis = new BufferedReader(new FileReader("input.txt"));
            //DataOutputStream fos = new DataOutputStream( new FileOutputStream("output.txt"));
            BufferedWriter fos = new BufferedWriter(new FileWriter("output.txt"));
            String inputString;
            while ((inputString = fis.readLine()) != null) {
        //fos.writeBytes(inputString);
        //fos.writeByte('\n');
        fos.write(inputString);
        fos.write('\n');
            }
            fis.close();
            fos.close();
        } catch (IOException ioe) {
            System.out.println("I/O failed for SecurityManagerTest.");
        }catch(Exception e)
        {
           System.out.println(e.toString());
        }
      
   }
}
 
 
import java.io.*;
class PasswordSecurityManager extends SecurityManager {
private String password;
PasswordSecurityManager(String password) {
    super();
    this.password = password;
}
private boolean accessOK() {
    int c;
    //DataInputStream dis = new DataInputStream(System.in);
    BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
    String response;
    System.out.println("What's the secret password?");
    try {
        response = dis.readLine();
        if (response.equals(password))
            return true;
        else
            return false;
    } catch (IOException e) {
        return false;
    }
}
public void checkRead(FileDescriptor filedescriptor) {
    if (!accessOK())
        throw new SecurityException("Not a Chance!");
}
public void checkRead(String filename) {
    if (!accessOK())
        throw new SecurityException("No Way!");
}
public void checkRead(String filename, Object executionContext) {
    if (!accessOK())
        throw new SecurityException("Forget It!");
}
public void checkWrite(FileDescriptor filedescriptor) {
    if (!accessOK())
        throw new SecurityException("Not!");
}
public void checkWrite(String filename) {
    if (!accessOK())
        throw new SecurityException("Not Even!");
}

分享到:
评论

相关推荐

    Java安全权限控制机制研究综述.pdf

    Java安全权限控制机制是Java安全体制中的一种重要机制,通过对Java安全管理器、权限类、安全策略文件、自定制权限类等底层技术的研究,程序员可以细致的控制各个安全访问权限。 Java安全管理器(SecurityManager)...

    ProGrade:Java 安全管理器变得简单-开源

    开源项目"ProGrade"致力于简化这一过程,为开发者提供了一个自定义Java安全管理器和安全策略实现的库。本文将深入探讨ProGrade的核心功能、如何使用以及它对Java安全性的提升。 首先,ProGrade的主要亮点在于其提供...

    关于java语言的安全性

    8. **Java安全管理器**: 安全管理器是Java安全模型的核心组件,它可以根据策略文件定义的规则,决定代码是否具有执行特定操作的权限。 9. **安全编程实践**: 除了语言级别的安全特性,良好的编程习惯也至关重要...

    java外卖系统源码-remote-code-execution-sample:演示Java安全管理器的使用如何防止远程代码执行(RCE)攻击

    安全管理器来防止远程代码执行漏洞。 Java 安全管理器 由于 JEP 411(以及这里已经指出的其他原因),提到的启用 Java 安全管理器的具体解决方案是不切实际的。 然而,它的思想,即采用强制访问控制技术仍然非常适用...

    JAVA安全手册(英文版)

    8. **Java安全管理器**:安全管理器是Java安全框架的核心组件,它执行所有的安全检查。手册会解释如何自定义安全管理器以满足特定的安全需求。 9. **JVM安全**:手册也会涉及JVM的内部安全机制,如堆栈指针检查、...

    java下载管理器

    总的来说,Java下载管理器是一个集成了多种高级特性和优化策略的下载工具,旨在提供高效、稳定、安全的文件下载体验。通过Java的灵活性和强大功能,它实现了跨平台运行,满足了不同用户的需求。

    java任务管理器

    Java任务管理器是一种工具,它允许开发者通过JNI(Java Native Interface)来调用Windows操作系统的底层接口,以实现对系统任务的监控和管理。这个工具的界面设计简洁且直观,提供了一个用户友好的方式来查看和管理...

    java-读取任务管理器信息

    "Java 读取任务管理器信息" 本文主要讨论了如何在 Java 中读取任务管理器信息,包括物理内存、剩余物理内存、已使用物理内存、内存使用率、cpu 占有率等信息。 java 中读取任务管理器信息的必要性: 在实际开发中...

    给自己记录的JAVA安全学习笔记.zip

    9. **Java安全管理器与权限策略**:安全管理器是Java安全框架的一部分,可以自定义以实施特定的安全策略。权限策略文件定义了不同代码源的权限,这是控制代码行为的关键。 10. **防止内存泄漏与安全的垃圾收集**:...

    基于Java的两个通用安全模块的设计与实现.zip

    6. **Java安全管理器(Security Manager)**:Java的`java.lang.SecurityManager`允许开发者设置一套规则来限制代码的运行权限,防止恶意代码的执行。 7. **JCE(Java Cryptography Extension)**:对于更高级的...

    JAVA2平台安全技术

    10. Java安全管理器:安全管理器是一个可选组件,可以进一步增强平台的安全性。它允许开发者自定义安全策略,监控和控制程序的运行。 以上就是JAVA2平台安全技术的一些核心概念和机制。理解并熟练掌握这些技术对于...

    java文件管理器(含文本编辑器)

    Java文件管理器是一款基于Java编程语言开发的实用工具,它具备了常见的文件操作功能,如创建新文件夹、创建新文本文档、打开文件、重命名文件、删除文件以及返回上级目录。此外,该管理器还集成了一款文本编辑器,...

    基于JAVA的安全电子商务(论文)

    Java安全管理器(Security Manager)是实现这一模型的关键组件,允许开发者定义应用程序的安全策略。 2. **HTTPS与SSL/TLS协议**:在电子商务系统中,为了确保数据传输的安全,通常会采用HTTPS协议,它基于SSL/TLS...

    Java Runtime Environment JRE 1.4.2

    此外,JRE 1.4.2还包含了Java安全管理器,它提供了控制Java应用程序访问系统资源的能力,增强了系统的安全性。这一版本还引入了Java的增强注解(Annotations),这是一种元数据,可以用于提供编译时和运行时的信息,...

    基于java的两个通用安全模块系统毕业设计与实现(源代码+项目报告).zip

    8. **Java安全管理器(Security Manager)**:Java允许安装安全管理器,它可以进一步限制应用程序的行为。这两个模块可能使用了安全管理器来定制更严格的运行环境。 9. **源代码审查**:为了保证代码的安全性,源...

    java权限设计

    Java安全管理器(Security Manager)负责检查运行时的权限。 4. **Java Security Manager**:这是Java平台的一部分,用于限制应用程序的某些操作,如读写文件、网络连接等,以提高系统的安全性。 5. **权限...

    基于Java实现的Shellcode加载器.zip

    Java本身具有平台无关性和安全性,通过Java安全管理器(Security Manager)来防止不受信任的代码执行危险操作。然而,有些场景下可能需要在Java环境中运行特定的系统命令或操作,这时就需要一个Shellcode加载器。 ...

    JAVA学习文档

    Java安全管理器允许开发者自定义安全策略。在性能方面,Java通过垃圾回收机制自动管理内存,避免了内存泄漏问题。此外,Java的并发库提供了一套高效处理多线程的工具,如Executor框架,有助于优化程序性能。 2. OO...

Global site tag (gtag.js) - Google Analytics