天天看点

Tomcat 安全配置与性能优化

中国广东省深圳市龙华新区民治街道溪山美地

518131

+86 13113668890

+86 755 29812080

$date: 2013-07-23 11:48:13 +0800 (tue, 23 jul 2013) $

摘要

我的系列文档

<a href="http://netkiller.github.io/architect/index.html" target="_top">netkiller architect 手札</a>

<a href="http://netkiller.github.io/developer/index.html" target="_top">netkiller developer 手札</a>

<a href="http://netkiller.github.io/php/index.html" target="_top">netkiller php 手札</a>

<a href="http://netkiller.github.io/python/index.html" target="_top">netkiller python 手札</a>

<a href="http://netkiller.github.io/testing/index.html" target="_top">netkiller testing 手札</a>

<a href="http://netkiller.github.io/cryptography/index.html" target="_top">netkiller cryptography 手札</a>

<a href="http://netkiller.github.io/linux/index.html" target="_top">netkiller linux 手札</a>

<a href="http://netkiller.github.io/debian/index.html" target="_top">netkiller debian 手札</a>

<a href="http://netkiller.github.io/centos/index.html" target="_top">netkiller centos 手札</a>

<a href="http://netkiller.github.io/freebsd/index.html" target="_top">netkiller freebsd 手札</a>

<a href="http://netkiller.github.io/security/index.html" target="_top">netkiller security 手札</a>

<a href="http://netkiller.github.io/version/index.html" target="_top">netkiller version 手札</a>

<a href="http://netkiller.github.io/www/index.html" target="_top">netkiller web 手札</a>

<a href="http://netkiller.github.io/monitoring/index.html" target="_top">netkiller monitoring 手札</a>

<a href="http://netkiller.github.io/storage/index.html" target="_top">netkiller storage 手札</a>

<a href="http://netkiller.github.io/mail/index.html" target="_top">netkiller mail 手札</a>

<a href="http://netkiller.github.io/shell/index.html" target="_top">netkiller shell 手札</a>

<a href="http://netkiller.github.io/network/index.html" target="_top">netkiller network 手札</a>

<a href="http://netkiller.github.io/database/index.html" target="_top">netkiller database 手札</a>

<a href="http://netkiller.github.io/postgresql/index.html" target="_top">netkiller postgresql 手札</a>

<a href="http://netkiller.github.io/mysql/index.html" target="_top">netkiller mysql 手札</a>

<a href="http://netkiller.github.io/nosql/index.html" target="_top">netkiller nosql 手札</a>

<a href="http://netkiller.github.io/ldap/index.html" target="_top">netkiller ldap 手札</a>

<a href="http://netkiller.github.io/cisco/index.html" target="_top">netkiller cisco ios 手札</a>

<a href="http://netkiller.github.io/multimedia/index.html" target="_top">netkiller multimedia 手札</a>

<a href="http://netkiller.github.io/docbook/index.html" target="_top">netkiller docbook 手札</a>

<a href="http://netkiller.github.io/oss/index.html" target="_top">netkiller 开源软件 手札</a>

目录

服务器上不要安装jdk,请使用 server jre. 服务器上根本不需要编译器,代码应该在release服务器上完成编译打包工作。

理由:一旦服务器被控制,可以防止在其服务器上编译其他恶意代码并植入到你的程序中。

-xms 指定初始化时化的栈内存

-xmx 指定最大栈内存

maxthreads 是 tomcat 所能接受最大连接数。一般设置不要超过8000以上,如果你的网站访问量非常大可能使用运行多个tomcat实例的方法。

即,在一个服务器上启动多个tomcat然后做负载均衡处理。

maxthreads 配置要结合 jvm -xmx 参数调整,也就是要考虑内存开销。

不要使用tomcat的虚拟主机,每个站点一个实例。即,启动多个tomcat.

这也是php运维在这里常犯的错误,php的做法是一个web下面放置多个虚拟主机,而不是每个主机启动一个web服务器。tomcat 是多线程,共享内存,任何一个虚拟主机中的应用出现崩溃,会影响到所有应用程序。采用多个实例方式虽然开销比较大,但保证了应用程序隔离与安全。

通常所说的gzip压缩,tomcat通过在server.xml配置设置压缩的选项。

压缩会增加tomcat负担,最好采用nginx + tomcat 或者 apache + tomcat 方式,压缩交由nginx/apache 去做。

当tomcat完成安装后你首先要做的事情如下:

首次安装完成后立即删除webapps下面的所有代码

注释或删除 tomcat-users.xml 所有用户权限,看上去如下:

隐藏tomcat版本信息

服务器信息已经被改为 server: neo app srv 1.0

不要使用root用户启动tomcat,java程序与c程序不同。nginx,httpd 使用root用户启动守护80端口,子进程/线程会通过setuid(),setgid()两个函数切换到普通用户。即父进程所有者是root用户,子进程与多线程所有者是一个非root用户,这个用户没有shell,无法通过ssh与控制台登陆系统,java 的jvm 是与系统无关的,是建立在os之上的,你使用什么用户启动tomcat,那麽tomcat 就会继承该所有者的权限。

这造成了一个问题,linux系统小于1024的端口只有root可以使用,这也是为什么tomcat默认端口是8080。如果你想使用80端口只能使用root启动tomcat。这有带来了很多安全问题。

解决方案是创建一个不同用户,如:

注意 /sbin/nologin , 意味着该用户不能登录,同时我也没有给它指定密码,这个用户只能用于启动tomcat

接下来解决80端口问题, 思路就是80去调用8080,或者映射端口。

下面是影射方案,80 跳转 8080

另一个就是从80请求去调用8080的方案

这个方案可以在 tomcat 前段增加反向代理,例如:nginx,apache,squid,varnish或者f5, array这类设备等等

关闭war自动部署 unpackwars="false" autodeploy="false"。防止被植入木马等恶意程序

应用程序部署与tomcat启动,不能使用同一个用户。

我的tomcat 安装在 /srv目录下,tomcat启动用户为daemon; 应用程序放在/www目录下www所有者是www用户。这样的目的是一旦tomcat被植入web shell程序,它将不能创建或编辑/www目录下面的任何内容。

修改 cookie 变量 jsessionid, 这个cookie 是用于维持session关系。建议你改为phpsessid。