前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java技术专题】「盲点追踪」突破知识盲点分析Java安全管理器(SecurityManager)

【Java技术专题】「盲点追踪」突破知识盲点分析Java安全管理器(SecurityManager)

原创
作者头像
洛神灬殇
发布2023-04-15 15:27:10
4060
发布2023-04-15 15:27:10
举报
文章被收录于专栏:Java技术专题Java技术专题

前提介绍

Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个安全性是我们重点考虑的问题,一般我们可以通过安全管理器机制来完善安全性,安全管理器是安全的实施者,可对此类进行扩展,它提供了加在应用程序上的安全措施,通过配置安全策略文件达到对网络、本地文件和程序其它部分的访问限制的效果。

安全管理器的作用

当Java应用程序运行时,它们可以访问计算机上的资源,例如文件系统、网络、系统属性等。SecurityManager是Java中的一个类,它允许开发人员控制应用程序对这些资源的访问。SecurityManager可以实现以下功能:

  1. 安全策略管理:SecurityManager可以实现安全策略管理,以确保应用程序只能访问它们被授权访问的资源。
  2. 访问控制:SecurityManager可以实现访问控制,以确保应用程序只能访问它们被授权访问的资源。
  3. 权限管理:SecurityManager可以实现权限管理,以确保应用程序只能执行它们被授权执行的操作。
  4. 安全审计:SecurityManager可以实现安全审计,以记录应用程序对资源的访问和操作。

在Java中,可以通过System.setSecurityManager()方法来设置SecurityManager。开发人员可以编写自己的SecurityManager类,以实现自定义的安全策略管理、访问控制、权限管理和安全审计功能。

安全管理机制

在这里插入图片描述
在这里插入图片描述

检查操作权限

在这里插入图片描述
在这里插入图片描述
开启安全管理器

一般而言,Java程序启动时并不会自动启动安全管理器,可以通过以下两种方法启动安全管理器:

  • 一种是隐式,启动默认的安全管理器最简单的方法就是:直接在启动命令中添加-Djava.security.manager参数即可。
  • 一种是显式,实例化一个java.lang.SecurityManager或继承它的子类的对象,然后通过System.setSecurityManager()来设置并启动一个安全管理器。

在启动安全管理器时可以通过-Djava.security.policy选项来指定安全策略文件。如果没有指定策略文件的路径,那么安全管理器将使用默认的安全策略文件,它位于%JAVA_HOME%/jre/lib/security目录下面的java.policy。需要说明一下的是,=表示这个策略文件将和默认的策略文件一同发挥作用;==表示只使用这个策略文件。

在这里插入图片描述
在这里插入图片描述

那么如何才能实现自己的安全管理器,并且配置权限呢?下面将通过一个简单的例子阐明实现步骤,一般可以分为以下两步:

在这里插入图片描述
在这里插入图片描述
  • 创建一个SecurityManager子类,并根据需要重写一些方法。
  • 根据应用程序代码的权限需要配置策略文件。如果使用默认安全管理器则省略第一步,下面用个例子说明安全管理器的使用:
代码语言:java
复制
public class SecurityManagerTest {
        public static void main(String[] args) throws FileNotFoundException {
         System.out.println("SecurityManager: " + System.getSecurityManager());
         FileInputStream fis = new FileInputStream("c:\\protect.txt");
         System.out.println(System.getProperty("file.encoding"));
        }
}

分下面几种情况运行程序:

  1. 假如不添加启动参数直接运行,则相当于没有启动安全管理器,SecurityManager打印出来为null,且能正确读取protect.txt文件跟file.encoding属性。
  2. 添加启动参数-Djava.security.manager-Djava.security.policy=c:/protect.policy,俩参数分别代表启动默认安全管理器和指明策略配置文件路径。此时SecurityManager打印出来为不为null,但由于此时protect.policy里面并没有做任何授权,所以在读取文件的时就抛出AccessControlExcepti on异常。
  3. 在protect.policy文件添加以下授权语句,
代码语言:txt
复制
grant {
	permissionjava.io.FilePermission "c:/protect.txt", "read";
};

此时SecurityManager不为空,并且有权限读取protect.txt文件,但最终还是会抛一个AccessControlException异常,因为并没有权限读取file.encoding系统属性。

  1. 将protect.policy授权语句改为如下:
代码语言:txt
复制
grant {
	permissionjava.io.FilePermission "c:/protect.txt", "read";
	permissionjava.util.PropertyPermission "file.encoding", "read";
};

这次读取文件跟读取系统属性的权限都有了,程序正常运行,不再抛出安全异常。

由上面几种情况我们清晰了解安全管理器的使用,通过简单地配置策略文件能达到应用安全的管理。Java的Permission类是用来定义类所拥有的权限,Java本身包括了一些 Permission类,如下:

在这里插入图片描述
在这里插入图片描述

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提介绍
    • 安全管理器的作用
      • 安全管理机制
        • 检查操作权限
          • 开启安全管理器
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档