java安全——Java 默认沙箱

news2024/11/18 11:17:14

Java安全

Java 默认沙箱

程序设计者或者管理员通过改变沙箱的参数从而完成权限的变动更新

Java默认沙箱的设计目的是为了保护系统和用户的安全。Java虚拟机提供了一种机制,让Java应用程序在一个受限的环境中运行,也就是“沙箱”。这个沙箱能够在应用程序中启用一些安全管理功能,以保护系统和用户的安全,防止应用程序意外或恶意地破坏系统。

Java提供了一系列安全管理类和安全策略,以实现对应用程序的安全限制。Java虚拟机通过对代码来源的检查,实现对Java程序的安全限制。也就是说,用户可以将一个不可信的应用程序加载到Java虚拟机中,虚拟机会通过安全管理类来控制应用程序的行为,以防止应用程序访问系统资源或者执行危险操作。

Java默认沙箱实施的主要方式是限制Java应用程序的权限。Java应用程序的权限是指应用程序可以进行的操作,如文件读写、网络访问、系统操作等。Java default sandbox通过限制Java应用程序的权限,防止应用程序执行危险操作,从而提高系统的安全性。

沙箱要素

  1. 安全管理器:Java提供了一个安全管理器类,它控制着应用程序对系统资源的访问。安全管理器提供了一个安全策略,该策略可以通过配置文件进行配置,以控制应用程序访问系统资源的权限。安全管理器可以防止不受信任的应用程序执行危险操作,从而保护系统的安全。
  2. 权限:权限是一种授权机制,它允许Java应用程序对系统资源进行访问。Java应用程序只有获得相应的权限,才能够访问系统资源。Java提供了一系列的权限,如文件读写权限、网络访问权限、系统操作权限等。通过授予和限制权限,可以保证Java应用程序在沙箱中运行时的安全性。
  3. 类加载器:Java应用程序运行时,需要从磁盘或网络中加载类文件。Java提供了一个类加载器的机制,它可以加载Java类文件,并在沙箱中实例化对象。类加载器可以限制Java应用程序的代码访问,从而保证Java应用程序的运行环境的安全性。
  4. JVM安全策略:JVM安全策略是一个配置文件,它可以控制Java应用程序访问系统资源的权限。该文件可以通过文本编辑器进行编辑,管理员可以在其中定义Java应用程序可以执行的操作。当Java应用程序执行时,JVM会读取该安全策略文件,并检查Java应用程序的权限。

权限

  • 每个java类都具有一组权限,这些权限说明了该类能够做的所有操作
  • 沙箱的参数完全由这些参数决定。
  • 当java类程序执行敏感操作的时候需要检查该类的操作权限是否允许,否则抛出异常
  • java核心API不受权限的控制,可以执行任何操作
  • 其它类包括类路径下的类,要涉及进行安全操作的类,不许进行检验,
文件权限

文件权限的优先级没有操作系统的优先级高,可能操作系统不允许文件的操作但是文件权限中有这个权限。

在这里插入图片描述

套接字权限

在这里插入图片描述

属性权限

在这里插入图片描述

运行时权限

在这里插入图片描述

AWT 权限

在这里插入图片描述

网络权限

在这里插入图片描述

安全权限
序列化权限
反射权限

在这里插入图片描述

完全权限

在这里插入图片描述

密钥库

在这里插入图片描述

Java沙箱是一个安全环境,其中包含了一系列限制和控制措施,以防止恶意代码对系统进行攻击。密钥库是Java

沙箱中的一部分。密钥库是一种存储公钥和私钥的容器,它可以由Java应用程序使用来加密和解密数据。Java沙箱中的密钥库通常用于以下两个目的:

  1. 数字签名验证

Java沙箱中包含的应用程序可能会尝试获取其他应用程序的数字签名,并验证签名是否正确。为了进行数字签名验证,应用程序必须使用事先存储在密钥库中的签名密钥来验证数字签名。如果签名验证失败,Java沙箱将阻止应用程序继续执行。

  1. SSL/TLS加密

Java沙箱中的应用程序可能需要使用SSL/TLS加密来保护与远程服务器的通信。为了进行SSL/TLS加密,应用程序需要访问密钥库中的证书和私钥。证书和私钥用于建立安全的通信管道,并将数据加密以确保数据安全。

使用Java沙箱中的密钥库非常简单。只需在应用程序中使用Java密钥库API来访问密钥库。您需要使用Java keytool程序创建密钥库,然后将密钥库添加到Java沙箱的安全管理器中进行授权。一旦授权,您的应用程序就可以在Java沙箱中安全地使用密钥库中存储的公钥和私钥了。

代码源

  • 代码基和签名者
    • 签名者字段的内部必须与密钥库中的某个别名对应匹配
    • 代码基则可以是任何合法的URL地址

在这里插入图片描述

  1. 安全沙箱

Java沙箱通常用于运行未经验证的Java代码。为了确保安全,Java沙箱会限制可执行代码的访问和资源使用。使用代码源,您可以限制可执行代码仅能从事先指定的代码源来加载类和资源。这可以防止可执行代码访问不安全或不可信的资源。

  1. 库隔离

在某些情况下,您可能需要在同一系统上运行多个Java应用程序。这些应用程序可能依赖于不同版本的同一Java库。为了避免同一系统上的不同应用程序之间发生命名冲突和版本冲突,您可以使用代码源来隔离库的加载。使用代码源,您可以让Java应用程序仅从指定的代码源来加载需要的库,避免了不必要的命名冲突和版本冲突。

策略文件

Java安全策略文件是Java中的一种安全设置,用于限制Java代码所能访问的资源和执行的操作。这些资源包括文件系统、网络和系统配置等。通过使用Java安全策略文件,可以提高Java应用程序的安全性,防止恶意代码的执行和数据泄露等问题。

Java安全策略文件通常以.policy结尾,可以通过在Java虚拟机启动时指定-Djava.security.policy选项来加载。Java安全策略文件中包括了一系列的权限和规则,用于控制Java代码的访问和操作。例如,可以限制Java代码只能访问指定的文件或网络端口,或者只允许Java代码执行指定的操作等。

Java安全策略文件的格式比较灵活,可以根据需求自定义。在Java策略文件中,权限由以下几个部分组成:

  1. 代码源:定义了Java代码的源路径或来源URL。
  2. 权限:限制了Java代码可以访问的某些资源,例如文件系统、网络或系统配置等。
  3. 代码位置:定义了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 安全策略文件和权限。

  1. 打开 policytool 工具

在命令行窗口中输入 policytool 并按回车键,或者在 Windows 系统中找到 Java 安装目录下的 bin 文件夹,双击运行 policytool.exe 文件。

  1. 创建新的安全策略文件

在 policytool 工具的菜单栏中选择 File -> New,然后输入安全策略文件的名称和路径,点击 Save 按钮。

  1. 添加权限

在 policytool 工具的菜单栏中选择 Edit -> Add Policy Entry,然后在弹出的对话框中输入代码所需的权限和代码路径,点击 Add Entry 按钮。

  1. 修改权限

在 policytool 工具的菜单栏中选择 Edit -> Edit Policy Entry,然后在弹出的对话框中选择需要修改的策略条目,修改相应的权限和代码路径,点击 OK 按钮。

  1. 删除权限

在 policytool 工具的菜单栏中选择 Edit -> Delete Policy Entry,然后在弹出的对话框中选择需要删除的策略条目,点击 OK 按钮。

  1. 保存策略文件

在 policytool 工具的菜单栏中选择 File -> Save,然后选择保存的路径和文件名,点击 Save 按钮。

  1. 退出 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 机制会带来一些性能和功能上的影响。下面是一些可能的影响:

  1. 性能:由于在启用 SecurityManager 机制时,JVM 需要对每个可执行的代码都进行安全性检查,从而导致程序的性能出现下降。因此,对于对执行性能有较高要求的程序或对 CPU 和内存资源敏感的应用程序来说,可能需要权衡考虑是否需要开启安全管理器机制。
  2. 功能限制:在启用安全管理器机制时,程序的功能可能会受到限制。如果没有配置良好的安全策略文件或者安全策略过于严格,则可能导致程序无法执行一些关键操作,例如访问本地文件系统、创建网络连接等。因此,需要仔细考虑程序的功能需求以及所需的权限。
  3. 需要额外的配置:在启用安全管理器机制时,需要编写和配置安全策略文件以及调整程序的代码结构和行为。这可能需要程序员具备一定的安全意识和技能,并进行比较复杂的配置工作。

java.security文件

在这里插入图片描述

在 Java 8 中,默认的安全策略文件位于 $JAVA_HOME/jre/lib/security/java.policy,它包含了一些基本的权限规则。这些规则控制了 Java 代码的访问权限,确保 Java 代码不能访问敏感信息和系统资源,保证了应用程序的安全性。下面是一些默认安全策略文件中的一些规则:

该规则授予了从 Java 安装目录的 lib 文件夹中加载的类访问一些系统属性的读权限,例如 Java 版本、供应商、操作系统名称和版本等。

  1. grant { permission java.lang.RuntimePermission "getClassLoader";};

该规则授予 Java 程序允许调用 getClassLoader 方法的权限。

  1. grant { permission java.util.PropertyPermission "*", "read,write";};

该规则授予 Java 程序允许读写所有系统属性的权限。

  1. grant { permission java.security.SecurityPermission "getProperty.jdk.certpath.disabledAlgorithms";};

该规则授予 Java 程序访问 JDk certificate path 禁用算法的权限。

还有很多其他的权限规则在默认的安全策略文件中,基本上是一些典型的权限控制,如文件读写权限、网络访问权限、运行时操作权限等等,这些默认规则可以保护 Java 应用程序的安全性。但是对于一些复杂的场景,可能会需要自定义安全策略文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信支付证书过期了怎么办

什么是商户API证书?如何获取商户API证书? 微信原文档:https://kf.qq.com/faq/161222NneAJf161222U7fARv.html 注:正常情况下,微信商户平台的密钥不需要更新重置,站点妥善保存密钥,定期更新证书即…

【adb指令】

一、什么是adb adb的全称为Android Debug Bridge,官方提供的用于操作安卓设备的工具。 二、adb用来干什么? 在电脑终端通过命令行: 打开收手机应用;传输文件;点击、输入、滑动等;硬件操作、返回、回到首…

踩坑记录:nuxt3 - ssg 重构我的前端导航网站

一、💥 背景故事 不久前我利用周末搭建了个 万能导航网站,当时还写了篇文章:# 我给自己搭建的前端导航网站,你们都别用🤪。本来我以为不会有太大的访问量,主要是方便自己用。没想到用的人还不少&#xff0…

maven 远程仓库 查找jar mvnrepository.com

https://mvnrepository.com 搜索包 找到指定版本 下载包或者配置文件引用

WORDPRESS REST API 学习

WORDPRESS 的 REST API 本身是没有身份验证的,我安装了 miniOrange 的 WordPress REST API Authentication 免费部分只有 Basic Authentication 和 JWT Authentication , 作为学习 REST API 够用了。 一般使用 postman 测试 api ,后来卸载了…

通用分页【上】之后端代码

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于通用分页的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 导读: 💡辉辉小…

git创建分支提示fatal: not a valid object name: ‘master‘解决方案

文章目录 1. 背景描述:2. 原因分析:3. 解决方案: 1. 背景描述: 在本地使用 git init初始化一个空的git项目后,想使用git branch创建分支时,提示fatal: not a valid object name: ‘master’。 2. 原因分…

【react全家桶学习】react的 (新/旧) 生命周期(重点)

目录 生命周期(旧) 挂载时的生命周期 constructor(props) componentWillMount()-------------新生命周期已替换 render() componentDidMount()--- 组件…

【MHA高可用配置及故障切换】

目录 一、案例概述1、传统的MySQL主从架构存在的问题1.1、单点故障 2、HMA的简介2.1、HMA的概述2.2、HMA的组成2.3、MHA 的特点 三、搭建MySQL HMA1、实验思路1、进入主服务器进行修改配置文件2、启动服务,并在从服务器上配置计划性任务进行时间同步 2、修改 Master…

人声克隆技术:So-Vits-Svc项目解析

SO-VITs-SVC 本文是该系列的第一篇,采用倒序的方式,先从推理过程开始介绍人声克隆的工作流,以及各个模型的功能,之后再去详细介绍各个模型,因此不涉及具体的使用方法,这个官方文档里面已经讲的很清楚了&…

相机成像原理【第一节】

文章目录 1、胶片摄影与数码摄影2、相机的组成2.1 只有传感器相机的成像 3、小孔成像3.1 小孔相机的参数和成像结果3.2 关于小孔成像的两个问题 1、胶片摄影与数码摄影 胶片摄影是把光学镜头的光信号投射到胶片上, 数码摄影是把光学镜头的光信号投射到传感器上&…

「又是干货」史诗级漏洞挖掘的过程快get一下

前言 本文记录了针对前台RCE的挖掘过程,由于该CMS前几天才做了修复,所以将挖掘过程写出来 接着直接来看代码,首先目标仍然是解析if标签的代码块,看一下三个正则 /\{pboot:if\(([^}^\$])\)\}([\s\S]*?)\{\/pboot:if\}//([\w])(…

零基础也能轻松制作电子邀请函教程

随着互联网技术的发展,电子邀请函已经逐渐取代传统的纸质邀请函成为一种趋势。不仅可以节省纸张和邮寄的成本,还能够更加个性化和创意化地展现活动。自己制作电子邀请函,百利而无一害,如果你也想自己动手制作一份电子邀请函&#…

VTK 悬浮显示 actor详细

需求:场景中一个actor,鼠标悬浮时 显示此actor的信息。 效果: 实现: 1,利用vtkInteractorStyleTrackballCamera 的OnMouseMove 事件 判断是否处于悬浮状态 2,判断悬浮后,首先将世界坐标转为…

10分钟教你学会使用ab 进行并发压力测试

目录 ab全称为:apache bench。 安装ab命令: 使用: 测试结果: 结果分析: 总结: ab全称为:apache bench。 是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进…

离子风枪的功能特点及应用领域

除静电离子风枪是一种常见的设备,被广泛应用于各个领域的生产线上,其作用是通过产生离子气流,有效地去除物体表面的静电。在现代工业生产中,静电可能引发诸多问题,如引起电子元器件损坏、拖尘吸附、产品互粘等。除静电…

如何使用Wu10Man启用或禁用自动更新

使用Wu10Man启用或禁用自动更新 启用自动更新禁用自动更新Windows 10 将在你设置为自动维护时自动检查新的 Windows 更新。默认情况下,Windows 10 将自动下载并安装重要和关键更新。 某些更新不是自动安装的。这包括可选更新和要求你接受新使用条款的更新。当这些更新可用时,…

哈工大操作系统实验三(整理自用)

一、实验内容 基于模板 process.c 编写多进程的样本程序,实现如下功能: 所有子进程都并行运行,每个子进程的实际运行时间一般不超过 30 秒; 父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出&…

SpringBoot项目做成Docker 镜像

1.使用Xshell5使用 put指令上传到Centos put D:\git\repository_idea\emsms\target\emsms-0.0.1-SNAPSHOT.jar 2.编辑文件 vim spring ROM java:8 ADD emsms-0.0.1-SNAPSHOT.jar dd.jar CMD java -jar dd.jar 示例: 3.退出并保存编辑 4.将文件打包成镜像 dock…

Flink中FileSink的使用

在Flink中提供了StreamingFileSink用以将数据流输出到文件系统. 这里结合代码介绍如何使用FileSink. 首先FileSink有两种模式forRowFormat和forBulkFormat public static <IN> DefaultRowFormatBuilder<IN> forRowFormat(final Path basePath, final Encoder<IN…