`
hongfei_sr
  • 浏览: 29811 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 安全 权限策略

阅读更多

java的能够成为众多企业中应用广泛的语言,除了完善,强大的功能之外,重要的还有它的安全性.
java设计了从程序编写,编译,类加载过程,执行的每一步都进行安全检查.
这里简要说一下java的安全管理器和访问权限
"安全管理器是负责控制某个操作是否允许执行的类."

 

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

  •     创建一个新的类加载器
  •     退出虚拟机;
  •     使用反射访问另一个类的成员;
  •     访问本地文件;
  •     打开socket连接;
  •     启动打印作业;
  •     访问系统剪贴板;
  •     访问AWT时间队列;
  •     打开一个顶层窗口.

    整个java类库中还有许多其他类似的检查.

需要注意的是,在运行java应用程序是,默认的设置是不安装安全管理器的,这样所有的操作都是允许的.另一方面,applet浏览器会执行一个功能受限的安全策略.

 

它的安全策略建安里了代码来源和访问权限集之间的映射关系.

以文件访问权限为例

安全策略文件

策略类需要读取响应的安全策略文件,这些文件包含了将代码来源映射为权限的指令.
在我们的jdk中默认有两个地方可以安装安全侧路文件:

    java平台主目录的java.policy文件
    用户主目录的.java.policy文件(注意文件名前面的圆点)
    注意:可以在java.security配置文件中修改这些文件的位置,默认位置设定为

policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
 

 

另外一种方式是为每一个应用程序配置显示的策略文件.

(策略文件格式参考官方文档 )

 

启用策略文件有两种方法,一种是在应用程序的main方法内部设置系统属性:

 

    1.

System.setProperty("java.security.policy", "app.policy");


    2. 虚拟机命令行启动参数

java -Djava.security.policy=app.policy App
 

      对于applet

applietviewer -J-Djava.security.policy=app.policy applet.html
 

    在这些例子中,app.policy文件被添加到了其他有效的策略中.如果再命令行中添加了第二个等号,比如:

java -Djava.security.policy==app.policy App
 

    那么应用程序就只是用指定的策略文件,而标准的策略文件将被忽略.

 

前面说,默认java是不安装安全管理器的.因此,在安装安全管理器之前,看不到策略文件的作用.
所以启用要启用安全管理器,一可以在main方法中添加:

 

System.setSecurityManager(new SecurityManager());
 


    或者在启动虚拟机的时候添加命令行选项-Djava.security.manager

java -Djava.security.manager -Djava.security.policy=app.policy App

 

针对文件访问file permission

java.io.FilePermission 有read, write, execute 和delete四个操作

另外一个注意的地方是:
    代码总是可以读取自身所在目录(或该目录的子目录)中的文件,不需要对其进行显式授权。(since JDK API 1.2)
就是说默认情况下代码总是对自身目录的文件有可读权限,但是其他write, execute 和delete权限是没有的.

"每个类都有个保护域,它是用于封装类的代码来源和权限集合的对象.当SecuritManager类需要检查某个权限是,它要检查看当前位于调用堆栈上的所有方法的类,然后它获得所有类的保护域,并且询问每个保护欲,该域的权限集合是否允许执行当前正在被检查的操作.如果所有的域都同意,那么检查得以通过.否则,就会抛出一个SecurityManager异常."
 



这里我和搭档的测试方法是测试应用程序目录的上一个目录中的一个目录的权限.

策略文件和应用程序文件在同一目录
    PermissionTest.policy

    grant {
        permission java.util.PropertyPermission "user.dir", "read";
        permission java.io.FilePermission "../test", "write";
    };
 


需要说明的是,user.dir 这个property的读权限因为需要在应用程序中获得上级目录需要使用的java.io.File的方法,但是在执行过程中出现报错,user.dir不可读.所以应该是File的方法使用到了user.dir这个property,所以在这里也把这个权限加上.

    响应的java.util.PropertyPermission权限可参考java目录中的java.policy文件响应内容,注意其中并没有user.dir属性目标.

同时,我们对测试程序本身目录中的文件进行了测试.

测试程序
    PermissionTest.java

import java.io.FilePermission;
    import java.io.File;

    public class PermissionTest {
        public static void main(String[] args) {
           
            SecurityManager manager = System.getSecurityManager();
           
            File f = new File("");
            System.out.println(System.getProperty("user.dir"));
            System.out.println(f.getAbsoluteFile().getParent());
           
            try{
                manager.checkRead("../test");
                System.out.println("读权限可用!");
            } catch (SecurityException e) {
                System.out.println("读权限不可用!");
                System.out.println(e.getMessage());
            }
           
            try{
                manager.checkWrite("../test");
                System.out.println("写权限可用!");
            } catch (SecurityException e) {
                System.out.println("写权限不可用!");
                System.out.println(e.getMessage());
            }
           
            try{
                manager.checkDelete("../test");
                System.out.println("删除权限可用!");
            } catch (SecurityException e) {
                System.out.println("删除权限不可用!");
                System.out.println(e.getMessage());
            }
           
            try{
                manager.checkExec(f.getAbsoluteFile().getParent() + File.separator + "test");
                System.out.println("执行权限可用!");
            } catch (SecurityException e) {
                System.out.println("执行权限不可用!");
                System.out.println(e.getMessage());
            }
           
            System.out.println("=======检查应用程序本身目录文件权限=======");
            try{
                manager.checkRead("TEM");
                System.out.println("TEM 读权限可用!");
               
            } catch (SecurityException e) {
                System.out.println("TEM 读权限不可用!");
                System.out.println(e.getMessage());
            }
           
            try{
                    manager.checkWrite("TEM");
                System.out.println("TEM 写权限可用!");
               
            } catch (SecurityException e) {
                System.out.println("TEM 写权限不可用!");
                System.out.println(e.getMessage());
            }
           
            try{
                manager.checkDelete("TEM");
                System.out.println("TEM 删除权限可用!");
               
            } catch (SecurityException e) {
                System.out.println("TEM 删除权限不可用!");
                System.out.println(e.getMessage());
            }
           
            try{
                manager.checkExec(System.getProperty("user.dir") + File.separator + "TEM");
                System.out.println("TEM 执行权限可用!");
            } catch (SecurityException e) {
                System.out.println("TEM 执行权限不可用!");
                System.out.println(e.getMessage());
            }

            System.out.println("Fine.");
           
        }
    }
 


还需要说明的是检查执行权限的checkExec方法,参见JDK API

public void checkExec(String cmd)
……
如果 cmd 是绝对路径,那么此方法使用 FilePermission(cmd,"execute") 权限调用 checkPermission,否则用 FilePermission("<<ALL FILES>>","execute") 权限调用 checkPermission。
……
 

所以,checkExec需要使用绝对路径文件来调用.
当然可以通过checkPermission(Permission p)来检查,这样就不涉及到绝对路径的问题.

命令行执行测试:

java -Djava.security.manager -Djava.security.policy==PermissionTest.policy PermissionTest 
 

修改policy文件及测试程序,可以看到不同权限的变化.

 

--参考资料《JAVA核心技术(Core Java)》原书第8版

1
1
分享到:
评论
1 楼 lliiqiang 2014-06-24  
其实都是基于先决条件的安全策略,不能否定条件.相信自己的判断,对外要隐瞒内部结构.

相关推荐

    Java安全权限控制机制研究综述.pdf

    通过对java安全体制中权限控制机制的研究,探讨了java安全管理器、权限类、安全策略文件、自定制权限类等底层技术,提出通过这些技术,程序员可以细致的控制各个安全访问权限。

    flex+java+tomcat实现socket通信及安全策略

    /********** 本例子是本人参考网上的例子,重新整理和修改的例子,非常简单和具有针对性****/ 1.背景:Flex Socket通信及安全策略,使用flex实现客户端,java实现...需要在java服务端开通843权限策略,具体看例子源码

    jdk1.8.0-xx,下载无限强度权限策略文件补丁包

    使用Java加载密钥时,抛出异常...其他版本,下载无限强度权限策略文件补丁包,并使用其中的文件覆盖$JAVA_HOME/lib/security目录下的对应的local_policy.jar 和 US_export_policy.jar Java9及以上,均无限制。

    JAVA的数据权限设计.docx

    数据权限策略优化 JAVA的数据权限设计全文共3页,当前为第2页。 JAVA的数据权限设计全文共3页,当前为第3页。数据权限同样属于权限范畴,每次访问都会去请求验证权限,所 以权限的认证必须要高效,这时可以写算法...

    IT安全策略汇总-安全中国

    创建Java安全框架 避免Java漏洞被利用 企业该如何防范攻击者利用多个零日攻击? Stuxnet蠕虫攻击方法简介 企业如何避免遭受零日攻击或未知恶意程序攻击? 蜜罐技术:如何跟踪攻击者的活动?(上) 蜜罐技术:如何...

    基于Java的两个通用安全模块的设计与实现

    基于Java的两个通用安全模块的设计与实现简介 随着信息技术的飞速发展,系统安全成为了软件开发中不可忽视的重要环节。为了确保数据的安全性和完整性,基于Java的两个通用安全模块被设计与实现,分别为身份验证模块...

    Java源码(jee)

    Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE),在线代码生成功能,包括核心模块如:组织机构、角色用户、菜单及按钮授权、数据...

    java编程开发社区安全模块优化管理系统的毕业设计实现.zip

    在设计访问控制策略时,需要考虑不同用户的权限和角色,并确保他们只能访问其所需的信息和功能。 3.应用最佳实践:在开发安全模块优化管理系统时,需要应用最佳安全实践和标准。例如,您可以遵循OWASP(开放式网络...

    Java EE 企业级快速开发平台 jeesite

    Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE),在线代码生成功能,包括核心模块如:组织机构、角色用户、菜单及按钮授权、数据...

    设计一个java开放平台的总结

    因此需要设计合理的安全和合规策略,包括用户身份验证、数据加密、访问控制等。 技术支持和服务:开放平台需要提供良好的技术支持和服务,包括问题解决、技术支持、版本更新等方面。因此需要设计合理的技术支持和

    蚂蚁java架构师第七/八期含项目

    08.基于策略模式重构多重if判断(124分钟) 02架构师必备安全技能 09.如何防御XSS攻击与防止抓包篡改数据01(124分钟) 09.如何防御XSS攻击与防止抓包篡改数据02(63分钟) 10.springsecurity实现动态权限控制(63分钟) 11....

    Java毕业设计-java+mysql crm客户关系管理系统.rar

    3. 安全性:系统采用了严格的权限控制机制,确保数据的安全性和保密性。 4. 可扩展性:系统具有良好的可扩展性,可以根据企业的发展需求进行功能的扩展和升级。 本系统适用于各类企业,特别是需要加强客户关系管理...

    网络安全之安全编码.docx

    除了以下为特定编程语言建立的协议外,个别程序员可以在安全编码中使用各种策略。这些策略可以包括编码的一致性和清晰性,以限制混淆,并使其他程序员能够使用相同的代码。网络安全之安全编码全文共2页,当前为第2页...

    SQL注入攻击与防御(安全技术经典译丛)

     4.7 提升权限  4.7.1 SQL Server  4.7.2 Oracle  4.8 窃取哈希口令  4.8.1 SQL Server  4.8.2 MySQL  4.8.3 Oracle  4.9 带外通信  4.9.1 E-mail  4.9.2 HTTP/DNS  4.9.3 文件系统  4.10 ...

    Java核心技术II(第8版)

    9.3.2 安全策略文件 9.3.3 定制权限 9.3.4 实现权限类 9.4 用户认证 9.4.1 JAAS 登录模块 9.5 数字签名 9.5.1 消息摘要 9.5.2 消息签名 9.5.3 X.509证书格式 9.5.4 校验签名 9.5.5 认证问题 9.5.6 证书签名 9.5.7 ...

    主住机安全作业指导书——身份鉴别、访问控制、安全审计、剩余信息保护、资源控制

    是否启用访问控制功能,依据安全策略控制用户对资源的访问;2.是否根据管理用户的角色分配权限,实现管理用户的权限分离,仅授管理用户所需的最小权限;3.是否实现操作系统特权用户的权限分离;4.是否限制默认账户的...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    是一个低代码 全栈类 框架,它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能

    对象视图模型 ,零前端代码、零代码生成、零SQL、零API声明、零DTO / VO / BO 创建,表结构注释自动生成 内置严密安全策略,细颗粒权限隔离 , Cloud开发能力,不停机升级,轻依赖,集群内每个服务都可以轻松实现...

    统一身份认证管理平台介绍

    3、统一认证身份系统总体设计(总体架构图、身份认证平台功能结构、管理员三权分立原则、系统部署设计普通模式及集群模式、丰富的认证扩展机制、多角度的权限管理、多样化的数据同步服务、灵活的授权策略、丰富的...

Global site tag (gtag.js) - Google Analytics