我应该采取哪些步骤来保护Tomcat 6.x?

我正在设置一个新的Tomcat部署,并希望它尽可能安全

我创build了一个'jakarta'用户,并将jsvc作为守护进程运行Tomcat。 目录权限的任何提示,并限制访问Tomcat的文件?

我知道我将需要删除默认的web应用程序 – 文档,例子等…有什么最佳做法,我应该在这里使用? 那么所有的configurationXML文件呢? 那里有任何提示?

是否值得启用安全pipe理器,以便webapps在沙箱中运行? 有没有人有设置这个经验?

我见过在Apache后面运行两个Tomcat实例的人的例子。 看来这可以使用mod_jk或mod_proxy …任何优点/缺点? 这是值得的麻烦?

如果有问题,操作系统是Debian lenny。 我不使用apt-get,因为lenny只提供tomcat 5.5,我们需要6.x.

谢谢!

您可以安装Tomcat 6以jsvc身份作为用户tomcat运行(而不是root )。 这是我上次做的设置:

我在/usr/java/tomcatCATALINA_HOME )和/var/lib/tomcatCATALINA_BASE )下安装了Tomcat应用程序:

 cd /usr/java sudo tar xzvf ~/downloads/apache-tomcat-6.0.18.tar.gz sudo ln -s apache-tomcat-6.0.18 tomcat sudo /usr/sbin/useradd -d /var/lib/tomcat -c "Apache Tomcat" -m -s /sbin/nologin tomcat cd /var/lib/tomcat sudo mkdir logs work temp sudo chown tomcat:tomcat logs temp work (cd /usr/java/tomcat && sudo tar cvf - conf webapps) | sudo tar xvf - sudo chmod -R g+rw webapps conf sudo chown -R tomcat:tomcat webapps conf cd webapps/ sudo rm -rf docs examples manager host-manager cd ../conf sudo chmod g+r * 

然后我build立了jsvc包装器:

 cd tar xzvf downloads/apache-tomcat-6.0.18.tar.gz tar xzvf apache-tomcat-6.0.18/bin/jsvc.tar.gz cd jsvc-src chmod +x configure ./configure --with-java=$JAVA_HOME make ./jsvc --help sudo cp jsvc /usr/local/sbin/ 

最后,我收紧了实例目录的权限:

 cd /var/lib/tomcat sudo chmod -R 0700 conf sudo chmod -R 0750 logs sudo chmod -R 0700 temp sudo chmod -R 0700 work sudo chmod -R 0770 webapps/ sudo chown -R tomcat:tomcat conf sudo chown -R tomcat:tomcat logs 

当你现在运行Tomcat的时候,你需要使用jsvc来启动它,所以把这个脚本添加为/etc/init.d/tomcat ,然后适当地链接它:

 #!/bin/sh # # tomcat Startup script for the Apache Tomcat Server running under jsvc # # chkconfig: 345 85 15 # description: Apache Tomcat # pidfile: /var/run/jsvc.pid JAVA_HOME=/usr/java/jdk1.6.0_13 CATALINA_HOME=/usr/java/apache-tomcat-6.0.18 CATALINA_BASE=/var/lib/tomcat JAVA_OPTS="-Djava.awt.headless=true" JMX_OPTS="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" DAEMON_APP=/usr/local/sbin/jsvc TOMCAT_USER=tomcat # Everything below should be okay PID_FILE=/var/run/jsvc.pid LOCK_FILE=/var/lock/tomcat PATH=/sbin:/bin:/usr/bin . /lib/init/vars.sh . /lib/lsb/init-functions [ -x $JAVA_HOME/bin/java ] || exit 0 [ -x $DAEMON_APP ] || exit 0 [ -d $CATALINA_HOME/bin ] || exit 0 [ -d $CATALINA_BASE ] || exit 0 RETVAL=0 prog="jsvc" CLASSPATH=\ $JAVA_HOME/lib/tools.jar:\ $CATALINA_HOME/bin/commons-daemon.jar:\ $CATALINA_HOME/bin/bootstrap.jar start() { # Start Tomcat log_daemon_msg "Starting Apache Tomcat" $DAEMON_APP \ -user $TOMCAT_USER \ -home $JAVA_HOME \ -wait 10 \ -pidfile $PID_FILE \ -outfile $CATALINA_BASE/logs/catalina.out \ -errfile $CATALINA_BASE/logs/catalina.out \ $JAVA_OPTS $JMX_OPTS \ -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \ -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \ -Dcatalina.home=$CATALINA_HOME \ -Dcatalina.base=$CATALINA_BASE \ -Djava.io.tmpdir=$CATALINA_BASE/temp \ -cp $CLASSPATH \ org.apache.catalina.startup.Bootstrap start 2>/dev/null 1>&2 RETVAL=$? if [ 0 -eq $RETVAL ]; then touch $LOCK_FILE log_end_msg 0 else log_end_msg 1 fi } stop() { # Stop tomcat log_daemon_msg "Stopping Apache Tomcat" $DAEMON_APP \ -stop \ -pidfile $PID_FILE \ org.apache.catalina.startup.Bootstrap 2>/dev/null 1>&2 RETVAL=$? if [ 0 -eq $RETVAL ]; then rm -rf $LOCK_FILE log_end_msg 0 else log_end_msg 1 fi } restart() { stop sleep 5 start } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status $prog ;; condrestart) [ -f $LOCK_FILE ] && restart || : ;; *) log_action_msg "Usage: $0 {start|stop|restart|status|condrestart}" exit 1 esac exit $? 

美国国防部有一个很好的指南 ,将Tomcat安全指导整合到一个整体的Web服务器安全指南(SRG)中。 你可以在这里find更多的安全指南:

http://iase.disa.mil/stigs/srgs/Pages/index.aspx

开放Web应用程序安全项目( OWASP )提供了关于保护Tomcat的wiki页面 ,您可能会发现它很有用。 在撰写本文时,似乎更关注于Tomcat 5.x,但希望随着时间的推移将会更新。

我认真考虑从testingbackporting tomcat6包。 您可以订阅该软件包以获取正在上传到存档的新版本的通知。 (我有点偏见,因为我曾在debian包装上)。

我还没有尝试在安全pipe理器下运行webapps,因为没有应用程序带有一个策略,坦白说,自己创build一个应用程序是非常耗时的操作。 如果你偏执狂,你当然可以这样做。 它主要涉及到运行tomcat,等待一些婊子,然后添加一个例外的政策,并重新启动tomcat。 冲洗,重复等

显然,不要以root身份运行tomcat。 tomcat用户不应该能够写入日志目录或工作目录以外的任何东西。 你应该确保你的webapps目录只包含你想运行的webapps。

我总是在apache后面运行tomcat。 这部分是因为我想更多的人使用Apache,所以错误会更快。 这是非常一厢情愿的想法,你不应该依靠这是一个安全改进。 Apache带给你的是可configuration性。 有很多模块是tomcat没有的,或者不能高效地完成。 mod_cache,mod_ssl,mod_security,都想到了。 您可以selectmod_jk,mod_proxy(以及mod_proxy_http或mod_proxy_ajp)。 mod_jk(和mod_proxy_ajp)使用二进制AJP协议,而不是效率较低的http协议。 我build议使用mod_jk。

不要忘记在tomcat-users.xml中更改adminangular色的默认密码这是非常重要的,否则恶意的人可以在没有像tomcat服务器的后门那样的限制权限的情况下部署应用程序,并尝试做很多不好的事情。