参考资料

  该文中的内容来源于 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. 05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  2. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  3. [原]Redis主从复制各种环境下测试

    Redis 主从复制各种环境下测试 测试环境: Linux ubuntu 3.11.0-12-generic 2GB Mem 1 core of Intel(R) Core(TM) i5-3470 C ...

  4. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  5. 微信开发 :WeixinPayInfoCollection尚未注册Mch 问题解决

    在使用开源项目 SENPARC.WEIXIN SDK 调用微信支付接口的时候出现了WeixinPayInfoCollection尚未注册Mch,这个问题. 最后地解决方案是: 我这个傻逼忘了在全局Gl ...

  6. [转载]SQL语句中的日期计算

    1. 本月的第一天SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0) 2. 本月的最后一天SELECT  dateadd(ms,-3,DATEADD( ...

  7. 【一起学OpenFOAM】系列由来

    1 为什么要学习OpenFOAM 掐指算起来,接触CFD也差不多有十个年头了,其间一直使用的商用CFD软件,有Fluent.CFX.StarCCM+等,这些商用软件各有其优缺点,都能较好的解决常规的工 ...

  8. web前端开发分享-目录

    1. web前端开发分享-css,js入门篇 2. web前端开发分享-css,js进阶篇 3. web前端开发分享-css,js提高篇 4. web前端开发分享-css,js工具篇 5. web前端 ...

  9. mono for android学习过程系列教程(5)

    这一讲主要需要了解的安卓UI元素是Spinner.这个元素类似我们 winform和webform里面的下拉选项. 首先我们先建立一个新的项目,命名为SpinnerExample. 然后在Layout ...

  10. Ubuntu(Linux) + mono + jexus +asp.net MVC3 部署

    感谢  张善友 的建议,我把 微信订餐  由nginx 改成 jexus,目前运行状况来说,确实稳定了很多,再次感谢. 部署步骤参考 jexus官网:http://www.jexus.org/ htt ...