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

news2024/9/28 12:02:21

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

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

Java安全管理器

SecurityManager 来实现更严格的限制

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

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

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

package work.bigdata1421.dduojcodesandbox.security;

import java.security.Permission;

/**
 * 默认的安全管理器
 */
public class DefaultSecurityManager extends SecurityManager{

    // 检查所有的权限
    @Override
    public void checkPermission(Permission perm) {
        System.out.println("默认不做任何限制");
        super.checkPermission(perm);
    }

}

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

写一个能抛异常的

package work.bigdata1421.dduojcodesandbox.security;

import java.security.Permission;

/**
 * 禁止所有的权限安全管理器
 */
public class DenySecurityManager extends SecurityManager{

    // 检查所有的权限
    @Override
    public void checkPermission(Permission perm) {
        throw new SecurityException("权限异常"+perm.getActions());
    }

}

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

这边进行了报错

实现MySecurityManager

package work.bigdata1421.dduojcodesandbox.security;

import java.security.Permission;

public class MySecurityManager extends SecurityManager {


    // 检查所有的权限
    @Override
    public void checkPermission(Permission perm) {
//        super.checkPermission(perm);
    }

    // 检测程序是否可执行文件
    @Override
    public void checkExec(String cmd) {
        throw new SecurityException("checkExec 权限异常:" + cmd);
    }

    // 检测程序是否允许读文件

    @Override
    public void checkRead(String file) {
        System.out.println(file);
        if (file.contains("C:\\code\\yuoj-code-sandbox")) {
            return;
        }
//        throw new SecurityException("checkRead 权限异常:" + file);
    }

    // 检测程序是否允许写文件
    @Override
    public void checkWrite(String file) {
//        throw new SecurityException("checkWrite 权限异常:" + file);
    }

    // 检测程序是否允许删除文件
    @Override
    public void checkDelete(String file) {
//        throw new SecurityException("checkDelete 权限异常:" + file);
    }

    // 检测程序是否允许连接网络
    @Override
    public 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

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

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

相关文章

软件测试学习笔记丨curl命令发送请求

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32332 一、简介 cURL是一个通过URL传输数据的,功能强大的命令行工具。cURL可以与Chrome Devtool工具配合使用,把浏览器发送的真实请求还原出来,附带认证信…

Spring Boot打造:小徐影院管理平台

第1章 概述 1.1 研究背景 随着现代网络技术发展,对于小徐影城管理系统现在正处于网络发展的阶段,所以对它的要求也是比较严格的,要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式,依靠网络技术的的快速发展和现代…

【Mysql】Mysql数据库基本操作-------DDL(上)

1、DDL解释 DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容, (1)对数据库的常用操作 (2)对表结构的常用操作 (3)修…

【Qt】编写第一个Qt程序 对象树 内存泄漏问题探讨

编写第一个Qt程序 1. 使用图形化界面生成2. 使用代码生成3. 对象树3.1什么是对象树3.2 验证对象树 4. 解决编码问题 1. 使用图形化界面生成 创建好一个项目后,我们可以点击 widget.ui 进入图形化界面设计,可以直接通过拖拽的方式进行添加。 通过拖拽的方…

群体神经科学中的社会公正:避免数据分析中的社会构建误用

TLDR:有意思的观点。文章作者强调,使用群体神经科学大数据时,研究人员必须承担起伦理和科学责任,避免对边缘化群体造成进一步的污名化。通过像ABCD这样的开放数据集,研究人员应避免将种族、性别等简单化处理为独立变量…

「JavaScript深入」聊一聊 new操作符具体干了什么?

JavaScript深入 — new操作符 概念流程手写new操作符 概念 在JavaScript中,new 操作符用于创建一个给定构造函数的实例对象 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) } cons…

记一次从登录框到内网横向

前言 接到公司通知要对某某行业做渗透测试,挖一些尽可能高危的漏洞,于是便有了接下来的故事。 0x01 信息收集 首先收集了十几个该行业相关的网站,然后一个个做信息收集,先列出来可利用的点。 1.某某公司为YouDianCMS&#xff08…

车载诊断技术:汽车健康的守护者

一、车载诊断技术的发展历程 从最初简单的硬件设备到如今智能化、网络化的系统,车载诊断技术不断演进,为汽车安全和性能提供保障。 早期的汽车诊断检测技术处于比较原始的状态,主要依靠操作经验和主观评价。随着汽车工业的发展,车载诊断技术也经历了不同的阶段。20 世纪初…

Java生成Markdown格式内容

前一篇写的是markdown格式的文本内容转换保存为word文档,是假定已经有一个现成的markdown格式的文本,然后直接转换保存为word文档,不过在开发中,通常情况下,数据是从数据库中获取,拿到的数据映射到java对象…

趋势外推法

趋势外推法主要利用图形识别法和差分法计算,进行模型的基本选择。 一、图形识别法。 这种方法是通过绘制散点图来进行的,即将时间序列的数据绘制成以时间 t 为横轴、时序观察值为纵轴的图形,观察并将其变化曲线与各类函数曲线模型的图形进行…

物联网系统中高精度温度检测方案_温度变送器

01 物联网系统中为什么要使用温度变送器 在物联网系统中使用温度变送器的原因主要可以归纳为以下几点: 1、温度监测与控制 实时数据获取:温度变送器能够将温度这一物理量转换为可传输的标准化电信号(如4-20mA电流信号、0-10V电压信号或RS48…

Spring Boot 进阶-Spring Boot 开发第一个Web接口

在前面的文章中我们对Spring Boot的配置以及日志配置有了大概的了解,在我们搭建完成第一个Spring Boot项目之后也提到了一个概念就是RestFul风格的接口开发。下面我们就来详细介绍一下使用Spring Boot如何去开发一个RestFul的Web接口。 准备 在开发接口之前,需要引入的就是W…

一文上手Kafka【中】

一、发送消息细节 在发送消息的特别注意: 在版本 3.0 中,以前返回 ListenableFuture 的方法已更改为返回 CompletableFuture。为了便于迁移,2.9 版本添加了一个方法 usingCompletableFuture(),该方法为 CompletableFu…

【工具类】证书自动续签免费版 正式发布

证书自动续签免费版 正式发布 1.控制台首页2.申请证书2.1.支持自动解析和手动解析两种模式2.2.LB(负载均衡)支持主流的云厂商2.3.CDN(内容分发) 支持主流的云厂商2.4.对象存储(OSS)支持主流云厂商2.5DCDN&a…

TDengine 在业务落地与架构改造中的应用实践!

前言 在物联网和大数据时代,时序数据的管理和分析变得至关重要。TDengine,作为一款专为时序数据设计的开源数据库,以其卓越的存储和查询效率,成为众多企业优化数据架构的优选。本文将分享我将TDengine成功应用于实际业务的经验&am…

elementui/plus灯下面的指示怎么改成圆圈或者隐藏

改成圆圈的步骤 改成没有indicator-position指示的位置/或者隐藏

用友U8 CRM 多个接口存在SQL注入漏洞

本文所涉及的任何技术、信息或工具,仅供学习和参考之用,请勿将文章内的相关技术用于非法目的,如有相关非法行为与文章作者无关。请遵守《中华人民共和国网络安全法》。 中华人民共和国网络安全法 第二十七条 规定 任何个人和组织不得从事非…

保姆级复现yolov7(论文复现)

保姆级复现yolov7(论文复现) 本文所涉及所有资源均在传知代码平台可获取 所需环境 当然深度学习环境的搭建是基础,详情可见(win10): 【深度学习】windows10环境配置详细教程anaconda3环境变量配置win10-CSDN博客 Unbutun搭建深度学…

正则表达式的使用示例--Everything文件检索批量重命名工具

一、引言 Everything是一款非常实用的文件搜索工具,它可以帮助您快速定位并查找计算机中的文件和文件夹。Everything搜索文件资料之神速,有使用过的朋友们都深有体会,相对于Windows自带的搜索功能,使用Everything,可以…

C语言 | Leetcode C语言题解之第442题数组中重复的数据

题目&#xff1a; 题解&#xff1a; int* findDuplicates(int* nums, int numsSize, int* returnSize) { int *ans (int *)malloc(sizeof(int) * numsSize);int pos 0;for (int i 0; i < numsSize; i) {int x abs(nums[i]);if (nums[x - 1] > 0) {nums[x - 1] -…