天天看点

Tomcat安全加固配置手册 第1章   概述 第2章    产品介绍 第3章   Tomcat的安全加固配置

现有的Web服务体系架构缺少有效的安全性支持,所以需要一个安全框架模型来解决Web服务中的各种安全问题。Web服务器是应用的载体,如果这个载体出现安全问题,那么运行在其中的Web应用程序的安全就得不到保障了。本文主要描述Apache Tomcat的安全加固和配置工作,最终用以指导系统实施。

本文档用于指导系统工程师进行系统实施工作,架构师和系统工程师应该通读本文档,选择适当方式用于自己的系统。

查看目前系统部署的Tomcat是否为统一的版本,切换到$CATALINA_HOME\bin目录下:

Linux:

[root@srv-dfh526tomcat6-spaceservice]# cd bin/

[root@srv-dfh526bin]# ./version.sh

UsingCATALINA_BASE:  /soft/tomcat6-spaceservice

UsingCATALINA_HOME:  /soft/tomcat6-spaceservice

UsingCATALINA_TMPDIR: /soft/tomcat6-spaceservice/temp

UsingJRE_HOME:        /usr/local/jdk6

UsingCLASSPATH:      /soft/tomcat6-spaceservice/bin/bootstrap.jar

Serverversion: Apache Tomcat/6.0.33

Serverbuilt:   Aug 16 2011 02:16:34

Servernumber:  6.0.33.0

OSName:        Linux

OSVersion:     2.6.32-279.el6.x86_64

Architecture:   amd64

JVMVersion:    1.6.0_32-b05

JVMVendor:     Sun Microsystems Inc.

Windows:

D:\tools\apache-tomcat-6.0.30\apache-tomcat-6.0.30\bin>version.bat

UsingCATALINA_BASE:  "D:\tools\apache-tomcat-6.0.30\apache-tomcat-6.0.30"

UsingCATALINA_HOME:  "D:\tools\apache-tomcat-6.0.30\apache-tomcat-6.0.30"

UsingCATALINA_TMPDIR: "D:\tools\apache-tomcat-6.0.30\apache-tomcat-6.0.30\temp"

UsingJRE_HOME:       "D:\Java\jdk1.8.0"

UsingCLASSPATH:      "D:\tools\apache-tomcat-6.0.30\apache-tomcat-6.0.30\bin\b

ootstrap.jar"

Serverversion: Apache Tomcat/6.0.30

Serverbuilt:   January 10 2011 1752

Servernumber:  6.0.30.0

OSName:        Windows 7

OSVersion:     6.1

JVMVersion:    1.8.0-ea-b121

JVMVendor:     Oracle Corporation

D:\tools\apache-tomcat-6.0.30\apache-tomcat-6.0.30\bin>

将$CATALINA_HOME\conf\tomcat-users.xml中文件的所有用户都注释掉,配置如下:

<code>&lt;?</code><code>xmlversion</code><code>=</code><code>'1.0'</code> <code>encoding</code><code>=</code><code>'utf-8'</code><code>?&gt;</code>

<code>&lt;</code><code>tomcat-users</code><code>&gt;</code>

<code>&lt;!—</code>

<code>  </code><code>&lt;</code><code>rolerolename</code><code>=</code><code>"tomcat"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>rolerolename</code><code>=</code><code>"role1"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>rolerolename</code><code>=</code><code>"manager"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>rolerolename</code><code>=</code><code>"admin"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>user</code> <code>username</code><code>=</code><code>"tomcat"</code><code>password</code><code>=</code><code>"tomcat"</code> <code>roles</code><code>=</code><code>"tomcat"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>userusername</code><code>=</code><code>"both"</code> <code>password</code><code>=</code><code>"tomcat"</code><code>roles</code><code>=</code><code>"tomcat,role1"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>userusername</code><code>=</code><code>"role1"</code> <code>password</code><code>=</code><code>"tomcat"</code><code>roles</code><code>=</code><code>"role1"</code><code>/&gt; </code>

<code>  </code><code>&lt;</code><code>userusername</code><code>=</code><code>"admin"</code> <code>password</code><code>=</code><code>"admin"</code><code>roles</code><code>=</code><code>"manager"</code><code>/&gt; </code>

<code>--&gt;</code>

<code>&lt;/</code><code>tomcat-users</code><code>&gt;</code>

如果业务需要内置的Tomcat用户,则需要给其分配合理的权限,密码设置符合密码策略,Tomcat角色类型如下:

 role1:具有读权限;

 tomcat:具有读和运行权限;

 admin:具有读、运行和写权限;

 manager:具有远程管理权限。

如果使用启用了Tomcat用户,则需要设置Tomcat定时登出,将$CATALINA_HOME\conf\server.xml配置如下:

<code>&lt;</code><code>Connectorport</code><code>=</code><code>"8080"</code>

<code>       </code><code>protocol</code><code>=</code><code>"HTTP/1.1"</code>

<code>       </code><code>maxHttpHeaderSize</code><code>=</code><code>"8192"</code> 

<code>       </code><code>maxThreads</code><code>=</code><code>"150"</code>

<code>       </code><code>minSpareThreads</code><code>=</code><code>"25"</code> 

<code>       </code><code>maxSpareThreads</code><code>=</code><code>"75"</code><code>、</code>

<code>       </code><code>enableLookups</code><code>=</code><code>"false"</code> 

<code>       </code><code>redirectPort</code><code>=</code><code>"8443"</code> 

<code>       </code><code>acceptCount</code><code>=</code><code>"100"</code>

<code>       </code><code>connectionTimeout</code><code>=</code><code>"30000"</code>

<code>       </code><code>disableUploadTimeout</code><code>=</code><code>"true"</code><code>/&gt;</code>

加固检查:

输入帐号和密码都无法登录

除了需要部署上去的应用,其余位于$CATALINA_HOME\webapps文件夹中的应用如docs、examples、host-manager、manager和ROOT。

注:若无业务必要,请执行删除上述的应用包。

输入:http://localhost:8080/manager/html

出现的页面空白

确保$CATALINA_HOME\conf\web.xml中listings的值为false:

<code>&lt;</code><code>init-param</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>param-name</code><code>&gt;listings&lt;/</code><code>param-name</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>param-value</code><code>&gt;false&lt;/</code><code>param-value</code><code>&gt;</code>

<code>&lt;/</code><code>init-param</code><code>&gt;</code>

因为目前框架中没有为Cookie添加HttpOnly属性,所以可以在Tomcat中设置。

第一步,在$CATALINA_HOME\conf\context.xml文件中添加useHttpOnly="true"配置如下:

<code>&lt;</code><code>Context</code>  <code>useHttpOnly</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>       </code><code>&lt;</code><code>WatchedResource</code><code>&gt;WEB-INF/web.xml&lt;/</code><code>WatchedResource</code><code>&gt;</code>

<code>&lt;/</code><code>Context</code><code>&gt;</code>

     第二步,在项目应用的web.xml中配置上:

<code>&lt;</code><code>session-config</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>cookie-config</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>http-only</code><code>&gt;true&lt;/</code><code>http-only</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>secure</code><code>&gt;true&lt;/</code><code>secure</code><code>&gt;</code>

<code>     </code><code>&lt;/</code><code>cookie-config</code><code>&gt;</code>

<code>&lt;/</code><code>session-config</code><code>&gt;</code>

可以通过firebug查看cookie,出现HttpOnly属性

在$CATALINA_HOME\conf\server.xml中“&lt;Server port="8005" shutdown="SHUTDOWN"&gt;”配置有允许任何人只要telnet到服务器的8005端口,输入"SHUTDOWN",然后回车,服务器立即就被关掉了。从安全的角度上考虑,需要把这个shutdown指令改成一个别人不容易猜测的字符串。而且这个修改不影响shutdown.bat或shutdown.sh的执行。配置如下:

&lt;Serverport="未被占用的端口" shutdown="较为复杂的字符串"&gt;

注:配置的端口需要大于1024。

使用telnet 127.0.0.1 8005进入,输入“SHUTDOWN”,Tomcat不会被关闭。

在默认配置下,当应用出现异常时,客户端会显示Tomcat的版本信息。攻击者可以根据Tomcat版本信息选择漏洞库攻击,所以需要将Tomcat的版本信息隐藏,将$CATALINA_HOME\lib\catalina.jar\org\apache\catalina\util中的配置ServerInfo.properties如下:

<code>server.info=需要展现的信息如SmartCity</code>

<code>server.number=SmartCity</code>

<code>server.built=</code><code>20140101</code>

     加固检测:

输入一个异常的URL看看出现的异常页面是否出现类似(无Tomcat的版本信息)如下内容:

默认的配置war放在$CATALINA_HOME\webapps中会自动部署,所以关闭war自动部署防止被植入木马等恶意程序。将$CATALINA_HOME\conf\server.xml配置如下:

<code>&lt;</code><code>Hostname</code><code>=</code><code>"localhost"</code>

<code>       </code><code>appBase</code><code>=</code><code>"webapps"</code>

<code>    </code><code>unpackWARs</code><code>=</code><code>"false"</code>

<code>   </code><code>autoDeploy</code><code>=</code><code>"false"</code>

<code>    </code><code>xmlValidation</code><code>=</code><code>"false"</code>

<code>    </code><code>xmlNamespaceAware</code><code>=</code><code>"false"</code><code>&gt;</code>

     加固检查:

将一个war文件放进$CATALINA_HOME\webapps,启动Tomcat后,war文件不会被部署。

场景一:新部署的应用

#若系统中已经存在该用户,则不需要重写创建

<code>[root@localhost~]</code><code># groupadd dfhapp</code>

<code>[root@localhost~]</code><code># useradd  -d/home/ dfhapp -g dfhapp dfhapp</code>

<code>#创建的密码需要符合密码策略要求</code>

<code>[root@localhost~]</code><code># passwd dfhapp</code>

<code>更改用户 tomcat 的密码。</code>

<code>新的密码:</code>

<code>无效的密码:过于简单化/系统化</code>

<code>无效的密码:过于简单</code>

<code>重新输入新的密码:</code>

<code>passwd</code><code>:所有的身份验证令牌已经成功更新。</code>

<code>[root@localhost/]</code><code># cd /</code>

<code>[root@localhost/]</code><code># mkdir /soft</code>

<code>[root@localhost/]</code><code># chown -R dfhapp:dfhapp /soft/</code>

<code>#切换用户</code>

<code>[root@localhost/]</code><code># su dfhapp</code>

<code>[dfhapp@localhost /]$ </code><code>cd</code> <code>/soft/</code>

<code>[dfhapp@localhost soft]$ wgethttp:</code><code>//mirror</code><code>.esocc.com</code><code>/apache/tomcat/tomcat-6/v6</code><code>.0.39</code><code>/bin/apache-tomcat-6</code><code>.0.39.zip</code>

<code>[dfhapp@localhost soft]$ unzip apache-tomcat-6.0.39.zip</code>

<code>[dfhapp@localhost soft]$ </code><code>mv</code> <code>apache-tomcat-6.0.39 tomcat-demo</code>

<code>[dfhapp@localhost soft]$ </code><code>cd</code> <code>tomcat-demo/</code>

<code>[dfhapp@localhost tomcat-demo]$ </code><code>chmod</code> <code>750 *</code>

<code>[dfhapp@localhost tomcat-demo]$ </code><code>chmod</code> <code>-R 540 bin/*</code>

<code>[dfhapp@localhost tomcat-demo]$ </code><code>chmod</code> <code>-R 540 lib/*</code>

<code>[dfhapp@localhost tomcat-demo]$ </code><code>chmod</code> <code>-R 640 conf/*</code>

<code>[dfhapp@localhost tomcat-demo]$ </code><code>cd</code> <code>bin/</code>

<code>#启动Tomcat</code>

<code>[dfhapp@localhost bin]$ .</code><code>/startup</code><code>.sh </code>

<code>UsingCATALINA_BASE:   </code><code>/soft/tomcat-demo</code>

<code>UsingCATALINA_HOME:   </code><code>/soft/tomcat-demo</code>

<code>UsingCATALINA_TMPDIR: </code><code>/soft/tomcat-demo/temp</code>

<code>UsingJRE_HOME:        </code><code>/usr</code>

<code>UsingCLASSPATH:      </code><code>/soft/tomcat-demo/bin/bootstrap</code><code>.jar</code>

场景二:已存在应用

#关闭应用线程,标红的线程号需要一致

<code>[root@yuanyuan2/]</code><code># ps -ef |grep tomcat_demo</code>

<code>root      4917     1 6 16:08 pts</code><code>/1</code>    <code>00:00:54</code><code>/usr/bin/java-Djava</code><code>.util.logging.config.</code><code>file</code><code>=</code><code>/apache/tomcat_demo/conf/logging</code><code>.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256m-Djava.endorsed.</code><code>dirs</code><code>=</code><code>/apache/tomcat_demo/endorsed</code> <code>-classpath</code><code>/apache/tomcat_demo/bin/bootstrap</code><code>.jar -Dcatalina.base=</code><code>/apache/tomcat_demo-Dcatalina</code><code>.home=</code><code>/apache/tomcat_demo</code> <code>-Djava.io.tmpdir=</code><code>/apache/tomcat_demo/temporg</code><code>.apache.catalina.startup.Bootstrap start</code>

<code>root      5066 4858  0 16:22 pts</code><code>/1</code>    <code>00:00:00 </code><code>grep</code> <code>tomcat_demo</code>

<code> </code><code>[root@yuanyuan2 /]</code><code># kill  -9 4917</code>

<code>#删除缓存目录,不然无法降权</code>

<code>[root@yuanyuan2~]</code><code># cd /apache/tomcat_demo/</code>

<code>[root@yuanyuan2tomcat_demo]</code><code># rm -rf work/Catalina/</code>

<code>[root@yuanyuan2tomcat_demo]</code><code># rm -rf conf/Catalina/</code>

<code>[root@localhost/]</code><code># chown -R dfhapp:dfhapp/data/</code>

<code>[dfhapp@yuanyuan2 /]$ </code><code>cd</code> <code>/apache/tomcat_demo/</code>

<code>#重新赋权限</code>

注:(1)上述的dfhapp组名和用户可以根据需要更改。

     (2)如果需要上传文件到服务容器中的可以将存放目录设置为750.,命令如下。

<code>[tomcat@localhostimage]$ </code><code>chmod</code> <code>-R 750 get/</code>

     (3)鉴于Tonmcat的赋权操作是重复的,所以可以建立一个shell文件,存放在Tonmcat的根目录下进行赋权。

<code>[tomcat@yuanyuan2tomcat_demo]$ </code><code>pwd</code>

<code>/apache/tomcat_demo</code>

<code>#创建tomcat.sh脚本</code>

<code>[tomcat@yuanyuan2tomcat_demo]$ vim tomcat.sh </code>

<code>chmod</code> <code>750 *</code>

<code>chmod</code> <code>-R 540 bin/*</code>

<code>chmod</code> <code>-R 540 lib/*</code>

<code>chmod</code> <code>-R 640 conf/*</code>

<code>[tomcat@yuanyuan2tomcat_demo]$ </code><code>chmod</code> <code>755 tomcat.sh</code>

<code>[tomcat@yuanyuan2tomcat_demo]$ .</code><code>/tomcat</code><code>.sh</code>

     Tomcat中各个文件的权限:

<code>[tomcat@localhosttomcat-demo]$ ll</code>

<code>总用量 124</code>

<code>drwxr-x---.2 tomcat tomcat  4096 1月  2722:42 bin</code>

<code>drwxr-x---.3 tomcat tomcat  4096 4月   220:52 conf</code>

<code>drwxr-x---.2 tomcat tomcat  4096 1月  2722:42 lib</code>

<code>-rwxr-x---.1 tomcat tomcat 57695 1月  27 22:42 LICENSE</code>

<code>drwxr-x---.2 tomcat tomcat  4096 4月   220:52 logs</code>

<code>-rwxr-x---.1 tomcat tomcat   783 1月  2722:42 NOTICE</code>

<code>-rwxr-x---.1 tomcat tomcat  9360 1月  2722:42 RELEASE-NOTES</code>

<code>-rwxr-x---.1 tomcat tomcat 16707 1月  27 22:42 RUNNING.txt</code>

<code>drwxr-x---.2 tomcat tomcat  4096 1月  2722:42 temp</code>

<code>drwxr-x---.8 tomcat tomcat  4096 4月   220:52 webapps</code>

<code>drwxr-x---.3 tomcat tomcat  4096 4月   220:52 work</code>

本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/1610192