【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

时间:2022-09-05 10:49:43

作者:郭嘉

邮箱:allenwells@163.com

博客:http://blog.csdn.net/allenwells

github:https://github.com/AllenWell

一 安全管理器的功能

安全管理器是一个同意程序实现安全策略的类,它会在执行阶段检查须要保护的资源的訪问权限及其它规定的操作权限。保护系统免受恶意操作攻击。以达到系统的安全策略。

安全管理器负责检查的操作主要包括以下几个:

  • 创建一个新的类载入器
  • 退出虚拟机
  • 使用反射訪问还有一个类的成员
  • 訪问本地连接
  • 打开socket连接
  • 启动打印作业
  • 訪问系统剪贴板
  • 訪问AWT事件队列
  • 打开一个顶层窗体

注意:在执行Java应用程序时,默认的设置是不安装安全管理器的,这样全部的操作都是同意的,

安全管理器的工作流程例如以下图所看到的:

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

一 安全管理器的使用

1.1 获取安全管理器


Security security = System.getSecurityManager();

1.2 启动安全管理器

1.2.1 命令行启动

java -Djava.security.manager class_name

1.2.2 程序启动

在启动安全管理器时能够通过-Djava.security.policy选项来指定安全策略文件。

假设没有指定策略文件的路径,那么安全管理器将使用默认的安全策略文件,它位于%JAVA_HOME%/jre/lib/security文件夹以下的java.policy。

注意

  • =表示这个策略文件将和默认的策略文件一同发挥作用。
  • ==表示仅仅使用这个策略文件。

policy文件包括了多个grant语句,每个grant描写叙述某些代码拥有某些操作的权限。在启动安全管理器时会依据policy文件生成一个Policy对象,不论什么时候一个应用程序仅仅能有一个Policy对象

SecurityManager sm=new SecurityManager();
System.setSecurityManager(sm);

默认的%JAVA_HOME%/jre/lib/security/java.policy文件内容例如以下所看到的:

// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
}; // default permissions granted to all domains grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more
// information.
permission java.lang.RuntimePermission "stopThread"; // allows anyone to listen on dynamic ports
permission java.net.SocketPermission "localhost:0", "listen"; // "standard" properies that can be read by anyone permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read"; permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read"; permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};

1.3 关闭安全管理器

SecurityManager sm=System.getSecurityManager();
if(sm!=null)
{
System.setSecurityManager(null);
}

以上代码仅仅有在位于{JDK_HOME}/jre/lib/security文件夹下或者其它指定文件夹下的java.policy文件里指定了一个权限才会生效。

该权限是:

permission java.lang.RuntimePermission"setSecurityManager";

1.4 安全管理器检查

security.checkXXX(...);

检查完毕后,成功则安全管理器返回。失败则安全管理器抛出SecurityException,注意该约定唯一的例外是checkTopLevelWindow。它返回boolean值

1.5 安全管理器权限检查

安全管理器中全部其它check()方法的默认实现都是调用SecurityManager.checkPermission()方法来确定线程是否具有执行所请求的操作的权限。

仅仅带有单个权限參数的checkPermission()方法总是在当前执行的线程上下文中执行安全检查。

假设在给定的上下文进行检查须要在不同的上下文中进行,能够使用Java提供的包括上下文參数的getSecurityContext()方法和checkPermission()方法,例如以下所看到的:

Object context = null;
SecurityManager sm = System.getSecurityManager();
if(sm != null)
{
context = sm.getSecurityContext();//该方法返回当前调用上下文的一个快照
sm.checkPermission(permission, context);//该方法使用一个上下文对象,以及依据该上下文(不是当前执行线程的上下文)作出訪问决策的权限。
}

权限分为以下几个类别:

  • 文件
  • 套接字
  • 网络
  • 安全性
  • 执行时
  • 属性
  • AWT
  • 反射
  • 可序列化

相应的权限类为:

  • java.io.FilePermission
  • java.net.SocketPermission
  • java.net.NetPermission
  • java.security.SecurityPermission
  • java.lang.RuntimePermission
  • java.util.PropertyPermission
  • java.awt.AWTPermission
  • java.lang.reflect
  • ReflectPermission
  • java.io.SerializablePermission

整个权限类的层次结构例如以下图所看到的:

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

以下写一个样例来演示一下自己定义安全管理器的使用。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class SecurityManagerDemo
{
public static void main(String[] args) throws FileNotFoundException
{
System.out.println("SecurityManager: " + System.getSecurityManager());
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\my.txt");
System.out.println(System.getProperty("file.encoding"));
}
}

注意:my.txt是已经存在的文件,须要在你的文件夹创建,这里的文件夹是C:\Users\Administrator

直接执行

直接执行SecurityManagerDemo,相当于没有启动安全管理器,SecurityManager打印出来为null,且能正确读取protect.txt文件跟file.encoding属性。例如以下图所看到的:

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

加入启动參数执行

加入启动參数

-Djava.security.manager -Djava.security.policy=C:\\Users\\Administrator\\my.policy//自己定义策略文件

指定-Djava.security.manager參数,此时SecurityManager打印出来为不为null,my.policy里面并没有做不论什么授权。所以在读取文件的时就抛出AccessControlException异常,例如以下图所看到的:

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

创建my.policy,并写入以下grant:

grant {
permission java.io.FilePermission "C:\\Users\\Administrator\\my.txt", "read";
permission java.util.PropertyPermission "file.encoding", "read";
};

此时能够正确读取。例如以下图所看到的:

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

三 实现自己定义的安全管理器

实现自己定义的安全管理器一般分为两步:

  1. 创建一个SecurityManager子类,依据须要重写一些方法。
  2. 依据应用程序代码的权限须要配置策略文件。

以下写一个样例来演示一下自己定义安全管理器的使用:

自己定义类MySecurityManager继承于SecurityManager,重写了checkRead()方法。

public class MySecurityManager extends SecurityManager
{ @Override
public void checkRead(String file)
{
//super.checkRead(file, context);
if (file.endsWith("not"))
{
throw new SecurityException("你没有读取的本文件的权限");
}
} }

写个測试类MySecurityManagerDemo观察MySecurityManager是否实用。

import java.io.FileInputStream;
import java.io.IOException; public class MySecurityManagerDemo
{
public static void main(String[] args)
{
System.setSecurityManager(new MySecurityManager());
try
{
FileInputStream fis = new FileInputStream("not");
System.out.println(fis.read());
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

执行完毕后,输出打印“你没有读取的本文件的权限”。说明MySecurityManager能够使用。结果例如以下图所看到的:

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器的更多相关文章

  1. 【Java 虚拟机探索之路系列】:JIT编译器

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 为 ...

  2. java安全沙箱(四)之安全管理器及Java API

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  3. java jvm学习笔记六(实现写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

  4. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  5. java之jvm学习笔记六(实践写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

  6. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. Java 集合系列 02 Collection架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. 【Java进阶面试系列之一】哥们,你们的系统架构中为什么要引入消息中间件?

    转: [Java进阶面试系列之一]哥们,你们的系统架构中为什么要引入消息中间件? **这篇文章开始,我们把消息中间件这块高频的面试题给大家说一下,也会涵盖一些MQ中间件常见的技术问题. 这里大家可以关 ...

  9. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

随机推荐

  1. vim 标签命令

    设置标签:ma 跳转到标签:`a 查看当前所有标签:marks 删除标签:delmarks a 删除所有标签:delmarks! 不包括[A-Z]和[0-9]标签.

  2. [原创]cocos2d-x研习录-第二阶 概念类之导演类(CCDirector)

    CCDirector类是游戏的组织和控制中心(总指挥),它控制着主屏幕的显示.场景的切换和显示,以及游戏的开始.结束和暂停.它的继承关系图如下:    CCDirector继承自基类CCObject, ...

  3. Mac OS X 软件推荐

    ​1. 前言 每个操作系统都有自己的一套软件系统,但是不同的用户却会有不同的需求,系统虽会为用户提供一些基础软件,不过为了能无碍的进入自己的学习和工作状态,总有一些软件是必须安装的,同时这些软件也可以 ...

  4. 【解决】笔记本发射WiFi

    这个百度一下一大堆 .. 不过还是希望自己总结一发适合自己的 (*^__^*)  废话不多说,开始 基于几个bat (1)CreateWlan.bat netsh wlan set hostednet ...

  5. oracle查询和编写数据字典

    在项目交付时假设须要编写数据字典,能够採用以下的方法.首先执行以下的sql语句 SELECT A.TABLE_NAME AS 表名, A.COLUMN_NAME AS 字段名, DECODE(A.CH ...

  6. Unity的资源管理

    本篇文章翻译自Unity的官方文档,原文地址:https://docs.unity3d.com/Manual/BehindtheScenes.html Unity自动导入资源的同时为你管理这些资源产生 ...

  7. Spring MVC 使用介绍(十六)数据验证 (三)分组、自定义、跨参数、其他

    一.概述 除了依赖注入.方法参数,Bean Validation 1.1定义的功能还包括: 1.分组验证 2.自定义验证规则 3.类级别验证 4.跨参数验证 5.组合多个验证注解 6.其他 二.分组验 ...

  8. Hive HiveServer2+beeline+jdbc客户端访问操作

    HiveServer 查看/home/hadoop/bigdatasoftware/apache-hive-0.13.1-bin/bin目录文件,其中有hiveserver2 启动hiveserver ...

  9. STM32的优先级的理解及其使用

    1 组只代表主优先级和副优先级数量的配比,组之间没有优先级的概念. 2 不同的主优先级中断之间,高优先级中断可以打断正在执行的低优先级中断,即可以形成中断嵌套. 3 主优先级相同的中断,高副优先级中断 ...

  10. lock和Monitor(锁对象)

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...