共计 8515 个字符,预计需要花费 22 分钟才能阅读完成。
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 项目的登录认证管理。
在生产环境中,我们需要将该文件全部注释。
注释效果如下:
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2015-02/113060p2.htm
五、优化 server.xml
Tomcat 的主配置文件,该文件中包含很多主要元素,比如 Service、Connector、Host 等,这些元素都会创建软件 ” 对象 ”、排序及进程管道中设置的这些元素嵌套方,使我们可以执行过滤、分组等工作。
如果要对改文件做优化,我们需要先了解该文件的结构!
server.xml 的结构图:
该文件描述了如何启动 Tomcat Server
/GlobaNamingResources
/host>
/Engine>
/Service>
/Server>
针对该文件,我们需要优化的点有如下:
1、maxThreads 连接数限制
maxThreads 是 Tomcat 所能接受最大连接数。一般设置不要超过 8000 以上,如果你的网站访问量非常大可能使用运行多个 Tomcat 实例的方法,即,在一个服务器上启动多个 tomcat 然后做负载均衡处理。
这里还需要注意的一点是,tomcat 和 php 不同。php 可以按照 cpu 和内存的情况去配置连接数,上万很正常。而 java 还需要注意 jvm 的参数配置。如果不注意就会因为 jvm 参数过小而崩溃。
2、多虚拟主机
强烈建议不要使用 Tomcat 的虚拟主机,推荐每个站点使用一个实例。即,可以启动多个 Tomcat,而不是启动一个 Tomcat 里面包含多个虚拟主机。因为 Tomcat 是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全。
3、压错传输
tomcat 作为一个应用服务器,也是支持 gzip 压缩功能的。我们可以在 server.xml 配置文件中的 Connector 节点中配置如下参数,来实现对指定资源类型进行压缩。
compression=”on” # 打开压缩功能
compressionMinSize=”50″ # 启用压缩的输出内容大小,默认为 2KB
noCompressionUserAgents=”gozilla, traviata” # 对于以下的浏览器,不启用压缩
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain” # 哪些资源类型需要压缩
提示:
Tomcat 的压缩是在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML、CSS、Javascript 和 Text,它可以节省 40% 左右的流量。更为重要的是,它可以对动态生成的,包括 CGI、PHP、JSP、ASP、Servlet,SHTML 等输出的网页也能进行压缩,压缩效率也很高。但是,压缩会增加 Tomcat 的负担,因此最好采用 Nginx + Tomcat 或者 Apache + Tomcat 方式,将压缩的任务交由 Nginx/Apache 去做。
4、管理 AJP 端口
AJP 是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果 tomcat 前端放的是 apache 的时候,会使用到 AJP 这个连接器。由于我们公司前端是由 nginx 做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。
“8009” protocol=”AJP/1.3″ redirectPort=”8443″ />
–>
5、更改关闭 Tomcat 实例的指令
server.xml 中定义了可以直接关闭 Tomcat 实例的管理端口。我们通过 telnet 连接上该端口之后,输入 SHUTDOWN(此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭 Tomcat 的端口和指令都很简单。默认端口为 8005,指令为 SHUTDOWN。因此我们需要将关闭指令修改复杂一点。
当然,在新版的 Tomcat 中该端口仅监听在 127.0.0.1 上,因此大家也不必担心。除非黑客登陆到 tomcat 本机去执行关闭操作。
修改实例:
n=”9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd”>
6、更改 Tomcat 的服务监听端口
一般公司的 Tomcat 都是放在内网的,因此我们针对 Tomcat 服务的监听地址都是内网地址。
修改实例:
1
“8080” address=”172.16.100.1″ />
7、关闭 war 自动部署
默认 Tomcat 是开启了对 war 包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。
修改实例:
“localhost” appBase=””
unpackWARs=”false” autoDeploy=”false”>
六、禁用 Tomcat 管理页面
我们线上是不使用 Tomcat 默认提供的管理页面的,因此都会在初始化的时候就把这些页面删掉。这些页面是存放在 Tomcat 安装目录下的 webapps 目录下的。
我们只需要删除该目录下的所有文件即可。
当然,还有涉及管理页面的 2 个配置文件 host-manager.xml 和 manager.xml 也需要一并删掉。这两个文件存放在 Tomcat 安装目录下的 conf/Catalina/localhost 目录下。
七、用普通用户启动 Tomcat
为了进一步安全,我们不建议使用 root 来启动 Tomcat。这边建议使用专用用户 tomcat 或者 nobody 用户来启动 Tomcat。
在启动之前,需要对我们的 tomcat 安装目录下所有文件的属主和属组都设置为指定用户。
八、分离 Tomcat 和项目的用户
为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。因此我们要将 Tomcat 和项目的属主做分离,这样子,即便被搞,他也无法创建和编辑项目文件。
Tomcat 的详细介绍 :请点这里
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 项目的登录认证管理。
在生产环境中,我们需要将该文件全部注释。
注释效果如下:
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2015-02/113060p2.htm