Java安全
Java 默认沙箱
程序设计者或者管理员通过改变沙箱的参数从而完成权限的变动更新
Java默认沙箱的设计目的是为了保护系统和用户的安全。Java虚拟机提供了一种机制,让Java应用程序在一个受限的环境中运行,也就是“沙箱”。这个沙箱能够在应用程序中启用一些安全管理功能,以保护系统和用户的安全,防止应用程序意外或恶意地破坏系统。
Java提供了一系列安全管理类和安全策略,以实现对应用程序的安全限制。Java虚拟机通过对代码来源的检查,实现对Java程序的安全限制。也就是说,用户可以将一个不可信的应用程序加载到Java虚拟机中,虚拟机会通过安全管理类来控制应用程序的行为,以防止应用程序访问系统资源或者执行危险操作。
Java默认沙箱实施的主要方式是限制Java应用程序的权限。Java应用程序的权限是指应用程序可以进行的操作,如文件读写、网络访问、系统操作等。Java default sandbox通过限制Java应用程序的权限,防止应用程序执行危险操作,从而提高系统的安全性。
沙箱要素
- 安全管理器:Java提供了一个安全管理器类,它控制着应用程序对系统资源的访问。安全管理器提供了一个安全策略,该策略可以通过配置文件进行配置,以控制应用程序访问系统资源的权限。安全管理器可以防止不受信任的应用程序执行危险操作,从而保护系统的安全。
- 权限:权限是一种授权机制,它允许Java应用程序对系统资源进行访问。Java应用程序只有获得相应的权限,才能够访问系统资源。Java提供了一系列的权限,如文件读写权限、网络访问权限、系统操作权限等。通过授予和限制权限,可以保证Java应用程序在沙箱中运行时的安全性。
- 类加载器:Java应用程序运行时,需要从磁盘或网络中加载类文件。Java提供了一个类加载器的机制,它可以加载Java类文件,并在沙箱中实例化对象。类加载器可以限制Java应用程序的代码访问,从而保证Java应用程序的运行环境的安全性。
- JVM安全策略:JVM安全策略是一个配置文件,它可以控制Java应用程序访问系统资源的权限。该文件可以通过文本编辑器进行编辑,管理员可以在其中定义Java应用程序可以执行的操作。当Java应用程序执行时,JVM会读取该安全策略文件,并检查Java应用程序的权限。
权限
- 每个java类都具有一组权限,这些权限说明了该类能够做的所有操作
- 沙箱的参数完全由这些参数决定。
- 当java类程序执行敏感操作的时候需要检查该类的操作权限是否允许,否则抛出异常
- java核心API不受权限的控制,可以执行任何操作
- 其它类包括类路径下的类,要涉及进行安全操作的类,不许进行检验,
文件权限
文件权限的优先级没有操作系统的优先级高,可能操作系统不允许文件的操作但是文件权限中有这个权限。
套接字权限
属性权限
运行时权限
AWT 权限
网络权限
安全权限
序列化权限
反射权限
完全权限
密钥库
Java沙箱是一个安全环境,其中包含了一系列限制和控制措施,以防止恶意代码对系统进行攻击。密钥库是Java
沙箱中的一部分。密钥库是一种存储公钥和私钥的容器,它可以由Java应用程序使用来加密和解密数据。Java沙箱中的密钥库通常用于以下两个目的:
- 数字签名验证
Java沙箱中包含的应用程序可能会尝试获取其他应用程序的数字签名,并验证签名是否正确。为了进行数字签名验证,应用程序必须使用事先存储在密钥库中的签名密钥来验证数字签名。如果签名验证失败,Java沙箱将阻止应用程序继续执行。
- SSL/TLS加密
Java沙箱中的应用程序可能需要使用SSL/TLS加密来保护与远程服务器的通信。为了进行SSL/TLS加密,应用程序需要访问密钥库中的证书和私钥。证书和私钥用于建立安全的通信管道,并将数据加密以确保数据安全。
使用Java沙箱中的密钥库非常简单。只需在应用程序中使用Java密钥库API来访问密钥库。您需要使用Java keytool程序创建密钥库,然后将密钥库添加到Java沙箱的安全管理器中进行授权。一旦授权,您的应用程序就可以在Java沙箱中安全地使用密钥库中存储的公钥和私钥了。
代码源
- 代码基和签名者
- 签名者字段的内部必须与密钥库中的某个别名对应匹配
- 代码基则可以是任何合法的URL地址
- 安全沙箱
Java沙箱通常用于运行未经验证的Java代码。为了确保安全,Java沙箱会限制可执行代码的访问和资源使用。使用代码源,您可以限制可执行代码仅能从事先指定的代码源来加载类和资源。这可以防止可执行代码访问不安全或不可信的资源。
- 库隔离
在某些情况下,您可能需要在同一系统上运行多个Java应用程序。这些应用程序可能依赖于不同版本的同一Java库。为了避免同一系统上的不同应用程序之间发生命名冲突和版本冲突,您可以使用代码源来隔离库的加载。使用代码源,您可以让Java应用程序仅从指定的代码源来加载需要的库,避免了不必要的命名冲突和版本冲突。
策略文件
Java安全策略文件是Java中的一种安全设置,用于限制Java代码所能访问的资源和执行的操作。这些资源包括文件系统、网络和系统配置等。通过使用Java安全策略文件,可以提高Java应用程序的安全性,防止恶意代码的执行和数据泄露等问题。
Java安全策略文件通常以.policy结尾,可以通过在Java虚拟机启动时指定-Djava.security.policy选项来加载。Java安全策略文件中包括了一系列的权限和规则,用于控制Java代码的访问和操作。例如,可以限制Java代码只能访问指定的文件或网络端口,或者只允许Java代码执行指定的操作等。
Java安全策略文件的格式比较灵活,可以根据需求自定义。在Java策略文件中,权限由以下几个部分组成:
- 代码源:定义了Java代码的源路径或来源URL。
- 权限:限制了Java代码可以访问的某些资源,例如文件系统、网络或系统配置等。
- 代码位置:定义了Java代码所在的位置,例如本地文件系统或Web服务器中的URL等。
下面是一个Java策略文件的示例:
grant codeBase “file:/home/user/myapp.jar” {
permission java.io.FilePermission “C:/temp/*”, “read,write”;
permission java.net.SocketPermission “hostname.com:80”, “connect”;
permission javax.sound.sampled.AudioPermission “play”;
}
在这个策略文件中,指定了代码源为/home/user/myapp.jar路径下的代码,然后授予了该代码对C:/temp目录和hostname.com:80端口的读写和连接权限,同时允许该代码播放音频。
总之,在使用Java安全策略文件时,需要根据程序的需求定制相应的策略文件,并对其进行测试和验证,以确保应用程序的安全性。
策略文件说明
Java安全策略文件分为全局策略和用户策略,它们的作用和使用方式略有不同。
- 全局策略文件:
全局策略文件是Java虚拟机的安全策略,用于定义Java应用程序所执行的默认安全规则。全局策略文件通常位于$JAVA_HOME/jre/lib/security目录下,其文件名为java.policy。全局策略文件适用于整个Java虚拟机,对所有Java应用程序生效。
- 用户策略文件:
用户策略文件是一个可选的Java安全策略,用于自定义应用程序的安全规则。用户策略文件通常位于用户的home目录下,其文件名为.policy。用户策略文件适用于单个用户,可以根据需要添加或修改安全规则,以满足其特定应用程序的安全需求。
全局策略文件和用户策略文件的格式和使用方法都十分相似。下面是一个典型的Java策略文件示例,展示了一个基本的策略定义:
grant codeBase “file:/home/user/myapp.jar” {
permission java.io.FilePermission “C:/temp/*”, “read,write”;
permission java.net.SocketPermission “hostname.com:80”, “connect”;
permission javax.sound.sampled.AudioPermission “play”;
}其中,grant关键字指定了代码库,codeBase指定了应该授予哪个代码库权限。它可以是文件系统路径,也可以是远程URL等。permission关键字定义了包含在该代码库中的Java代码所允许的权限。
需要注意的是,全局策略文件可被覆盖。在使用Java应用程序时,可以通过设置java.security.policy选项以及-Djava.security.manager选项来指定Java安全策略文件。如果同时设置了系统属性和命令行选项,则命令行选项会覆盖系统属性。为了确保安全性,尽量不要在系统中使用系统范围内的Java安全策略文件。
可以使用策略工具处理策略文件比如:policytool图形工具
policytool 工具是一个图形化的工具,用于管理 java 安全策略文件和权限。
- 打开 policytool 工具
在命令行窗口中输入 policytool 并按回车键,或者在 Windows 系统中找到 Java 安装目录下的 bin 文件夹,双击运行 policytool.exe 文件。
- 创建新的安全策略文件
在 policytool 工具的菜单栏中选择 File -> New,然后输入安全策略文件的名称和路径,点击 Save 按钮。
- 添加权限
在 policytool 工具的菜单栏中选择 Edit -> Add Policy Entry,然后在弹出的对话框中输入代码所需的权限和代码路径,点击 Add Entry 按钮。
- 修改权限
在 policytool 工具的菜单栏中选择 Edit -> Edit Policy Entry,然后在弹出的对话框中选择需要修改的策略条目,修改相应的权限和代码路径,点击 OK 按钮。
- 删除权限
在 policytool 工具的菜单栏中选择 Edit -> Delete Policy Entry,然后在弹出的对话框中选择需要删除的策略条目,点击 OK 按钮。
- 保存策略文件
在 policytool 工具的菜单栏中选择 File -> Save,然后选择保存的路径和文件名,点击 Save 按钮。
- 退出 policytool 工具
在 policytool 工具的菜单栏中选择 File -> Exit,然后点击 Yes 按钮确认退出。
默认沙箱
在 Java 8 中,可以通过一些系统属性(system properties)来配置默认的沙箱机制。以下是几个常用的系统属性:
java.security.manager
:启用 SecurityManager 沙箱机制。使用该系统属性可以启用 JVM 的安全管理器,它可以控制 Java 应用程序在运行时的行为,例如控制 Java 代码对系统资源的访问,确保 Java 应用程序的安全性。例如,设置-Djava.security.manager
参数来启用 SecurityManager:java -Djava.security.manager YourApplication
java.security.policy
:指定自定义安全策略文件。如果我们需要编写自定义的安全策略文件,可以使用该系统属性来指定它的路径。例如,设置-Djava.security.policy=your.policy
参数在运行时指定自定义策略文件:java -Djava.security.policy=your.policy YourApplication
java.security.debug
:启用 Security Debug 模式。当我们需要调试 Java 应用程序的安全性问题时,可以使用该系统属性来启用 Security Debug 模式。例如,设置-Djava.security.debug=access,failure
参数来启用 Debug 模式:java -Djava.security.debug=access,failure YourApplication
需要注意的是,使用沙箱机制可以提高 Java 应用程序的安全性,但是也可能会影响程序的性能和功能。因此,我们应该在实际开发和部署中根据实际需求来配置沙箱机制。
在 Java 8 中,
java.security.manager
参数默认是关闭的,也就是说,如果不显式设置该参数,Java 应用程序会默认关闭安全管理器机制。因此,在 Java 8 中,如果想要开启 SecurityManager 沙箱机制,应该显式设置该参数,例如:java -Djava.security.manager YourApplication
需要注意的是,开启 SecurityManager 机制会对程序的性能和功能产生一定影响,因此,在决定是否开启 SecurityManager 时,应该根据实际需求和情况来进行判断和权衡。
开启沙箱的影响
开启 SecurityManager 机制会带来一些性能和功能上的影响。下面是一些可能的影响:
- 性能:由于在启用 SecurityManager 机制时,JVM 需要对每个可执行的代码都进行安全性检查,从而导致程序的性能出现下降。因此,对于对执行性能有较高要求的程序或对 CPU 和内存资源敏感的应用程序来说,可能需要权衡考虑是否需要开启安全管理器机制。
- 功能限制:在启用安全管理器机制时,程序的功能可能会受到限制。如果没有配置良好的安全策略文件或者安全策略过于严格,则可能导致程序无法执行一些关键操作,例如访问本地文件系统、创建网络连接等。因此,需要仔细考虑程序的功能需求以及所需的权限。
- 需要额外的配置:在启用安全管理器机制时,需要编写和配置安全策略文件以及调整程序的代码结构和行为。这可能需要程序员具备一定的安全意识和技能,并进行比较复杂的配置工作。
java.security文件
在 Java 8 中,默认的安全策略文件位于 $JAVA_HOME/jre/lib/security/java.policy,它包含了一些基本的权限规则。这些规则控制了 Java 代码的访问权限,确保 Java 代码不能访问敏感信息和系统资源,保证了应用程序的安全性。下面是一些默认安全策略文件中的一些规则:
该规则授予了从 Java 安装目录的 lib 文件夹中加载的类访问一些系统属性的读权限,例如 Java 版本、供应商、操作系统名称和版本等。
grant { permission java.lang.RuntimePermission "getClassLoader";};
该规则授予 Java 程序允许调用 getClassLoader 方法的权限。
grant { permission java.util.PropertyPermission "*", "read,write";};
该规则授予 Java 程序允许读写所有系统属性的权限。
grant { permission java.security.SecurityPermission "getProperty.jdk.certpath.disabledAlgorithms";};
该规则授予 Java 程序访问 JDk certificate path 禁用算法的权限。
还有很多其他的权限规则在默认的安全策略文件中,基本上是一些典型的权限控制,如文件读写权限、网络访问权限、运行时操作权限等等,这些默认规则可以保护 Java 应用程序的安全性。但是对于一些复杂的场景,可能会需要自定义安全策略文件。