Tomcat的系统安全管理

Tomcat是一个Web容器,我们开发的Web项目运行在Tomcat平台,这就好比将一个应用嵌入到一个平台上面运行,要使嵌入的程序能正常运行,首先平台要能安全正常运行。并且要最大程度做到平台不受嵌入的应用程序影响,两者在一定程度上达到隔离的效果。Tomcat与Web项目也是要最大程度隔离,使Tomcat平台足够安全。
我们先看看Tomcat可能存在哪些安全威胁。
(1) 在web应用的jsp页面或Servlet中使用System.exit(1);
假如你是一个老板,但是平时对待员工苛刻,工资又老是不准时发,承诺给员工的福利又做不到,所有员工敢怒不敢言,在背后严重鄙视你。小明实在看不下去准备离职了,他觉得要做点事情报复下你这没人情味的老板,作为程序员的他,于是敲起了几行代码作为离别礼物:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2019-01-01 00:00:00");
Date now = new Date();
if (now.after(date)){
    System.exit(1);
}
在Servlet中的这几行代码,平时运行一点事情都没有,但是他就像个定时炸弹,在小明庆祝他离职五周年时,你的公司的系统就时不时得停止服务,并且还很难找出问题的所在。
(2) 在web应用中调用Tomcat内部核心代码实现类,特别是静态类;
Tomcat中有些代码是可以给外部调用,而有些核心代码为避免给Tomcat带来威胁甚至是崩溃的危险,需要控制外部程序的访问。
以上两种情况,都可能在Tomcat运行时导致Tomcat罢工。针对这些情况,我们有必要使用SecurityManager来保护服务器不受类似木马的servlet、jsp和标签库等得影响,使服务器多一层保护,能运行地更加安全可靠。
    Tomcat中有一般会使用到的权限许可有以下这些:
 java.util.PropertyPermission - 控制读/写Java虚拟器的属性,如java.home。
 java.lang.RuntimePermission - 控制使用一些系统/运行时(System/Runtime)的功能,如exit()和exec()。它也控制包(package)的访问/定义。
 java.io.FilePermission - 控制对文件和目录的读/写/执行操作。
 java.net.SocketPermission - 控制使用网路sockets连接。
 java.net.NetPermission - 控制使用multicast网路连接。
 java.lang.reflect.ReflectPermission - 控制使用reflection来对类进行检视。
 java.security.SecurityPermission - 控制对安全方法的访问。
 java.security.AllPermission - 给予所有访问权限。

毫无疑问,为了保证Tomcat的安全性,Tomcat启动时也开启了安全管理器,它采用的是默认的安全管理器——SecurityManager。在Tomcat启动的批处理文件中能找到-Djava.security.manager -Djava.security.policy==%CATALINA_BASE%\conf\catalina.policy,但Tomcat并没有使用默认的策略文件,而是指定一个catalina.policy作为策略文件。下面列出Catalina.policy文件有代表性的授权语句:
grant codeBase "file:${java.home}/lib/-" {
    permission java.security.AllPermission;
};
grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" {
permission java.io.FilePermission "${catalina.base}${file.separator}logs", "read, write";
    permission java.lang.RuntimePermission "shutdownHooks";
    permission java.util.PropertyPermission "catalina.base", "read";
};
grant {
    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat";
};
上面有三个grant语句,第一个授权表示的意义比较简单,java安装路径下的lib目录及其子目录下的jar包拥有所有的权限。符号说明:*表示所有文件,-表示所有文件及其子目录下的文件。第二个grant是对Tomcat安装路径下bin目录的tomcat-juli.jar包进行授权,包括对tomcat安装目录下logs目录的读写权限、关闭钩子权限、catalina.base系统变量的读取权限。第三个grant表示授权对org.apache.tomcat包里面的类访问权限。
针对accessClassInPackage权限有必要展开详细讲解,还有一个类似的权限defineClassInPackage,由于默认的情况下是所有包都是可以被访问调用的,如果要对一些包进行访问控制,可通过以下几个步骤使应用具备这两种权限的安全检查。
首先,设置安全属性,告诉安全管理器哪些包需要进行访问权限检查,Security.setProperty
("package.definition","需要检查的包,多个包用逗号分隔")、Security.setProperty("package.access", "需要检查的包,多个包用逗号分隔")。
其次,配置策略文件policy,对指定类或包配置访问指定包的权限,例如
grant codeBase "file:${catalina.home}/webapps/manager/-"{
permission java.lang.RuntimePermission"accessClassInPackage.org.apache.tomcat";
};
指定${catalina.home}/webapps/manager/目录及其子目录下得文件都有访问org.apache.tomcat包的权限。格式是"accessClassInPackage.包路径"。
最后,如果你想检查此类是否有某个包的访问权限,可以显式地使用System.getSecurityManager(). checkPackageAccess("包路径");否则会在类加载器加载某个类时由loadClass方法触发权限检查。如果没权限则抛出SecurityException异常。
package.definition跟package.access这两种权限都是对包进行保护,从整体上保护一个包以避免不可信任代码的访问。其一,如果不可信任代码想要访问类的包保护成员,可能通过在被攻击的包内定义自己的新类用以获取这些成员的访问权的方式,这种方式叫包注入。针对包注入可以向package.definition属性添加需要保护的包,当检测到代码试图在包内定义新类时,类装载器的defineClass方法会抛出异常,以此达到防止包被恶意注入。可通过将包配置为RuntimePermission("defineClassInPackage."+package)给予权限。其二,为防止不可信代码对包进行访问,可通过限制包访问但同时赋予特定代码的访问权限,向package.access属性添加需要保护的包,当检测到代码试图访问上述包中的类时,类加载器的loadClass方法会抛出异常,以此达到包的访问限制。把RuntimePermission("accessClassInPackage."+package)权限赋予某个包即可实现其访问权限。
类装载器中的defineClass跟loadClass这两个方法比较奇特,如果想要深入了解可以研究JDK的类加载器的加载机制,从本书第二部分关于类加载器中知道,简单地说,每个类被加载器加载时都会调用loadClass方法,loadClass会进行如下判断:①从内存中查找此类是否已经加载,如已加载直接返回此类。②如果存在父类加载器,就委派给父类加载器加载。③如果不存在父类加载器,就尝试由启动类加载器加载。④如果以上三种方法都无法加载此类,才调用这个加载器类的findClass方法,此方法再调用defineClass方法。
在Tomcat启动过程中,当实例化Catalina类的时候(构造函数),就完成了package.definition跟package.access的安全属性设置,图3-1-5-3为SecurityConfig类图,此类通过读取catalina.properties中的属性完成设置,其中两个属性为
package.access
=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
package.definition
=sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
即以上这些包都需要进行权限检查。此类设置属性时并非直接设置,而是先读取系统已有的安全属性的值,然后再把这些包追加到后面。例如,先String access = Security.getProperty("package.access");
再Security.setProperty("package.access",access+","+"sun.,org.apache.catalina,…");
 

在Tomcat中,当启动了SecurityManager进行安全管理时,有些类是必须要使用的类,为避免由安全管理器导致运行到一半抛AccessControlException异常,在启动一开始就预先加载一些类,以此检查是否存在某些类读取的权限问题。SecurityClassLoad类负责对一些类进行预加载。

点击订购作者《Tomcat内核设计剖析》

时间: 2024-10-03 12:35:13

Tomcat的系统安全管理的相关文章

jsp+tomcat+mssql系统的配置

js jsp+tomcat+mssql系统的配置程序说明:使用数据库为sqlserver,开发语言java.1 创建数据库:1.1 启动sqlserver,1.2 运行企业管理器.1.3 创建childrenbooks数据库,1.4 物理数据库名1.5 称:childrenbooks_Data.MDF,1.6 数据库日志:childrenbooks_Log.LDF:保存在实践目录下.1.7 创建表:user_table (idx为主键)idx int 4 非空 主键user_id char 16

75篇关于Tomcat源码和机制的文章

整理下前面写过的75篇关于Tomcat源码和机制的文章 文章列表 如何设计一个Web容器 Web安全认证机制知多少 Tomcat集群实现源码级别剖析 Tomcat集群如何同步会话 从单机到集群会话的管理之集群模式一 从单机到集群会话的管理之集群模式二(更大的集群) Tomcat集群的failover机制 Tomcat集群应用部署的实现机制 Tomcat集群机制剖析及其生产部署选型 Tomcat如何实现WebSocket Tomcat如何实现Comet Tomcat怎么实现异步Servlet To

Linux系统如何设置安全管理

Linux是一款免费传播类操作系统,Linux系统进程在一定条件下可以对任何文件.数据库等进行操作.如果此进程被不法分子用作其他不法用途,将会给系统带来重大危害.作为服务器中占绝大多数市场份额的Linux系统,在此前提下必须的保证计算机系统的安全,所以我们不得不对其进程要进行安全管理.那如何设置Linux系统安全管理呢? 下面就是设置系统安全管理的步骤: 1.引导程序安全 Linux系统的root密码是很容易破解的,当然前提是你没有设置引导程序密码,如GRUB或LILO,为了防止通过引导程序破译

linux系统tomcat重启老是端口被占用

问题描述 linux系统tomcat重启老是端口被占用 linux上的tomcat java网站更新,./startup.sh查看日志发现是端口被占用,然后查使用端口的 线程,kill掉,再次启动还是端口被占用,已经纠结两天了,求大神解答! 解决方案 http://jingyan.baidu.com/article/67662997372ecc54d51b8423.html 解决方案二: 那就要看那个进程为 ui 什么老是启动,是不是常驻进程 解决方案三: 你查出来占用端口的是什么程度没有? 参

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

试想一下,如果你的JSP页面中包含一句代码"System.exit(1);",你的web应用访问到该JSP时,会发生什么? 一般使用tomcat可能都没有注意到这个问题,本篇主要讲述tomcat 6中SecurityManager的管理机制,尽量使用简单明了的图片表示其中关系. 其他知识参考tomcat文档翻译.如有错误,请予指正. 理解java.policy Java是一门安全性很高的语言,因此也会考虑到用户代码对整个系统的侵入性.试想一下,如果你引用了一个jar包,里面包含了依据s

深入理解Tomcat系列之一:系统架构

前言 Tomcat是Apache基金组织下的开源项目,性质是一个Web服务器.下面这种情况很普遍:在eclipse床架一个web项目并部署到Tomcat中,启动tomcat,在浏览器中输入一个类似http://localhost:8080/webproject/anyname.jsp的url,然后就可以看到我们写好的jsp页面的内容了.一切都是那么自然和顺理成章,然而这一切都是源于tomcat带给我们的,那么在tomcat背后,这一切又是怎么样发生的呢?带着对tomcat工作原理的好奇心,我决定

深入理解Tomcat系列之一:系统架构(转)

前言 Tomcat是Apache基金组织下的开源项目,性质是一个Web服务器.下面这种情况很普遍:在eclipse床架一个web项目并部署到Tomcat中,启动tomcat,在浏览器中输入一个类似http://localhost:8080/webproject/anyname.jsp的url,然后就可以看到我们写好的jsp页面的内容了.一切都是那么自然和顺理成章,然而这一切都是源于tomcat带给我们的,那么在tomcat背后,这一切又是怎么样发生的呢?带着对tomcat工作原理的好奇心,我决定

初学者入门:Tomcat在Win2000下的安装

初学 一.Tomcat简介 自从JSP发布之后,推出了各式各样的JSP引擎.Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet.这样,Tomcat就诞生了.Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载.Tomcat与Apache的组合相当完美. 二.安装前的准备 在安装Tomcat前,你的Win2000下应该已经安装了Apache和JDK,并且你应该已经能大致了

Tomcat在Windows 2000下的安装配制

window 一.Tomcat简介 自从JSP发布之后,推出了各式各样的JSP引擎.Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet.这样,Tomcat就诞生了.Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载.Tomcat与Apache的组合相当完美. 二.安装前的准备 在安装Tomcat前,你的Win2000下应该已经安装了Apache和JDK,并且你应该已经