我应该采取什么步骤来保护Tomcat 6.x?


10

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

我创建了一个“ jakarta”用户,并让jsvc将Tomcat作为守护程序运行。关于目录权限的任何提示,以及诸如此类的限制访问Tomcat文件的提示?

我知道我需要删除默认的Web应用程序-文档,示例等...在这里我应该使用什么最佳实践?那所有的配置XML文件呢?有什么提示吗?

启用安全管理器以使Web应用程序在沙箱中运行是否值得?有没有人有设置经验?

我看到了一些在Apache之后运行Tomcat的两个实例的人的例子。看来这可以使用mod_jk或mod_proxy来完成...两者的优点/缺点?值得麻烦吗?

如果重要的话,操作系统是Debian lenny。我不使用apt-get,因为lenny仅提供tomcat 5.5,而我们需要6.x。

谢谢!

Answers:


6

您可以安装Tomcat 6以使其以tomcatjsvc用户身份(而不是以root用户身份)运行。这是我上次设置时所做的操作:

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

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 *

然后,我构建了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 $?

我通常将chmod和chown内容添加到启动(init)脚本中,因为它以root身份运行。我已经被人们“帮忙”以tomcat作为root的身份“折磨”了好几次,导致文件和目录属于root,并且一旦正确重启,对于tomcat用户来说是不可写的。您是否错过了列表中的“ sudo chown tomcat:tomcat临时工作”?还是我错过了什么?
奥拉夫

由于它们是由Tomcat创建的,因此将使用tomcat:tomcat owner / group创建它们。
CoverosGene

有什么理由不使用预打包的jsvc包?就个人而言,即使我从Apache的服务器下载Tomcat,我也只安装了该软件包。
tronda

3

美国国防部提供了一个很好的指南,该指南将Tomcat安全指南与整体Web服务器安全指南(SRG)相结合。您可以在此处找到更多安全指南:

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


谢谢,尽管它们的格式不是很友好
Peter Sankauskas 09年

链接断开。它们似乎也不再提供特定于Tomcat的清单。
鲍勃,

更新以修复链接。“应用程序服务”指南中仍然有一些特定于Tomcat的内容。
Jim Hunziker

那是一个很棒的页面,但是,它是从2006年开始的,因此对于最新的tomcat,某些建议可能不是最新的。这是有关目录权限的相关段落:B.2安装和启动Tomcat可以配置为作为单用户应用程序或共享系统服务或进程运行。Tomcat服务或进程不需要主机平台管理员或root特权即可操作。为了限制利用Tomcat服务器的风险,将创建一个专用于运行Tomcat服务或进程的自定义主机帐户,并为其分配最小的主机系统特权。
amos 2014年

2

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


1

我会认真考虑从测试中移植tomcat6软件包。您可以订阅该软件包以获取有关将新版本上载到存档的通知。(因为我从事过Debian包装工作,所以我略有偏见)。

我没有尝试过在安全管理器下运行webapps,因为没有应用程序附带策略,坦率地说,创建自己的应用程序很耗时。如果您偏执狂,您当然可以这么做。它主要涉及运行tomcat,等待某些事情发生,然后将异常添加到策略中并再次重新启动tomcat。冲洗,重复等

显然,不要以root身份运行tomcat。tomcat用户不应写日志目录或工作目录之外的任何内容。您应该确保您的webapps目录仅包含要运行的webapp。

我总是在apache后面运行tomcat。部分原因是我希望更多的人使用apache,因此可以更快地发现bug。这几乎是一厢情愿的想法,您不应该依赖于此作为安全性改进。Apache带来的就是可配置性。有很多模块,tomcat只是没有,或者效率不高。mod_cache,mod_ssl和mod_security浮现在脑海。您可以选择mod_jk,mod_proxy(以及mod_proxy_http或mod_proxy_ajp)。mod_jk(和mod_proxy_ajp)使用二进制AJP协议而不是效率较低的http协议。我建议使用mod_jk。


0

不要忘记在tomcat-users.xml中更改admin角色的默认密码。这非常重要,否则恶意人员可以在没有限制权限的情况下将应用程序部署到tomcat服务器(例如totomcat),并尝试做很多不好的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.