参考资料

  该文中的内容来源于 Oracle 的官方文档。Oracle 在 Java 方面的文档是非常完善的。对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentation 开始寻找感兴趣的内容。本博客不定期从 Oracle 官网搬砖。

前言

  Java 在 Security 方面的特性,总是被很多人当做宣传的重点,但是对我而言,这基本上是八百年都用不到一次的特性。可是没办法,为了知识体系的完整性,我也不得不硬着头皮学习这些八竿子都打不着的内容。

  很多 Java 程序默认在一个安全的环境中运行,比如 Applet程序。当这些在安全环境中运行的程序需要访问我们系统中的资源时,就会受到限制。换句话说,就是当 Applet 之类的程序运行时,默认就会启动一个 SecurityManager,SecurityManager 负责检查该程序是否具有相应的权限。但是很多 Java 程序不会默认启动 SecurityManager,比如大部分在我们系统中直接运行的 Java 程序。没有启用 SecurityManager 的程序的权限不会受到限制,如果存在恶意代码的话,就会产生安全问题。如果我们非要放宽对它们的限制的话,就需要对相应的 Java 程序进行授权,授权需要用到 Policy File。

没有启用 SecurityManager 的程序可以访问系统中的任意资源

  废话少说,直接开始实战。先看两个示例程序,GetProps.javaCount.java,它们一个需要访问 Java 运行环境中的 Properties,一个需要读取磁盘上的文件。代码如下图:

  编译、打包、运行,这两个程序的运行结果非常符合预期,如下图:

  从上图中可以看出,我在打包的时候没有使用 jar-e 选项指定程序的入口点,只是简单的把所有的 .class 打成一个 jar 包而已。运行的时候使用 java -cp HelloWorld.jar 将该 jar 包指定为 CLASSPATH 并直接运行其中的类。其实这里的程序不打包也可以运行,但是要对程序进行签名,就必须得打包了。

启用了 SecurityManager 的程序权限会被限制

  如果启用 SecurityManager,则程序的权限会受到限制。怎么启用 SecurityManager 呢?有两个办法,一个办法是在启动程序的使用使用 java -Djava.security.manager 选项,另一个办法是在代码中使用 System.setSecurityManager(new SecurityManager());。先看下图,使用第一种办法开启 SecurityManager:

  可以看到,一旦使用 java -Djava.security.manager 选项启动,程序 GetPropsCount 都产生了异常。我们也可以在代码中启用 SecurityManager,也可以手动调用 SecurityManager 的方法来验证运行的程序是否具有相应的权限。请看下图示例程序 SecurityOnByCode.java

  编译、打包、运行,果然产生了异常,如下图:

使用 Policy File 为程序授权

  如果要让启用了 SecurityManager 的程序正常运行,就必须对它们进行相应的授权。在本例中,需要对 GetPropsSecurityOnByCode 示例程序授予它访问 System Properties 的权限,为 Count 示例程序授予访问目录 src/com/xkland/sample 中文件的权限。授权是使用 Policy File 来控制的。系统中有一个全局的 Policy File,它的路径是 ${java.home}/lib/security/java.policy,另外还可以为当前用户定义一个用户级别的 Policy File,只要这个文件的路径是 ${user.home}/.java.policy 就行。也可以编写其它的任意的 Policy File,只需要在启动程序的时候用 java -Djava.security.policy= 选项指定 Policy File 的路径即可。

  在 JDK 提供的工具中,有一个 policytool,这是一个 GUI 程序,它可以极大地简化我们编写 Policy File 的过程,后面的实战中会用到它。首先,先来为需要访问 System Properties 的程序授权,我制定一个这样的策略:位于 ${user.home}/HelloJavaWorld 目录下的程序可以访问 System Properties,这就需要用到基于 CodeBase 的授权。在本例中,我使用 policytool 创建一个 youxia.policy 文件,并基于 CodeBase 授予相应的访问 System Properties 的 java.util.PropertyPermission,如下图:

  可以使用 cat youxia.policy 命令查看生成的 Policy File 的内容。授权之后再运行 GetProps 程序和 SecurityOnByCode 程序,发现它们都能顺利运行,没有产生任何异常,如下图:

  但是另外一个程序 Count 仍然受限的,因为我们没有给它授予访问文件的权限。下面来解决这个问题,我设计的策略是如果该程序是被 youxia 的证书签名的,则授予它访问 src/com/xkland/sample 目录下所有文件的权利。这就需要用到基于 SignedBy 的授权。使用该类型的授权必须先指定密钥库(keystore),而密钥库的类型、供应方和口令是可以留空的,如下图:

  然后再添加相应的授权,如下图:

  最后来看运行效果。先常规使用 cat youxia.policy 看看,发现 Policy File 中多了一个 Grant SignedBy "youxia" 的条目,然后对 HelloWorld.jar 使用 youxia 的证书进行签名,最后运行程序,结果一切正常。如下图:

总结

  Java 领域中一些关于安全的特性往往是商家宣传的重点,但是对于我们普通开发者而言,用到这些特性的机会很少,因此往往会比较陌生。关于证书和密钥库的内容,请看这里 JDK中的证书生成和管理工具keytool, 关于 jar 文件签名和验证的内容,请看这里 Java程序的打包、签名和验证。这一篇中涉及到的 SecurityManager 和 Policy File 本身并不难,按我这个实战的流程走一遍即可了然于胸。

使用 SecurityManager 和 Policy File 管理 Java 程序的权限的更多相关文章

  1. Java 监控基础 - 使用 JMX 监控和管理 Java 程序

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章. 此篇文 ...

  2. JMX——以可视化形式管理与监控正在运行中的Java程序

    简单理解: MBean:管理的最小单元,一个MBean就是一个可以被监控的JavaBean. MBeanServer:一个池子,各个MBean都会注册到该池子中,并且该池子提供一系列的管理.监控API ...

  3. Java程序员必须熟知的十项技术

    1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...

  4. Linux上Makefile管理java项目

    前面文章讲到了Linux上通过.spec文件与rpmbuild命令将java程序打包为RPM安装包, 现阶段遇到新的需求: 使用Makefile来操纵java的编译.打包 该需求以前面的内容为基础 可 ...

  5. 读书笔记一 Java程序员的基本修养(数组及其内存管理)

    1.1 数组初始化 1.1.1 java数组是静态的 java数组被初始化之后,该数组所占的内存空间.数组长度都是不可变的. java程序中的数组必须经过初始化才可使用. 数组的初始化有两种方式: 1 ...

  6. spark之java程序开发

    spark之java程序开发 1.Spark中的Java开发的缘由: Spark自身是使用Scala程序开发的,Scala语言是同时具备函数式编程和指令式编程的一种混血语言,而Spark源码是基于Sc ...

  7. [转载]一个标准java程序员的进阶过程

    第一阶段:Java程序员 技术名称 内                 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...

  8. Java程序性能优化Tip

    本博客是阅读<java time and space performance tips>这本小书后整理的读书笔记性质博客,增加了几个测试代码,代码可以在此下载:java时空间性能优化测试代 ...

  9. 《Java程序员修炼之道》

    原子类:java.util.concurrent.atomic 线程锁:java.util.concurrent.locks 对付死锁:boolean acquired = lock.tryLock( ...

随机推荐

  1. React 入门教程

    React 起源于Facebook内部项目,是一个用来构建用户界面的 javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组件内 ...

  2. java Web项目创建之一(普通java web项目的创建与发布)

    1.创建新的web项目 file->new_>Dynamic Web Project(如图) 或file->new->Project->Web->Dynamic W ...

  3. ExtJS 4.2 Grid组件的单元格合并

    ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid ...

  4. 前端学HTTP之日志记录

    前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...

  5. [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Wen. ...

  6. 原生javascript 固定表头原理与源码

    我在工作中需要固定表头这个功能,我不想去找,没意思.于是就写了一个,我写的是angularjs 自定义指令 起了个 "fix-header" ,有人叫  "freeze- ...

  7. WebGIS中等值面展示的相关方案简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值面是气象.环保等相关项目上常用到的效果展示.在传统的CS项 ...

  8. 卸载oracle之后,如何清除注册表

    之前卸载了oracle,今天偶然间发现,在服务和应用程序里面,还残存着之前的oracle服务.原来,还需要去清理下注册表. 在开始菜单的这个框里面 输入regedit,进入注册表.找到这个目录 HKE ...

  9. http status code

    属于转载 http status code:200:成功,服务器已成功处理了请求,通常这表示服务器提供了请求的网页 404:未找到,服务器未找到 201-206都表示服务器成功处理了请求的状态代码,说 ...

  10. kali linux下的arp攻击

    这是我第一篇博客,写的不好请谅解 ____________________________(分割线)_______________________________ 在kali linux系统下自带工具 ...