Tomcat 安全配置与性能优化

Tomcat 是 Apache软件基金会下的一个免费、开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定、扩展性好、免费等特点深受广大用户喜爱。目前,很多互联网应用和企业应用都部署在 Tomcat 服务器上,比如我们公司,哈。

之前我们 Tomcat 都采用的是默认的配置,因此在安全方面还是有所隐患的。上周对测试环境的所有服务器的Tomcat都做了安全优化,其间也粗略做了一些性能优化,这里就简单记录分享下!

一、版本安全

升级当前的tomcat版本为最新稳定版本。故名思议,最新稳定版本就要兼顾最新和稳定这两个概念。一个稳定的版本,是需要时间沉淀的,而最新又是相对于稳定版而言的最新。因此我们一般会选择当前大版本中,最新版本往前推几个版本或者往前推几个月出的版本。

目前,企业常用的tomcat大版本为6.0和7.0版本,8.0版本虽然已经出了很久了,但是仍然不建议使用。

在升级版本中,需要注意的事情有两点:

1、尽量避免跨大版本的升级

2、将当前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件进行备份,然后部署完新版本的 tomcat 之后,将这些配置文件覆盖过去即可,然后停掉旧版本,启动新版本即可完成升级操作。

二、隐藏版本信息

为了避免黑客针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息。

默认 Tomcat 的版本信息如下:

针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 catalina.jar。

我们可以通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,通过修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段来实现来更改我们tomcat的版本信息。

文件信息如下:

[root@localhost ~]#  cat org/apache/catalina/util/ServerInfo.properties |grep -v ‘^$|#’

server.info=Apache Tomcat/7.0.53

server.number=7.0.53.0

server.built=Mar 25 2014 06:20:16

当然,还有另外一种方法来实现隐藏或伪装Tomcat的版本信息,不过本质和上面一样,操作如下:

[root@localhost ~]# cd /usr/local/apache-tomcat-7.0.53/lib

[root@localhost lib]# mkdir -p org/apache/catalina/util

[root@localhost lib]# cd org/apache/catalina/util

[root@localhost util]# vim ServerInfo.properties

server.info=nolinux        # 如果想修改成其它版本号,把这个地方的值改成其它值就行了

修改完毕之后,重启 Tomcat即可看到效果!

效果如下:

三、优化 web.xml

servlet与其它适用于整个Web应用程序设置的配置文件,必须符合servlet规范的标准格式。通过它可以配置你web应用的相关选项,tomcat在启动的时候会读取这个文件,完成你开发的系统的一些初始化操作。

它可以做如下事情:

1、提供基于 servlet 的相关配置

2、增加监听器,监控session或在tomcat启动时,加载一些你希望加载的资源。比如创建数据库连接池等等

3、设置session过期时间,tomcat默认是30分钟

4、更改应用的默认网页,常用为index.html/index.jsp等

5、增加过滤器,做一些你希望的过滤操作,比如敏感词汇的过滤

6、增加一些 jstl(标准标签库)的定义,方便在jsp中直接includ进来,直接使用这些标签

7、struts,spring或hibernate的一些配置等等

下面摘录下O’REILLY 的《Tomcat 权威指南》(Tomcat权威指南(第2版) PDF扫描版 下载见 http://www.linuxidc.com/Linux/2015-02/113062.htm)中的一段话:

web.xml 的文件格式定义在 Servlet 规范中,因此所有符合 Servlet 规范的 Java Servlet Container 都会用到它。当 Tomcat 部署应用程序时(在激活过程中,或加载应用程序后),它都会读取通用的conf/web.xml,然后再读取web应用程序中的WEB-INF/web.xml。其实根据他们的位置,我们就可以知道,conf/web.xml文件中的设定会应用于所有的web应用程序,而某些web应用程序的WEB-INF/web.xml中的设定只应用于该应用程序本身。

如果没有WEB-INF/web.xml文件,tomcat会输出找不到的消息,但仍然会部署并使用web应用程序,servlet规范的作者想要实现一种能迅速并简易设定新范围的方法,以用作测试,因此,这个web.xml并不是必要的,不过通常最好还是让每一个上线的web应用程序都有一个自己的WEB-INF/web.xml,即使它只用做识别,但我想这是一个好的习惯。

由于Servlet规范主要是对于web程序员,而非系统管理员使用的。因此,对于运维来讲,我们可能更关心的是站点的默认网页、自定义错误页面、禁止列目录等功能。

由于,正常生产环境中,肯定不会直接由tomcat对公网提供服务,前端肯定放的有apache或者nginx。因此,针对站点的默认主页和自定义错误页面,我们均在前端的apache或者nginx中做。另外,公司也可能交由程序猿在项目内的WEB-INF/web.xml中去做定义。

在tomcat新版本中,自动默认已经禁止列目录功能。

Linux下Apache与多个Tomcat 集群负载均衡 http://www.linuxidc.com/Linux/2012-01/51731.htm

Nginx Tomcat 集群负载均衡解决笔记 http://www.linuxidc.com/Linux/2013-07/86827.htm

实例详解Tomcat组件安装+Nginx反向代理Tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡 http://www.linuxidc.com/Linux/2013-06/85290.htm

CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器 http://www.linuxidc.com/Linux/2014-06/103836.htm

Apache+Tomcat 环境搭建(JK部署过程) http://www.linuxidc.com/Linux/2012-11/74474.htm

下面,我列出几种常见功能,在web.xml中的表现形式:

站点默认主页:

自定义错误页面:

定义会话超时时间:

禁止列目录:

四、优化 tomcat-user.xml

该文件含有用户名、角色以及密码的清单文件。负责提供webapps下manager项目的登录认证管理。

在生产环境中,我们需要将该文件全部注释。

注释效果如下:


Posted in Tomcat效率优化.

Warning: count(): Parameter must be an array or an object that implements Countable in /www/wwwroot/www.tomcat.org.cn/wp-includes/class-wp-comment-query.php on line 405

发表评论