当前位置: 首页 > news >正文

OJ在线评测系统 后端判题机架构搭建 使用原生实现Java安全管理器环境隔离

原生实现安全管理器环境隔离

限制用户的操作权限 文件 网络 执行

Java安全管理器

SecurityManager 来实现更严格的限制

是 Java 提供的保护 JVM Java安全的机制 可以实现更严格的资源和操作限制

编写安全管理器 只需要继承 SecurityManager类

我们可以从这个参数perm参数拿到数据

package work.bigdata1421.dduojcodesandbox.security;import java.security.Permission;/*** 默认的安全管理器*/
public class DefaultSecurityManager extends SecurityManager{// 检查所有的权限@Overridepublic void checkPermission(Permission perm) {System.out.println("默认不做任何限制");super.checkPermission(perm);}}

接下来我们去使用这个原生的资源管理器

写一个能抛异常的

package work.bigdata1421.dduojcodesandbox.security;import java.security.Permission;/*** 禁止所有的权限安全管理器*/
public class DenySecurityManager extends SecurityManager{// 检查所有的权限@Overridepublic void checkPermission(Permission perm) {throw new SecurityException("权限异常"+perm.getActions());}}

我们去尝试下怎么样让有些权限生效 有些程序不生效

这边进行了报错

实现MySecurityManager

package work.bigdata1421.dduojcodesandbox.security;import java.security.Permission;public class MySecurityManager extends SecurityManager {// 检查所有的权限@Overridepublic void checkPermission(Permission perm) {
//        super.checkPermission(perm);}// 检测程序是否可执行文件@Overridepublic void checkExec(String cmd) {throw new SecurityException("checkExec 权限异常:" + cmd);}// 检测程序是否允许读文件@Overridepublic void checkRead(String file) {System.out.println(file);if (file.contains("C:\\code\\yuoj-code-sandbox")) {return;}
//        throw new SecurityException("checkRead 权限异常:" + file);}// 检测程序是否允许写文件@Overridepublic void checkWrite(String file) {
//        throw new SecurityException("checkWrite 权限异常:" + file);}// 检测程序是否允许删除文件@Overridepublic void checkDelete(String file) {
//        throw new SecurityException("checkDelete 权限异常:" + file);}// 检测程序是否允许连接网络@Overridepublic void checkConnect(String host, int port) {
//        throw new SecurityException("checkConnect 权限异常:" + host + ":" + port);}
}

做一个测试

package work.bigdata1421.dduojcodesandbox.security;import cn.hutool.core.io.FileUtil;import java.nio.charset.Charset;/*** 测试安全管理器*/
public class TestSecurityManager {public static void main(String[] args) {System.setSecurityManager(new MySecurityManager());FileUtil.writeString("aa", "aaa", Charset.defaultCharset());}
}

看到了哪些内容是可以读的

这边只要使用了资源管理器 默认是把所有权限都禁用的

所有权限拒绝

实际情况下 我们只需要限制子程序的权限即可

没必要限制开发者自己写的程序

在运行java程序时 指定安全管理器

String runCmd = String.format("java -Xmx256m -Djava.security.manager=MySecurityManager %s Main ", userCodeParentPath, inputArgs);

我们改造成一个单独的东西

在 Java 中,配置类通常用于集中管理应用程序的配置信息。配置类可以从外部文件(如 XML、properties 文件)或其他来源读取设置。以下是几种常见的方法来加载和使用配置类:

定义一个常量

把路径指定进来

编写安全管理器

编译安全管理器

javac -encoding utf-8 .\MySecurityManager.java

首先运行java程序的时候 指定安全管理器 路径 名称

缺点

如果要做的比较严格的权限限制 需要自己去判断哪些文件 包名需要读写 粒度太细了

安全管理器本身也是Java代码 也可能存在漏洞

还是程序上的控制 没有到系统层面进行控制

Java9 后被取代

优点

权限控制灵活 实现简单

运行环境隔离

系统层面上 把用户程序封装到沙箱里

和宿主机 我们的电脑 服务器 隔离开

Docker 容器技术能够实现 cgroup namespace

相关文章:

  • 付费计量系统标准化未来展望
  • 【源码】询比价管理系统,招投标采购管理系统
  • 【滑动窗口算法】——定长滑动窗口——Python(附题)
  • vue2 将页面生成pdf下载
  • MYSQL-查看函数创建语句语法(五)
  • Ubuntu/Debian网络配置(补充篇)
  • 解决方案:如何区分python里面绝对路径跟相对路径的不同
  • SIP 会议信令
  • Android studio安装问题及解决方案
  • TypeScript高级内容
  • vue中使用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
  • 解压视频素材下载网站推荐
  • python用两类循环嵌套打印正置九九乘法口诀表和倒置九九乘法口诀表
  • PPT 快捷键使用、技巧
  • Python知识点:如何使用Hadoop与Python进行大数据处理
  • “大数据应用场景”之隔壁老王(连载四)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 30天自制操作系统-2
  • android 一些 utils
  • Date型的使用
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • GraphQL学习过程应该是这样的
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • JS实现简单的MVC模式开发小游戏
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PV统计优化设计
  • Python进阶细节
  • Redis在Web项目中的应用与实践
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 我的zsh配置, 2019最新方案
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #预处理和函数的对比以及条件编译
  • (2)Java 简介
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)薛涌:谈贫说富
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (简单) HDU 2612 Find a way,BFS。
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转) Face-Resources
  • (转)甲方乙方——赵民谈找工作
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 回调、接口回调、 委托
  • .net 设置默认首页
  • .net(C#)中String.Format如何使用
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET处理HTTP请求
  • .NET学习教程二——.net基础定义+VS常用设置
  • .so文件(linux系统)