我正在设置新的 Tomcat 部署,并希望它尽可能安全。
我已经创建了一个“jakarta”用户,并让 jsvc 将 Tomcat 作为守护进程运行。有没有关于目录权限等限制对 Tomcat 文件的访问的提示?
我知道我需要删除默认的 web 应用程序 - 文档、示例等... 我应该在这里使用哪些最佳实践?所有配置 XML 文件呢?有什么建议吗?
是否值得启用安全管理器以便 Web 应用在沙箱中运行?有人有设置此操作的经验吗?
我见过有人在 Apache 后面运行两个 Tomcat 实例的例子。似乎可以使用 mod_jk 或 mod_proxy 来实现这一点... 这两种方法有什么优缺点?值得这么麻烦吗?
如果有关系的话,操作系统是 Debian lenny。我没有使用 apt-get,因为 lenny 只提供 tomcat 5.5,而我们需要 6.x。
谢谢!
答案1
jsvc
您可以安装 Tomcat 6 以用户身份运行雄猫(不像根)。以下是我上次设置时的操作:
/usr/java/tomcat
我在( )下安装了 Tomcat 应用程序,并在( ) 下安装了CATALINA_HOME
实例:/var/lib/tomcat
CATALINA_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 $?
答案2
美国国防部有一个很好的指导将 Tomcat 安全指南整合到整体 Web 服务器安全指南 (SRG) 中。您可以在此处找到更多安全指南:
答案3
开放式 Web 应用程序安全项目 (开放Web服务计划)提供了有关保护 Tomcat 安全的 Wiki 页面,您可能会觉得有用。在撰写本文时,它似乎更侧重于 Tomcat 5.x,但希望随着时间的推移会更新。
答案4
不要忘记更改 tomcat-users.xml 中管理员角色的默认密码,这非常重要,否则恶意人员可以在没有限制权限的情况下部署应用程序,例如 tomcat 服务器的后门,并尝试做很多坏事。