Quali passi devo prendere per proteggere Tomcat 6.x?


10

Sono in procinto di configurare una nuova distribuzione Tomcat e voglio che sia il più sicuro possibile.

Ho creato un utente "jakarta" e jsvc esegue Tomcat come demone. Qualche suggerimento sui permessi di directory e simili per limitare l'accesso ai file di Tomcat?

So che dovrò rimuovere le webapp predefinite - documenti, esempi, ecc ... ci sono delle migliori pratiche che dovrei usare qui? Che dire di tutti i file XML di configurazione? Qualche consiglio lì?

Vale la pena abilitare Security Manager in modo che le webapp vengano eseguite in un sandbox? Qualcuno ha avuto esperienza nell'impostare questo?

Ho visto esempi di persone che eseguono due istanze di Tomcat dietro Apache. Sembra che questo possa essere fatto usando mod_jk o con mod_proxy ... qualche pro / contro di entrambi? Ne vale la pena?

Nel caso in cui sia importante, il sistema operativo è Debian Lenny. Non sto usando apt-get perché lenny offre solo tomcat 5.5 e abbiamo bisogno di 6.x.

Grazie!

Risposte:


6

È possibile installare Tomcat 6 per l'esecuzione jsvccome utente tomcat (non come root ). Ecco cosa ho fatto l'ultima volta che l'ho configurato:

Ho installato l'applicazione Tomcat in /usr/java/tomcat( CATALINA_HOME) e un'istanza in /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 *

Quindi ho creato il jsvcwrapper:

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/ 

Infine, ho rafforzato le autorizzazioni per le directory dell'istanza:

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

Quando esegui Tomcat ora, dovrai avviarlo utilizzando jsvc, quindi aggiungi questo script /etc/init.d/tomcate collegalo in modo appropriato:

#!/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 $?

Di solito aggiungo le cose chmod e chown allo script di avvio (init), poiché funziona come root. Sono stato morso più volte da persone che "aiutavano" ad avviare Tomcat come root, portando i file e le directory a appartenere al root e non scrivibili per l'utente Tomcat una volta riavviati correttamente. Ti sei perso "sudo chown tomcat: tomcat temp work" nella tua lista? O ho perso qualcosa?
Olaf,

Poiché sono creati da Tomcat, verranno creati con tomcat: proprietario / gruppo tomcat.
CoverosGene,

Qual è il motivo per non usare il pacchetto jsvc preconfezionato? Personalmente installo il pacchetto anche se scarico Tomcat dai server di Apache.
tronda,

3

Il Dipartimento della Difesa degli Stati Uniti ha una buona guida che ha combinato le indicazioni di sicurezza Tomcat in una guida alla sicurezza del server Web (SRG). Puoi trovare altre guide di sicurezza qui:

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


Grazie, anche se non sono in un formato molto amichevole
Peter Sankauskas,

Il collegamento è interrotto. Inoltre, non sembrano più fornire un elenco di controllo specifico per Tomcat.
Bob,

aggiornato per correggere il collegamento. Ci sono ancora alcune cose specifiche di Tomcat nella guida ai servizi applicativi.
Jim Hunziker,

Questa è un'ottima pagina, tuttavia, è del 2006, quindi alcuni consigli potrebbero non essere aggiornati per l'ultimo Tomcat. Ecco il paragrafo pertinente sulle autorizzazioni della directory: B.2 Installazione e avvio Tomcat può essere configurato per essere eseguito come applicazione per utente singolo o come servizio o processo di sistema condiviso. Un servizio o processo Tomcat non richiede l'amministratore della piattaforma host o i privilegi di root per funzionare. Per limitare il rischio di exploit del server Tomcat, verrà creato un account host personalizzato dedicato all'esecuzione del servizio o processo Tomcat e assegnato privilegi minimi del sistema host.
amos,


1

Prenderei seriamente in considerazione il backport dei pacchetti tomcat6 dai test. È possibile abbonarsi al pacchetto per ricevere le notifiche di nuove versioni caricate nell'archivio. (Sono leggermente di parte perché ho lavorato sul packaging debian).

Non ho provato a eseguire webapp con un gestore della sicurezza, poiché nessuna applicazione include una politica ed è francamente un'operazione che richiede tempo per crearne una tu. Se sei paranoico, puoi sicuramente farlo. Implica principalmente l'esecuzione di Tomcat, l'attesa di qualcosa da criticare, l'aggiunta di un'eccezione alla politica e il riavvio di Tomcat. Risciacqua, ripeti, ecc.

Ovviamente, non eseguire Tomcat come root. L'utente tomcat non dovrebbe essere in grado di scrivere su qualcosa al di fuori della directory di registro o della directory di lavoro. Dovresti assicurarti che la tua directory webapps contenga solo le webapp che vuoi eseguire.

Corro sempre Tomcat dietro Apache. Ciò è in parte dovuto al fatto che mi piacerebbe pensare che più persone usino l'apache, in modo che i bug vengano trovati più rapidamente. Questo è un pio desiderio e non dovresti fare affidamento sul fatto che questo è un miglioramento della sicurezza. Ciò che Apache ti offre è la configurabilità. Esistono molti moduli che Tomcat non ha o non può fare con la stessa efficienza. mod_cache, mod_ssl, mod_security mi vengono in mente tutti. Puoi scegliere mod_jk, mod_proxy (e mod_proxy_http o mod_proxy_ajp). mod_jk (e mod_proxy_ajp) utilizzano il protocollo binario AJP anziché il protocollo http meno efficiente. Consiglierei di usare mod_jk.


0

Non dimenticare di modificare la password predefinita del ruolo di amministratore in tomcat-users.xml È molto importante, altrimenti una persona malintenzionata può distribuire applicazioni senza autorizzazione limitata come backdoor sul server tomcat e provare a fare molte cose cattive.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.