Tomcat 6 --- 你很少使用的安全管理SecurityManager

试想一下,如果你的JSP页面中包含一句代码“System.exit(1);”,你的web应用访问到该JSP时,会发生什么?

一般使用tomcat可能都没有注意到这个问题,本篇主要讲述tomcat 6中SecurityManager的管理机制,尽量使用简单明了的图片表示其中关系。

其他知识参考tomcat文档翻译。如有错误,请予指正。

理解java.policy

  Java是一门安全性很高的语言,因此也会考虑到用户代码对整个系统的侵入性。试想一下,如果你引用了一个jar包,里面包含了依据system.exit(),每次执行到这里都直接退出,会不会很蛋疼!

  Java开发者肯定想过如此的问题,所以引入了java安全策略机制,利用一个配置文件来管理所有的代码权限。

  JDK中就有这样的文件,就是  jre/lib/security/java.policy  ,参考下该文件,就能理解其中的关系:

// 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";
};

  上面给出了基本的权限,例如任何人都可以监听动态端口,以及一些读操作。

  基本过程如下面的图所示:

  用户如果启用了安全管理,即在执行时添加了-Djava.security.manager, 就会在执行某些操作前 先读取 权限文件java.policy,检查是否具体相应权限。

  当然也可以自己定义安全文件,一般有两种方式:

  一种是自己创建SecuirtyManager类,创建一些checkXXX的方法,进行验证;

  另一种就是创建my.policy文件(名字随意),按照规定的语法配置权限,然后启动时添加-Djava.security.manager-Djava.security.policy=xxxx/my.policy参数。

  关于java本身的安全管理不是本篇的重点,下面介绍下tomcat中的安全策略。

理解tomcat中的Security

  Tomcat中的安全管理原理基本与前面JDK中的security类似,只是启动时需要在start后面添加-security参数,tomcat会自动读取 conf/catalina.policy 文件中的权限配置。启动命令如下:

F:apache-tomcat-xxx/bin/startup.bat -security

  catalina.policy中默认已经配置了很多的安全策略,这里就不多说明了,下个部分会针对某一特定文件进行说明:

  这里需要注意的是其配置语法:

grant [signedBy <signer>,] [codeBase <code source>] {
  permission  <class>  [<name> [, <action list>]];
};

  都要按照上面的格式进行配置。其中:

  codeBase 是通过URL的方式指定文件,可以使用变量或者java.home或者{catalina.home}来表示JDK和tomcat的根目录。

  class 指定了相应的操作

  [name,[,action]] name指定具体的操作或者文件,action指定可选的动作(比如read write等等)。

  具体的配置样例,可以参考上面的默认文件。

  

  另外要说明的就是都可以配置哪些操作,也就是permission后面都可以跟哪些类,他们的作用都是什么?

  上面列表中,最常用的java.io.FilePermission用于文件的操作、java.lang.RuntimePermission(可以通过禁用该权限达到防止system.exit(1)的目的)等等。

Security配置实战

  在tomcat中配置security,可以按照下面几个步骤:

  1 在样例代码中执行特殊权限操作:

  当访问该页面时,会自动执行下面的代码,如果不具有相应的权限,会直接报错:

    //执行文件读操作,即java.io.FilePermission
    System.out.println(txt2String(file));
    //执行获取文件属性操作,即java.util.PropertyPermission
    System.out.println(System.getProperty("file.encoding"));

  2 配置安全策略文件catalina.policy:

  只需要在catalina.policy末尾添加如下的配置即可:

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

  3 在命令行中添加-security启动

  访问JSP执行代码,样例中访问 http://localhost:8080/JSPTest/securityTest.jsp

  可以看到控制台正常输出:

  对比下正常启动的输出,SecurityManager会输出null(此时,如果JSP中有system.exit(1);程序就会直接退出):

  如果没有配置读写文件的权限,会报错(注释掉安全配置的第一句):

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

  如果没有配置获取文件属性权限,则会报错:

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

  因此,如果在安全管理模式下,进行了越权的操作,就会报错有的甚至直接导致程序退出。

  通过报错信息,可以快速的知道缺乏什么权限,根绝该报错就可以方便的配置安全策略。

参考

【1】Java.security.policy文件:http://www.tmser.com/post-187.html

【2】Java安全管理器:http://bubuko.com/infodetail-306759.html

【3】tomcat 6.0 security manager:http://tomcat.apache.org/tomcat-6.0-doc/security-manager-howto.html

http://www.cnblogs.com/xing901022/p/4565730.html

时间: 2024-09-28 00:09:07

Tomcat 6 --- 你很少使用的安全管理SecurityManager的相关文章

Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 来源:知乎 这个问题quora上有人提过 What are some lesser known but useful Unix commands? ,已经有不少答案了,我个人已经从这些答案中学到不少,这里我只是照搬过来,然后加上自己的解释. lsof: 列出所有打开的文件.举例:'lsof -p

读《暗时间》的很多摘抄与很少感悟

一.如何思考与学习 1.思维之外的道理与知识,都是零 无论是从书上看到的,别人跟你讲的还是通过其他途径获得的道理,只要不是自己亲身经历过的,就很难真正理解,变为自己思维的一部分. 2.永远不要相信,“只要你……就一定能……” 宇宙是不稳定的,事情的结果受太多因素的影响,不仅仅是自身因素,环境也很重要.努力不一定会成功,坚持不一定会胜利,好好工作不一定能升职加薪. 但是自身因素比外界因素更加可控,改善自身因素是必要不充分的 3.反思 我们常常发现别人的问题,却难以发现自己的问题,因为我们很少会把自

12个很少被人知道的CSS事实

之前没有认真的研究过,padding-bottom的值如果是百分比,那么它的实际值是根据父类的宽度来调整的.我还以为是根据这个元素的本身的宽度来定义呢?汗..padding-top/padding-left/padding-right也是一样算. 不过现在有一个CSS3属性叫box-sizing,可以取值 box-sizing:content-box | border-box content-box: padding和border不被包含在定义的width和height之内.对象的实际宽度等于设

你总说时间很少

没时间看哭泣的骆驼 少了心情 没时间撩拨那爱的罗曼史 少了喜欢 没时间吮吸印度洋的水清沙白 少了勇敢 没时间寻找相伴的野马 少了感觉 可到最后 时间真的很少 有了喜欢 就少了心情 有了感觉 就少了勇敢

为什么我们想法很多,付诸行动的却很少?

"我想在学习或工作之余,学习一门爱好,绘画.吉他.游泳.外语或者烹饪,我想开一个微信公众账号:我想给杂志专栏投稿:我想自己做一些小生意:我想对这个居住了很多年的城市来一次深度主题游--" 你的内心是否曾经涌现过类似的声音.那么,首先恭喜你,你没有"习以为常"当下的生活,对生活仍有追求,渴望生活更丰富多彩,自我更丰富.完整.可是,这些声音,有多少已被你实现,有多少就这样虚呼飘渺地逝去,只偶尔在你想起它的时候,闪回心头,接着又飘忽不见? 对于我自己来说,我就属于典型的前

为什么很少看到有钱的程序员炫富 ?

事情是这样的. 小近逛知乎的时候,看到这样一个问题:“为什么很少见工资高的程序员炫富?”我一想,也是啊,便问了旁边的一个近乎开发人员,没想到他幽幽地来了一句:“炫富不如炫妹子”. 再看网上炫富的人,很少能看到程序员.豆瓣上曾组织过一个“高帅富程序员联盟炫富大赛”活动,最终也只有寥寥7人参加,晒的还都是代码. 为什么呢?难道真像他们说的:“长年累月的码字工作造就了内敛的性格?” 看看这些程序员都是怎么说的: 靖难 同学聚会时.王尼玛在国企,据说工资只有我五分之一,在市区买了一套房,买了个雷克萨斯代

很少人注意的暴利行业,月赚1万的6个小生意!普通人也很容易做!

不要认为月入过万很难!其实你如果认识的有老板的话,就只知道日入过万都很简单!但是对普通人来说成本都很大.今天给大家介绍几个普通人可以快速做的小生意! 第一是:开锁工!白手起家上海买房!小陈是个开锁匠.在这个行业工作了5年,技术很好.开锁上海收费都是100到400元!复杂的还要贵点!我过年的时间收快递,风一下子把门关了!叫了个开门的要350元,来了没有5分钟就开了!一天开个十个就是3000多啊!听他说在上海买房买车了啊! 很少人注意的暴利行业,月赚1万的6个小生意!普通人也很容易做!第二个是,卖煎

.Net开发八年,坐标杭州,上个月换工作感觉现在.Net岗位很少,希望和同在杭州的同行们交流一下

.Net开发八年,坐标杭州,中间做过2年Java, 目前新入职一家做防伪溯源的中型公司,200人左右, 之前在一家500人规模的软件公司工作过4年,后面2年工作过3家互联网创业公司, 上个月换工作感觉现在.Net岗位很少, 希望和同在杭州的同行们交流一下, 有时间大家可以约个饭,爬个山,或者找地方聚一下聊聊天... 微信号:hoperboy 原文地址:https://www.cnblogs.com/hoperboy/p/9838113.html

你的领导工作能力很强,凡事喜欢亲力亲为,平时给你安排的工作很少且指导不多,导致你感觉来了几个月无事可做、没有成长。对此,你怎么办?

例:你的领导工作能力很强,凡事喜欢亲力亲为,平时给你安排的工作很少且指导不多,导致你感觉来了几个月无事可做.没有成长.对此,你怎么办? 结合题干信息,当前要处理的关系是我与领导之间的上下级关系,面临一个核心问题是领导本身能力强,但是却不重视“我”,导致我在工作中无所适从.相信很多考生都是按照这个思维来理解题目,以至于掉入题目的陷阱.这个时候,需要我们跳出学生思维,结合实际去思考.第一,领导本身工作能力强,我们作为下属最直接的反应是什么,应该是很开心的,跟着这样的领导我们也会受到潜移默化的影响,个