Linux

我應該採取哪些步驟來保護 Tomcat 6.x?

  • October 24, 2014

我正在設置新的 Tomcat 部署,並希望它盡可能安全。

我創建了一個“jakarta”使用者並讓 jsvc 作為守護程序執行 Tomcat。關於目錄權限等限制對Tomcat文件的訪問的任何提示?

我知道我需要刪除預設的 webapps - 文件、範例等……我應該在這裡使用任何最佳實踐嗎?那麼所有的配置 XML 文件呢?那裡有什麼提示嗎?

是否值得啟用安全管理器以便 web 應用程序在沙箱中執行?有沒有人有設置這個的經驗?

我見過有人在 Apache 後面執行兩個 Tomcat 實例的例子。看來這可以使用 mod_jk 或 mod_proxy 來完成……兩者都有什麼優點/缺點?值得麻煩嗎?

如果重要的話,作業系統是 Debian lenny。我沒有使用 apt-get 因為 lenny 只提供 tomcat 5.5 而我們需要 6.x。

謝謝!

您可以安裝 Tomcat 6 以在jsvc使用者tomcat下執行(而不是root)。這是我上次設置時所做的:

我在( )下安裝了 Tomcat 應用程序,在/usr/java/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 $?

引用自:https://serverfault.com/questions/43765