Tomcat安全配置及优化

安全

tomcat隐藏版本号

类似于nginx的server_tokens off ,tomcat也可以隐藏版本号,具体步骤如下:

1
2
3
4
5
6
7
8
9
10
cd apache-tomcat-7.0.59/lib
mkdir test
cd test
jar xf ../catalina.jar
vi org/apache/catalina/util/ServerInfo.properties
server.info=Tomcat
server.number=6
server.built=Jan 18 2013 14:51:10 UTC
jar cf ../catalina.jar ./*
rm -rf test

删除不必要的配置

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

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

1
rm -rf /srv/apache-tomcat/webapps/*

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

1
2
3
4
# cat conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
</tomcat-users>

虚拟主机

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

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

应用程序安全

以普通用户启动tomcat并关闭war自动部署 unpackWARs="false" autoDeploy="false"。防止被植入木马等恶意程序

优化

Tomcat的运行模式有3种

1、bio

默认的模式,性能非常低下,没有经过任何优化处理和支持.

2、nio

使用NIO在服务器端会有更好的性能,加强服务器端对并发处理的性能。 请注意:很抱歉,在tomcat6及其以后版本在默认的配置选项中是没有把NIO功能打开。利用java的异步io护理技术,noblocking IO技术.想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为

1
2
3
4
5
6
7
<Connector port="80″
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding=”UTF-8″
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443">

重启tomcat ,就可以生效。

3、apr

从操作系统级别来解决异步的IO问题,大幅度的提高性能。必须要安装apr和native,直接启动就支持apr修改protocol为org.apache.coyote.http11.Http11AprProtocol

安装apr

1
yum -y install apr apr-devel

安装native 进入tomcat/bin目录,比如:

1
2
3
4
5
cd /usr/local/tomcat/bin/
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.20-src/jni/native/
./configure --with-apr=/usr/bin/apr-1-config
make && make install

安装完成之后 会出现如下提示信息

1
2
Libraries have been installed in:
   /usr/local/apr/lib

安装成功后还需要对tomcat设置环境变量,方法是在setenv.sh文件中增加1行:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"   

修改8080端对应的conf/server.xml

1
protocol="org.apache.coyote.http11.Http11AprProtocol"

启动tomcat之后,查看日志会有这一行信息,说明已经是APR模式启动了

INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].

并发优化 1.JVM调优 新增文件TOMCAT_HOME/bin/setenv.sh如下语句,具体数值视情况而定。

1
JAVA_OPTS="-Xms1024m -Xmx1024m -Xss1024K -XX:PermSize=64m -XX:MaxPermSize=128m"

参数详解

-Xms JVM初始化堆内存大小 -Xmx JVM堆的最大内存 -Xss 线程栈大小 -XX:PermSize JVM非堆区初始内存分配大小 -XX:MaxPermSize JVM非堆区最大内存 建议和注意事项: -Xms和-Xmx选项设置为相同堆内存分配,以避免在每次GC 后调整堆的大小,堆内存建议占内存的60%~80%;非堆内存是不可回收内存,大小视项目而定;线程栈大小推荐256k.

32G内存配置如下:

1
JAVA_OPTS="-Xms20480m -Xmx20480m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m"

2.关闭DNS反向查询 在<Connector port=”8080″中加入如下参数

enableLookups="false"

3.优化tomcat参数(使用APR)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Listener className="org.apache.catalina.core.AprLifecycleListener" />
...
<Connector port="8080"
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           connectionTimeout="20000" //链接超时时长
           redirectPort="8443"
           maxThreads="500"
           minSpareThreads="20"
           acceptCount="1000"
           enableLookups="false"
           compression="on"    //压缩传输,取值on|off|force,默认值off。
           noCompressionUserAgents="gozilla, traviata"   
           compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream"="2048"
           URIEncoding="UTF-8"
           server="baidu" />
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat被JavaWorld杂志的编辑选为2001年度最具创新的java产品,可见其在业界的地位。
本文主要内容:
(1)安装apr,这是 Apache 为了提升 Tomcat 的性能搞的一套本地化 Socket, Thread, IO 组件也就是说它有高级 IO 功能, 操作系统级别的功能调用, 以及本地进程处理等等。
(2)安装Tomcat Native,这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。
(3)安装tomcat为系统服务
(4)优化tomcat的jvm内存池
(5)修改tomcat的并发连接数
 
一、安装apr
(1)安装apr
# tar zxvf apr-1.4.2.tar.gz 
# cd apr-1.4.2
# ./configure --prefix=/usr/local/www/apr
# make
# make install
 
(2)安装apr-iconv
# tar -zxvf apr-iconv-1.2.1.tar.gz
# cd apr-iconv-1.2.1
# ./configure --prefix=/usr/local/www/apr-iconv --with-apr=/usr/local/www/apr 
# make
# make install
 
(3)安装apr-util
 
# tar zxvf apr-util-1.3.9.tar.gz
# cd apr-util-1.3.9
# ./configure --prefix=/usr/local/www/apr-util  --with-apr=/usr/local/www/apr --with-apr-iconv=/usr/local/www/apr-iconv/bin/apriconv 
# make
# make install
 
二、安装tomcat和tomcat-native
 
(1)JDK安装
# chmod a+x jdk-6u18-linux-i586-rpm.bin
# ./jdk-6u7-linux-i586-rpm.bin
# ln -s /usr/java/jdk1.6.0_18 /usr/local/java
 
设置环境变量
# vi /etc/profile
末尾增加如下内容
JAVA_HOME=/usr/local/java
CLASSPATH=/usr/local/java/lib/dt.jar:/usr/local/java/lib/tools.jar
PATH=/usr/local/java/bin:$PATH
export PATH JAVA_HOME CLASSPATH
# source /etc/profile
# java –version  
查看java版本,如果是1.6的,就是说明安装成功了。
 
(2)安装Tomcat
 
# tar -zxvf apache-tomcat-6.0.26.tar.gz 
# mv apache-tomcat-6.0.26 /usr/local/www/tomcat
# vi /usr/local/www/tomcat/bin/catalina.sh
加入一行:
JAVA_HOME=/usr/local/java
# /usr/local/www/tomcat/bin/startup.sh
 
(3)安装tomcat-native
# cp tomcat-native-1.1.20-src.tar.gz /usr/local/www/tomcat/bin/
# cd /usr/local/www/tomcat/bin   
# tar zxvf tomcat-native-1.1.20-src.tar.gz 
# cd tomcat-native-1.1.20-src/jni/native   
# ./configure --with-apr=/usr/local/www/apr --with-java-home=/usr/local/java 
# make  
# make install  
 
(4)设置 apr 的环境变量:
# vi /etc/profile   
后面添加以下内容   
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib   
# source /etc/profile  
启动 tomcat 后, 看日志:
# more /usr/local/www/tomcat/logs/catalina.out 
Dec 5, 2009 3:25:39 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
 
三、tomcat添加到系统服务
# cd /usr/local/www/tomcat/bin/
# tar -zxvf jsvc.tar.gz 
# cd jsvc-src
# chmod a+x configure
# ./configure --with-java=/usr/local/java
# make
# cp /usr/local/www/tomcat/bin/jsvc-src/native/Tomcat5.sh /etc/rc.d/init.d/tomcat
# vi /etc/rc.d/init.d/tomcat 
 
在#!bin/sh下添加
#chkconfig: 2345 85 15
#description: apache-tomcat.6 
相应的内容修改为如下内容:
JAVA_HOME=/usr/local/java
CATALINA_HOME=/usr/local/www/tomcat
DAEMON_HOME=/usr/local/www/tomcat/bin
TOMCAT_USER=tomcat
CATALINA_BASE=/usr/local/www/tomcat
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
$DAEMON_HOME/jsvc-src/jsvc   #有两处
 
添加执行用户tomcat
# groupadd tomcat
# useradd -g tomcat -s /sbin/nologin -M tomcat
加入系统服务,开机自启动
# chown -R tomcat.tomcat /usr/local/www/tomcat
# chmod a+x /etc/rc.d/init.d/tomcat 
# chkconfig --add tomcat
# chkconfig tomcat on
 
四、修改Java虚拟机的虚拟内存
 
(1)添加tomcat管理员
# vi /usr/local/www/tomcat/conf/tomcat-users.xml
在<tomcat-users>  </tomcat-users>中间添加
<role rolename="manager"/>
<user username="tomcat" password="lin31415926" roles="manager"/>
其中username="tomcat"为用户名password="lin31415926"为密码
 
(2)修改Java虚拟机的虚拟内存
tomcat默认的JVM比较小
查看JVM
打开http://ip:8080/ 
点击"status",查看JVM选项
Free memory: 3.25 MB Total memory: 7.62 MB Max memory: 121.81 MB
 
# vi /etc/init.d/tomcat
在CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"下方添加一句
JAVA_OPTS="-Xms1024m -Xmx1024m -Xmn256m -Djava.awt.headless=true"
在$CATALINA_OPTS \上面添加一句
$JAVA_OPTS \
重启一下tomcat,然后再次查看JVM
Free memory: 953.12 MB Total memory: 998.43 MB Max memory: 998.43 MB
 
五、修改tomcat并发连接数
 
tomcat6.0 默认并发数为200,查看方法和JVM一样,查看http-8080选项
Max threads: 200
# vi /usr/local/www/tomcat/conf/server.xml 
修改前:
<Connector port="8080" protocol="HTTP/1.1"   
                redirectPort="8443"  
                connectionTimeout="20000"  
                />  
修改后:  
<Connector port="8080" protocol="HTTP/1.1"   
                maxHttpHeaderSize="8192" useBodyEncodingForURI="true"  
                maxThreads="1000"
                redirectPort="8443"  
                enableLookups="false"  
                compression="on"   
                compressionMinSize="2048"  
                compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"   
                connectionTimeout="20000"  
                disableUploadTimeout="true"  
                />
<!-- 
   port:Tomcat服务器监听的端口号
   maxHttpHeaderSize:Http的Header的最大限制
   enableLookups="false" 使用允许DNS查询,通常情况下设置为false
   redirectPort 服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
   maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
   acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
   connectionTimeout 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
   minSpareThreads Tomcat初始化时创建的线程数。
   maxSpareThreads 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
   compression="on" 打开压缩功能
   compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB 
   compressableMimeType压缩类型
-->
 
重启tomcat后再次查看
Max threads: 1000 

1. JVM

1.1. 使用 Server JRE 替代JDK。

服务器上不要安装JDK,请使用 Server JRE. 服务器上根本不需要编译器,代码应该在Release服务器上完成编译打包工作。

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

1.2. JAVA_OPTS

export JAVA_OPTS="-server -Xms512m -Xmx4096m  -XX:PermSize=64M -XX:MaxPermSize=512m"

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

-Xmx 指定最大栈内存

2. Tomcat 优化

2.1. maxThreads 连接数限制

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

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

<Connector port="8080" address="localhost"
	maxThreads="2048" maxHttpHeaderSize="8192"
	emptySessionPath="true" protocol="HTTP/1.1"
	enableLookups="false" redirectPort="8181" acceptCount="100"
	connectionTimeout="20000" disableUploadTimeout="true" />

提示

很多做过php运维的朋友在这里会犯一个大错误,php优化服务器通常怎做法是安装cpu以及内存的情况配置连接数,连接数过万都很正常,但java不同jvm配置要非常小心,稍有差错就会崩溃。

maxThreads 配置要结合 JVM -Xmx 参数调整,也就是要考虑内存开销。

maxThreads  		客户请求最大线程数
minSpareThreads    	初始化时创建的 socket 线程数
maxSpareThreads   	连接器的最大空闲 socket 线程数

2.2. 虚拟主机

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

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

2.3. 压错传输

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

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               compression="on"
               compressionMinSize1="2048"
               noCompressionUserAgents="gozilla, traviata"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream"/>

提示

压缩会增加Tomcat负担,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,压缩交由Nginx/Apache 去做。

compression 			打开压缩功能   
compressionMinSize   	启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 	压缩类型

3. Tomcat 安全配置

3.1. 安装后初始化配置

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

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

rm -rf /srv/apache-tomcat/webapps/*

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

# cat conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
</tomcat-users>
3.1.1. 隐藏版本信息

隐藏Tomcat版本信息

vim $CATALINA_HOME/conf/server.xml

    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
				maxThreads="8192"
				minSpareThreads="64"
				maxSpareThreads="128"
				acceptCount="128"
				enableLookups="false"
                server="Neo App Srv 1.0"/>

# curl -I http://localhost:8080/
HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Date: Thu, 20 Oct 2011 09:51:55 GMT
Connection: close
Server: Neo App Srv 1.0

服务器信息已经被改为 Server: Neo App Srv 1.0

3.1.2. 应用程序安全

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

关闭 reloadable="false" 也用于防止被植入木马

3.1.3. JSESSIONID

修改 Cookie 变量 JSESSIONID, 这个cookie 是用于维持Session关系。建议你改为PHPSESSID。

3.2. 启动用户与端口

不要使用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。这有带来了很多安全问题。

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

groupadd -g 80 daemon
adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon

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

chown daemon:daemon -R /srv/*
su - daemon -c "/srv/apache-tomcat/bin/startup.sh"

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

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

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

取消跳转
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

查看规则
iptables -t nat -L

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

这个方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array这类设备等等

4. 如何部署应用程序

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

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

adduser --home /www -c "Web Application" www

我的Tomcat安装在/srv目录下,但应用程序放在/www目录下,一般是这样的结构。

/www/example.com/www.example.com

每次升级将压错包解压到 /www/example.com/目录下,www.example.com 是符号连接,连接到刚刚解压的目录。

这个可以实现通过符号连接在多个版本之间快速切换。

 

转载于:https://my.oschina.net/liting/blog/425516

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值